<?php // Pandora FMS - http://pandorafms.com // ================================================== // Copyright (c) 2005-2010 Artica Soluciones Tecnologicas // Please see http://pandorafms.org for full contribution list // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation for version 2. // This program is distributed in the hope that it will be useful, // 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 global $config; check_login(); $agent_d = check_acl($config['id_user'], 0, 'AD'); $agent_w = check_acl($config['id_user'], 0, 'AW'); $access = ($agent_d == true) ? 'AD' : (($agent_w == true) ? 'AW' : 'AD'); if (!$agent_d && !$agent_w) { db_pandora_audit( 'ACL Violation', 'Trying to access downtime scheduler' ); include 'general/noaccess.php'; return; } // Default set_unless_defined($config['past_planned_downtimes'], 1); require_once 'include/functions_users.php'; // Buttons $buttons = [ 'text' => "<a href='index.php?sec=extensions&sec2=godmode/agentes/planned_downtime.list'>".html_print_image('images/list.png', true, ['title' => __('List')]).'</a>', ]; // 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.').'<br>'.__('Disable Agents: Disables the selected agents.').'<br>'.__('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] = " <div id='once_time' style='display: none;'> <table> <tr> <td>".__('From:').'</td> <td>'.html_print_input_text('once_date_from', $once_date_from, '', 10, 10, true, $disabled_in_execution).ui_print_help_tip(__('Date format is YY/MM/DD'), true).html_print_input_text('once_time_from', $once_time_from, '', 9, 9, true, $disabled_in_execution).ui_print_help_tip(__('Watch format is hours (24h):minutes:seconds'), true).'</td> </tr> <tr> <td>'.__('To:').'</td> <td>'.html_print_input_text('once_date_to', $once_date_to, '', 10, 10, true).ui_print_help_tip(__('Date format is YY/MM/DD'), true).html_print_input_text('once_time_to', $once_time_to, '', 9, 9, true).ui_print_help_tip(__('Watch format is hours (24h):minutes:seconds'), true)."</td> </tr> </table> </div> <div id='periodically_time' style='display: none;'> <table> <tr><td>".ui_get_using_system_timezone_warning().'</td></tr> <tr> <td>'.__('Type Periodicity:').' '.html_print_select( [ 'weekly' => __('Weekly'), 'monthly' => __('Monthly'), ], 'type_periodicity', $type_periodicity, 'change_type_periodicity();', '', 0, true, false, true, '', $disabled_in_execution )."</td> </tr> <tr> <td colspan='2'> <table id='weekly_item' style='display: none;'> <tr> <td>".__('Mon').html_print_checkbox('monday', 1, $monday, true, $disabled_in_execution).'</td> <td>'.__('Tue').html_print_checkbox('tuesday', 1, $tuesday, true, $disabled_in_execution).'</td> <td>'.__('Wed').html_print_checkbox('wednesday', 1, $wednesday, true, $disabled_in_execution).'</td> <td>'.__('Thu').html_print_checkbox('thursday', 1, $thursday, true, $disabled_in_execution).'</td> <td>'.__('Fri').html_print_checkbox('friday', 1, $friday, true, $disabled_in_execution).'</td> <td>'.__('Sat').html_print_checkbox('saturday', 1, $saturday, true, $disabled_in_execution).'</td> <td>'.__('Sun').html_print_checkbox('sunday', 1, $sunday, true, $disabled_in_execution)."</td> </tr> </table> <table id='monthly_item' style='display: none;'> <tr> <td>".__('From day:').'</td> <td>'.html_print_select( $days, 'periodically_day_from', $periodically_day_from, '', '', 0, true, false, true, '', $disabled_in_execution ).'</td> <td>'.__('To day:').'</td> <td>'.html_print_select( $days, 'periodically_day_to', $periodically_day_to, '', '', 0, true, false, true, '', $disabled_in_execution ).'</td> <td>'.ui_print_help_tip(__('The end day must be higher than the start day'), true).'</td> </tr> </table> <table> <tr> <td>'.__('From hour:').'</td> <td>'.html_print_input_text( 'periodically_time_from', $periodically_time_from, '', 7, 7, true, $disabled_in_execution ).ui_print_help_tip( __('Watch format is hours (24h):minutes:seconds.').'.<br>'.__('The end time must be higher than the start time'), true ).'</td> <td>'.__('To hour:').'</td> <td>'.html_print_input_text( 'periodically_time_to', $periodically_time_to, '', 7, 7, true, $disabled_in_execution ).ui_print_help_tip( __('Watch format is hours (24h):minutes:seconds.').'.<br>'.__('The end time must be higher than the start time'), true ).'</td> </tr> </table> </td> </tr> </table> </div>'; echo '<form method="POST" action="index.php?sec=estado&sec2=godmode/agentes/planned_downtime.editor">'; if ($id_downtime > 0) { echo '<table width=100% border=0 cellpadding=4 >'; echo "<tr><td width=75% valign='top'>"; } // Editor form html_print_table($table); html_print_input_hidden('id_agent', $id_agent); echo '<div class="action-buttons" style="width: 100%">'; if ($id_downtime > 0) { html_print_input_hidden('update_downtime', 1); html_print_input_hidden('id_downtime', $id_downtime); html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); } else { html_print_input_hidden('create_downtime', 1); html_print_submit_button(__('Add'), 'crtbutton', false, 'class="sub wand"'); } echo '</div>'; echo '</form>'; if ($id_downtime > 0) { echo "<td valign=top style='width:300px;padding-left:20px;'>"; $filter_group = (int) get_parameter('filter_group', 0); // User AD groups to str for the filter $id_groups_str = implode(',', $user_groups_ad); if (empty($id_groups_str)) { // Restrictive filter on error. This will filter all the downtimes $id_groups_str = '-1'; } $filter_cond = ''; if ($filter_group > 0) { if ($recursion) { $rg = groups_get_id_recursive($filter_group, true); $filter_cond .= ' AND id_grupo IN ('; $i = 0; $len = count($rg); foreach ($rg as $key) { if ($i == ($len - 1)) { $filter_cond .= $key.')'; } else { $i++; $filter_cond .= $key.','; } } } else { $filter_cond = " AND id_grupo = $filter_group "; } } $sql = sprintf( 'SELECT tagente.id_agente, tagente.alias FROM tagente WHERE tagente.id_agente NOT IN ( SELECT tagente.id_agente FROM tagente, tplanned_downtime_agents WHERE tplanned_downtime_agents.id_agent = tagente.id_agente AND tplanned_downtime_agents.id_downtime = %d ) AND disabled = 0 %s AND tagente.id_grupo IN (%s) ORDER BY tagente.nombre', $id_downtime, $filter_cond, $id_groups_str ); $agents = db_get_all_rows_sql($sql); if (empty($agents)) { $agents = []; } $agent_ids = extract_column($agents, 'id_agente'); $agent_names = extract_column($agents, 'alias'); // item[<id>] = <name>; $agents = array_combine($agent_ids, $agent_names); if ($agents === false) { $agents = []; } $disabled_add_button = false; if (empty($agents) || $disabled_in_execution) { $disabled_add_button = true; } echo "<form method=post action='index.php?sec=estado&sec2=godmode/agentes/planned_downtime.editor&id_downtime=$id_downtime'>"; html_print_select_groups(false, $access, true, 'filter_group', $filter_group, '', '', '', false, false, true, '', false, 'min-width:180px;margin-right:15px;'); html_print_checkbox('recursion', 1, $recursion, false, false, ''); echo __('Recursion').' '; echo '<br /><br />'; html_print_submit_button(__('Filter by group'), '', false, 'class="sub next"', false); echo '</form>'; // Show available agents to include into downtime echo '<h4>'.__('Available agents').':</h4>'; echo "<form method=post action='index.php?sec=estado&sec2=godmode/agentes/planned_downtime.editor&insert_downtime_agent=1&id_downtime=$id_downtime'>"; echo html_print_select($agents, 'id_agents[]', -1, '', _('Any'), -2, false, true, true, '', false, 'width: 180px;'); if ($type_downtime != 'quiet') { echo '<div id="available_modules_selection_mode" style="padding-top:20px;display: none;">'; } else { echo '<div id="available_modules_selection_mode" style="padding-top:20px">'; } echo html_print_select( [ 'common' => __('Show common modules'), 'all' => __('Show all modules'), ], 'modules_selection_mode', 'common', false, '', '', true, false, true, '', false, 'min-width:180px;' ); echo '</div>'; echo '<h4>'.__('Available modules:').ui_print_help_tip(__('Only for type Quiet for downtimes.'), true).'</h4>'; if ($type_downtime != 'quiet') { echo '<div id="available_modules" style="display: none;">'; } else { echo '<div id="available_modules" style="">'; } echo html_print_select([], 'module[]', '', '', '', 0, false, true, true, '', false, 'width: 180px;'); echo '</div>'; echo '<br /><br /><br />'; html_print_submit_button(__('Add'), 'add_item', $disabled_add_button, 'class="sub next"', false); echo '</form>'; echo '</table>'; // Start Overview of existing planned downtime echo '<h4>'.__('Agents planned for this downtime').':</h4>'; // User the $id_groups_str built before $sql = sprintf( 'SELECT ta.nombre, tpda.id, ta.id_os, ta.id_agente, ta.id_grupo, ta.ultimo_contacto, tpda.all_modules FROM tagente ta INNER JOIN tplanned_downtime_agents tpda ON ta.id_agente = tpda.id_agent AND tpda.id_downtime = %d WHERE ta.id_grupo IN (%s)', $id_downtime, $id_groups_str ); $downtimes_agents = db_get_all_rows_sql($sql); if (empty($downtimes_agents)) { echo '<div class="nf">'.__('There are no agents').'</div>'; } else { $table = new stdClass(); $table->id = 'list'; $table->class = 'databox data'; $table->width = '100%'; $table->data = []; $table->head = []; $table->head[0] = __('Name'); $table->head[1] = __('Group'); $table->head[2] = __('OS'); $table->head[3] = __('Last contact'); $table->head['count_modules'] = __('Modules'); if (!$running) { $table->head[5] = __('Actions'); $table->align[5] = 'center'; $table->size[5] = '5%'; } foreach ($downtimes_agents as $downtime_agent) { $data = []; $alias = db_get_value('alias', 'tagente', 'id_agente', $downtime_agent['id_agente']); $data[0] = $alias; $data[1] = db_get_sql( 'SELECT nombre FROM tgrupo WHERE id_grupo = '.$downtime_agent['id_grupo'] ); $data[2] = ui_print_os_icon($downtime_agent['id_os'], true, true); $data[3] = $downtime_agent['ultimo_contacto']; if ($type_downtime == 'disable_agents_alerts') { $data['count_modules'] = __('All alerts'); } else if ($type_downtime == 'disable_agents') { $data['count_modules'] = __('Entire agent'); } else { if ($downtime_agent['all_modules']) { $data['count_modules'] = __('All modules'); } else { $data['count_modules'] = __('Some modules'); } } if (!$running) { $data[5] = ''; if ($type_downtime != 'disable_agents_alerts' && $type_downtime != 'disable_agents') { $data[5] = '<a href="javascript:show_editor_module('.$downtime_agent['id_agente'].');">'.html_print_image('images/config.png', true, ['border' => '0', 'alt' => __('Delete')]).'</a>'; } $data[5] .= '<a href="index.php?sec=estado&sec2=godmode/agentes/planned_downtime.editor&id_agent='.$downtime_agent['id_agente'].'&delete_downtime_agent=1&id_downtime_agent='.$downtime_agent['id'].'&id_downtime='.$id_downtime.'">'.html_print_image('images/cross.png', true, ['border' => '0', 'alt' => __('Delete')]).'</a>'; } $table->data['agent_'.$downtime_agent['id_agente']] = $data; } html_print_table($table); } } $table = new stdClass(); $table->id = 'loading'; $table->width = '100%'; $table->colspan['loading'][0] = '6'; $table->style[0] = 'text-align: center;'; $table->data = []; $table->data['loading'] = []; $table->data['loading'][0] = html_print_image('images/spinner.gif', true); echo "<div style='display: none;'>"; html_print_table($table); echo '</div>'; $table = new stdClass(); $table->id = 'editor'; $table->width = '100%'; $table->colspan['module'][1] = '5'; $table->data = []; $table->data['module'] = []; $table->data['module'][0] = ''; $table->data['module'][1] = '<h4>'.__('Modules').'</h4>'; // List of modules, empty, it is populated by javascript. $table->data['module'][1] = " <table cellspacing='4' cellpadding='4' border='0' width='100%' id='modules_in_agent' class='databox_color'> <thead> <tr> <th scope='col' class='header c0'>".__('Module')."</th> <th scope='col' class='header c1'>".__('Action')."</th> </tr> </thead> <tbody> <tr class='datos' id='template' style='display: none;'> <td class='name_module' style=''></td> <td class='cell_delete_button' style='text-align: right; width:10%;' id=''>".'<a class="link_delete" onclick="if(!confirm(\''.__('Are you sure?').'\')) return false;" href="">'.html_print_image( 'images/cross.png', true, [ 'border' => '0', 'alt' => __('Delete'), ] ).'</a>'."</td> </tr> <tr class='datos2' id='add_modules_row'> <td class='datos2' style='' id=''>".__('Add Module:').' '.html_print_select( [], 'modules', '', '', '', 0, true )."</td> <td class='datos2 button_cell' style='text-align: right; width:10%;' id=''>".'<div id="add_button_div">'.'<a class="add_button" href="">'.html_print_image( 'images/add.png', true, [ 'border' => '0', 'alt' => __('Add'), ] ).'</a>'.'</div>'."<div id='spinner_add' style='display: none;'>".html_print_image('images/spinner.gif', true).'</div>'.'</td> </tr> </tbody></table>'; echo "<div style='display: none;'>"; html_print_table($table); echo '</div>'; echo "<div style='display: none;'>"; echo "<div id='spinner_template'>"; html_print_image('images/spinner.gif'); echo '</div>'; echo '</div>'; echo "<div id='some_modules_text' style='display: none;'>"; echo __('Some modules'); echo '</div>'; echo "<div id='some_modules_text' style='display: none;'>"; echo __('Some modules'); echo '</div>'; echo "<div id='all_modules_text' style='display: none;'>"; echo __('All modules'); echo '</div>'; ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); ?> <script language="javascript" type="text/javascript"> var id_downtime = <?php echo $id_downtime; ?>; var action_in_progress = false; function change_type_downtime() { switch ($("#type_downtime").val()) { case 'disable_agents_alerts': case 'disable_agents': $("#available_modules").hide(); $("#available_modules_selection_mode").hide(); break; case 'quiet': $("#available_modules_selection_mode").show(); $("#available_modules").show(); break; } } function change_type_execution() { switch ($("#type_execution").val()) { case 'once': $("#periodically_time").hide(); $("#once_time").show(); break; case 'periodically': $("#once_time").hide(); $("#periodically_time").show(); break; } } function change_type_periodicity() { switch ($("#type_periodicity").val()) { case 'weekly': $("#monthly_item").hide(); $("#weekly_item").show(); break; case 'monthly': $("#weekly_item").hide(); $("#monthly_item").show(); break; } } function show_executing_alert () { alert('<?php echo __('This elements cannot be modified while the downtime is being executed'); ?>'); } function show_editor_module(id_agent) { //Avoid freak states. if (action_in_progress) return; //Check if the row editor module exists if ($('#loading_' + id_agent).length > 0) { //The row exists $('#loading_' + id_agent).remove(); } else { if ($('#module_editor_' + id_agent).length == 0) { $("#list-agent_" + id_agent).after( $("#loading-loading").clone().attr('id', 'loading_' + id_agent)); jQuery.post ('ajax.php', {"page": "include/ajax/planned_downtime.ajax", "get_modules_downtime": 1, "id_agent": id_agent, "id_downtime": id_downtime }, function (data) { if (data['correct']) { //Check if the row editor module exists if ($('#loading_' + id_agent).length > 0) { //The row exists $('#loading_' + id_agent).remove(); $("#list-agent_" + id_agent).after( $("#editor-module").clone() .attr('id', 'module_editor_' + id_agent) .hide()); fill_row_editor(id_agent, data); } } }, "json" ); } else { if ($('#module_editor_' + id_agent).is(':visible')) { $('#module_editor_' + id_agent).hide(); } else { $('#module_editor_' + id_agent).css('display', ''); } } } } function fill_row_editor(id_agent, data) { //$("#modules", $('#module_editor_' + id_agent)).empty(); //Fill the select for to add modules $.each(data['in_agent'], function(id_module, name) { $("#modules", $('#module_editor_' + id_agent)) .append($("<option value='" + id_module + "'>" + name + "</option>")); }); $(".add_button", $('#module_editor_' + id_agent)). attr('href', 'javascript:' + 'add_module_in_downtime(' + id_agent + ')'); //Fill the list of modules $.each(data['in_downtime'], function(id_module, name) { var template_row = $("#template").clone(); $(template_row).css('display', ''); $(template_row).attr('id', 'row_module_in_downtime_' + id_module); $(".name_module", template_row).html(name); $(".link_delete", template_row).attr('href', 'javascript:' + 'delete_module_from_downtime(' + id_downtime + ',' + id_module + ');'); $("#add_modules_row", $('#module_editor_' + id_agent)) .before(template_row); }); //.show() is crap, because put a 'display: block;'. $('#module_editor_' + id_agent).css('display', ''); } function add_row_module(id_downtime, id_agent, id_module, name) { var template_row = $("#template").clone(); $(template_row).css('display', ''); $(template_row).attr('id', 'row_module_in_downtime_' + id_module); $(".name_module", template_row).html(name); $(".link_delete", template_row).attr('href', 'javascript:' + 'delete_module_from_downtime(' + id_downtime + ',' + id_module + ');'); $("#add_modules_row", $('#module_editor_' + id_agent)) .before(template_row); } function fill_selectbox_modules(id_downtime, id_agent) { jQuery.post ('ajax.php', {"page": "include/ajax/planned_downtime.ajax", "get_modules_downtime": 1, "id_agent": id_agent, "id_downtime": id_downtime, "none_value": 1 }, function (data) { if (data['correct']) { $("#modules", $('#module_editor_' + id_agent)).empty(); //Fill the select for to add modules $.each(data['in_agent'], function(id_module, name) { $("#modules", $('#module_editor_' + id_agent)) .append($("<option value='" + id_module + "'>" + name + "</option>")); }); $("#modules", $('#module_editor_' + id_agent)).val(0); } }, "json" ); } function add_module_in_downtime(id_agent) { var module_sel = $("#modules", $('#module_editor_' + id_agent)).val(); if (module_sel == 0) { alert('<?php echo __('Please select a module.'); ?>'); } else { action_in_progress = true; $("#add_button_div", $('#module_editor_' + id_agent)).toggle(); $("#spinner_add", $('#module_editor_' + id_agent)).toggle(); jQuery.post ('ajax.php', {"page": "include/ajax/planned_downtime.ajax", "add_module_into_downtime": 1, "id_agent": id_agent, "id_module": module_sel, "id_downtime": id_downtime }, function (data) { if (data['correct']) { $("#list-agent_" + id_agent + '-count_modules').html( $("#some_modules_text").html()); add_row_module(id_downtime, id_agent, module_sel, data['name']); fill_selectbox_modules(id_downtime, id_agent); $("#add_button_div", $('#module_editor_' + id_agent)) .toggle(); $("#spinner_add", $('#module_editor_' + id_agent)) .toggle(); } else if (data['executed']) { show_executing_alert(); } action_in_progress = false; }, "json" ); } } function delete_module_from_downtime(id_downtime, id_module) { var spinner = $("#spinner_template").clone(); var old_cell_content = $(".cell_delete_button", "#row_module_in_downtime_" + id_module) .clone(true); $(".cell_delete_button", "#row_module_in_downtime_" + id_module) .html(spinner); action_in_progress = true; jQuery.post ('ajax.php', {"page": "include/ajax/planned_downtime.ajax", "delete_module_from_downtime": 1, "id_downtime": id_downtime, "id_module": id_module }, function (data) { if (data['correct']) { fill_selectbox_modules(id_downtime, data['id_agent']); $("#row_module_in_downtime_" + id_module).remove(); if (data['all_modules']) { $("#list-agent_" + data['id_agent'] + '-count_modules').html( $("#all_modules_text").html()); } } else if (data['executed']) { show_executing_alert(); } else { $(".cell_delete_button", "#row_module_in_downtime_" + id_module) .html($(old_cell_content)); } action_in_progress = false; }, "json" ); } $(document).ready (function () { $("#id_agents").change(agent_changed_by_multiple_agents); $("#modules_selection_mode").change(agent_changed_by_multiple_agents); change_type_downtime(); change_type_execution(); change_type_periodicity(); $("#text-periodically_time_from, #text-periodically_time_to, #text-once_time_from, #text-once_time_to").timepicker({ showSecond: true, timeFormat: '<?php echo TIME_FORMAT_JS; ?>', timeOnlyTitle: '<?php echo __('Choose time'); ?>', timeText: '<?php echo __('Time'); ?>', hourText: '<?php echo __('Hour'); ?>', minuteText: '<?php echo __('Minute'); ?>', secondText: '<?php echo __('Second'); ?>', currentText: '<?php echo __('Now'); ?>', closeText: '<?php echo __('Close'); ?>'}); $("#text-once_date_from, #text-once_date_to").datepicker({dateFormat: "<?php echo DATE_FORMAT_JS; ?>", showButtonPanel: true}); $.datepicker.setDefaults($.datepicker.regional[ "<?php echo get_user_language(); ?>"]); $("#filter_group").click (function () { $(this).css ("width", "auto"); }); $("#filter_group").blur (function () { $(this).css ("width", "180px"); }); $("#id_agent").click (function () { $(this).css ("width", "auto"); }); $("#id_agent").blur (function () { $(this).css ("width", "180px"); }); // Warning message about the problems caused updating a past planned downtime var type_execution = "<?php echo $type_execution; ?>"; var datetime_from = <?php echo json_encode(strtotime($once_date_from.' '.$once_time_from)); ?>; var datetime_now = <?php echo json_encode($utimestamp); ?>; var create = <?php echo json_encode($create); ?>; if (!create && (type_execution == 'periodically' || (type_execution == 'once' && datetime_from < datetime_now))) { $("input#submit-updbutton, input#submit-add_item, table#list a").click(function (e) { if (!confirm("<?php echo __('WARNING: If you edit this planned downtime, the data of future SLA reports may be altered'); ?>")) { e.preventDefault(); } }); } // Disable datepickers when it has readonly attribute $('input.hasDatepicker[readonly]').disable(); }); </script>