"".html_print_image( 'images/list.png', true, [ 'title' => __('List'), 'class' => 'invert_filter', ] ).'', ]; // Header. ui_print_page_header( __('Scheduled Downtime'), 'images/gm_monitoring.png', false, '', true, $buttons ); // Recursion group filter. $recursion = get_parameter('recursion', $_POST['recursion']); // Initialize data. $id_group = (int) get_parameter('id_group'); $name = (string) get_parameter('name'); $description = (string) get_parameter('description'); $type_downtime = (string) get_parameter('type_downtime', 'quiet'); $type_execution = (string) get_parameter('type_execution', 'once'); $type_periodicity = (string) get_parameter('type_periodicity', 'weekly'); $utimestamp = get_system_time(); // Fake utimestamp to retrieve the string date of the system. $system_time = ($utimestamp - get_fixed_offset()); $once_date_from = (string) get_parameter( 'once_date_from', date(DATE_FORMAT, $utimestamp) ); $once_time_from = (string) get_parameter( 'once_time_from', date(TIME_FORMAT, $utimestamp) ); $once_date_to = (string) get_parameter( 'once_date_to', date(DATE_FORMAT, $utimestamp) ); $once_time_to = (string) get_parameter( 'once_time_to', date(TIME_FORMAT, ($utimestamp + SECONDS_1HOUR)) ); $periodically_day_from = (int) get_parameter( 'periodically_day_from', 1 ); $periodically_day_to = (int) get_parameter( 'periodically_day_to', 31 ); $periodically_time_from = (string) get_parameter( 'periodically_time_from', date(TIME_FORMAT, $system_time) ); $periodically_time_to = (string) get_parameter( 'periodically_time_to', date(TIME_FORMAT, ($system_time + SECONDS_1HOUR)) ); $monday = (bool) get_parameter('monday'); $tuesday = (bool) get_parameter('tuesday'); $wednesday = (bool) get_parameter('wednesday'); $thursday = (bool) get_parameter('thursday'); $friday = (bool) get_parameter('friday'); $saturday = (bool) get_parameter('saturday'); $sunday = (bool) get_parameter('sunday'); $first_create = (int) get_parameter('first_create'); $create_downtime = (int) get_parameter('create_downtime'); $update_downtime = (int) get_parameter('update_downtime'); $edit_downtime = (int) get_parameter('edit_downtime'); $downtime_copy = (int) get_parameter('downtime_copy'); $id_downtime = (int) get_parameter('id_downtime'); $id_agent = (int) get_parameter('id_agent'); $insert_downtime_agent = (int) get_parameter('insert_downtime_agent'); $delete_downtime_agent = (int) get_parameter('delete_downtime_agent'); $modules_selection_mode = (string) get_parameter('modules_selection_mode'); // User groups with AD or AW permission for ACL checks. $user_groups_ad = array_keys( users_get_groups($config['id_user'], $access) ); // INSERT A NEW DOWNTIME_AGENT ASSOCIATION. if ($insert_downtime_agent === 1) { insert_downtime_agent($id_downtime, $user_groups_ad); } // DELETE A DOWNTIME_AGENT ASSOCIATION. if ($delete_downtime_agent === 1) { $id_da = (int) get_parameter('id_downtime_agent'); // Check AD permission on downtime. $downtime_group = db_get_value( 'id_group', 'tplanned_downtime', 'id', $id_downtime ); if ($downtime_group === false || !in_array($downtime_group, $user_groups_ad) ) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } // Check AD permission on agent. $agent_group = db_get_value( 'id_grupo', 'tagente', 'id_agente', $id_agent ); if ($agent_group === false || !in_array($agent_group, $user_groups_ad) ) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } // 'Is running' check. $is_running = (bool) db_get_value( 'executed', 'tplanned_downtime', 'id', $id_downtime ); if ($is_running) { ui_print_error_message( __('This elements cannot be modified while the downtime is being executed') ); } else { $row_to_delete = db_get_row('tplanned_downtime_agents', 'id', $id_da); $result = db_process_sql_delete( 'tplanned_downtime_agents', ['id' => $id_da] ); if ($result) { // Delete modules in downtime. db_process_sql_delete( 'tplanned_downtime_modules', [ 'id_downtime' => $row_to_delete['id_downtime'], 'id_agent' => $id_agent, ] ); } } } // UPDATE OR CREATE A DOWNTIME (MAIN DATA, NOT AGENT ASSOCIATION). if ($create_downtime || $update_downtime) { $check = (bool) db_get_value('name', 'tplanned_downtime', 'name', $name); $datetime_from = strtotime($once_date_from.' '.$once_time_from); $datetime_to = strtotime($once_date_to.' '.$once_time_to); $now = time(); if ($type_execution == 'once' && !$config['past_planned_downtimes'] && $datetime_from < $now) { ui_print_error_message( __('Not created. Error inserting data. Start time must be higher than the current time') ); } else if ($type_execution == 'once' && $datetime_from >= $datetime_to) { ui_print_error_message( __('Not created. Error inserting data').'. '.__('The end date must be higher than the start date') ); } else if ($type_execution == 'once' && $datetime_to <= $now && !$config['past_planned_downtimes']) { ui_print_error_message( __('Not created. Error inserting data').'. '.__('The end date must be higher than the current time') ); } else if ($type_execution == 'periodically' && $type_periodicity == 'monthly' && $periodically_day_from == $periodically_day_to && $periodically_time_from >= $periodically_time_to ) { ui_print_error_message( __('Not created. Error inserting data').'. '.__('The end time must be higher than the start time') ); } else if ($type_execution == 'periodically' && $type_periodicity == 'monthly' && $periodically_day_from > $periodically_day_to) { ui_print_error_message( __('Not created. Error inserting data').'. '.__('The end day must be higher than the start day') ); } else { $sql = ''; if ($create_downtime) { // Check AD permission on new downtime. if (!in_array($id_group, $user_groups_ad)) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } if (trim(io_safe_output($name)) != '') { if (!$check) { $values = [ 'name' => $name, 'description' => $description, 'date_from' => $datetime_from, 'date_to' => $datetime_to, 'executed' => 0, 'id_group' => $id_group, 'only_alerts' => 0, 'monday' => $monday, 'tuesday' => $tuesday, 'wednesday' => $wednesday, 'thursday' => $thursday, 'friday' => $friday, 'saturday' => $saturday, 'sunday' => $sunday, 'periodically_time_from' => $periodically_time_from, 'periodically_time_to' => $periodically_time_to, 'periodically_day_from' => $periodically_day_from, 'periodically_day_to' => $periodically_day_to, 'type_downtime' => $type_downtime, 'type_execution' => $type_execution, 'type_periodicity' => $type_periodicity, 'id_user' => $config['id_user'], ]; if ($config['dbtype'] == 'oracle') { $values['periodically_time_from'] = '1970/01/01 '.$values['periodically_time_from']; $values['periodically_time_to'] = '1970/01/01 '.$values['periodically_time_to']; } $result = db_process_sql_insert( 'tplanned_downtime', $values ); } else { ui_print_error_message( __('Each scheduled downtime must have a different name') ); } } else { ui_print_error_message( __('Scheduled downtime must have a name') ); } } else if ($update_downtime) { $old_downtime = db_get_row('tplanned_downtime', 'id', $id_downtime); // Check AD permission on OLD downtime. if (empty($old_downtime) || !in_array($old_downtime['id_group'], $user_groups_ad)) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } // Check AD permission on NEW downtime group. if (!in_array($id_group, $user_groups_ad)) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } // 'Is running' check. $is_running = (bool) $old_downtime['executed']; $values = []; if (trim(io_safe_output($name)) == '') { ui_print_error_message( __('Scheduled downtime must have a name') ); } // When running only certain items can be modified for the 'once' type. else if ($is_running && $type_execution == 'once') { $values = [ 'description' => $description, 'date_to' => $datetime_to, 'id_user' => $config['id_user'], ]; } else { $values = [ 'name' => $name, 'description' => $description, 'date_from' => $datetime_from, 'date_to' => $datetime_to, 'id_group' => $id_group, 'only_alerts' => 0, 'monday' => $monday, 'tuesday' => $tuesday, 'wednesday' => $wednesday, 'thursday' => $thursday, 'friday' => $friday, 'saturday' => $saturday, 'sunday' => $sunday, 'periodically_time_from' => $periodically_time_from, 'periodically_time_to' => $periodically_time_to, 'periodically_day_from' => $periodically_day_from, 'periodically_day_to' => $periodically_day_to, 'type_downtime' => $type_downtime, 'type_execution' => $type_execution, 'type_periodicity' => $type_periodicity, 'id_user' => $config['id_user'], ]; if ($config['dbtype'] == 'oracle') { $values['periodically_time_from'] = '1970/01/01 '.$values['periodically_time_from']; $values['periodically_time_to'] = '1970/01/01 '.$values['periodically_time_to']; } } if ($is_running) { $result = false; } else { if (!empty($values)) { $result = db_process_sql_update( 'tplanned_downtime', $values, ['id' => $id_downtime] ); } } } if ($result === false) { if ($create_downtime) { ui_print_error_message(__('Could not be created')); } else { ui_print_error_message(__('Could not be updated')); } } else { if ($create_downtime && $name && !$check) { $id_downtime = $result; insert_downtime_agent($id_downtime, $user_groups_ad); ui_print_success_message(__('Successfully created')); } else if ($update_downtime && $name) { ui_print_success_message(__('Successfully updated')); } } } } if ($downtime_copy) { $result = planned_downtimes_copy($id_downtime); if ($result['id_downtime'] !== false) { $id_downtime = $result['id_downtime']; ui_print_success_message($result['success']); } else { ui_print_error_message(__($result['error'])); } } // Have any data to show ? if ($id_downtime > 0) { // Columns of the table tplanned_downtime. $columns = [ 'id', 'name', 'description', 'date_from', 'date_to', 'executed', 'id_group', 'only_alerts', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'periodically_time_from', 'periodically_time_to', 'periodically_day_from', 'periodically_day_to', 'type_downtime', 'type_execution', 'type_periodicity', 'id_user', ]; switch ($config['dbtype']) { case 'mysql': case 'postgresql': $columns_str = implode(',', $columns); $sql = "SELECT $columns_str FROM tplanned_downtime WHERE id = $id_downtime"; break; case 'oracle': // Oracle doesn't have TIME type, // so we should transform the DATE value. $new_time_from = "TO_CHAR(periodically_time_from, 'HH24:MI:SS') AS periodically_time_from"; $new_time_to = "TO_CHAR(periodically_time_to, 'HH24:MI:SS') AS periodically_time_to"; $time_from_key = array_search('periodically_time_from', $columns); $time_to_key = array_search('periodically_time_to', $columns); if ($time_from_key !== false) { $columns[$time_from_key] = $new_time_from; } if ($time_to_key !== false) { $columns[$time_to_key] = $new_time_to; } $columns_str = implode(',', $columns); $sql = "SELECT $columns_str FROM tplanned_downtime WHERE id = $id_downtime"; break; } $result = db_get_row_sql($sql); // Permission check for the downtime with the AD user groups if (empty($result) || !in_array($result['id_group'], $user_groups_ad)) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } $name = (string) $result['name']; $id_group = (int) $result['id_group']; $description = (string) $result['description']; $type_downtime = (string) $result['type_downtime']; $type_execution = (string) $result['type_execution']; $type_periodicity = (string) $result['type_periodicity']; $once_date_from = date(DATE_FORMAT, $result['date_from']); $once_date_to = date(DATE_FORMAT, $result['date_to']); $once_time_from = date(TIME_FORMAT, $result['date_from']); $once_time_to = date(TIME_FORMAT, $result['date_to']); $periodically_time_from = (string) $result['periodically_time_from']; $periodically_time_to = (string) $result['periodically_time_to']; $periodically_day_from = (int) $result['periodically_day_from']; $periodically_day_to = (int) $result['periodically_day_to']; $monday = (bool) $result['monday']; $tuesday = (bool) $result['tuesday']; $wednesday = (bool) $result['wednesday']; $thursday = (bool) $result['thursday']; $friday = (bool) $result['friday']; $saturday = (bool) $result['saturday']; $sunday = (bool) $result['sunday']; $running = (bool) $result['executed']; } // When the planned downtime is in execution, // only action to postpone on once type is enabled and the other are disabled. $disabled_in_execution = (int) $running; $return_all_group = false; if (users_can_manage_group_all('AW') === true || $disabled) { $return_all_group = true; } $table = new StdClass(); $table->class = 'databox filters'; $table->width = '100%'; $table->data = []; $table->data[0][0] = __('Name'); $table->data[0][1] = html_print_input_text( 'name', $name, '', 25, 40, true, $disabled_in_execution ); $table->data[1][0] = __('Group'); $table->data[1][1] = '