"".html_print_image('images/list.png', true, ['title' => __('List')]).'',
];
// Header
ui_print_page_header(
__('Planned Downtime'),
'images/gm_monitoring.png',
false,
'planned_downtime',
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');
$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) {
// 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(
'ACL Violation',
'Trying to access downtime scheduler'
);
include 'general/noaccess.php';
return;
}
$agents = (array) get_parameter('id_agents');
$module_names = (array) get_parameter('module');
$all_modules = (empty($module_names) || ($module_names[0] === '0'));
// '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 {
foreach ($agents as $agent_id) {
// check module belongs to the agent
if ($modules_selection_mode == 'all') {
$check = false;
foreach ($module_names as $module_name) {
$check_module = modules_get_agentmodule_id($module_name, $agent_id);
if (!empty($check_module)) {
$check = true;
}
}
if (!$check) {
continue;
}
}
// Check AD permission on agent
$agent_group = db_get_value('id_grupo', 'tagente', 'id_agente', $agent_id);
if ($agent_group === false || !in_array($agent_group, $user_groups_ad)) {
continue;
}
$values = [
'id_downtime' => $id_downtime,
'id_agent' => $agent_id,
'all_modules' => $all_modules,
];
$result = db_process_sql_insert('tplanned_downtime_agents', $values);
if ($result && !$all_modules) {
foreach ($module_names as $module_name) {
$module = modules_get_agentmodule_id($module_name, $agent_id);
if (empty($module)) {
continue;
}
$values = [
'id_downtime' => $id_downtime,
'id_agent' => $agent_id,
'id_agent_module' => $module['id_agente_modulo'],
];
$result = db_process_sql_insert('tplanned_downtime_modules', $values);
if ($result) {
$values = ['id_user' => $config['id_user']];
$result = db_process_sql_update(
'tplanned_downtime',
$values,
['id' => $id_downtime]
);
}
}
}
}
}
}
// 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(
'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(
'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 == 'weekly' && $periodically_time_from >= $periodically_time_to)
|| ($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(
'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 planned downtime must have a different name')
);
}
} else {
ui_print_error_message(
__('Planned 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(
'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(
'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(__('Planned 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 if ($is_running) {
ui_print_error_message(__('Cannot be modified while the downtime is being executed'));
} 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 (!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;
ui_print_success_message(__('Successfully created'));
} else if ($update_downtime && $name) {
ui_print_success_message(__('Successfully updated'));
}
}
}
}
// 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(
'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;
$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] = html_print_select_groups(false, $access, true, 'id_group', $id_group, '', '', 0, true, false, true, '', $disabled_in_execution);
$table->data[2][0] = __('Description');
$table->data[2][1] = html_print_textarea('description', 3, 35, $description, '', true);
$table->data[3][0] = __('Type').ui_print_help_tip(
__('Quiet: Modules will not generate events or fire alerts.').'
'.__('Disable Agents: Disables the selected agents.').'
'.__('Disable Alerts: Disable alerts for the selected agents.'),
true
);
$table->data[3][1] = html_print_select(
[
'quiet' => __('Quiet'),
'disable_agents' => __('Disabled Agents'),
'disable_agents_alerts' => __('Disabled only Alerts'),
],
'type_downtime',
$type_downtime,
'change_type_downtime()',
'',
0,
true,
false,
true,
'',
$disabled_in_execution
);
$table->data[4][0] = __('Execution');
$table->data[4][1] = html_print_select(
[
'once' => __('Once'),
'periodically' => __('Periodically'),
],
'type_execution',
$type_execution,
'change_type_execution();',
'',
0,
true,
false,
true,
'',
$disabled_in_execution
);
$days = array_combine(range(1, 31), range(1, 31));
$table->data[5][0] = __('Configure the time').' '.ui_print_help_icon('planned_downtime_time', true);
;
$table->data[5][1] = "