diff --git a/pandora_console/extras/delete_files/delete_files.txt b/pandora_console/extras/delete_files/delete_files.txt index 888b359278..50f79eb02f 100644 --- a/pandora_console/extras/delete_files/delete_files.txt +++ b/pandora_console/extras/delete_files/delete_files.txt @@ -113,4 +113,5 @@ enterprise/include/javascript/SimpleMapController.js enterprise/include/javascript/tooltipster.bundle.min.js enterprise/include/styles/tooltipster.bundle.min.css mobile/include/javascript/jquery.mobile-1.3.1.js -mobile/include/style/jquery.mobile-1.3.1.css \ No newline at end of file +mobile/include/style/jquery.mobile-1.3.1.css +godmode/alerts/configure_alert_special_days.php \ No newline at end of file diff --git a/pandora_console/extras/mr/51.sql b/pandora_console/extras/mr/51.sql index ea9d454839..290defc3dd 100644 --- a/pandora_console/extras/mr/51.sql +++ b/pandora_console/extras/mr/51.sql @@ -1,5 +1,30 @@ START TRANSACTION; +CREATE TABLE IF NOT EXISTS `talert_calendar` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL default '', + `id_group` INT(10) NOT NULL DEFAULT 0, + `description` text, + PRIMARY KEY (`id`), + UNIQUE (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar'); + +ALTER TABLE `talert_special_days` ADD COLUMN `id_calendar` int(10) unsigned NOT NULL DEFAULT 1; +ALTER TABLE `talert_special_days` ADD COLUMN `day_code` tinyint(2) unsigned NOT NULL DEFAULT 0; + +UPDATE `talert_special_days` set `day_code` = 1 WHERE `same_day` = 'monday'; +UPDATE `talert_special_days` set `day_code` = 2 WHERE `same_day` = 'tuesday'; +UPDATE `talert_special_days` set `day_code` = 3 WHERE `same_day` = 'wednesday'; +UPDATE `talert_special_days` set `day_code` = 4 WHERE `same_day` = 'thursday'; +UPDATE `talert_special_days` set `day_code` = 5 WHERE `same_day` = 'friday'; +UPDATE `talert_special_days` set `day_code` = 6 WHERE `same_day` = 'saturday'; +UPDATE `talert_special_days` set `day_code` = 7 WHERE `same_day` = 'sunday'; + +ALTER TABLE `talert_special_days` DROP COLUMN `same_day`; +ALTER TABLE `talert_special_days` ADD FOREIGN KEY (`id_calendar`) REFERENCES `talert_calendar`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + ALTER TABLE `tagent_repository` ADD COLUMN `deployment_timeout` INT UNSIGNED DEFAULT 600 AFTER `path`; COMMIT; \ No newline at end of file diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index a84cd73032..21d4bc2552 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -4224,3 +4224,31 @@ INSERT INTO `tncm_script` VALUES (5,5,'enable expect:Password:\s* _enablepass_ term length 0 config term end end exit '); INSERT INTO `tncm_template_scripts`(`id_template`, `id_script`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5); + +-- ---------------------------------------------------------------------- +-- Table `talert_calendar` +-- ---------------------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `talert_calendar` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL default '', + `id_group` INT(10) NOT NULL DEFAULT 0, + `description` text, + PRIMARY KEY (`id`), + UNIQUE (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar'); + +ALTER TABLE `talert_special_days` ADD COLUMN `id_calendar` int(10) unsigned NOT NULL DEFAULT 1; +ALTER TABLE `talert_special_days` ADD COLUMN `day_code` tinyint(2) unsigned NOT NULL DEFAULT 0; + +UPDATE `talert_special_days` set `day_code` = 1 WHERE `same_day` = 'monday'; +UPDATE `talert_special_days` set `day_code` = 2 WHERE `same_day` = 'tuesday'; +UPDATE `talert_special_days` set `day_code` = 3 WHERE `same_day` = 'wednesday'; +UPDATE `talert_special_days` set `day_code` = 4 WHERE `same_day` = 'thursday'; +UPDATE `talert_special_days` set `day_code` = 5 WHERE `same_day` = 'friday'; +UPDATE `talert_special_days` set `day_code` = 6 WHERE `same_day` = 'saturday'; +UPDATE `talert_special_days` set `day_code` = 7 WHERE `same_day` = 'sunday'; + +ALTER TABLE `talert_special_days` DROP COLUMN `same_day`; +ALTER TABLE `talert_special_days` ADD FOREIGN KEY (`id_calendar`) REFERENCES `talert_calendar`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/pandora_console/godmode/alerts/alert_special_days.php b/pandora_console/godmode/alerts/alert_special_days.php index 31f787f910..3a8957293b 100644 --- a/pandora_console/godmode/alerts/alert_special_days.php +++ b/pandora_console/godmode/alerts/alert_special_days.php @@ -1,577 +1,75 @@ '[CalendarManager]'.$e->getMessage() ]); + exit; + } else { + echo '[CalendarManager]'.$e->getMessage(); } + // Stop this execution, but continue 'globally'. return; } -// Header -ui_print_page_header( - __('Alerts').' » '.__('Special days list'), - 'images/gm_alerts.png', - false, - 'alert_special_days', - true -); +// AJAX controller. +if ((bool) is_ajax() === true) { + $method = get_parameter('method'); -$update_special_day = (bool) get_parameter('update_special_day'); -$create_special_day = (bool) get_parameter('create_special_day'); -$delete_special_day = (bool) get_parameter('delete_special_day'); -$upload_ical = (bool) get_parameter('upload_ical', 0); -$display_range = (int) get_parameter('display_range'); - -if ($upload_ical) { - $same_day = (string) get_parameter('same_day'); - $overwrite = (bool) get_parameter('overwrite', 0); - $values = []; - $values['id_group'] = (string) get_parameter('id_group'); - $values['same_day'] = $same_day; - - $error = $_FILES['ical_file']['error']; - $extension = substr($_FILES['ical_file']['name'], -3); - - if ($error == 0 && strcasecmp($extension, 'ics') == 0) { - $skipped_dates = ''; - // $today = date ('Ymd'); - $this_month = date('Ym'); - $ical = new ICal($_FILES['ical_file']['tmp_name']); - $events = $ical->events(); - foreach ($events as $event) { - $event_date = substr($event['DTSTART'], 0, 8); - $event_month = substr($event['DTSTART'], 0, 6); - if ($event_month >= $this_month) { - $values['description'] = @$event['SUMMARY']; - $values['date'] = $event_date; - $date = date('Y-m-d', strtotime($event_date)); - $date_check = ''; - $filter['id_group'] = $values['id_group']; - $filter['date'] = $date; - $date_check = db_get_value_filter('date', 'talert_special_days', $filter); - if ($date_check == $date) { - if ($overwrite) { - $id_special_day = db_get_value_filter('id', 'talert_special_days', $filter); - alerts_update_alert_special_day($id_special_day, $values); - } else { - if ($skipped_dates == '') { - $skipped_dates = __('Skipped dates: '); - } - - $skipped_dates .= $date.' '; - } - } else { - alerts_create_alert_special_day($date, $same_day, $values); - } - } - } - - $result = true; - } else { - $result = false; - } - - if ($result) { - db_pandora_audit('Special days list', 'Upload iCalendar '.$_FILES['ical_file']['name']); - } - - ui_print_result_message($result, __('Success to upload iCalendar').'
'.$skipped_dates, __('Fail to upload iCalendar')); -} - -if ($create_special_day) { - $date = (string) get_parameter('date'); - $same_day = (string) get_parameter('same_day'); - $values = []; - $values['id_group'] = (string) get_parameter('id_group'); - $values['description'] = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description')))); - - $aviable_description = true; - if (preg_match('/script/i', $values['description'])) { - $aviable_description = false; - } - - $array_date = explode('-', $date); - - $year = $array_date[0]; - $month = $array_date[1]; - $day = $array_date[2]; - - if ($year == '*') { - // '0001' means every year. - $year = '0001'; - $date = $year.'-'.$month.'-'.$day; - } - - if (!checkdate($month, $day, $year)) { - $result = ''; - } else { - $date_check = ''; - $filter['id_group'] = $values['id_group']; - $filter['date'] = $date; - $date_check = db_get_value_filter('date', 'talert_special_days', $filter); - if ($date_check == $date) { - $result = ''; - $messageAction = __('Could not be created, it already exists'); + if (method_exists($cs, $method) === true) { + if (CalendarManager::ajaxMethod($method) === true) { + $cs->{$method}(); } else { - if ($aviable_description) { - $result = alerts_create_alert_special_day($date, $same_day, $values); - $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$values['description'].'"}'; - } else { - $result = false; - } + $cs->error('Unavailable method.'); } - } - - if ($result) { - db_pandora_audit('Command management', 'Create special day '.$result, false, false, $info); } else { - db_pandora_audit('Command management', 'Fail try to create special day', false, false); + $cs->error('Method not found. ['.$method.']'); } - - // Show errors - if (!isset($messageAction)) { - $messageAction = __('Could not be created'); - } - - $messageAction = ui_print_result_message( - $result, - __('Successfully created'), - $messageAction - ); -} - -if ($update_special_day) { - $id = (int) get_parameter('id'); - $alert = alerts_get_alert_special_day($id); - $date = (string) get_parameter('date'); - $date_orig = (string) get_parameter('date_orig'); - $same_day = (string) get_parameter('same_day'); - $description = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description')))); - $id_group = (string) get_parameter('id_group'); - $id_group_orig = (string) get_parameter('id_group_orig'); - - $aviable_description = true; - if (preg_match('/script/i', $description)) { - $aviable_description = false; - } - - $array_date = explode('-', $date); - - $year = $array_date[0]; - $month = $array_date[1]; - $day = $array_date[2]; - - if ($year == '*') { - // '0001' means every year. - $year = '0001'; - $date = $year.'-'.$month.'-'.$day; - } - - $values = []; - $values['date'] = $date; - $values['id_group'] = $id_group; - $values['same_day'] = $same_day; - $values['description'] = $description; - - if (!checkdate($month, $day, $year)) { - $result = ''; - } else { - if ($id_group != $id_group_orig || $date != $date_orig) { - $date_check = ''; - $filter['id_group'] = $id_group; - $filter['date'] = $date; - $date_check = db_get_value_filter('date', 'talert_special_days', $filter); - if ($date_check == $date) { - $result = ''; - $messageAction = __('Could not be updated, it already exists'); - } else { - if ($aviable_description !== false) { - $result = alerts_update_alert_special_day($id, $values); - $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$description.'"}'; - } - } - } else { - if ($aviable_description !== false) { - $result = alerts_update_alert_special_day($id, $values); - $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$description.'"}'; - } - } - } - - if ($result) { - db_pandora_audit('Command management', 'Update special day '.$id, false, false, $info); - } else { - db_pandora_audit('Command management', 'Fail to update special day '.$id, false, false); - } - - - // Show errors - if (!isset($messageAction)) { - $messageAction = __('Could not be updated'); - } - - $messageAction = ui_print_result_message( - $result, - __('Successfully updated'), - $messageAction - ); -} - -if ($delete_special_day) { - $id = (int) get_parameter('id'); - - $result = alerts_delete_alert_special_day($id); - - if ($result) { - db_pandora_audit('Command management', 'Delete special day '.$id); - } else { - db_pandora_audit('Command management', 'Fail to delete special day '.$id); - } - - ui_print_result_message( - $result, - __('Successfully deleted'), - __('Could not be deleted') - ); -} - - -echo ""; -echo ""; -echo ''; -echo '
'; -echo __('iCalendar(.ics) file').' '; -html_print_input_file('ical_file', false, false); -echo ''; -echo __('Same day of the week'); -$days = []; -$days['monday'] = __('Monday'); -$days['tuesday'] = __('Tuesday'); -$days['wednesday'] = __('Wednesday'); -$days['thursday'] = __('Thursday'); -$days['friday'] = __('Friday'); -$days['saturday'] = __('Saturday'); -$days['sunday'] = __('Sunday'); -html_print_select($days, 'same_day', $same_day, '', '', 0, false, false, false); -echo ''; -echo __('Group').' '; -$own_info = get_user_info($config['id_user']); -if (!users_can_manage_group_all('LM')) { - $can_manage_group_all = false; + // Stop any execution. + exit; } else { - $can_manage_group_all = true; + // Run. + $cs->run(); } - -echo '
'; -html_print_select_groups(false, 'LM', $can_manage_group_all, 'id_group', $id_group, false, '', 0, false, false, true, '', false, 'width:100px;'); -echo '
'; -echo '
'; -echo __('Overwrite'); -ui_print_help_tip(__('Check this box, if you want to overwrite existing same days.'), false); -echo ' '; -html_print_checkbox('overwrite', 1, $overwrite, false, false, false, true); -echo ''; -html_print_input_hidden('upload_ical', 1); -echo ""; -echo '
'; - - -$this_year = date('Y'); -$this_month = date('m'); - -$filter = []; -if (!is_user_admin($config['id_user'])) { - $filter['id_group'] = array_keys(users_get_groups(false, 'LM')); -} - -// Show display range. -$html = "'; -echo $html; - -// Show calendar -for ($month = 1; $month <= 12; $month++) { - if ($display_range) { - $display_month = $month; - $display_year = $display_range; - } else { - $display_month = ($this_month + $month - 1); - $display_year = $this_year; - } - - if ($display_month > 12) { - $display_month -= 12; - $display_year += 1; - } - - $cal_table = new stdClass(); - $cal_table->width = '100%'; - $cal_table->class = 'databox data'; - - $cal_table->data = []; - $cal_table->head = []; - $cal_table->head[0] = __('Sun'); - $cal_table->head[1] = __('Mon'); - $cal_table->head[2] = __('Tue'); - $cal_table->head[3] = __('Wed'); - $cal_table->head[4] = __('Thu'); - $cal_table->head[5] = __('Fri'); - $cal_table->head[6] = __('Sat'); - $cal_table->cellstyle = []; - $cal_table->size = []; - $cal_table->size[0] = '14%'; - $cal_table->size[1] = '14%'; - $cal_table->size[2] = '14%'; - $cal_table->size[3] = '14%'; - $cal_table->size[4] = '14%'; - $cal_table->size[5] = '14%'; - $cal_table->size[6] = '14%'; - $cal_table->align = []; - $cal_table->border = '1'; - $cal_table->titlestyle = 'text-align:center; font-weight: bold;'; - switch ($display_month) { - case 1: - $cal_table->title = __('January'); - break; - - case 2: - $cal_table->title = __('February'); - break; - - case 3: - $cal_table->title = __('March'); - break; - - case 4: - $cal_table->title = __('April'); - break; - - case 5: - $cal_table->title = __('May'); - break; - - case 6: - $cal_table->title = __('June'); - break; - - case 7: - $cal_table->title = __('July'); - break; - - case 8: - $cal_table->title = __('August'); - break; - - case 9: - $cal_table->title = __('September'); - break; - - case 10: - $cal_table->title = __('October'); - break; - - case 11: - $cal_table->title = __('November'); - break; - - case 12: - $cal_table->title = __('December'); - break; - } - - $cal_table->title .= ' / '.$display_year; - - $last_day = date('j', mktime(0, 0, 0, ($display_month + 1), 0, $display_year)); - $cal_line = 0; - - for ($day = 1; $day < ($last_day + 1); $day++) { - $week = date('w', mktime(0, 0, 0, $display_month, $day, $display_year)); - if ($cal_line == 0 && $week != 0 && $day == 1) { - for ($i = 0; $i < $week; $i++) { - $cal_table->cellstyle[$cal_line][$i] = 'font-size: 18px;'; - $cal_table->data[$cal_line][$i] = '-'; - } - } - - if ($week == 0 || $week == 6) { - $cal_table->cellstyle[$cal_line][$week] = 'color: red;'; - } - - $date = sprintf('%04d-%02d-%02d', $display_year, $display_month, $day); - $date_wildcard = sprintf('0001-%02d-%02d', $display_month, $day); - $special_days = ''; - $filter['date'] = [ - $date, - $date_wildcard, - ]; - $filter['order']['field'] = 'date'; - $filter['order']['order'] = 'DESC'; - $special_days = db_get_all_rows_filter('talert_special_days', $filter); - - if ($special_days != '') { - foreach ($special_days as $special_day) { - $cal_table->data[$cal_line][$week] .= '
'; - $cal_table->data[$cal_line][$week] .= $day; - $cal_table->data[$cal_line][$week] .= '
'; - $cal_table->data[$cal_line][$week] .= ui_print_group_icon($special_day['id_group'], true); - - if ($special_day['date'] == $date_wildcard) { - $cal_table->data[$cal_line][$week] .= '('.ui_print_help_tip('This is valid every year. However, this will be ignored if indivisual setting for the same group is available.', true).') '; - } - - $cal_table->data[$cal_line][$week] .= __('Same as '); - switch ($special_day['same_day']) { - case 'monday': - $cal_table->data[$cal_line][$week] .= __('Monday'); - break; - - case 'tuesday': - $cal_table->data[$cal_line][$week] .= __('Tuesday'); - break; - - case 'wednesday': - $cal_table->data[$cal_line][$week] .= __('Wednesday'); - break; - - case 'thursday': - $cal_table->data[$cal_line][$week] .= __('Thursday'); - break; - - case 'friday': - $cal_table->data[$cal_line][$week] .= __('Friday'); - break; - - case 'saturday': - $cal_table->data[$cal_line][$week] .= __('Saturday'); - break; - - case 'sunday': - $cal_table->data[$cal_line][$week] .= __('Sunday'); - break; - } - - // Only show description if is filled. - if (empty($special_day['description']) === false) { - $cal_table->data[$cal_line][$week] .= ui_print_help_tip($special_day['description'], true); - } - - if ($special_day['id_group'] || ($can_manage_group_all && $special_day['id_group'] == 0)) { - $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image( - 'images/config.png', - true, - ['class' => 'invert_filter'] - ).'  '; - $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image( - 'images/cross.png', - true, - ['class' => 'invert_filter'] - ).''; - ; - } - - $cal_table->data[$cal_line][$week] .= '
'; - $cal_table->cellstyle[$cal_line][$week] = 'font-weight: bold;'; - } - } else { - $cal_table->cellstyle[$cal_line][$week] .= 'font-size: 18px;'; - $cal_table->data[$cal_line][$week] = $day.' '; - } - - $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image( - 'images/add_mc.png', - true, - ['class' => 'invert_filter'] - ).''; - - if ($week == 6) { - $cal_line++; - } - } - - for ($padding = ($week + 1); $padding <= 6; $padding++) { - $cal_table->cellstyle[$cal_line][$padding] = 'font-size: 18px;'; - $cal_table->data[$cal_line][$padding] = '-'; - } - - html_print_table($cal_table); -} - -echo '
'; -echo '
'; -html_print_submit_button(__('Create'), 'create', false, 'class="sub next"'); -html_print_input_hidden('create_special_day', 1); -echo ''; -echo '
'; diff --git a/pandora_console/godmode/alerts/configure_alert_special_days.php b/pandora_console/godmode/alerts/configure_alert_special_days.php deleted file mode 100644 index 14d85afc1d..0000000000 --- a/pandora_console/godmode/alerts/configure_alert_special_days.php +++ /dev/null @@ -1,159 +0,0 @@ -width = '100%'; -$table->class = 'databox filters'; - -$table->style = []; -$table->style[0] = 'font-weight: bold'; -$table->size = []; -$table->size[0] = '20%'; -$table->data = []; -$table->data[0][0] = __('Date'); -$table->data[0][1] = html_print_input_text( - 'date', - $date, - '', - 10, - 10, - true -); -$table->data[0][1] .= html_print_image( - 'images/calendar_view_day.png', - true, - [ - 'alt' => 'calendar', - 'onclick' => "scwShow(scwID('text-date'),this);", - 'class' => 'invert_filter', - ] -); -$table->data[1][0] = __('Group'); -$groups = users_get_groups(); -$own_info = get_user_info($config['id_user']); -// Only display group "All" if user is administrator or has "LM" privileges. -if (users_can_manage_group_all('LM')) { - $display_all_group = true; -} else { - $display_all_group = false; -} - -$table->data[1][1] = html_print_select_groups( - false, - 'LW', - $display_all_group, - 'id_group', - $id_group, - '', - '', - 0, - true -); - -$table->data[2][0] = __('Same day of the week'); -$days = []; -$days['monday'] = __('Monday'); -$days['tuesday'] = __('Tuesday'); -$days['wednesday'] = __('Wednesday'); -$days['thursday'] = __('Thursday'); -$days['friday'] = __('Friday'); -$days['saturday'] = __('Saturday'); -$days['sunday'] = __('Sunday'); -$table->data[2][1] = html_print_select( - $days, - 'same_day', - $same_day, - '', - '', - 0, - true, - false, - false -); - -$table->data[3][0] = __('Description'); -$table->data[3][1] = html_print_textarea( - 'description', - 10, - 30, - $description, - '', - true -); - -echo ''; -html_print_table($table); - -echo '
'; -if ($id) { - html_print_input_hidden('id', $id); - html_print_input_hidden('update_special_day', 1); - html_print_input_hidden('id_group_orig', $id_group_orig); - html_print_input_hidden('date_orig', $date_orig); - html_print_submit_button(__('Update'), 'create', false, 'class="sub upd"'); -} else { - html_print_input_hidden('create_special_day', 1); - html_print_submit_button(__('Create'), 'create', false, 'class="sub wand"'); -} - -echo '
'; -echo ''; diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 36767a3e72..4936617b47 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -11,8 +11,11 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// Load global vars +// Load global vars. global $config; + +use PandoraFMS\Calendar; + require_once $config['homedir'].'/include/functions_alerts.php'; require_once $config['homedir'].'/include/functions_users.php'; enterprise_include_once('meta/include/functions_alerts_meta.php'); @@ -288,7 +291,7 @@ function update_template($step) $friday = (bool) get_parameter('friday'); $saturday = (bool) get_parameter('saturday'); $sunday = (bool) get_parameter('sunday'); - $special_day = (bool) get_parameter('special_day'); + $special_day = (int) get_parameter('special_day'); $time_from = (string) get_parameter('time_from'); $time_from = date('H:i:00', strtotime($time_from)); $time_to = (string) get_parameter('time_to'); @@ -418,7 +421,7 @@ $thursday = true; $friday = true; $saturday = true; $sunday = true; -$special_day = false; +$special_day = 0; $default_action = 0; $fields = []; for ($i = 1; $i <= $config['max_macro_fields']; $i++) { @@ -561,7 +564,7 @@ if ($id && ! $create_template) { $friday = (bool) $template['friday']; $saturday = (bool) $template['saturday']; $sunday = (bool) $template['sunday']; - $special_day = (bool) $template['special_day']; + $special_day = (int) $template['special_day']; $max_alerts = $template['max_alerts']; $min_alerts = $template['min_alerts']; $min_alerts_reset_counter = $template['min_alerts_reset_counter']; @@ -671,11 +674,36 @@ if ($step == 2) { ); $table->data[0][2] = __('Use special days list'); - $table->data[0][3] = html_print_checkbox( + $data_special_days = Calendar::calendars( + // Fields. + [ '`talert_calendar`.*' ], + // Filter. + [], + // Count. + false, + // Offset. + null, + // Limit. + null, + // Order. + null, + // Sort field. + null, + // Reduce to a select. + true + ); + + $table->data[0][3] = html_print_select( + $data_special_days, 'special_day', - 1, $special_day, + '', + __('None'), + 0, true, + false, + false, + '', (!$is_management_allowed | $disabled) ); diff --git a/pandora_console/include/class/CalendarManager.class.php b/pandora_console/include/class/CalendarManager.class.php new file mode 100644 index 0000000000..9d5db4e80d --- /dev/null +++ b/pandora_console/include/class/CalendarManager.class.php @@ -0,0 +1,1158 @@ + $msg] + ); + } + + + /** + * Instantiate controller. + * + * @param string $url Utility url. + * @param string|null $ajax_url Ajax url. + */ + public function __construct(string $url, ?string $ajax_url=null) + { + global $config; + $this->access = 'LM'; + + check_login(); + // ACL Check. + if ((bool) check_acl($config['id_user'], 0, $this->access) !== true) { + db_pandora_audit( + 'ACL Violation', + 'Trying to access Alert calendar view' + ); + include 'general/noaccess.php'; + exit; + } + + $this->url = $url; + $this->ajaxUrl = self::BASE_AJAX_PAGE; + + if (empty($ajax_url) === false) { + $this->ajaxUrl = $ajax_url; + } + } + + + /** + * Retrieves a list of. + * + * @param string $tab Active tab. + * + * @return array + */ + public function getTabs(string $tab='list') + { + global $config; + + $buttons = []; + + $buttons['list'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/list.png', + true, + [ + 'title' => __('Alert calendar list'), + 'class' => 'invert_filter', + ] + ).'', + ]; + + $id_calendar = get_parameter('id_calendar', 0); + $id = get_parameter('id', 0); + + $op = get_parameter('op', ''); + $action = get_parameter('action', ''); + + if (($id_calendar !== 0 || $id !== 0)) { + $id = ($id_calendar === 0) ? $id : $id_calendar; + $buttons['list_edit'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/pencil.png', + true, + [ + 'title' => __('Edit calendar'), + 'class' => 'invert_filter', + ] + ).'', + ]; + + $buttons['special_days'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/templates.png', + true, + [ + 'title' => __('Alert special days'), + 'class' => 'invert_filter', + ] + ).'', + ]; + } + + if ($op === 'edit' && $action === '') { + $tab = 'list_edit'; + } + + $buttons[$tab]['active'] = true; + + return $buttons; + } + + + /** + * Execute page and show interface. + * + * @return void + */ + public function run() + { + \ui_require_css_file('alert'); + $op = get_parameter('op'); + $tab = get_parameter('tab_calendar'); + switch ($tab) { + case 'special_days': + if ($op === 'edit') { + if ($this->showSpecialDaysEdition() !== true) { + return; + } + } else if ($op === 'delete') { + $this->deleteSpecialDay(); + } else if ($op === 'upload_ical') { + $this->iCalendarSpecialDay(); + } + + $this->showSpecialDays(); + break; + + case 'list': + default: + if ($op === 'edit') { + if ($this->showCalendarEdition() !== true) { + return; + } + } else if ($op === 'delete') { + $this->deleteCalendar(); + } + + $this->showCalendarList(); + break; + } + + } + + + /** + * Delete calendar + * + * @return void + */ + public function deleteCalendar() + { + $id = (int) get_parameter('id'); + try { + $calendar = new Calendar($id); + if ($id === 0) { + return; + } + } catch (\Exception $e) { + if ($id > 0) { + $this->message = \ui_print_error_message( + \__('Calendar not found: %s', $e->getMessage()), + '', + true + ); + } + + return; + } + + // Remove. + $calendar->delete(); + $this->message = \ui_print_success_message( + \__('Calendar successfully deleted'), + '', + true + ); + } + + + /** + * Delete special day. + * + * @return void + */ + public function deleteSpecialDay() + { + $id = (int) get_parameter('id'); + try { + $specialDay = new SpecialDay($id); + if ($id === 0) { + return; + } + } catch (\Exception $e) { + if ($id > 0) { + $this->message = \ui_print_error_message( + \__('Special day not found: %s', $e->getMessage()), + '', + true + ); + } + + return; + } + + // Remove. + $specialDay->delete(); + $this->message = \ui_print_success_message( + \__('Special day successfully deleted'), + '', + true + ); + } + + + /** + * Icalendar. + * + * @return void + */ + public function iCalendarSpecialDay() + { + include_once 'include/ics-parser/class.iCalReader.php'; + + $day_code = (string) get_parameter('day_code'); + $overwrite = (bool) get_parameter('overwrite', 0); + $values = []; + $values['id_group'] = (string) get_parameter('id_group'); + $values['id_calendar'] = get_parameter('id_calendar'); + $values['day_code'] = $day_code; + $error = $_FILES['ical_file']['error']; + $extension = substr($_FILES['ical_file']['name'], -3); + + if ($error == 0 && strcasecmp($extension, 'ics') == 0) { + $result = true; + $skipped_dates = ''; + $this_month = date('Ym'); + $ical = new \ICal($_FILES['ical_file']['tmp_name']); + $events = $ical->events(); + foreach ($events as $event) { + $event_date = substr($event['DTSTART'], 0, 8); + $event_month = substr($event['DTSTART'], 0, 6); + if ($event_month >= $this_month) { + $values['description'] = @$event['SUMMARY']; + $values['date'] = $event_date; + $date = date('Y-m-d', strtotime($event_date)); + $date_check = ''; + $filter['id_group'] = $values['id_group']; + $filter['date'] = $date; + $filter['id_calendar'] = $values['id_calendar']; + $date_check = db_get_value_filter( + 'date', + 'talert_special_days', + $filter + ); + + if ($date_check === $date) { + if ($overwrite === true) { + $id_special_day = db_get_value_filter( + 'id', + 'talert_special_days', + $filter + ); + try { + $specialDay = new SpecialDay($id_special_day); + $specialDay->date($values['date']); + $specialDay->id_group($values['id_group']); + $specialDay->day_code($values['day_code']); + $specialDay->description($values['description']); + $specialDay->id_calendar($values['id_calendar']); + + if ($specialDay->save() === true) { + $result = true; + } else { + $result = false; + } + } catch (\Exception $e) { + $result = false; + } + } else { + if ($skipped_dates == '') { + $skipped_dates = __('Skipped dates: '); + } + + $skipped_dates .= $date.' '; + } + } else { + try { + $specialDay = new SpecialDay(); + $specialDay->date($values['date']); + $specialDay->id_group($values['id_group']); + $specialDay->day_code($values['day_code']); + $specialDay->description($values['description']); + $specialDay->id_calendar($values['id_calendar']); + + if ($specialDay->save() === true) { + $result = true; + } else { + $result = false; + } + } catch (\Exception $e) { + $result = false; + } + } + } + } + } else { + $result = false; + } + + if ($result === true) { + db_pandora_audit( + 'Special days list', + 'Upload iCalendar '.$_FILES['ical_file']['name'] + ); + } + + $this->message = \ui_print_result_message( + $result, + \__('Success to upload iCalendar').'
'.$skipped_dates, + \__('Fail to upload iCalendar') + ); + } + + + /** + * Show a list of models registered in this system. + * + * @return void + */ + public function showCalendarList() + { + View::render( + 'calendar/list', + [ + 'ajax_url' => $this->ajaxUrl, + 'url' => $this->url, + 'tabs' => $this->getTabs('list'), + 'message' => $this->message, + ] + ); + } + + + /** + * Show a list of network configuration templates. + * + * @return boolean Continue showing list or not. + */ + public function showCalendarEdition() + { + global $config; + $id = (int) get_parameter('id'); + $new = false; + try { + $calendar = new Calendar($id); + if ($id === 0) { + $new = true; + } + } catch (\Exception $e) { + if ($id > 0) { + $this->message = \ui_print_error_message( + \__('Calendar not found: %s', $e->getMessage()), + '', + true + ); + } + + $calendar = new Calendar(); + $new = true; + } + + $action = get_parameter('action'); + if ($action === 'save') { + $success = false; + + $msg_ok = \__('Successfully updated'); + $msg_err = \__('Failed to update'); + if ($new === true) { + $msg_ok = \__('Successfully created'); + $msg_err = \__('Failed to create'); + } + + try { + $name = get_parameter('name', null); + $change_name = true; + if ($new === false && $name === $calendar->name()) { + $change_name = false; + } + + $calendar->name($name); + $calendar->id_group(get_parameter('id_group', null)); + $calendar->description(get_parameter('description', null)); + + if ($change_name === true && empty($calendar->search(['name' => $calendar->name()])) === false) { + $reason = \__( + 'Failed saving calendar: name exists', + $config['dbconnection']->error + ); + } else { + // Save template. + if ($calendar->save() === true) { + $success = true; + } else { + $reason = \__( + 'Failed saving calendar: ', + $config['dbconnection']->error + ); + } + } + } catch (\Exception $e) { + $this->message = \ui_print_error_message( + \__('Error: %s', $e->getMessage()), + '', + true + ); + $success = false; + } + + $this->message .= \ui_print_result_message( + $success, + $msg_ok, + sprintf('%s%s', $msg_err, $reason), + '', + true + ); + + if ($success === true) { + return $success; + } + } + + View::render( + 'calendar/edit', + [ + 'ajax_url' => $this->ajaxUrl, + 'url' => $this->url.'&op=edit&tab_calendar=list', + 'tabs' => $this->getTabs('list'), + 'calendar' => $calendar, + 'message' => $this->message, + 'create' => $new, + ] + ); + + return false; + } + + + /** + * AJAX Method, draws calendar list. + * + * @return void + */ + public function drawListCalendar() + { + global $config; + + // Datatables offset, limit and order. + $filter = get_parameter('filter', []); + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $order = get_datatable_order(true); + + try { + ob_start(); + + $fields = ['`talert_calendar`.*']; + + // Retrieve data. + $data = Calendar::calendars( + // Fields. + $fields, + // Filter. + $filter, + // Count. + false, + // Offset. + $start, + // Limit. + $length, + // Order. + $order['direction'], + // Sort field. + $order['field'] + ); + + // Retrieve counter. + $count = Calendar::calendars( + $fields, + $filter, + true + )['count']; + + $is_management_allowed = \is_management_allowed(); + + if ((bool) $data === true) { + $manage = check_acl( + $config['id_user'], + 0, + 'LM', + true + ); + + $data = array_reduce( + $data, + function ($carry, $item) use ($manage, $is_management_allowed) { + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps + // Transforms array of arrays $data into an array + // of objects, making a post-process of certain fields. + $tmp = (object) $item; + + if ((bool) $manage === true) { + $name = ''; + $name .= $tmp->name; + $name .= ''; + $tmp->name = $name; + } + + $tmp->id_group = \ui_print_group_icon( + $tmp->id_group, + true + ); + + // Options. View. + $tmp->options = ''; + if ((bool) $manage === true) { + if ($is_management_allowed === true) { + // Options. Edit. + $tmp->options .= ''; + $tmp->options .= html_print_image( + 'images/config.png', + true, + [ + 'title' => __('Edit'), + 'class' => 'invert_filter', + ] + ); + $tmp->options .= ''; + } + + // Options. Especial days. + $tmp->options .= ''; + $tmp->options .= html_print_image( + 'images/add.png', + true, + [ + 'title' => __('Special days'), + 'class' => 'invert_filter', + ] + ); + $tmp->options .= ''; + + if ($is_management_allowed === true && $tmp->id != 1) { + // Options. Delete. + $tmp->options .= ''; + $tmp->options .= html_print_image( + 'images/cross.png', + true, + [ + 'title' => __('Delete'), + 'class' => 'invert_filter', + ] + ); + $tmp->options .= ''; + } + } + + $carry[] = $tmp; + return $carry; + } + ); + } + + // Datatables format: RecordsTotal && recordsfiltered. + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (\Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + // If not valid, show error with issue. + json_decode($response); + if (json_last_error() === JSON_ERROR_NONE) { + // If valid dump. + echo $response; + } else { + echo json_encode( + ['error' => $response] + ); + } + + } + + + /** + * Show a list of models registered in this system. + * + * @return void + */ + public function showSpecialDays() + { + global $config; + $id_calendar = (int) get_parameter('id_calendar'); + + $display_range = (int) get_parameter('display_range', 0); + try { + // Datatables offset, limit and order. + if ($display_range === 0) { + $date = date('Y').'-'.date('m').'-1'; + } else { + $date = $display_range.'-1-1'; + } + + $futureDate = date('Y-m-d', strtotime('+1 year', strtotime($date))); + + $filter = []; + $filter['date'] = $date; + $filter['futureDate'] = $futureDate; + $filter['id_calendar'] = $id_calendar; + if (!is_user_admin($config['id_user'])) { + $filter['id_group'] = array_keys( + users_get_groups(false, 'LM') + ); + } + + $fields = ['`talert_special_days`.*']; + + $specialDays = specialDay::specialDays( + // Fields. + $fields, + // Filter. + $filter, + // Count. + false, + // Offset. + null, + // Limit. + null, + // Order. + null, + // Sort field. + null, + // Reduce array. + true + ); + } catch (\Exception $e) { + if ($id_calendar > 0) { + $this->message = \ui_print_error_message( + \__('Special days not found: %s', $e->getMessage()), + '', + true + ); + } + } + + View::render( + 'calendar/special_days', + [ + 'ajax_url' => $this->ajaxUrl, + 'url' => $this->url.'&tab_calendar=special_days', + 'tabs' => $this->getTabs('special_days'), + 'message' => $this->message, + 'specialDays' => $specialDays, + 'id_calendar' => $id_calendar, + 'display_range' => $display_range, + ] + ); + } + + + /** + * Show form special day. + * + * @return boolean Continue showing list or not. + */ + public function showSpecialDaysEdition() + { + global $config; + + $id = (int) get_parameter('id'); + $new = false; + try { + $specialDay = new SpecialDay($id); + if ($id === 0) { + $specialDay->date(get_parameter('date', null)); + $specialDay->id_calendar(get_parameter('id_calendar', null)); + $new = true; + } + } catch (\Exception $e) { + if ($id > 0) { + $this->message = \ui_print_error_message( + \__('SpecialDay not found: %s', $e->getMessage()), + '', + true + ); + } + + $specialDay = new SpecialDay(); + $new = true; + } + + $action = get_parameter('action'); + if ($action === 'save') { + $success = false; + + $msg_ok = \__('Successfully updated'); + $msg_err = \__('Failed to update'); + if ($new === true) { + $msg_ok = \__('Successfully created'); + $msg_err = \__('Failed to create'); + } + + try { + $date = get_parameter('date', null); + $id_group = get_parameter('id_group', null); + $day_code = get_parameter('day_code', null); + $id_calendar = get_parameter('id_calendar', null); + $description = get_parameter('description', null); + $change = true; + if ($new === false + && ($date === $specialDay->date() + || $id_group === $specialDay->id_group() + || $day_code === $specialDay->day_code()) + ) { + $change = false; + } + + $specialDay->date($date); + $specialDay->id_group($id_group); + $specialDay->day_code($day_code); + $specialDay->description($description); + $specialDay->id_calendar($id_calendar); + + $search = specialDay::specialDays( + [ '`talert_special_days`.*' ], + [ + 'date_match' => $specialDay->date(), + 'id_group' => [$specialDay->id_group()], + 'day_code' => $specialDay->day_code(), + ] + ); + + if ($change === true && empty($search) === false) { + $reason = \__( + 'Failed saving calendar: already exists', + $config['dbconnection']->error + ); + } else { + // Save template. + if ($specialDay->save() === true) { + $success = true; + } else { + $reason = \__( + 'Failed saving special day: ', + $config['dbconnection']->error + ); + } + } + } catch (\Exception $e) { + $this->message = \ui_print_error_message( + \__('Error: %s', $e->getMessage()), + '', + true + ); + $success = false; + } + + $this->message .= \ui_print_result_message( + $success, + $msg_ok, + sprintf('%s%s', $msg_err, $reason), + '', + true + ); + + if ($success === true) { + return $success; + } + } + + View::render( + 'calendar/special_days_edit', + [ + 'ajax_url' => $this->ajaxUrl, + 'url' => $this->url.'&id_calendar='.$specialDay->id_calendar().'&op=edit&tab_calendar=special_days', + 'tabs' => $this->getTabs('special_days'), + 'specialDay' => $specialDay, + 'message' => $this->message, + 'create' => $new, + 'id_calendar' => $specialDay->id_calendar(), + ] + ); + + return false; + } + + + /** + * AJAX Method, draw Alert Template list. + * + * @return void + */ + public function drawAlertTemplates() + { + global $config; + $date = get_parameter('date', ''); + $id_group = get_parameter('id_group', 0); + $day_code = get_parameter('day_code', ''); + $id_calendar = get_parameter('id_calendar', 0); + + $weekdays = [ + 1 => 'monday', + 2 => 'tuesday', + 3 => 'wednesday', + 4 => 'thursday', + 5 => 'friday', + 6 => 'saturday', + 7 => 'sunday', + 8 => 'holidays', + ]; + + $output = '

'.__('Same as %s', $weekdays[$day_code]); + $output .= ' » '; + $output .= __('Templates not being fired'); + $output .= '

'; + + $columns = [ + 'name', + 'id_group', + 'type', + 'monday', + 'tuesday', + 'wednesday', + 'thursday', + 'friday', + 'saturday', + 'sunday', + ]; + + $column_names = [ + __('Name'), + __('Group'), + __('Type'), + __('Mon'), + __('Tue'), + __('Wed'), + __('Thu'), + __('Fri'), + __('Sat'), + __('Sun'), + ]; + try { + $output .= ui_print_datatable( + [ + 'id' => 'templates_alerts_special_days', + 'return' => true, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => 'godmode/alerts/alert_special_days', + 'ajax_data' => [ + 'method' => 'dataAlertTemplates', + 'day_code' => $day_code, + 'id_calendar' => $id_calendar, + 'id_group' => $id_group, + ], + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'name', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Type'), + 'type' => 'select', + 'name' => 'type', + 'fields' => alerts_get_alert_templates_types(), + 'selected' => 0, + 'nothing' => 'None', + 'nothing_value' => 0, + ], + [ + 'label' => __('Search'), + 'type' => 'text', + 'class' => 'mw250px', + 'id' => 'name', + 'name' => 'name', + ], + ], + ], + ] + ); + } catch (Exception $e) { + $output .= $e->getMessage(); + } + + echo $output; + + return; + } + + + /** + * AJAX Method, draw Alert Template list. + * + * @return array + */ + public function dataAlertTemplates() + { + global $config; + $filters = get_parameter('filter', []); + if (empty($filters['type']) === false) { + $filter['type'] = $filters['type']; + } + + if (empty($filters['name']) === false) { + $filter[] = "name LIKE '%".$filters['name']."%'"; + } + + $id_calendar = (int) get_parameter('id_calendar', 0); + $id_group = (int) get_parameter('id_group', 0); + $filter['special_day'] = $id_calendar; + + if ($id_group !== 0) { + $filter['id_group'] = $id_group; + } + + $templates = alerts_get_alert_templates($filter); + + $count = alerts_get_alert_templates($filter, ['COUNT(*) AS total']); + + $day_code = get_parameter('day_code', ''); + + $weekdays = [ + 1 => 'monday', + 2 => 'tuesday', + 3 => 'wednesday', + 4 => 'thursday', + 5 => 'friday', + 6 => 'saturday', + 7 => 'sunday', + ]; + + $data = []; + if (empty($templates) === false) { + foreach ($templates as $template) { + if ((bool) $template[$weekdays[$day_code]] === false) { + $data[] = [ + 'name' => $template['name'], + 'id_group' => ui_print_group_icon( + $template['id_group'], + true + ), + 'type' => $template['type'], + 'monday' => (bool) $template['monday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'tuesday' => (bool) $template['tuesday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'wednesday' => (bool) $template['wednesday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'thursday' => (bool) $template['thursday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'friday' => (bool) $template['friday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'saturday' => (bool) $template['saturday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + 'sunday' => (bool) $template['sunday'] === true + ? html_print_image( + 'images/tick.png', + true, + ['class' => 'invert_filter'] + ) + : '', + ]; + } + } + } + + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count[0]['total'], + 'recordsFiltered' => count($data), + ] + ); + + return $data; + } + + +} diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php index 6ca454695d..19aff75cce 100644 --- a/pandora_console/include/functions_alerts.php +++ b/pandora_console/include/functions_alerts.php @@ -2380,118 +2380,6 @@ function get_alert_last_fire_timestamp_in_period($id_alert_module, $period, $dat } -/** - * Insert in talert_special_days a new special day. - * - * @param date of special day. - * @param same day of the week. - * @param mixed A single value or array of values to insert (can be a multiple a mount of rows). - * - * @return mixed False in case of error or invalid values passed. Affected rows otherwise. - */ -function alerts_create_alert_special_day($date, $same_day, $values=false) -{ - if (empty($date)) { - return false; - } - - if (empty($same_day)) { - return false; - } - - if (! is_array($values)) { - $values = []; - } - - global $config; - $date_db = ''; - - switch ($config['dbtype']) { - case 'mysql': - $date_db = 'date'; - break; - - case 'oracle': - $date_db = '"date"'; - break; - } - - $values[$date_db] = $date; - $values['same_day'] = $same_day; - - return @db_process_sql_insert('talert_special_days', $values); -} - - -/** - * Update a special day in talert_special_days. - * - * @param int special day Id. - * @param mixed Array of values to update. - * - * @return mixed False in case of error or invalid values passed. Affected rows otherwise - */ -function alerts_update_alert_special_day($id_special_day, $values) -{ - $id_special_day = safe_int($id_special_day, 1); - - if (empty($id_special_day)) { - return false; - } - - if (! is_array($values)) { - return false; - } - - return (@db_process_sql_update( - 'talert_special_days', - $values, - ['id' => $id_special_day] - )) !== false; -} - - -/** - * Delete a special day in talert_special_days. - * - * @param int special day Id. - * - * @return mixed False in case of error or invalid values passed. Affected rows otherwise - */ -function alerts_delete_alert_special_day($id_special_day) -{ - $id_special_day = safe_int($id_special_day, 1); - - if (empty($id_special_day)) { - return false; - } - - return (@db_process_sql_delete( - 'talert_special_days', - ['id' => $id_special_day] - )) !== false; -} - - -/** - * Get a special day in talert_special_days. - * - * @param int special day Id. - * - * @return mixed False in case of error or invalid values passed. All row of the selected command otherwise - */ -function alerts_get_alert_special_day($id_special_day) -{ - $id_special_day = safe_int($id_special_day, 1); - - if (empty($id_special_day)) { - return false; - } - - return db_get_row('talert_special_days', 'id', $id_special_day); -} - - /** * Get number of alert fired that an action is executed. Only fot non default alerts * diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 0ee513a877..bfdc8c712e 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -55,6 +55,7 @@ enterprise_include_once('include/functions_alerts.php'); // Clases. use PandoraFMS\Module; use PandoraFMS\Enterprise\Cluster; +use PandoraFMS\SpecialDay; /** @@ -14131,7 +14132,7 @@ function api_get_special_days($thrash1, $thrash2, $other, $thrash3) * * @param $thrash1 Don't use. * @param $thrash2 Don't use. - * @param array $other it's array, $other as param is ;;;; in this order + * @param array $other it's array, $other as param is ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * @param $thrash3 Don't use * @@ -14150,6 +14151,7 @@ function api_set_create_special_day($thrash1, $thrash2, $other, $thrash3) $same_day = $other['data'][1]; $description = $other['data'][2]; $idGroup = $other['data'][3]; + $calendar_name = (isset($other['data'][4]) === true) ? $other['data'][4] : 'Default'; if (!check_acl($config['id_user'], $idGroup, 'LM', true)) { returnError('forbidden', 'string'); @@ -14186,17 +14188,51 @@ function api_set_create_special_day($thrash1, $thrash2, $other, $thrash3) } } - $values = [ - 'description' => $other['data'][2], - 'id_group' => $other['data'][3], + $weekdays = [ + 'monday' => 1, + 'tuesday' => 2, + 'wednesday' => 3, + 'thursday' => 4, + 'friday' => 5, + 'saturday' => 6, + 'sunday' => 7, + 'holiday' => 8, ]; - $idSpecialDay = alerts_create_alert_special_day($special_day, $same_day, $values); + $day_code = (isset($weekdays[$same_day]) === true) ? $weekdays[$same_day] : 0; - if (is_error($idSpecialDay)) { - returnError('Special Day could not be created'); - } else { - returnData('string', ['type' => 'string', 'data' => $idSpecialDay]); + if ($day_code === 0) { + returnError('Special Day could not be created. Same day doesn\'t exists.'); + return; + } + + $id_calendar = db_get_value_sql( + sprintf( + 'SELECT id FROM talert_calendar WHERE name="%s"', + $calendar_name + ) + ); + + if ($id_calendar === false) { + returnError('Special Day could not be created. Calendar doesn\'t exists.'); + return; + } + + try { + $sd = new SpecialDay(); + $sd->date($special_day); + $sd->id_group($idGroup); + $sd->day_code($day_code); + $sd->description($description); + $sd->id_calendar($id_calendar); + $sd->save(); + if ($sd->save() === true) { + returnData('string', ['type' => 'string', 'data' => $sd->id()]); + } else { + returnError('Special Day could not be created'); + } + } catch (Exception $e) { + returnData('string', ['type' => 'string', 'data' => $e]); } } @@ -14693,7 +14729,7 @@ function api_set_recreate_service_modules($id, $id_agent) * * @param string $id Id of the special day to update. * @param $thrash2 Don't use. - * @param array $other it's array, $other as param is ;;;; in this order + * @param array $other it's array, $other as param is ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * @param $thrash3 Don't use * @@ -14709,9 +14745,10 @@ function api_set_update_special_day($id_special_day, $thrash2, $other, $thrash3) } $special_day = $other['data'][0]; - $same_day = $other['data'][1]; + $day_code = $other['data'][1]; $description = $other['data'][2]; $idGroup = $other['data'][3]; + $id_calendar = $other['data'][4]; if (!check_acl($config['id_user'], $idGroup, 'LM', true)) { returnError('forbidden', 'string'); @@ -14742,24 +14779,22 @@ function api_set_update_special_day($id_special_day, $thrash2, $other, $thrash3) return; } - $return = db_process_sql_update( - 'talert_special_days', - [ - 'date' => $special_day, - 'same_day' => $same_day, - 'description' => $description, - 'id_group' => $idGroup, - ], - ['id' => $id_special_day] - ); - - returnData( - 'string', - [ - 'type' => 'string', - 'data' => (int) ((bool) $return), - ] - ); + try { + $sd = new SpecialDay(); + $sd->date($special_day); + $sd->id_group($idGroup); + $sd->day_code($day_code); + $sd->description($description); + $sd->id_calendar($id_calendar); + $sd->save(); + if ($sd->save() === true) { + returnError('Special Day could not be updated'); + } else { + returnData('string', ['type' => 'string', 'data' => $sd->id()]); + } + } catch (Exception $e) { + returnData('string', ['type' => 'string', 'data' => $e]); + } } @@ -14805,13 +14840,20 @@ function api_set_delete_special_day($id_special_day, $thrash2, $thrash3, $thrash return; } - $return = alerts_delete_alert_special_day($id_special_day); + try { + $specialDay = new SpecialDay($id_special_day); + } catch (\Exception $e) { + if ($id > 0) { + returnError('The Special Day could not be deleted.'); + } - if (is_error($return)) { - returnError('The Special Day could not be deleted.'); - } else { - returnData('string', ['type' => 'string', 'data' => $return]); + return; } + + // Remove. + $specialDay->delete(); + $return = 'success'; + returnData('string', ['type' => 'string', 'data' => $return]); } diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 804bf56024..06d56df4ed 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4032,15 +4032,19 @@ function html_print_input_file($name, $return=false, $options=false) if ($options) { if (isset($options['size'])) { - $output .= 'size="'.$options['size'].'"'; + $output .= ' size="'.$options['size'].'"'; } if (isset($options['disabled'])) { - $output .= 'disabled="disabled"'; + $output .= ' disabled="disabled"'; } if (isset($options['class'])) { - $output .= 'class="'.$options['class'].'"'; + $output .= ' class="'.$options['class'].'"'; + } + + if (isset($options['required'])) { + $output .= ' required'; } } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index bb4193a9b7..03ec3ee614 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3591,19 +3591,87 @@ function ui_print_datatable(array $parameters) // Order. $err_msg = '
'; $output = $err_msg.$filter.$extra.$table.$js; + if (is_ajax() === false) { + ui_require_css_file('datatables.min', 'include/styles/js/'); + ui_require_css_file('tables'); + if (is_metaconsole()) { + ui_require_css_file('tables_meta', ENTERPRISE_DIR.'/include/styles/'); + } - ui_require_css_file('datatables.min', 'include/styles/js/'); - ui_require_css_file('tables'); - if (is_metaconsole()) { - ui_require_css_file('tables_meta', ENTERPRISE_DIR.'/include/styles/'); + ui_require_javascript_file('datatables.min'); + ui_require_javascript_file('buttons.dataTables.min'); + ui_require_javascript_file('dataTables.buttons.min'); + ui_require_javascript_file('buttons.html5.min'); + ui_require_javascript_file('buttons.print.min'); + } else { + // Load tables.css. + $output .= ''; + if (is_metaconsole() === true) { + // Load tables_meta.css. + $output .= ''; + } + + // Load datatables.js. + $output .= ''; + // Load buttons.dataTables.min.js. + $output .= ''; + // Load dataTables.buttons.min.js. + $output .= ''; + // Load buttons.html5.min.js. + $output .= ''; + // Load buttons.print.min.js. + $output .= ''; } - ui_require_javascript_file('datatables.min'); - ui_require_javascript_file('buttons.dataTables.min'); - ui_require_javascript_file('dataTables.buttons.min'); - ui_require_javascript_file('buttons.html5.min'); - ui_require_javascript_file('buttons.print.min'); - if (isset($parameters['return']) && $parameters['return'] == true) { // Compat. $parameters['print'] = false; diff --git a/pandora_console/include/javascript/pandora_alerts.js b/pandora_console/include/javascript/pandora_alerts.js index 7ecded70c8..b527067290 100644 --- a/pandora_console/include/javascript/pandora_alerts.js +++ b/pandora_console/include/javascript/pandora_alerts.js @@ -1,5 +1,4 @@ -/* globals $ */ - +/* globals $ confirmDialog uniqId showMsg*/ function parse_alert_command(command, classs) { if (classs == "recovery") { classs = "fields_recovery"; @@ -36,21 +35,64 @@ function parse_alert_command(command, classs) { return command; } +// eslint-disable-next-line no-unused-vars function render_command_preview(original_command) { $("#textarea_command_preview").html( parse_alert_command(original_command, "") ); } +// eslint-disable-next-line no-unused-vars function render_command_recovery_preview(original_command) { $("#textarea_command_recovery_preview").html( parse_alert_command(original_command, "recovery") ); } +// eslint-disable-next-line no-unused-vars function render_command_description(command_description) { if (command_description != "") { command_description = "
" + command_description; } $("#command_description").html(command_description); } + +// eslint-disable-next-line no-unused-vars +function load_templates_alerts_special_days(settings) { + confirmDialog({ + title: settings.title, + message: function() { + var id = "div-" + uniqId(); + $.ajax({ + method: "post", + url: settings.url, + data: { + page: settings.page, + method: "drawAlertTemplates", + date: settings.date, + id_group: settings.id_group, + day_code: settings.day_code, + id_calendar: settings.id_calendar + }, + datatype: "html", + success: function(data) { + $("#" + id) + .empty() + .html(data); + }, + error: function(e) { + showMsg(e); + } + }); + + return "
" + settings.loading + "
"; + }, + ok: settings.btn_ok_text, + cancel: settings.btn_cancel_text, + onAccept: function() { + $("#" + settings.name_form).submit(); + }, + size: 750, + maxHeight: 500 + }); +} diff --git a/pandora_console/include/lib/Calendar.php b/pandora_console/include/lib/Calendar.php new file mode 100644 index 0000000000..3b6b1560fe --- /dev/null +++ b/pandora_console/include/lib/Calendar.php @@ -0,0 +1,274 @@ + $id]; + + $this->existsInDB = false; + + if (is_numeric($id) === true + && $id > 0 + ) { + parent::__construct( + $table, + $filter, + null, + false + ); + $this->existsInDB = true; + } else { + // Create empty skel. + parent::__construct($table, null); + } + } + + + /** + * Saves current definition to database. + * + * @return mixed Affected rows of false in case of error. + * @throws \Exception On error. + */ + public function save() + { + if ($this->fields['id'] > 0) { + // Update. + $updates = $this->fields; + + $rs = \db_process_sql_update( + $this->table, + $updates, + ['id' => $this->fields['id']] + ); + + if ($rs === false) { + global $config; + throw new \Exception( + __METHOD__.' error: '.$config['dbconnection']->error + ); + } + } else { + // Creation. + $inserts = $this->fields; + + // Clean null fields. + foreach ($inserts as $k => $v) { + if ($v === null) { + unset($inserts[$k]); + } + } + + $rs = \db_process_sql_insert( + $this->table, + $inserts + ); + + if ($rs === false) { + global $config; + throw new \Exception( + __METHOD__.' error: '.$config['dbconnection']->error + ); + } + + $this->fields['id'] = $rs; + } + + return true; + } + + + /** + * Remove this calendar. + * + * @return void + */ + public function delete() + { + if ($this->existsInDB === true) { + \db_process_delete_temp( + $this->table, + 'id', + $this->fields['id'] + ); + } + } + + + /** + * Returns an array with all calendar filtered. + * + * @param array $fields Fields array or 'count' keyword to retrieve count. + * @param array $filter Filters to be applied. + * @param boolean $count Retrieve count of items instead results. + * @param integer $offset Offset (pagination). + * @param integer $limit Limit (pagination). + * @param string $order Sort order. + * @param string $sort_field Sort field. + * @param boolean $select_options Array options for select. + * + * @return array With all results. + * @throws \Exception On error. + */ + public static function calendars( + array $fields=[ '`talert_calendar`.*' ], + array $filter=[], + bool $count=false, + ?int $offset=null, + ?int $limit=null, + ?string $order=null, + ?string $sort_field=null, + ?bool $select_options=false + ) { + $sql_filters = []; + $order_by = ''; + $pagination = ''; + + if (isset($filter['free_search']) === true + && empty($filter['free_search']) === false + ) { + $sql_filters[] = vsprintf( + ' AND (`talert_calendar`.`name` like "%%%s%%" + OR `talert_calendar`.`description` like "%%%s%%")', + array_fill(0, 2, $filter['free_search']) + ); + } + + if (isset($order) === true) { + $dir = 'asc'; + if ($order === 'desc') { + $dir = 'desc'; + }; + + if (in_array( + $sort_field, + [ 'name' ] + ) === true + ) { + $order_by = sprintf( + 'ORDER BY `talert_calendar`.`%s` %s', + $sort_field, + $dir + ); + } else { + // Custom field order. + $order_by = sprintf( + 'ORDER BY `%s` %s', + $sort_field, + $dir + ); + } + } + + if (isset($limit) === true && $limit > 0 + && isset($offset) === true && $offset >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $limit, + $offset + ); + } + + $sql = sprintf( + 'SELECT %s + FROM `talert_calendar` + WHERE 1=1 + %s + %s + %s', + join(',', $fields), + join(' ', $sql_filters), + $order_by, + $pagination + ); + + if ($count === true) { + $sql = sprintf('SELECT count(*) as n FROM ( %s ) tt', $sql); + + return ['count' => \db_get_value_sql($sql)]; + } + + $return = \db_get_all_rows_sql($sql); + + if (is_array($return) === false) { + return []; + } + + if ($select_options === true) { + $return = array_reduce( + $return, + function ($carry, $item) { + $carry[$item['id']] = $item['name']; + return $carry; + } + ); + } + + return $return; + } + + +} diff --git a/pandora_console/include/lib/SpecialDay.php b/pandora_console/include/lib/SpecialDay.php new file mode 100644 index 0000000000..bd7816b94c --- /dev/null +++ b/pandora_console/include/lib/SpecialDay.php @@ -0,0 +1,310 @@ + $id]; + + $this->existsInDB = false; + + if (is_numeric($id) === true + && $id > 0 + ) { + parent::__construct( + $table, + $filter, + null, + false + ); + $this->existsInDB = true; + } else { + // Create empty skel. + parent::__construct($table, null); + } + } + + + /** + * Saves current definition to database. + * + * @return mixed Affected rows of false in case of error. + * @throws \Exception On error. + */ + public function save() + { + if ($this->fields['id'] > 0) { + // Update. + $updates = $this->fields; + + $rs = \db_process_sql_update( + $this->table, + $updates, + ['id' => $this->fields['id']] + ); + + if ($rs === false) { + global $config; + throw new \Exception( + __METHOD__.' error: '.$config['dbconnection']->error + ); + } + } else { + // Creation. + $inserts = $this->fields; + + // Clean null fields. + foreach ($inserts as $k => $v) { + if ($v === null) { + unset($inserts[$k]); + } + } + + $rs = \db_process_sql_insert( + $this->table, + $inserts + ); + + if ($rs === false) { + global $config; + throw new \Exception( + __METHOD__.' error: '.$config['dbconnection']->error + ); + } + + $this->fields['id'] = $rs; + } + + return true; + } + + + /** + * Remove this Special day. + * + * @return void + */ + public function delete() + { + if ($this->existsInDB === true) { + \db_process_delete_temp( + $this->table, + 'id', + $this->fields['id'] + ); + } + } + + + /** + * Returns an array with all special days filtered. + * + * @param array $fields Fields array or 'count' keyword to retrieve count. + * @param array $filter Filters to be applied. + * @param boolean $count Retrieve count of items instead results. + * @param integer $offset Offset (pagination). + * @param integer $limit Limit (pagination). + * @param string $order Sort order. + * @param string $sort_field Sort field. + * @param boolean $reduce Reduce result [Year][month][day]. + * + * @return array With all results. + * @throws \Exception On error. + */ + public static function specialDays( + array $fields=[ '`talert_special_days`.*' ], + array $filter=[], + bool $count=false, + ?int $offset=null, + ?int $limit=null, + ?string $order=null, + ?string $sort_field=null, + ?bool $reduce=false + ) { + $sql_filters = []; + $order_by = ''; + $pagination = ''; + + if (isset($filter['free_search']) === true + && empty($filter['free_search']) === false + ) { + $sql_filters[] = vsprintf( + ' AND `talert_special_days`.`name` like "%%%s%%"', + array_fill(0, 1, $filter['free_search']) + ); + } + + if (isset($filter['id_calendar']) === true + && empty($filter['id_calendar']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`id_calendar` = %d', + $filter['id_calendar'] + ); + } + + if (isset($filter['date']) === true + && empty($filter['date']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`date` >= "%s"', + $filter['date'] + ); + } + + if (isset($filter['futureDate']) === true + && empty($filter['futureDate']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`date` <= "%s"', + $filter['futureDate'] + ); + } + + if (isset($filter['id_group']) === true + && empty($filter['id_group']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`id_group` IN ("%s")', + implode(',', $filter['id_group']) + ); + } + + if (isset($filter['date_match']) === true + && empty($filter['date_match']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`date` = "%s"', + $filter['date_match'] + ); + } + + if (isset($filter['day_code']) === true + && empty($filter['day_code']) === false + ) { + $sql_filters[] = sprintf( + ' AND `talert_special_days`.`day_code` = %d', + $filter['day_code'] + ); + } + + if (isset($order) === true) { + $dir = 'asc'; + if ($order === 'desc') { + $dir = 'desc'; + }; + + if (in_array( + $sort_field, + [ 'name' ] + ) === true + ) { + $order_by = sprintf( + 'ORDER BY `talert_special_days`.`%s` %s', + $sort_field, + $dir + ); + } else { + // Custom field order. + $order_by = sprintf( + 'ORDER BY `%s` %s', + $sort_field, + $dir + ); + } + } + + if (isset($limit) === true && $limit > 0 + && isset($offset) === true && $offset >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $limit, + $offset + ); + } + + $sql = sprintf( + 'SELECT %s + FROM `talert_special_days` + WHERE 1=1 + %s + %s + %s', + join(',', $fields), + join(' ', $sql_filters), + $order_by, + $pagination + ); + + if ($count === true) { + $sql = sprintf('SELECT count(*) as n FROM ( %s ) tt', $sql); + + return ['count' => \db_get_value_sql($sql)]; + } + + $return = \db_get_all_rows_sql($sql); + + if (is_array($return) === false) { + return []; + } + + if ($reduce === true) { + $return = array_reduce( + $return, + function ($carry, $item) { + $year = date('Y', strtotime($item['date'])); + $month = date('n', strtotime($item['date'])); + $day = date('j', strtotime($item['date'])); + $carry[$year][$month][$day][] = $item; + return $carry; + } + ); + } + + return $return; + } + + +} diff --git a/pandora_console/include/styles/alert.css b/pandora_console/include/styles/alert.css index 52320eb741..a18d1eb9d6 100644 --- a/pandora_console/include/styles/alert.css +++ b/pandora_console/include/styles/alert.css @@ -292,3 +292,54 @@ div#rules.show { #rules select.click-list-elements:focus { outline-color: transparent; } + +#icalendar-special-days { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; + background-color: #fff; + border: 1px solid #e1e1e1; + border-radius: 5px; + padding: 20px 50px; +} + +#icalendar-special-days ul.wizard { + flex: 0; +} + +#icalendar-special-days ul.wizard:first-child { + flex: 1 1 100%; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; + margin-right: 80px; +} + +.note-special-day { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + align-content: center; +} + +.note-special-day div { + display: flex; + flex-direction: row; + align-items: center; + align-content: center; +} + +.note-special-day div a.tip { + margin: 0px; + margin-right: 2px; +} + +.note-special-day div a.tip > img { + margin: 0px; +} diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index d40975cd1f..c75a4c616e 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -570,16 +570,31 @@ CREATE TABLE IF NOT EXISTS `talert_template_module_actions` ( ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- ----------------------------------------------------- +-- Table `talert_calendar` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `talert_calendar` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL default '', + `id_group` INT(10) NOT NULL DEFAULT 0, + `description` text, + PRIMARY KEY (`id`), + UNIQUE (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + -- ----------------------------------------------------- -- Table `talert_special_days` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `talert_special_days` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `id_calendar` int(10) unsigned NOT NULL DEFAULT 1, `id_group` INT(10) NOT NULL DEFAULT 0, `date` date NOT NULL DEFAULT '1970-01-01', - `same_day` enum('monday','tuesday','wednesday','thursday','friday','saturday','sunday') NOT NULL DEFAULT 'sunday', + `day_code` tinyint(2) NOT NULL, `description` text, - PRIMARY KEY (`id`) + PRIMARY KEY (`id`), + FOREIGN KEY (`id_calendar`) REFERENCES talert_calendar(`id`) + ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ----------------------------------------------------- diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 69802ec826..da203476bd 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -2777,3 +2777,5 @@ INSERT INTO `tncm_script` VALUES (5,5,'enable expect:Password:\s* _enablepass_ term length 0 config term end end exit '); INSERT INTO `tncm_template_scripts`(`id_template`, `id_script`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5); + +INSERT INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar'); diff --git a/pandora_console/views/calendar/edit.php b/pandora_console/views/calendar/edit.php new file mode 100644 index 0000000000..17d25fa97b --- /dev/null +++ b/pandora_console/views/calendar/edit.php @@ -0,0 +1,140 @@ +'; + $url_link .= __('metaconsole'); + $url_link .= ''; + } else { + $url_link = __('any node'); + } + + \ui_print_warning_message( + __( + 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.', + $url_link + ) + ); +} + +if (empty($message) === false) { + echo $message; +} + +$inputs = []; + +// Name. +$inputs[] = [ + 'label' => __('Name'), + 'arguments' => [ + 'type' => 'text', + 'name' => 'name', + 'required' => true, + 'value' => $calendar->name(), + ], +]; + +// Group. +$inputs[] = [ + 'label' => __('Group'), + 'arguments' => [ + 'type' => 'select_groups', + 'returnAllGroup' => true, + 'name' => 'id_group', + 'selected' => $calendar->id_group(), + 'required' => true, + ], +]; + +// Description. +$inputs[] = [ + 'label' => __('Description'), + 'arguments' => [ + 'type' => 'textarea', + 'name' => 'description', + 'required' => false, + 'value' => $calendar->description(), + 'rows' => 50, + 'columns' => 30, + ], +]; + + +if ($is_management_allowed === true) { + // Submit. + $inputs[] = [ + 'arguments' => [ + 'name' => 'button', + 'label' => (($create === true) ? __('Create') : __('Update')), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + ], + ]; +} + +// Print form. +HTML::printForm( + [ + 'form' => [ + 'action' => $url.'&op=edit&action=save&id='.$calendar->id(), + 'method' => 'POST', + ], + 'inputs' => $inputs, + ], + false, + true +); + +\enterprise_hook('close_meta_frame'); diff --git a/pandora_console/views/calendar/list.php b/pandora_console/views/calendar/list.php new file mode 100644 index 0000000000..80a1811b8f --- /dev/null +++ b/pandora_console/views/calendar/list.php @@ -0,0 +1,154 @@ +'; + $url_link .= __('metaconsole'); + $url_link .= ''; + } else { + $url_link = __('any node'); + } + + \ui_print_warning_message( + __( + 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.', + $url_link + ) + ); +} + +if (empty($message) === false) { + echo $message; +} + +// Datatables list. +try { + $columns = [ + [ + 'text' => 'id', + 'class' => 'invisible', + ], + 'name', + 'id_group', + 'description', + [ + 'text' => 'options', + 'class' => 'w150px action_buttons', + ], + ]; + + $column_names = [ + __('ID'), + __('Name'), + __('Group'), + __('Description'), + __('Options'), + ]; + + $tableId = 'calendar_list'; + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $tableId, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => $ajax_url, + 'ajax_data' => ['method' => 'drawListCalendar'], + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'id', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Free search'), + 'type' => 'text', + 'class' => 'mw250px', + 'id' => 'free_search', + 'name' => 'free_search', + ], + ], + ], + ] + ); +} catch (Exception $e) { + echo $e->getMessage(); +} + +if ((bool) check_acl($config['id_user'], 0, 'LM') === true) { + HTML::printForm( + [ + 'form' => [ + 'action' => $url.'&op=edit', + 'method' => 'POST', + ], + 'inputs' => [ + [ + 'arguments' => [ + 'name' => 'button', + 'label' => __('Create'), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + ], + ], + ], + ] + ); +} + +\enterprise_hook('close_meta_frame'); diff --git a/pandora_console/views/calendar/special_days.php b/pandora_console/views/calendar/special_days.php new file mode 100644 index 0000000000..4c50485d67 --- /dev/null +++ b/pandora_console/views/calendar/special_days.php @@ -0,0 +1,515 @@ +'; + $url_link .= __('metaconsole'); + $url_link .= ''; + } else { + $url_link = __('any node'); + } + + \ui_print_warning_message( + __( + 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.', + $url_link + ) + ); +} + +if (empty($message) === false) { + echo $message; +} + +$inputs = []; + +// Name. +$inputs[] = [ + 'label' => __('iCalendar(.ics) file'), + 'arguments' => [ + 'name' => 'ical_file', + 'type' => 'file', + 'columns' => 25, + 'rows' => 10, + 'options' => ['required' => 1], + ], +]; + +$days = []; +$days['monday'] = __('Monday'); +$days['tuesday'] = __('Tuesday'); +$days['wednesday'] = __('Wednesday'); +$days['thursday'] = __('Thursday'); +$days['friday'] = __('Friday'); +$days['saturday'] = __('Saturday'); +$days['sunday'] = __('Sunday'); + +// Same day of the week. +$inputs[] = [ + 'label' => __('Same day of the week'), + 'arguments' => [ + 'name' => 'day_code', + 'type' => 'select', + 'fields' => $days, + ], +]; + +// Group. +$inputs[] = [ + 'label' => __('Group'), + 'arguments' => [ + 'type' => 'select_groups', + 'returnAllGroup' => true, + 'name' => 'id_group', + ], +]; + +// Group. +$inputs[] = [ + 'label' => __('Overwrite').ui_print_help_tip( + __('Check this box, if you want to overwrite existing same days.'), + true + ), + 'arguments' => [ + 'type' => 'checkbox', + 'name' => 'overwrite', + 'id' => 'overwrite', + 'disabled_hidden' => true, + ], +]; + +// Submit. +$inputs[] = [ + 'arguments' => [ + 'name' => 'button', + 'label' => __('Upload'), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + ], +]; + +if ($is_management_allowed === true) { + // Print form. + HTML::printForm( + [ + 'form' => [ + 'action' => $url.'&op=upload_ical&id='.$id_calendar, + 'method' => 'POST', + 'id' => 'icalendar-special-days', + 'enctype' => 'multipart/form-data', + ], + 'inputs' => $inputs, + ], + false + ); +} + + +$this_year = date('Y'); +$this_month = date('m'); + +$filter = []; +if (!is_user_admin($config['id_user'])) { + $filter['id_group'] = array_keys(users_get_groups(false, 'LM')); +} + +$url = $url.'&id_calendar='.$id_calendar; + +// Show display range. +$html = "
".__('Display range: '); -if ($display_range) { - $html .= '['.__('Default').']  '; - if ($display_range > 1970) { - $html .= '<< '; - } - - $html .= '['.$display_range.']'; - $html .= ' >>'; -} else { - $html .= '['.__('Default').']  '; - $html .= '<< '; - $html .= '['; - $html .= $this_year; - $html .= ']'; - $html .= ' >>'; -} - -$html .= '
'; +echo $html; + +// Show calendar. +for ($month = 1; $month <= 12; $month++) { + if ($display_range) { + $display_month = $month; + $display_year = $display_range; + } else { + $display_month = ($this_month + $month - 1); + $display_year = $this_year; + } + + if ($display_month > 12) { + $display_month -= 12; + $display_year++; + } + + $cal_table = new stdClass(); + $cal_table->width = '100%'; + $cal_table->class = 'databox data'; + + $cal_table->data = []; + $cal_table->head = []; + $cal_table->head[0] = __('Sun'); + $cal_table->head[1] = __('Mon'); + $cal_table->head[2] = __('Tue'); + $cal_table->head[3] = __('Wed'); + $cal_table->head[4] = __('Thu'); + $cal_table->head[5] = __('Fri'); + $cal_table->head[6] = __('Sat'); + $cal_table->cellstyle = []; + $cal_table->size = []; + $cal_table->size[0] = '14%'; + $cal_table->size[1] = '14%'; + $cal_table->size[2] = '14%'; + $cal_table->size[3] = '14%'; + $cal_table->size[4] = '14%'; + $cal_table->size[5] = '14%'; + $cal_table->size[6] = '14%'; + $cal_table->align = []; + $cal_table->border = '1'; + $cal_table->titlestyle = 'text-align:center; font-weight: bold;'; + switch ($display_month) { + case 1: + $cal_table->title = __('January'); + break; + + case 2: + $cal_table->title = __('February'); + break; + + case 3: + $cal_table->title = __('March'); + break; + + case 4: + $cal_table->title = __('April'); + break; + + case 5: + $cal_table->title = __('May'); + break; + + case 6: + $cal_table->title = __('June'); + break; + + case 7: + $cal_table->title = __('July'); + break; + + case 8: + $cal_table->title = __('August'); + break; + + case 9: + $cal_table->title = __('September'); + break; + + case 10: + $cal_table->title = __('October'); + break; + + case 11: + $cal_table->title = __('November'); + break; + + case 12: + $cal_table->title = __('December'); + break; + + default: + // Not possible. + break; + } + + $cal_table->title .= ' / '.$display_year; + + $last_day = date('j', mktime(0, 0, 0, ($display_month + 1), 0, $display_year)); + $cal_line = 0; + + for ($day = 1; $day < ($last_day + 1); $day++) { + $week = date('w', mktime(0, 0, 0, $display_month, $day, $display_year)); + if ($cal_line == 0 && $week != 0 && $day == 1) { + for ($i = 0; $i < $week; $i++) { + $cal_table->cellstyle[$cal_line][$i] = 'font-size: 18px;'; + $cal_table->data[$cal_line][$i] = '-'; + } + } + + if ($week == 0 || $week == 6) { + $cal_table->cellstyle[$cal_line][$week] = 'color: red;'; + } + + $date = sprintf('%04d-%02d-%02d', $display_year, $display_month, $day); + $date_wildcard = sprintf('0001-%02d-%02d', $display_month, $day); + + $cal_table->cellstyle[$cal_line][$week] .= 'font-size: 18px;'; + $cal_table->data[$cal_line][$week] = $day.' '; + + if ($is_management_allowed === true) { + $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image( + 'images/add_mc.png', + true, + ['class' => 'invert_filter'] + ).''; + } + + if (empty($specialDays) === false && isset($specialDays[$display_year][$display_month][$day]) === true) { + $cal_table->data[$cal_line][$week] .= '
'; + foreach ($specialDays[$display_year][$display_month][$day] as $special_day) { + // Only show description if is filled. + $cal_table->data[$cal_line][$week] .= '
'; + $cal_table->data[$cal_line][$week] .= '
'; + $cal_table->data[$cal_line][$week] .= ui_print_group_icon( + $special_day['id_group'], + true + ); + + if (empty($special_day['description']) === false) { + $cal_table->data[$cal_line][$week] .= ui_print_help_tip($special_day['description'], true); + } + + if ($special_day['date'] == $date_wildcard) { + $cal_table->data[$cal_line][$week] .= '('; + $cal_table->data[$cal_line][$week] .= ui_print_help_tip( + 'This is valid every year. However, this will be ignored if indivisual setting for the same group is available.', + true + ); + $cal_table->data[$cal_line][$week] .= ') '; + } + + $cal_table->data[$cal_line][$week] .= __('As '); + switch ($special_day['day_code']) { + case '1': + $cal_table->data[$cal_line][$week] .= __('Monday'); + break; + + case '2': + $cal_table->data[$cal_line][$week] .= __('Tuesday'); + break; + + case '3': + $cal_table->data[$cal_line][$week] .= __('Wednesday'); + break; + + case '4': + $cal_table->data[$cal_line][$week] .= __('Thursday'); + break; + + case '5': + $cal_table->data[$cal_line][$week] .= __('Friday'); + break; + + case '6': + $cal_table->data[$cal_line][$week] .= __('Saturday'); + break; + + case '7': + $cal_table->data[$cal_line][$week] .= __('Sunday'); + break; + + case '8': + $cal_table->data[$cal_line][$week] .= __('Holidays'); + break; + + default: + // Not possible. + break; + } + + $cal_table->data[$cal_line][$week] .= '
'; + $cal_table->data[$cal_line][$week] .= '
'; + if ($special_day['id_group'] || (users_can_manage_group_all('LM') === true && $special_day['id_group'] == 0)) { + $script_delete = ''; + $dateformat = date_create($special_day['date']); + $options_zoom = htmlspecialchars( + json_encode( + [ + 'date' => $special_day['date'], + 'id_group' => $special_day['id_group'], + 'day_code' => $special_day['day_code'], + 'id_calendar' => $special_day['id_calendar'], + 'btn_ok_text' => __('Create'), + 'btn_cancel_text' => __('Cancel'), + 'title' => date_format($dateformat, 'd M Y'), + 'url' => ui_get_full_url('ajax.php', false, false, false), + 'page' => $ajax_url, + 'loading' => __('Loading, this operation might take several minutes...'), + ] + ), + ENT_QUOTES, + 'UTF-8' + ); + + $onclick_zoom = 'load_templates_alerts_special_days('.$options_zoom.')'; + $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= 'title="'; + $cal_table->data[$cal_line][$week] .= __('Show templates'); + $cal_table->data[$cal_line][$week] .= '">'; + $cal_table->data[$cal_line][$week] .= html_print_image( + 'images/zoom.png', + true, + ['class' => 'invert_filter'] + ).''; + + if ($is_management_allowed === true) { + $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image( + 'images/config.png', + true, + ['class' => 'invert_filter'] + ).'  '; + $url_delete = $url.'&op=delete&id='.$special_day['id']; + $script_delete = 'if (!confirm(\''.__('Are you sure?').'\')) return false;'; + $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= ' onClick="'.$script_delete.'"'; + $cal_table->data[$cal_line][$week] .= 'title="'; + $cal_table->data[$cal_line][$week] .= __('Remove'); + $cal_table->data[$cal_line][$week] .= '">'; + $cal_table->data[$cal_line][$week] .= html_print_image( + 'images/cross.png', + true, + ['class' => 'invert_filter'] + ).''; + } + } + + $cal_table->data[$cal_line][$week] .= '
'; + $cal_table->data[$cal_line][$week] .= '
'; + } + } + + if ($week == 6) { + $cal_line++; + } + } + + for ($padding = ($week + 1); $padding <= 6; $padding++) { + $cal_table->cellstyle[$cal_line][$padding] = 'font-size: 18px;'; + $cal_table->data[$cal_line][$padding] = '-'; + } + + html_print_table($cal_table); +} + +if ((bool) check_acl($config['id_user'], 0, 'LM') === true) { + HTML::printForm( + [ + 'form' => [ + 'action' => $url.'&op=edit', + 'method' => 'POST', + ], + 'inputs' => [ + [ + 'arguments' => [ + 'name' => 'button', + 'label' => __('Create'), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + ], + ], + ], + ] + ); +} + +echo ''; +ui_require_javascript_file('pandora_alerts'); + +\enterprise_hook('close_meta_frame'); +?> + \ No newline at end of file diff --git a/pandora_console/views/calendar/special_days_edit.php b/pandora_console/views/calendar/special_days_edit.php new file mode 100644 index 0000000000..23f72dc38f --- /dev/null +++ b/pandora_console/views/calendar/special_days_edit.php @@ -0,0 +1,216 @@ +'; + $url_link .= __('metaconsole'); + $url_link .= ''; + } else { + $url_link = __('any node'); + } + + \ui_print_warning_message( + __( + 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.', + $url_link + ) + ); +} + +if (empty($message) === false) { + echo $message; +} + +$inputs = []; + +// Date. +$inputs[] = [ + 'label' => __('Date'), + 'arguments' => [ + 'type' => 'text', + 'name' => 'date', + 'required' => true, + 'value' => $specialDay->date(), + ], + 'extra' => html_print_image( + 'images/calendar_view_day.png', + true, + [ + 'alt' => 'calendar', + 'onclick' => "scwShow(scwID('text-date'),this);", + 'class' => 'invert_filter', + ] + ), +]; + +if (users_can_manage_group_all('LM') === true) { + $display_all_group = true; +} else { + $display_all_group = false; +} + +// Group. +$inputs[] = [ + 'label' => __('Group'), + 'arguments' => [ + 'type' => 'select_groups', + 'returnAllGroup' => $display_all_group, + 'name' => 'id_group', + 'selected' => $specialDay->id_group(), + ], +]; + +$days = []; +$days[1] = __('Monday'); +$days[2] = __('Tuesday'); +$days[3] = __('Wednesday'); +$days[4] = __('Thursday'); +$days[5] = __('Friday'); +$days[6] = __('Saturday'); +$days[7] = __('Sunday'); +$days[8] = __('Holidays'); + +// Same day of the week. +$inputs[] = [ + 'label' => __('Same day of the week'), + 'arguments' => [ + 'name' => 'day_code', + 'type' => 'select', + 'fields' => $days, + 'selected' => ($specialDay->day_code() === null) ? 1 : $specialDay->day_code(), + ], +]; + +// Description. +$inputs[] = [ + 'label' => __('Description'), + 'arguments' => [ + 'type' => 'textarea', + 'name' => 'description', + 'required' => false, + 'value' => $specialDay->description(), + 'rows' => 50, + 'columns' => 30, + ], +]; + +// Calendar. +$inputs[] = [ + 'arguments' => [ + 'type' => 'hidden', + 'name' => 'id_calendar', + 'value' => $specialDay->id_calendar(), + ], +]; + +if ($is_management_allowed === true) { + // Submit. + $inputs[] = [ + 'arguments' => [ + 'name' => 'button', + 'label' => (($create === true) ? __('Create') : __('Update')), + 'type' => 'submit', + 'attributes' => 'class="sub next"', + ], + ]; +} + +// Print form. +HTML::printForm( + [ + 'form' => [ + 'id' => 'form-special-days', + 'action' => $url.'&action=save&id='.$specialDay->id(), + 'method' => 'POST', + ], + 'inputs' => $inputs, + ], + false, + true +); + +echo ''; + +ui_require_javascript_file('calendar'); +ui_require_javascript_file('pandora_alerts'); + +\enterprise_hook('close_meta_frame'); +?> + \ No newline at end of file diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 2a9634d33c..3347eca41a 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -531,15 +531,16 @@ sub pandora_evaluate_alert ($$$$$$$;$$$$) { my $date = sprintf("%4d%02d%02d", $year + 1900, $mon + 1, $mday); # '0001' means every year. my $date_every_year = sprintf("0001%02d%02d", $mon + 1, $mday); - my $special_day = get_db_value ($dbh, 'SELECT same_day FROM talert_special_days WHERE (date = ? OR date = ?) AND (id_group = 0 OR id_group = ?) ORDER BY date DESC', $date, $date_every_year, $alert->{'id_group'}); - + my $special_day = get_db_value ($dbh, 'SELECT day_code FROM talert_special_days WHERE (date = ? OR date = ?) AND (id_group = 0 OR id_group = ?) AND (id_calendar = ?) ORDER BY date DESC', $date, $date_every_year, $alert->{'id_group'}, $alert->{'special_day'}); + if (!defined($special_day)) { - $special_day = ''; + $special_day = 0; } - - if ($special_day ne '') { - logger ($pa_config, $date . " is a special day for " . $alert->{'name'} . ". (as a " . $special_day . ")", 10); - return $status if ($alert->{$special_day} != 1); + + my @weeks = ( 'none', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'holiday'); + if ($special_day != 0) { + logger ($pa_config, $date . " is a special day for " . $alert->{'name'} . ". (as a " . $weeks[$special_day] . ")", 10); + return $status if (!defined($alert->{$weeks[$special_day]}) || $alert->{$weeks[$special_day]} == 0); } else { logger ($pa_config, $date . " is *NOT* a special day for " . $alert->{'name'}, 10); diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 3127261899..801a10540e 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -179,7 +179,7 @@ sub help_screen{ help_screen_line('--update_alert_template', " \n\t ", 'Update a field of an alert template'); help_screen_line('--validate_all_alerts', '', 'Validate all the alerts'); help_screen_line('--validate_alert', ' []', 'Validate alert given angent, module and alert'); - help_screen_line('--create_special_day', " ", 'Create special day'); + help_screen_line('--create_special_day', " ", 'Create special day'); help_screen_line('--delete_special_day', '', 'Delete special day'); help_screen_line('--update_special_day', " ", 'Update a field of a special day'); help_screen_line('--create_data_module_from_local_component', ' []', "Create a new data \n\t module from a local component"); @@ -956,6 +956,31 @@ sub pandora_get_special_day_id ($$) { return defined ($special_day_id) ? $special_day_id : -1; } + +########################################################################## +## SUB pandora_get_calendar_id(id) +## Return calendar id, given "calendar_name" +########################################################################## +sub pandora_get_calendar_id ($$) { + my ($dbh, $calendar_name) = @_; + + my $calendar_id = get_db_value ($dbh, "SELECT id FROM talert_calendar WHERE ${RDBMS_QUOTE}name${RDBMS_QUOTE} = ?", $calendar_name); + + return defined ($calendar_id) ? $calendar_id : -1; +} + +########################################################################## +## SUB pandora_get_same_day_id(id) +## Return same day id, given "same_day" +########################################################################## +sub pandora_get_same_day_id ($$) { + my ($dbh, $same_day) = @_; + + my $weeks = { 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6, 'sunday' => 7, 'holiday' => 8}; + + return defined ($weeks{$same_day}) ? $weeks{$same_day} : -1; +} + ########################################################################## ## Delete a special day. ########################################################################## @@ -6413,12 +6438,16 @@ sub pandora_get_network_component_id($$) { ############################################################################## sub cli_create_special_day() { - my ($special_day, $same_day, $description, $group_name) = @ARGV[2..5]; + my ($special_day, $calendar_name, $same_day, $description, $group_name) = @ARGV[2..5]; + my $calendar_name_exists = pandora_get_calendar_id ($dbh, $calendar_name); + my $same_day_exists = pandora_get_same_day_id ($dbh, $same_day); my $special_day_exists = pandora_get_special_day_id ($dbh, $special_day); non_exist_check($special_day_exists,'special day',$special_day); + non_exist_check($calendar_name_exists,'calendar name',$calendar_name); + non_exist_check($same_day_exists,'same day',$same_day); my $group_id = 0; - + # If group name is not defined, we assign group All (0) if(defined($group_name)) { $group_id = get_group_id($dbh, decode('UTF-8', $group_name)); @@ -6434,19 +6463,21 @@ sub cli_create_special_day() { help_screen (); exit 1; } - if ($same_day !~ /monday|tuesday|wednesday|thursday|friday|saturday|sunday/) { + + if ($same_day !~ /monday|tuesday|wednesday|thursday|friday|saturday|sunday|holiday/) { print_log "[ERROR] '$same_day' is invalid day.\n\n"; $param = '--create_special_day'; help_screen (); exit 1; } - + my %parameters; - + $parameters{"${RDBMS_QUOTE}date${RDBMS_QUOTE}"} = $special_day; $parameters{'same_day'} = $same_day; $parameters{'description'} = decode('UTF-8', $description); $parameters{'id_group'} = $group_id; + $parameters{'calendar_name'} = $calendar_name; pandora_create_special_day_from_hash ($conf, \%parameters, $dbh); }
".__('Display range: '); +if ($display_range) { + $html .= '['.__('Default').']  '; + if ($display_range > 1970) { + $html .= '<< '; + } + + $html .= '['.$display_range.']'; + $html .= ' >>'; +} else { + $html .= '['.__('Default').']  '; + $html .= '<< '; + $html .= '['; + $html .= $this_year; + $html .= ']'; + $html .= ' >>'; +} + +$html .= '