mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-07-27 07:44:35 +02:00
2009-01-15 Esteban Sanchez <estebans@artica.es>
* include/styles/menu.css: Changed the z-index property of the menu which was overlapped in some cases. * include/functions.php: format_alert_row() moved to functions_ui.php * include/functions_ui.php: Added format_alert_row() from function.php * include/functions_agents.php: Added to repository. * include/functions_alerts.php: Added new functions get_alerts_agent_module_disabled(), set_alerts_agent_module_force_execution(), get_alerts_agent_module_last_fired(). * include/functions_db.php, operation/agentes/estado_agente.php, operation/agentes/networkmap.php: Style correction. * include/functions_reporting.php: Use new functions_agent.php. Added a bit of documentation and style correction. * godmode/alerts/alert_templates.php: Improved a bit the template tooltip. * operation/agentes/alerts_status.php: Added to repository. New interface to list agent alerts. * operation/agentes/estado_alertas.php: Removed from repository. Replaced by alert_status.php. * operation/agentes/ver_agente.php: Removed flag_alert code snippet. Use new files added. Style correction. * operation/menu.php: Old files references replaced by new ones. * index.php: Removed build and pandora version references. * pandoradb.sql: Removed useless module_type field in talert_templates. * pandoradb_migrate_20_to_21.sql: Removed duplicate fields addition. Fixed some warnings. Added custom_id field to tagente. Style correction. * include/config_process.php: Updated build version. git-svn-id: https://svn.code.sf.net/p/pandora/code/trunk@1344 c3f86ba8-e40f-0410-aaad-9ba5e7f4b01f
This commit is contained in:
parent
466dc5be76
commit
cf3876ce27
@ -1,3 +1,50 @@
|
|||||||
|
2009-01-15 Esteban Sanchez <estebans@artica.es>
|
||||||
|
|
||||||
|
* include/styles/menu.css: Changed the z-index property of the menu
|
||||||
|
which was overlapped in some cases.
|
||||||
|
|
||||||
|
* include/functions.php: format_alert_row() moved to functions_ui.php
|
||||||
|
|
||||||
|
* include/functions_ui.php: Added format_alert_row() from function.php
|
||||||
|
|
||||||
|
* include/functions_agents.php: Added to repository.
|
||||||
|
|
||||||
|
* include/functions_alerts.php: Added new functions
|
||||||
|
get_alerts_agent_module_disabled(),
|
||||||
|
set_alerts_agent_module_force_execution(),
|
||||||
|
get_alerts_agent_module_last_fired().
|
||||||
|
|
||||||
|
* include/functions_db.php, operation/agentes/estado_agente.php,
|
||||||
|
operation/agentes/networkmap.php: Style correction.
|
||||||
|
|
||||||
|
* include/functions_reporting.php: Use new functions_agent.php. Added
|
||||||
|
a bit of documentation and style correction.
|
||||||
|
|
||||||
|
* godmode/alerts/alert_templates.php: Improved a bit the template
|
||||||
|
tooltip.
|
||||||
|
|
||||||
|
* operation/agentes/alerts_status.php: Added to repository. New
|
||||||
|
interface to list agent alerts.
|
||||||
|
|
||||||
|
* operation/agentes/estado_alertas.php: Removed from repository.
|
||||||
|
Replaced by alert_status.php.
|
||||||
|
|
||||||
|
* operation/agentes/ver_agente.php: Removed flag_alert code snippet.
|
||||||
|
Use new files added. Style correction.
|
||||||
|
|
||||||
|
* operation/menu.php: Old files references replaced by new ones.
|
||||||
|
|
||||||
|
* index.php: Removed build and pandora version references.
|
||||||
|
|
||||||
|
* pandoradb.sql: Removed useless module_type field in
|
||||||
|
talert_templates.
|
||||||
|
|
||||||
|
* pandoradb_migrate_20_to_21.sql: Removed duplicate fields addition.
|
||||||
|
Fixed some warnings. Added custom_id field to tagente. Style
|
||||||
|
correction.
|
||||||
|
|
||||||
|
* include/config_process.php: Updated build version.
|
||||||
|
|
||||||
2009-01-14 Sancho Lerena <slerena@artica.es>
|
2009-01-14 Sancho Lerena <slerena@artica.es>
|
||||||
|
|
||||||
* operation/servers/view_server_detail.php: Fixed missing parameter.
|
* operation/servers/view_server_detail.php: Fixed missing parameter.
|
||||||
|
@ -40,35 +40,33 @@ if (defined ('AJAX')) {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
echo '<h3>'.$template['name'].'</h3>';
|
echo '<h3>'.$template['name'].'</h3>';
|
||||||
echo '<strong>'.__('Type').':</strong> '.get_alert_templates_type_name ($template['type']).'<br />';
|
echo '<strong>'.get_alert_templates_type_name ($template['type']).':</strong> ';
|
||||||
|
|
||||||
switch ($template['type']) {
|
switch ($template['type']) {
|
||||||
case 'regex':
|
case 'regex':
|
||||||
case 'equal':
|
case 'equal':
|
||||||
case 'not_equal':
|
case 'not_equal':
|
||||||
echo '<strong>'.__('Value').':</strong> ';
|
|
||||||
if (empty ($template['value']))
|
if (empty ($template['value']))
|
||||||
echo '<em>'.__('Empty').'</em>';
|
echo '<em>'.__('Empty').'</em>';
|
||||||
else
|
else
|
||||||
echo '<code>'.$template['value'].'</code>';
|
echo '<code>'.$template['value'].'</code>';
|
||||||
echo '<br />';
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'max':
|
|
||||||
case 'max_min':
|
case 'max_min':
|
||||||
echo '<strong>'.__('Max. Value').':</strong> ';
|
echo __('Between').' ';
|
||||||
|
case 'max':
|
||||||
echo format_numeric ($template['max_value']);
|
echo format_numeric ($template['max_value']);
|
||||||
echo '<br />';
|
|
||||||
|
|
||||||
/* Break on max to not show min */
|
/* Break on max to not show min */
|
||||||
if ($template['type'] == 'max')
|
if ($template['type'] == 'max')
|
||||||
break;
|
break;
|
||||||
|
echo ''.__('and').' ';
|
||||||
case 'min':
|
case 'min':
|
||||||
echo '<strong>'.__('Min. Value').':</strong> ';
|
|
||||||
echo format_numeric ($template['min_value']);
|
echo format_numeric ($template['min_value']);
|
||||||
echo '<br />';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo '<br />';
|
||||||
|
|
||||||
if ($template['description'] != '') {
|
if ($template['description'] != '') {
|
||||||
echo '<strong>'.__('Description').':</strong><br />';
|
echo '<strong>'.__('Description').':</strong><br />';
|
||||||
echo $template['description'];
|
echo $template['description'];
|
||||||
|
@ -17,9 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
//Pandora Version
|
//Pandora Version
|
||||||
if (!isset ($build_version))
|
$build_version = "PC090115";
|
||||||
$build_version="PC081016";
|
|
||||||
if (!isset ($pandora_version))
|
|
||||||
$pandora_version = "v2.1-dev";
|
$pandora_version = "v2.1-dev";
|
||||||
|
|
||||||
// This is directory where placed "/attachment" directory, to upload files stores.
|
// This is directory where placed "/attachment" directory, to upload files stores.
|
||||||
|
@ -800,95 +800,6 @@ function show_alert_row_edit ($row2, $tdcolor = "datos", $id_tipo_modulo = 1, $c
|
|||||||
return $string;
|
return $string;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Formats a row from the alert table and returns an array usable in the table function
|
|
||||||
*
|
|
||||||
* @param array $alert A valid (non empty) row from the alert table
|
|
||||||
* @param bool $combined Whether or not this is a combined alert
|
|
||||||
* @param bool $agent Whether to print the agent information with the module information
|
|
||||||
* @param string $section Tab where the function was called from (used for urls)
|
|
||||||
*
|
|
||||||
* @return array A formatted array with proper html for use in $table->data (7 columns)
|
|
||||||
*/
|
|
||||||
function format_alert_row ($alert, $combined = 0, $agent = 1, $tab = 'main') {
|
|
||||||
if (empty ($alert)) {
|
|
||||||
return array ("", "", "", "", "", "", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get agent id
|
|
||||||
$id_agente = get_agentmodule_agent($alert["id_agente_modulo"]);
|
|
||||||
|
|
||||||
$data = array ();
|
|
||||||
|
|
||||||
// Force alert execution
|
|
||||||
if ($combined == 0) {
|
|
||||||
if ($alert["flag"] == 0) {
|
|
||||||
$data[0] = "<a href='index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=".$id_agente."&id_agente_modulo=".$alert["id_agente_modulo"]."&tab=".$tab."&flag_alert=1&refr=60'><img src='images/target.png' border='0'></a>";
|
|
||||||
} else {
|
|
||||||
$data[0] = "<a href='index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=".$id_agente."&tab=".$tab."&refr=60'><img src='images/refresh.png' border='0'></a>";
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$data[0] = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$data[1] = get_alert_type ($alert["id_alerta"]);
|
|
||||||
|
|
||||||
if ($combined == 1) {
|
|
||||||
$data[2] = print_agent_name ($id_agente, true, 20);
|
|
||||||
} elseif ($agent == 0) {
|
|
||||||
$data[2] = mb_substr (get_agentmodule_name ($alert["id_agente_modulo"]), 0, 20);
|
|
||||||
} else {
|
|
||||||
$data[2] = print_agent_name (get_agentmodule_agent ($alert["id_agente_modulo"]), true, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
$data[3] = mb_substr (safe_input ($alert["descripcion"]), 0, 35);
|
|
||||||
|
|
||||||
//Eye tooltip
|
|
||||||
$data[4] = '<a class="info"><img class="top" src="images/eye.png" alt="detail tooltip" />';
|
|
||||||
$data[4] .= '<span><table cellspacing="2" cellpadding="0" style="margin-left:2px;">
|
|
||||||
<tr><th colspan="2" width="91">'.__('Recovery').'</th></tr>
|
|
||||||
<tr><td colspan="2" class="datos" align="center"><b>'.($alert["recovery_notify"] == 1 ? __('Yes') : __('No')).'</b></td></tr>
|
|
||||||
<tr><th colspan="2" width="91">'.__('Priority').'</th></tr>
|
|
||||||
<tr><td colspan="2" class="datos" align="center"><b>'.get_alert_priority ($alert["priority"]).'</b></td></tr>
|
|
||||||
<tr><th colspan="2" width="91">'.__('Fires every').'</th></tr><tr><td colspan="2" class="datos" align="center"><b>';
|
|
||||||
if ($alert["min_alerts"] > 0) {
|
|
||||||
$data[4] .= human_time_description_raw ($alert["time_threshold"] / $alert["min_alerts"]);
|
|
||||||
} else {
|
|
||||||
$data[4] .= human_time_description_raw ($alert["time_threshold"]);
|
|
||||||
}
|
|
||||||
$data[4] .= '</b></td></tr>
|
|
||||||
<tr><th colspan="2" width="91">'.__('Firing days').'</th></tr>
|
|
||||||
<tr><td colspan="2" class="datos" align="center"><b>'.get_alert_days ($alert).'</b></td></tr>
|
|
||||||
<tr><th colspan="2" width="91">'.__('Firing times').'</th></tr>
|
|
||||||
<tr><td colspan="2" class="datos" align="center"><b>'.($alert["time_from"] == $alert["time_to"] ? __('Always') : $alert["time_from"].' - '.$alert["time_to"]).'</b></td></tr>
|
|
||||||
</table></span></a>';
|
|
||||||
|
|
||||||
//Min. and Max. - maybe move this to the span
|
|
||||||
$data[5] = format_numeric ($alert["dis_min"], 2).' / '.format_numeric ($alert["dis_max"], 2);
|
|
||||||
|
|
||||||
$data[6] = print_timestamp ($alert["last_fired"], true);
|
|
||||||
|
|
||||||
$options = array ();
|
|
||||||
$options["height"] = 9;
|
|
||||||
$options["width"] = 20;
|
|
||||||
|
|
||||||
if ($alert["times_fired"] > 0) {
|
|
||||||
$options["src"] = "images/pixel_red.png";
|
|
||||||
$options["title"] = __('Alert fired').' '.$alert["times_fired"].' '.__('times');
|
|
||||||
} elseif ($alert["disable"] > 0) {
|
|
||||||
$options["src"] = "images/pixel_gray.png";
|
|
||||||
$options["title"] = __('Alert disabled');
|
|
||||||
} else {
|
|
||||||
$options["src"] = "images/pixel_green.png";
|
|
||||||
$options["title"] = __('Alert not fired');
|
|
||||||
}
|
|
||||||
$data[7] = print_image ($options["src"], true, $options);
|
|
||||||
|
|
||||||
$data[8] = print_checkbox ("validate[]", $alert["id_aam"], false, true);
|
|
||||||
|
|
||||||
return $data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get report types in an array.
|
* Get report types in an array.
|
||||||
*
|
*
|
||||||
|
104
pandora_console/include/functions_agents.php
Normal file
104
pandora_console/include/functions_agents.php
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// Pandora FMS - the Flexible Monitoring System
|
||||||
|
// ============================================
|
||||||
|
// Copyright (c) 2008 Artica Soluciones Tecnologicas, http://www.artica.es
|
||||||
|
// Please see http://pandora.sourceforge.net for full contribution list
|
||||||
|
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public License (LGPL)
|
||||||
|
// 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.
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the simple alerts of an agent.
|
||||||
|
*
|
||||||
|
* @param int Agent id
|
||||||
|
* @param string Filter on "fired", "notfired" or "disabled". Any other value
|
||||||
|
* will not do any filter.
|
||||||
|
*
|
||||||
|
* @return array All simple alerts defined for an agent. Empty array if no
|
||||||
|
* alerts found.
|
||||||
|
*/
|
||||||
|
function get_agent_alerts_simple ($id_agent, $filter = false) {
|
||||||
|
switch ($filter) {
|
||||||
|
case "notfired":
|
||||||
|
$filter = ' AND times_fired = 0 AND disable = 0';
|
||||||
|
break;
|
||||||
|
case "fired":
|
||||||
|
$filter = ' AND times_fired > 0 AND disable = 0';
|
||||||
|
break;
|
||||||
|
case "disabled":
|
||||||
|
$filter = ' AND disable = 1';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$filter = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$id_modules = array_keys (get_agent_modules ($id_agent));
|
||||||
|
|
||||||
|
//$modules = ();
|
||||||
|
|
||||||
|
$sql = sprintf ("SELECT talert_template_modules.*
|
||||||
|
FROM talert_template_modules
|
||||||
|
WHERE id_agent_module in (%s)",
|
||||||
|
$id_agent, implode (",", $id_modules));
|
||||||
|
|
||||||
|
$alerts = get_db_all_rows_sql ($sql);
|
||||||
|
|
||||||
|
if ($alerts === false)
|
||||||
|
return array ();
|
||||||
|
return $alerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the combined alerts of an agent.
|
||||||
|
*
|
||||||
|
* @param int $id_agent Agent id
|
||||||
|
*
|
||||||
|
* @return array An array with all combined alerts defined for an agent.
|
||||||
|
*/
|
||||||
|
function get_agent_alerts_combined ($id_agent, $filter = false) {
|
||||||
|
switch ($filter) {
|
||||||
|
case "notfired":
|
||||||
|
$filter = ' AND times_fired = 0 AND disable = 0';
|
||||||
|
break;
|
||||||
|
case "fired":
|
||||||
|
$filter = ' AND times_fired > 0 AND disable = 0';
|
||||||
|
break;
|
||||||
|
case "disabled":
|
||||||
|
$filter = ' AND disable = 1';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$filter = '';
|
||||||
|
}
|
||||||
|
$sql = sprintf ("SELECT * FROM talerta_agente_modulo WHERE id_agent = %d%s", $id_agent, $filter);
|
||||||
|
$alerts = get_db_all_rows_sql ($sql);
|
||||||
|
|
||||||
|
if ($alerts === false)
|
||||||
|
return array ();
|
||||||
|
return $alerts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the alerts of an agent, simple and combined.
|
||||||
|
*
|
||||||
|
* @param int $id_agent Agent id
|
||||||
|
*
|
||||||
|
* @return array An array with all alerts defined for an agent.
|
||||||
|
*/
|
||||||
|
function get_agent_alerts ($id_agent, $filter = false) {
|
||||||
|
$simple_alerts = get_agent_alerts_simple ($id_agent, $filter);
|
||||||
|
$combined_alerts = get_agent_alerts_combined ($id_agent, $filter);
|
||||||
|
|
||||||
|
return array_merge ($simple_alerts, $combined_alerts);
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
@ -589,12 +589,35 @@ function get_alert_agent_module ($id_alert_agent_module) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function get_alerts_agent_module ($id_agent_module) {
|
function get_alerts_agent_module ($id_agent_module) {
|
||||||
|
$id_alert_agent_module = safe_int ($id_agent_module, 1);
|
||||||
$sql = sprintf ('SELECT * FROM talert_template_modules
|
$sql = sprintf ('SELECT * FROM talert_template_modules
|
||||||
WHERE id_agent_module = %d
|
WHERE id_agent_module = %d
|
||||||
AND disabled = 0', $id_agent_module);
|
AND disabled = 0', $id_agent_module);
|
||||||
return get_db_all_rows_sql ($sql);
|
return get_db_all_rows_sql ($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_alerts_agent_module_disabled ($id_alert_agent_module) {
|
||||||
|
$id_alert_agent_module = safe_int ($id_alert_agent_module, 1);
|
||||||
|
return get_db_value ('disabled', 'talert_template_modules', 'id',
|
||||||
|
$id_alert_agent_module);
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_alerts_agent_module_force_execution ($id_alert_agent_module) {
|
||||||
|
$id_alert_agent_module = safe_int ($id_alert_agent_module, 1);
|
||||||
|
$sql = sprintf ('UPDATE talert_template_modules
|
||||||
|
SET force_execution = 1
|
||||||
|
WHERE id = %d',
|
||||||
|
$id_alert_agent_module);
|
||||||
|
|
||||||
|
return process_sql ($sql) !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_alerts_agent_module_last_fired ($id_alert_agent_module) {
|
||||||
|
$id_alert_agent_module = safe_int ($id_alert_agent_module, 1);
|
||||||
|
return get_db_value ('last_fired', 'talert_template_modules', 'id',
|
||||||
|
$id_alert_agent_module);
|
||||||
|
}
|
||||||
|
|
||||||
function add_alert_agent_module_action ($id_alert_agent_module, $id_alert_action, $options = false) {
|
function add_alert_agent_module_action ($id_alert_agent_module, $id_alert_action, $options = false) {
|
||||||
if (empty ($id_alert_agent_module))
|
if (empty ($id_alert_agent_module))
|
||||||
return false;
|
return false;
|
||||||
|
@ -291,87 +291,6 @@ function get_agent_modules ($id_agent, $details = false) {
|
|||||||
}
|
}
|
||||||
return $modules;
|
return $modules;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all the simple alerts of an agent.
|
|
||||||
*
|
|
||||||
* @param int Agent id
|
|
||||||
* @param string Filter on "fired", "notfired" or "disabled". Any other value
|
|
||||||
* will not do any filter.
|
|
||||||
*
|
|
||||||
* @return array All simple alerts defined for an agent. Empty array if no
|
|
||||||
* alerts found.
|
|
||||||
*/
|
|
||||||
function get_agent_alerts_simple ($id_agent, $filter = false) {
|
|
||||||
switch ($filter) {
|
|
||||||
case "notfired":
|
|
||||||
$filter = ' AND times_fired = 0 AND disable = 0';
|
|
||||||
break;
|
|
||||||
case "fired":
|
|
||||||
$filter = ' AND times_fired > 0 AND disable = 0';
|
|
||||||
break;
|
|
||||||
case "disabled":
|
|
||||||
$filter = ' AND disable = 1';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$filter = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = sprintf ("SELECT talerta_agente_modulo.*
|
|
||||||
FROM talerta_agente_modulo, tagente_modulo
|
|
||||||
WHERE talerta_agente_modulo.id_agente_modulo = tagente_modulo.id_agente_modulo
|
|
||||||
AND tagente_modulo.id_agente = %d %s",
|
|
||||||
$id_agent, $filter);
|
|
||||||
$alerts = get_db_all_rows_sql ($sql);
|
|
||||||
|
|
||||||
if ($alerts === false)
|
|
||||||
return array ();
|
|
||||||
return $alerts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all the combined alerts of an agent.
|
|
||||||
*
|
|
||||||
* @param int $id_agent Agent id
|
|
||||||
*
|
|
||||||
* @return array An array with all combined alerts defined for an agent.
|
|
||||||
*/
|
|
||||||
function get_agent_alerts_combined ($id_agent, $filter = false) {
|
|
||||||
switch ($filter) {
|
|
||||||
case "notfired":
|
|
||||||
$filter = ' AND times_fired = 0 AND disable = 0';
|
|
||||||
break;
|
|
||||||
case "fired":
|
|
||||||
$filter = ' AND times_fired > 0 AND disable = 0';
|
|
||||||
break;
|
|
||||||
case "disabled":
|
|
||||||
$filter = ' AND disable = 1';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$filter = '';
|
|
||||||
}
|
|
||||||
$sql = sprintf ("SELECT * FROM talerta_agente_modulo WHERE id_agent = %d%s", $id_agent, $filter);
|
|
||||||
$alerts = get_db_all_rows_sql ($sql);
|
|
||||||
|
|
||||||
if ($alerts === false)
|
|
||||||
return array ();
|
|
||||||
return $alerts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all the alerts of an agent, simple and combined.
|
|
||||||
*
|
|
||||||
* @param int $id_agent Agent id
|
|
||||||
*
|
|
||||||
* @return array An array with all alerts defined for an agent.
|
|
||||||
*/
|
|
||||||
function get_agent_alerts ($id_agent, $filter = false) {
|
|
||||||
$simple_alerts = get_agent_alerts_simple ($id_agent, $filter);
|
|
||||||
$combined_alerts = get_agent_alerts_combined ($id_agent, $filter);
|
|
||||||
|
|
||||||
return array_merge ($simple_alerts, $combined_alerts);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of the reports the user can view.
|
* Get a list of the reports the user can view.
|
||||||
*
|
*
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
require_once ("include/functions_agents.php");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get SLA of a module.
|
* Get SLA of a module.
|
||||||
*
|
*
|
||||||
@ -111,7 +113,7 @@ function get_agent_module_sla ($id_agent_module, $period, $min_value, $max_value
|
|||||||
/**
|
/**
|
||||||
* Get general stats info on a group
|
* Get general stats info on a group
|
||||||
*
|
*
|
||||||
* @param int $id_group
|
* @param int Group Id to get info.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
@ -125,10 +127,13 @@ function get_group_stats ($id_group) {
|
|||||||
|
|
||||||
//Select all modules in group
|
//Select all modules in group
|
||||||
$sql = sprintf ("SELECT tagente.id_agente, tagente_estado.estado, tagente_estado.datos, tagente_estado.current_interval, tagente_estado.utimestamp,
|
$sql = sprintf ("SELECT tagente.id_agente, tagente_estado.estado, tagente_estado.datos, tagente_estado.current_interval, tagente_estado.utimestamp,
|
||||||
tagente_estado.id_agente_modulo, tagente_modulo.id_tipo_modulo FROM tagente, tagente_estado, tagente_modulo
|
tagente_estado.id_agente_modulo, tagente_modulo.id_tipo_modulo
|
||||||
|
FROM tagente, tagente_estado, tagente_modulo
|
||||||
WHERE tagente.disabled = 0 AND tagente.id_grupo IN (%s)
|
WHERE tagente.disabled = 0 AND tagente.id_grupo IN (%s)
|
||||||
AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
|
AND tagente.id_agente = tagente_estado.id_agente
|
||||||
AND tagente_modulo.disabled = 0", implode (",",$groups));
|
AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
|
||||||
|
AND tagente_modulo.disabled = 0",
|
||||||
|
implode (",",$groups));
|
||||||
$result = get_db_all_rows_sql ($sql);
|
$result = get_db_all_rows_sql ($sql);
|
||||||
|
|
||||||
if ($result === false)
|
if ($result === false)
|
||||||
@ -152,7 +157,6 @@ function get_group_stats ($id_group) {
|
|||||||
$data["data_alerts_fired"] = 0;
|
$data["data_alerts_fired"] = 0;
|
||||||
$data["data_alerts_fire_count"] = 0;
|
$data["data_alerts_fire_count"] = 0;
|
||||||
|
|
||||||
|
|
||||||
$cur_time = get_system_time ();
|
$cur_time = get_system_time ();
|
||||||
|
|
||||||
foreach ($result as $row) {
|
foreach ($result as $row) {
|
||||||
|
@ -220,4 +220,75 @@ function print_agent_name ($id_agent, $return = false, $cutoff = 0) {
|
|||||||
|
|
||||||
echo $output;
|
echo $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats a row from the alert table and returns an array usable in the table function
|
||||||
|
*
|
||||||
|
* @param array A valid (non empty) row from the alert table
|
||||||
|
* @param bool Whether or not this is a combined alert
|
||||||
|
* @param bool Whether to print the agent information with the module information
|
||||||
|
* @param string Tab where the function was called from (used for urls)
|
||||||
|
*
|
||||||
|
* @return array A formatted array with proper html for use in $table->data (6 columns)
|
||||||
|
*/
|
||||||
|
function format_alert_row ($alert, $combined = false, $agent = true, $url = '') {
|
||||||
|
require_once ("include/functions_alerts.php");
|
||||||
|
|
||||||
|
if (empty ($alert))
|
||||||
|
return array ("", "", "", "", "", "", "");
|
||||||
|
|
||||||
|
// Get agent id
|
||||||
|
$id_agente = get_agentmodule_agent ($alert["id_agent_module"]);
|
||||||
|
$template = get_alert_template ($alert['id_alert_template']);
|
||||||
|
|
||||||
|
$data = array ();
|
||||||
|
|
||||||
|
// Force alert execution
|
||||||
|
$data[0] = '';
|
||||||
|
if (! $combined) {
|
||||||
|
if ($alert["force_execution"] == 0) {
|
||||||
|
$data[0] = '<a href="'.$url.'&id_alert='.$alert["id"].'&force_execution=1&refr=60"><img src="images/target.png" ></a>';
|
||||||
|
} else {
|
||||||
|
$data[0] = '<a href="'.$url.'&id_alert='.$alert["id"].'&refr=60"><img src="images/refresh.png" /></a>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($combined == 1) {
|
||||||
|
$data[1] = print_agent_name ($id_agente, true, 20);
|
||||||
|
} elseif ($agent == 0) {
|
||||||
|
$data[1] = mb_substr (get_agentmodule_name ($alert["id_agent_module"]), 0, 20);
|
||||||
|
} else {
|
||||||
|
$data[1] = print_agent_name (get_agentmodule_agent ($alert["id_agent_module"]), true, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data[2] = '<span class="left">';
|
||||||
|
$data[2] .= mb_substr (safe_input ($template["description"]), 0, 35);
|
||||||
|
$data[2] .= '</span> <span class="right">';
|
||||||
|
$data[2] .= '<a class="template_details" href="ajax.php?page=godmode/alerts/alert_templates&get_template_tooltip=1&id_template='.$template['id'].'">';
|
||||||
|
$data[2] .= '<img src="images/zoom.png" />';
|
||||||
|
$data[2] .= '</a></span>';
|
||||||
|
|
||||||
|
$data[3] = print_timestamp ($alert["last_fired"], true);
|
||||||
|
|
||||||
|
$options = array ();
|
||||||
|
$options["height"] = 9;
|
||||||
|
$options["width"] = 20;
|
||||||
|
|
||||||
|
if ($alert["times_fired"] > 0) {
|
||||||
|
$options["src"] = "images/pixel_red.png";
|
||||||
|
$options["title"] = __('Alert fired').' '.$alert["times_fired"].' '.__('times');
|
||||||
|
} elseif ($alert["disabled"] > 0) {
|
||||||
|
$options["src"] = "images/pixel_gray.png";
|
||||||
|
$options["title"] = __('Alert disabled');
|
||||||
|
} else {
|
||||||
|
$options["src"] = "images/pixel_green.png";
|
||||||
|
$options["title"] = __('Alert not fired');
|
||||||
|
}
|
||||||
|
|
||||||
|
$data[4] = print_image ($options["src"], true, $options);
|
||||||
|
|
||||||
|
$data[5] = print_checkbox ("validate[]", $alert["id"], false, true);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -78,7 +78,7 @@
|
|||||||
top:-25px;
|
top:-25px;
|
||||||
left:155px;
|
left:155px;
|
||||||
width:130px;
|
width:130px;
|
||||||
z-index:1;
|
z-index:5;
|
||||||
background: #E9F3D2 url(../../images/arrow.png) no-repeat scroll 6px 4px;
|
background: #E9F3D2 url(../../images/arrow.png) no-repeat scroll 6px 4px;
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,6 @@
|
|||||||
// Silk icon set 1.3 (cc) Mark James, http://www.famfamfam.com/lab/icons/silk/
|
// Silk icon set 1.3 (cc) Mark James, http://www.famfamfam.com/lab/icons/silk/
|
||||||
// Pandora FMS uses Pear Image::Graph code
|
// Pandora FMS uses Pear Image::Graph code
|
||||||
|
|
||||||
$build_version="PC090106";
|
|
||||||
$pandora_version="v2.1-dev";
|
|
||||||
global $build_version;
|
|
||||||
global $pandora_version;
|
|
||||||
|
|
||||||
//Set character encoding to UTF-8 - fixes a lot of multibyte character headaches
|
//Set character encoding to UTF-8 - fixes a lot of multibyte character headaches
|
||||||
if (function_exists (mb_internal_encoding)) {
|
if (function_exists (mb_internal_encoding)) {
|
||||||
mb_internal_encoding ("UTF-8");
|
mb_internal_encoding ("UTF-8");
|
||||||
|
@ -16,11 +16,10 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
// Load global vars
|
|
||||||
require_once ("include/config.php");
|
|
||||||
|
|
||||||
check_login ();
|
check_login ();
|
||||||
|
|
||||||
|
require_once ("include/functions_agents.php");
|
||||||
|
|
||||||
$filter = get_parameter_get ("filter", "all");
|
$filter = get_parameter_get ("filter", "all");
|
||||||
$offset = (int) get_parameter_get ("offset", 0);
|
$offset = (int) get_parameter_get ("offset", 0);
|
||||||
$id_group = (int) get_parameter ("ag_group", 1); //1 is the All group (selects all groups)
|
$id_group = (int) get_parameter ("ag_group", 1); //1 is the All group (selects all groups)
|
||||||
@ -33,6 +32,13 @@ $sec = safe_url_extraclean ($sec);
|
|||||||
|
|
||||||
$url = 'index.php?sec='.$sec.'&sec2='.$sec2.'&refr='.$config["refr"].'&filter='.$filter.'&ag_group='.$id_group;
|
$url = 'index.php?sec='.$sec.'&sec2='.$sec2.'&refr='.$config["refr"].'&filter='.$filter.'&ag_group='.$id_group;
|
||||||
|
|
||||||
|
// Force alert execution
|
||||||
|
$flag_alert = (bool) get_parameter ('force_execution');
|
||||||
|
if ($flag_alert == 1 && give_acl ($config['id_user'], $id_grupo, "AW")) {
|
||||||
|
require_once ("include/functions_alerts.php");
|
||||||
|
$id_alert = (int) get_parameter ('id_alert');
|
||||||
|
set_alerts_agent_module_force_execution ($id_alert);
|
||||||
|
}
|
||||||
|
|
||||||
// Show alerts for specific agent
|
// Show alerts for specific agent
|
||||||
if (isset ($_GET["id_agente"])) {
|
if (isset ($_GET["id_agente"])) {
|
||||||
@ -49,7 +55,7 @@ if (isset ($_GET["id_agente"])) {
|
|||||||
|
|
||||||
$alerts_simple = get_agent_alerts_simple ($id_agent, $filter);
|
$alerts_simple = get_agent_alerts_simple ($id_agent, $filter);
|
||||||
$alerts_combined = get_agent_alerts_combined ($id_agent, $filter);
|
$alerts_combined = get_agent_alerts_combined ($id_agent, $filter);
|
||||||
$print_agent = 0;
|
$print_agent = false;
|
||||||
} else {
|
} else {
|
||||||
if (give_acl ($config["id_user"], $id_group, "AR") == 0) {
|
if (give_acl ($config["id_user"], $id_group, "AR") == 0) {
|
||||||
audit_db ($config["id_user"], $config["remote_addr"], "ACL Violation","Trying to access alert view");
|
audit_db ($config["id_user"], $config["remote_addr"], "ACL Violation","Trying to access alert view");
|
||||||
@ -70,122 +76,134 @@ if (isset ($_GET["id_agente"])) {
|
|||||||
$alerts_combined = array_merge ($alerts_combined, $combined);
|
$alerts_combined = array_merge ($alerts_combined, $combined);
|
||||||
}
|
}
|
||||||
|
|
||||||
$print_agent = 1;
|
$print_agent = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tab = get_parameter_get ("tab");
|
$tab = get_parameter_get ("tab");
|
||||||
if ($tab != '') {
|
if ($tab != '') {
|
||||||
echo "<h2>".__('Pandora Agents')." > ".__('Full list of Alerts')."</h2>";
|
|
||||||
$url = $url.'&tab='.$tab;
|
$url = $url.'&tab='.$tab;
|
||||||
} else {
|
|
||||||
echo "<h3>".__('Full list of alerts').'</h3>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo "<h3>".__('Alerts').'</h3>';
|
||||||
|
|
||||||
echo '<form method="post" action="'.$url.'">';
|
if (get_parameter ('alert_validate')) {
|
||||||
if (isset ($_POST["alert_validate"])) {
|
|
||||||
$validate = get_parameter_post ("validate", array ());
|
$validate = get_parameter_post ("validate", array ());
|
||||||
$result = process_alerts_validate ($validate);
|
$result = process_alerts_validate ($validate);
|
||||||
print_error_message ($result, __('Alert(s) validated'), __('Error processing alert(s)'));
|
print_error_message ($result, __('Alert(s) validated'), __('Error processing alert(s)'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
echo '<form method="post" action="'.$url.'">';
|
||||||
|
|
||||||
if ($print_agent == 1) {
|
if ($print_agent) {
|
||||||
echo '<table cellpadding="4" cellspacing="4" class="databox">';
|
$table->width = '90%';
|
||||||
echo '<tr><td>'.__('Group').'</td><td valign="middle">';
|
$table->data = array ();
|
||||||
|
$table->style = array ();
|
||||||
|
|
||||||
//Select box
|
$table->data[0][0] = __('Group');
|
||||||
$fields = get_user_groups ($config["id_user"]);
|
$table->data[0][1] = print_select (get_user_groups (), "ag_group", $id_group,
|
||||||
print_select ($fields, "ag_group", $id_group, 'javascript:this.form.submit();" class="w150','');
|
'javascript:this.form.submit();', '', '', true);
|
||||||
|
|
||||||
//And submit button
|
$table->data[0][2] = '<a href="'.$url.'&filter=fired"><img src="images/pixel_red.png" width="18" height="18" title="'.__('Click to filter').'">'.__('Alert fired').'</a>';
|
||||||
echo '</td><td valign="middle"><noscript><input name="uptbutton" type="submit" class="sub" value="'.__('Show').'"></noscript></td>';
|
$table->data[0][3] = '<a href="'.$url.'&filter=notfired"><img src="images/pixel_green.png" width="18" height="18" title="'.__('Click to filter').'">'.__('Alert not fired').'</a>';
|
||||||
|
$table->data[0][4] = '<a href="'.$url.'&filter=disabled"><img src="images/pixel_gray.png" width="18" height="18" title="'.__('Click to filter').'">'.__('Alert disabled').'</a>';
|
||||||
|
|
||||||
//And finish the table here
|
switch ($filter) {
|
||||||
echo '<td class="f9" style="padding-left:30px;'.($filter == "fired" ? ' font-weight: bold;' : '').'"><a href="'.$url.'&filter=fired"><img src="images/pixel_red.png" width="18" height="18" title="'.__('Click to filter').'"></a> '.__('Alert fired').'</td>';
|
case 'fired':
|
||||||
echo '<td class="f9" style="padding-left:30px;'.($filter == "notfired" ? ' font-weight: bold;' : '').'"><a href="'.$url.'&filter=notfired"><img src="images/pixel_green.png" width="18" height="18" title="'.__('Click to filter').'"></a> '.__('Alert not fired').'</td>';
|
$table->style[2] = 'font-weight: bold';
|
||||||
echo '<td class="f9" style="padding-left:30px;'.($filter == "disabled" ? ' font-weight: bold;' : '').'"><a href="'.$url.'&filter=disabled"><img src="images/pixel_gray.png" width="18" height="18" title="'.__('Click to filter').'"></a> '.__('Alert disabled').'</td></tr></table>';
|
|
||||||
|
break;
|
||||||
|
case 'notfired':
|
||||||
|
$table->style[3] = 'font-weight: bold';
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 'disabled':
|
||||||
|
$table->style[4] = 'font-weight: bold';
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$table->cellpadding = 4;
|
print_table ($table);
|
||||||
$table->cellspacing = 4;
|
}
|
||||||
$table->width = 750;
|
|
||||||
$table->border = 0;
|
$table->width = '90%';
|
||||||
$table->class = "databox";
|
$table->class = "databox";
|
||||||
|
|
||||||
$table->head = array ();
|
$table->head = array ();
|
||||||
|
|
||||||
$table->head[0] = '';
|
$table->head[0] = '';
|
||||||
$table->head[1] = __('Type');
|
$table->head[1] = ''; //Placeholder for name
|
||||||
$table->head[2] = ''; //Placeholder for name
|
$table->head[2] = __('Template');
|
||||||
$table->head[3] = __('Description');
|
$table->head[3] = __('Last fired');
|
||||||
$table->head[4] = __('Info');
|
$table->head[4] = __('Status');
|
||||||
$table->head[5] = __('Min.').'/'.__('Max.');
|
$table->head[5] = __('Validate').pandora_help ('alert_validation', true);
|
||||||
$table->head[6] = __('Last fired');
|
|
||||||
$table->head[7] = __('Status');
|
|
||||||
$table->head[8] = __('Validate') . pandora_help('alert_validation', true);
|
|
||||||
$table->align = array ();
|
|
||||||
$table->align[0] = "center";
|
|
||||||
$table->align[1] = "center";
|
|
||||||
$table->align[4] = "center";
|
|
||||||
$table->align[5] = "center";
|
|
||||||
$table->align[6] = "center";
|
|
||||||
$table->align[7] = "center";
|
|
||||||
$table->align[8] = "center";
|
|
||||||
|
|
||||||
$table->title = __('Single alerts');
|
$table->title = __('Single alerts');
|
||||||
if ($print_agent == 0) {
|
|
||||||
$table->head[2] = __('Module name');
|
|
||||||
} else {
|
|
||||||
$table->head[2] = __('Agent name');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ($print_agent == 0) {
|
||||||
|
$table->head[1] = __('Module');
|
||||||
|
} else {
|
||||||
|
$table->head[1] = __('Agent');
|
||||||
|
}
|
||||||
|
$table->align = array ();
|
||||||
|
$table->align[4] = 'center';
|
||||||
|
$table->align[5] = 'center';
|
||||||
$table->data = array ();
|
$table->data = array ();
|
||||||
|
|
||||||
$counter[0] = 0; //Dual counter. This one counts the total number of alerts
|
$total = 0;
|
||||||
$counter[1] = 0; //Dual counter. This one counts only the printed alerts
|
$printed = 0;
|
||||||
foreach ($alerts_simple as $alert) {
|
foreach ($alerts_simple as $alert) {
|
||||||
$counter[0]++;
|
$total++;
|
||||||
if (empty ($alert) || $counter[1] >= $config["block_size"] || $counter[0] <= $offset) {
|
if (empty ($alert) || $printed >= $config["block_size"] || $total <= $offset) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$counter[1]++;
|
$printed++;
|
||||||
array_push ($table->data, format_alert_row ($alert, 0, $print_agent, 'alert'));
|
array_push ($table->data, format_alert_row ($alert, 0, $print_agent, $url));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty ($table->data)) {
|
if (!empty ($table->data)) {
|
||||||
pagination ($counter[0], $url, $offset);
|
pagination ($total, $url, $offset);
|
||||||
print_table ($table);
|
print_table ($table);
|
||||||
} else {
|
} else {
|
||||||
echo '<div class="nf">'.__('No simple alerts found').'</div>';
|
echo '<div class="nf">'.__('No simple alerts found').'</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
$table->title = __('Combined alerts');
|
$table->title = __('Combined alerts');
|
||||||
$table->head[1] = __('Agent name');
|
$table->head[1] = __('Agent');
|
||||||
$table->data = array ();
|
$table->data = array ();
|
||||||
|
|
||||||
$counter[2] = 0;
|
$combined_total = 0;
|
||||||
$counter[3] = 0;
|
$combined_printed = 0;
|
||||||
foreach ($alerts_combined as $alert) {
|
foreach ($alerts_combined as $alert) {
|
||||||
$counter[2]++;
|
$combined_total++;
|
||||||
if (empty ($alert) || $counter[3] >= $config["block_size"] || $counter[2] <= $offset) {
|
if (empty ($alert) || $combined_printed >= $config["block_size"] || $combined_total <= $offset) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$counter[3]++;
|
$combined_printed++;
|
||||||
array_push ($table->data, format_alert_row ($alert, 1, $print_agent));
|
array_push ($table->data, format_alert_row ($alert, 1, $print_agent));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty ($table->data)) {
|
if (!empty ($table->data)) {
|
||||||
pagination ($counter[0], $url, $offset);
|
pagination ($total, $url, $offset);
|
||||||
print_table ($table);
|
print_table ($table);
|
||||||
} else {
|
|
||||||
echo '<div class="nf">'.__('No combined alerts found').'</div>';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($counter[1] > 0 || $counter[2] > 0) {
|
if ($printed > 0 || $combined_total > 0) {
|
||||||
echo '<div style="text-align: right; width: 750px;">';
|
echo '<div class="action-buttons" style="width: '.$table->width.';">';
|
||||||
print_submit_button (__('Validate'), 'alert_validate', false, 'class="sub upd"', false);
|
print_submit_button (__('Validate'), 'alert_validate', false, 'class="sub upd"', false);
|
||||||
echo '</div>';
|
echo '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
echo '</form>';
|
echo '</form>';
|
||||||
?>
|
?>
|
||||||
|
<link rel="stylesheet" href="include/styles/cluetip.css" type="text/css" />
|
||||||
|
<script type="text/javascript" src="include/javascript/jquery.cluetip.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready (function () {
|
||||||
|
$("a.template_details").cluetip ({
|
||||||
|
arrows: true,
|
||||||
|
attribute: 'href',
|
||||||
|
cluetipClass: 'default',
|
||||||
|
fx: { open: 'fadeIn', openSpeed: 'slow' },
|
||||||
|
}).click (function () {
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
@ -33,7 +33,7 @@ $group_id = get_parameter ("group_id", 0);
|
|||||||
$ag_group = get_parameter ("ag_group", $group_id);
|
$ag_group = get_parameter ("ag_group", $group_id);
|
||||||
$ag_group = get_parameter_get ("ag_group_refresh", $ag_group); //if it isn't set, defaults to prev. value
|
$ag_group = get_parameter_get ("ag_group_refresh", $ag_group); //if it isn't set, defaults to prev. value
|
||||||
|
|
||||||
$search = get_parameter ("search", "");
|
$search = get_parameter ("search");
|
||||||
|
|
||||||
echo "<h2>".__('Pandora Agents')." > ".__('Summary')."</h2>";
|
echo "<h2>".__('Pandora Agents')." > ".__('Summary')."</h2>";
|
||||||
|
|
||||||
@ -242,11 +242,11 @@ if ($agents !== false) {
|
|||||||
echo "<a href='index.php?sec=gagente&
|
echo "<a href='index.php?sec=gagente&
|
||||||
sec2=godmode/agentes/configurar_agente&
|
sec2=godmode/agentes/configurar_agente&
|
||||||
id_agente=".$id_agente."'>
|
id_agente=".$id_agente."'>
|
||||||
<img src='images/setup.png' border=0 width=16></a>";
|
<img src='images/setup.png' border=0 width=16></a> ";
|
||||||
}
|
}
|
||||||
echo " <a href='index.php?sec=estado&
|
echo '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'"><strong>';
|
||||||
sec2=operation/agentes/ver_agente&id_agente=".$id_agente."'>
|
echo $nombre_agente;
|
||||||
<b>".$nombre_agente."</b></a></td>";
|
echo "</strong></a></td>";
|
||||||
|
|
||||||
// Show SO icon :)
|
// Show SO icon :)
|
||||||
echo "<td class='$tdcolor' align='center'>";
|
echo "<td class='$tdcolor' align='center'>";
|
||||||
@ -267,7 +267,7 @@ if ($agents !== false) {
|
|||||||
//echo ' (<b>';
|
//echo ' (<b>';
|
||||||
//echo get_group_name ($id_grupo);
|
//echo get_group_name ($id_grupo);
|
||||||
//echo "</b>)";
|
//echo "</b>)";
|
||||||
echo "</A>";
|
echo "</a>";
|
||||||
|
|
||||||
|
|
||||||
echo "<td class='$tdcolor'><b>".$numero_modulos." : ";
|
echo "<td class='$tdcolor'><b>".$numero_modulos." : ";
|
||||||
|
@ -43,8 +43,11 @@ function generate_dot ($simple = 0, $font_size) {
|
|||||||
$graph = open_graph ();
|
$graph = open_graph ();
|
||||||
|
|
||||||
// Get agent data
|
// Get agent data
|
||||||
$agents = get_db_all_rows_sql ('SELECT id_grupo, nombre, id_os, id_parent, id_agente FROM tagente WHERE disabled = 0 ORDER BY id_grupo');
|
$agents = get_db_all_rows_sql ('SELECT id_grupo, nombre, id_os, id_parent, id_agente
|
||||||
if ($agents)
|
FROM tagente
|
||||||
|
WHERE disabled = 0
|
||||||
|
ORDER BY id_grupo');
|
||||||
|
if ($agents){
|
||||||
foreach ($agents as $agent) {
|
foreach ($agents as $agent) {
|
||||||
if (give_acl ($config["id_user"], $agent["id_grupo"], "AR") == 0)
|
if (give_acl ($config["id_user"], $agent["id_grupo"], "AR") == 0)
|
||||||
continue;
|
continue;
|
||||||
@ -58,6 +61,7 @@ function generate_dot ($simple = 0, $font_size) {
|
|||||||
// Add node
|
// Add node
|
||||||
$graph .= create_node ($agent , $simple, $font_size)."\n\t\t";
|
$graph .= create_node ($agent , $simple, $font_size)."\n\t\t";
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create a central node if orphan nodes exist
|
// Create a central node if orphan nodes exist
|
||||||
if (count ($orphans)) {
|
if (count ($orphans)) {
|
||||||
@ -94,7 +98,8 @@ function create_node ($agent, $simple = 0, $font_size = 10) {
|
|||||||
AND tagente_modulo.id_tipo_modulo in (2, 6, 9, 18, 21, 100)
|
AND tagente_modulo.id_tipo_modulo in (2, 6, 9, 18, 21, 100)
|
||||||
AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
|
AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
|
||||||
AND tagente_modulo.disabled = 0
|
AND tagente_modulo.disabled = 0
|
||||||
AND tagente_estado.estado = 1', $agent['id_agente']);
|
AND tagente_estado.estado = 1',
|
||||||
|
$agent['id_agente']);
|
||||||
$bad_modules = get_db_sql ($sql);
|
$bad_modules = get_db_sql ($sql);
|
||||||
|
|
||||||
// Set node status
|
// Set node status
|
||||||
@ -105,7 +110,15 @@ function create_node ($agent, $simple = 0, $font_size = 10) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for alert
|
// Check for alert
|
||||||
$sql = sprintf ('SELECT COUNT(talerta_agente_modulo.id_aam) from talerta_agente_modulo, tagente_modulo, tagente WHERE tagente.id_agente = %d AND tagente.disabled = 0 AND tagente.id_agente = tagente_modulo.id_agente AND tagente_modulo.disabled = 0 AND tagente_modulo.id_agente_modulo = talerta_agente_modulo.id_agente_modulo AND talerta_agente_modulo.times_fired > 0 ', $agent['id_agente']);
|
$sql = sprintf ('SELECT COUNT(talerta_agente_modulo.id_aam)
|
||||||
|
FROM talerta_agente_modulo, tagente_modulo, tagente
|
||||||
|
WHERE tagente.id_agente = %d
|
||||||
|
AND tagente.disabled = 0
|
||||||
|
AND tagente.id_agente = tagente_modulo.id_agente
|
||||||
|
AND tagente_modulo.disabled = 0
|
||||||
|
AND tagente_modulo.id_agente_modulo = talerta_agente_modulo.id_agente_modulo
|
||||||
|
AND talerta_agente_modulo.times_fired > 0 ',
|
||||||
|
$agent['id_agente']);
|
||||||
$alert_modules = get_db_sql ($sql);
|
$alert_modules = get_db_sql ($sql);
|
||||||
if ($alert_modules)
|
if ($alert_modules)
|
||||||
$status_color = '#FFE308';
|
$status_color = '#FFE308';
|
||||||
@ -180,24 +193,16 @@ function open_graph () {
|
|||||||
if ($layout == 'radial')
|
if ($layout == 'radial')
|
||||||
$overlap = 'true';
|
$overlap = 'true';
|
||||||
|
|
||||||
if (($layout == 'flat') OR ($layout == 'radial') OR ($layout == 'spring1') OR ($layout == "spring2"))
|
if ($layout == 'flat' || $layout == 'radial' || $layout == 'spring1' || $layout == "spring2")
|
||||||
if ($nooverlap != '')
|
if ($nooverlap != '')
|
||||||
$overlap = 'scalexy';
|
$overlap = 'scalexy';
|
||||||
|
|
||||||
|
|
||||||
if ($pure == 1 && $zoom > 1 ) {
|
if ($pure == 1 && $zoom > 1 ) {
|
||||||
$size_x *= $zoom;
|
$size_x *= $zoom;
|
||||||
$size_y *= $zoom;
|
$size_y *= $zoom;
|
||||||
}
|
}
|
||||||
$size = $size_x . ',' . $size_y;
|
$size = $size_x . ',' . $size_y;
|
||||||
//
|
|
||||||
/*
|
|
||||||
echo "SIZE $size <br>";
|
|
||||||
echo "NO OVERLAP $nooverlap <br>";
|
|
||||||
echo "LAYOUT $layout <br>";
|
|
||||||
echo "FONTSIZE $font_size <br>";
|
|
||||||
echo "RANKSEP $ranksep <br>";
|
|
||||||
*/
|
|
||||||
// BEWARE: graphwiz DONT use single ('), you need double (")
|
// BEWARE: graphwiz DONT use single ('), you need double (")
|
||||||
$head = "graph networkmap { labeljust=l; margin=0; ";
|
$head = "graph networkmap { labeljust=l; margin=0; ";
|
||||||
if ($nooverlap != '') {
|
if ($nooverlap != '') {
|
||||||
@ -208,6 +213,7 @@ echo "RANKSEP $ranksep <br>";
|
|||||||
$head .= "ratio=fill;";
|
$head .= "ratio=fill;";
|
||||||
$head .= "root=0;";
|
$head .= "root=0;";
|
||||||
$head .= "size=\"$size\";";
|
$head .= "size=\"$size\";";
|
||||||
|
|
||||||
return $head;
|
return $head;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,13 +373,14 @@ if ($result !== false) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
echo '<img src="'.$filename_img.'" usemap="#networkmap" />';
|
echo '<img src="'.$filename_img.'" usemap="#networkmap" />';
|
||||||
include $filename_map;
|
include ($filename_map);
|
||||||
} else {
|
} else {
|
||||||
echo '<h2 class="err">'.__('Map could not be generated').'</h2>';
|
echo '<h2 class="err">'.__('Map could not be generated').'</h2>';
|
||||||
echo $result;
|
echo $result;
|
||||||
echo "<br /> Apparently something went wrong executing the command.";
|
echo "<br /> Apparently something went wrong executing the command.";
|
||||||
echo "<br /> Is ".$filter." (usually part of GraphViz) and echo installed and able to be executed by the webserver?";
|
echo "<br /> Is ".$filter." (usually part of GraphViz) and echo installed and able to be executed by the webserver?";
|
||||||
echo "<br /> Is your webserver restricted from executing command line tools through the system() call (PHP Safe Mode or SELinux)";
|
echo "<br /> Is your webserver restricted from executing command line tools through the <code>system()</code> call (PHP Safe Mode or SELinux)";
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
@ -161,13 +161,6 @@ if (isset($_GET["flag_agent"])){
|
|||||||
process_sql ($sql);
|
process_sql ($sql);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Force alert execution
|
|
||||||
$flag_alert = (int) get_parameter ('flag_alert', 0);
|
|
||||||
$id_agente_modulo = (int) get_parameter ('id_agente_modulo', 0);
|
|
||||||
if ($flag_alert == 1 && give_acl ($config['id_user'], $id_grupo, "AW")) {
|
|
||||||
$sql = "UPDATE talerta_agente_modulo SET flag = 1 WHERE id_agente_modulo = " . $id_agente_modulo;
|
|
||||||
process_sql ($sql);
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "<div id='menu_tab_frame_view'>";
|
echo "<div id='menu_tab_frame_view'>";
|
||||||
echo "<div id='menu_tab_left'><ul class='mn'><li class='view'>
|
echo "<div id='menu_tab_left'><ul class='mn'><li class='view'>
|
||||||
@ -230,7 +223,6 @@ echo "<img src='images/god4.png' class='top' border=0> ";
|
|||||||
echo __("Group");
|
echo __("Group");
|
||||||
echo "</a></li>";
|
echo "</a></li>";
|
||||||
|
|
||||||
|
|
||||||
// Inventory
|
// Inventory
|
||||||
enterprise_hook ('inventory_tab');
|
enterprise_hook ('inventory_tab');
|
||||||
|
|
||||||
@ -241,25 +233,25 @@ echo "<div style='height: 25px'> </div>";
|
|||||||
|
|
||||||
switch ($tab) {
|
switch ($tab) {
|
||||||
case "sla":
|
case "sla":
|
||||||
require "sla_view.php";
|
require ("sla_view.php");
|
||||||
break;
|
break;
|
||||||
case "manage":
|
case "manage":
|
||||||
require "estado_generalagente.php";
|
require ("estado_generalagente.php");
|
||||||
break;
|
break;
|
||||||
case "main":
|
case "main":
|
||||||
require "estado_generalagente.php";
|
require ("estado_generalagente.php");
|
||||||
require "estado_monitores.php";
|
require ("estado_monitores.php");
|
||||||
require "estado_alertas.php";
|
require ("alerts_status.php");
|
||||||
require "status_events.php";
|
require ("status_events.php");
|
||||||
break;
|
break;
|
||||||
case "data_view":
|
case "data_view":
|
||||||
require "datos_agente.php";
|
require ("datos_agente.php");
|
||||||
break;
|
break;
|
||||||
case "data":
|
case "data":
|
||||||
require "estado_ultimopaquete.php";
|
require ("estado_ultimopaquete.php");
|
||||||
break;
|
break;
|
||||||
case "alert":
|
case "alert":
|
||||||
require "estado_alertas.php";
|
require ("alerts_status.php");
|
||||||
break;
|
break;
|
||||||
case "inventory":
|
case "inventory":
|
||||||
enterprise_include ('operation/agentes/agent_inventory.php');
|
enterprise_include ('operation/agentes/agent_inventory.php');
|
||||||
|
@ -43,8 +43,8 @@ if (give_acl ($config['id_user'], 0, "AR")) {
|
|||||||
$sub["operation/agentes/estado_agente"]["text"] = __('Agent detail');
|
$sub["operation/agentes/estado_agente"]["text"] = __('Agent detail');
|
||||||
$sub["operation/agentes/estado_agente"]["refr"] = 60;
|
$sub["operation/agentes/estado_agente"]["refr"] = 60;
|
||||||
|
|
||||||
$sub["operation/agentes/estado_alertas"]["text"] = __('Alert detail');
|
$sub["operation/agentes/alerts_status"]["text"] = __('Alert detail');
|
||||||
$sub["operation/agentes/estado_alertas"]["refr"] = 60;
|
$sub["operation/agentes/alerts_status"]["refr"] = 60;
|
||||||
|
|
||||||
$sub["operation/agentes/status_monitor"]["text"] = __('Monitor detail');
|
$sub["operation/agentes/status_monitor"]["text"] = __('Monitor detail');
|
||||||
$sub["operation/agentes/status_monitor"]["refr"] = 60;
|
$sub["operation/agentes/status_monitor"]["refr"] = 60;
|
||||||
|
@ -235,7 +235,6 @@ CREATE TABLE IF NOT EXISTS `talert_templates` (
|
|||||||
`min_value` double(18,2) default NULL,
|
`min_value` double(18,2) default NULL,
|
||||||
`time_threshold` int(10) NOT NULL default '0',
|
`time_threshold` int(10) NOT NULL default '0',
|
||||||
`max_alerts` int(4) unsigned NOT NULL default '1',
|
`max_alerts` int(4) unsigned NOT NULL default '1',
|
||||||
`module_type` int(10) unsigned NOT NULL default '0',
|
|
||||||
`min_alerts` int(4) unsigned NOT NULL default '0',
|
`min_alerts` int(4) unsigned NOT NULL default '0',
|
||||||
`alert_text` varchar(255) default '',
|
`alert_text` varchar(255) default '',
|
||||||
`time_from` time default '00:00:00',
|
`time_from` time default '00:00:00',
|
||||||
@ -291,46 +290,6 @@ CREATE TABLE IF NOT EXISTS `tcompound_alert` (
|
|||||||
PRIMARY KEY (`id`, `id_aam`)
|
PRIMARY KEY (`id`, `id_aam`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `talerta_agente_modulo` (
|
|
||||||
`id_aam` int(10) unsigned NOT NULL auto_increment,
|
|
||||||
`id_agente_modulo` int(10) unsigned NOT NULL default '0',
|
|
||||||
`id_alerta` int(10) unsigned NOT NULL default '0',
|
|
||||||
`al_campo1` varchar(255) default '',
|
|
||||||
`al_campo2` varchar(255) default '',
|
|
||||||
`al_campo3` mediumtext NOT NULL,
|
|
||||||
`descripcion` varchar(255) default '',
|
|
||||||
`dis_max` double(18,2) default NULL,
|
|
||||||
`dis_min` double(18,2) default NULL,
|
|
||||||
`time_threshold` int(10) NOT NULL default '0',
|
|
||||||
`last_fired` datetime NOT NULL default '0000-00-00 00:00:00',
|
|
||||||
`max_alerts` int(4) unsigned NOT NULL default '1',
|
|
||||||
`times_fired` int(3) NOT NULL default '0',
|
|
||||||
`module_type` int(10) unsigned NOT NULL default '0',
|
|
||||||
`min_alerts` int(4) unsigned NOT NULL default '0',
|
|
||||||
`internal_counter` int(4) default '0',
|
|
||||||
`alert_text` varchar(255) default '',
|
|
||||||
`disable` tinyint(3) default '0',
|
|
||||||
`time_from` time default '00:00:00',
|
|
||||||
`time_to` time default '00:00:00',
|
|
||||||
`id_agent` int(10) default NULL,
|
|
||||||
`monday` tinyint(1) default '1',
|
|
||||||
`tuesday` tinyint(1) default '1',
|
|
||||||
`wednesday` tinyint(1) default '1',
|
|
||||||
`thursday` tinyint(1) default '1',
|
|
||||||
`friday` tinyint(1) default '1',
|
|
||||||
`saturday` tinyint(1) default '1',
|
|
||||||
`sunday` tinyint(1) default '1',
|
|
||||||
`recovery_notify` tinyint(1) default '0',
|
|
||||||
`priority` tinyint(4) default '0',
|
|
||||||
`al_f2_recovery` varchar(255) NOT NULL default '',
|
|
||||||
`al_f3_recovery` mediumtext NOT NULL,
|
|
||||||
`flag` tinyint(1) unsigned default '0',
|
|
||||||
PRIMARY KEY (`id_aam`),
|
|
||||||
KEY `id_agente_modulo` (`id_agente_modulo`),
|
|
||||||
KEY `disable` (`disable`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
|
|
||||||
-- Priority : 0 - Maintance (grey)
|
-- Priority : 0 - Maintance (grey)
|
||||||
-- Priority : 1 - Low (green)
|
-- Priority : 1 - Low (green)
|
||||||
-- Priority : 2 - Normal (blue)
|
-- Priority : 2 - Normal (blue)
|
||||||
|
@ -13,21 +13,13 @@ NULL DEFAULT '0', ADD `last_status` TINYINT( 4 ) NOT NULL DEFAULT
|
|||||||
ALTER TABLE `tagente_estado` ADD INDEX ( `current_interval` );
|
ALTER TABLE `tagente_estado` ADD INDEX ( `current_interval` );
|
||||||
ALTER TABLE `tagente_estado` ADD INDEX ( `running_by` );
|
ALTER TABLE `tagente_estado` ADD INDEX ( `running_by` );
|
||||||
ALTER TABLE `tagente_estado` ADD INDEX ( `last_execution_try` );
|
ALTER TABLE `tagente_estado` ADD INDEX ( `last_execution_try` );
|
||||||
ALTER TABLE `tagente_modulo` ADD `history_data` TINYINT( 1 )
|
|
||||||
UNSIGNED NOT NULL DEFAULT '1', ADD `min_warning` DOUBLE( 18, 2 ) NOT
|
|
||||||
NULL DEFAULT '0', ADD `max_warning` DOUBLE( 18, 2 ) NOT NULL
|
|
||||||
DEFAULT '0', ADD `min_critical` DOUBLE( 18, 2 ) NOT NULL DEFAULT
|
|
||||||
'0', ADD `max_critical` DOUBLE( 18, 2 ) NOT NULL DEFAULT '0', ADD
|
|
||||||
`min_ff_event` INT( 4 ) UNSIGNED NOT NULL DEFAULT '0', ADD
|
|
||||||
`delete_pending` INT( 1 ) UNSIGNED NOT NULL DEFAULT '0';
|
|
||||||
|
|
||||||
ALTER TABLE `tagente_modulo` ADD `min_warning` double(18,2) default 0;
|
ALTER TABLE `tagente_modulo` ADD `min_warning` double(18,2) default 0;
|
||||||
ALTER TABLE `tagente_modulo` ADD `max_warning` double(18,2) default 0;
|
ALTER TABLE `tagente_modulo` ADD `max_warning` double(18,2) default 0;
|
||||||
ALTER TABLE `tagente_modulo` ADD `min_critical` double(18,2) default 0;
|
ALTER TABLE `tagente_modulo` ADD `min_critical` double(18,2) default 0;
|
||||||
ALTER TABLE `tagente_modulo` ADD `max_critical` double(18,2) default 0;
|
ALTER TABLE `tagente_modulo` ADD `max_critical` double(18,2) default 0;
|
||||||
ALTER TABLE `tagente_modulo` ADD `min_ff_event` int(4) unsigned default '0';
|
ALTER TABLE `tagente_modulo` ADD `min_ff_event` int(4) unsigned default '0';
|
||||||
ALTER TABLE tagente_modulo ADD `delete_pending` int(1) unsigned default 0;
|
ALTER TABLE `tagente_modulo` ADD `delete_pending` int(1) unsigned default 0;
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE `tagente_modulo` DROP INDEX `tam_plugin`;
|
ALTER TABLE `tagente_modulo` DROP INDEX `tam_plugin`;
|
||||||
ALTER TABLE `tagente_modulo` DROP PRIMARY KEY , ADD PRIMARY KEY
|
ALTER TABLE `tagente_modulo` DROP PRIMARY KEY , ADD PRIMARY KEY
|
||||||
@ -60,7 +52,7 @@ CREATE TABLE IF NOT EXISTS `talert_actions` (
|
|||||||
CREATE TABLE IF NOT EXISTS `talert_templates` (
|
CREATE TABLE IF NOT EXISTS `talert_templates` (
|
||||||
`id` int(10) unsigned NOT NULL auto_increment,
|
`id` int(10) unsigned NOT NULL auto_increment,
|
||||||
`name` varchar(255) default '',
|
`name` varchar(255) default '',
|
||||||
`description` mediumtext default '',
|
`description` mediumtext,
|
||||||
`id_alert_action` int(10) unsigned NULL,
|
`id_alert_action` int(10) unsigned NULL,
|
||||||
`field1` varchar(255) default '',
|
`field1` varchar(255) default '',
|
||||||
`field2` varchar(255) default '',
|
`field2` varchar(255) default '',
|
||||||
@ -102,8 +94,7 @@ CREATE TABLE IF NOT EXISTS `talert_template_modules` (
|
|||||||
`priority` tinyint(4) default '0',
|
`priority` tinyint(4) default '0',
|
||||||
`force_execution` tinyint(1) default '0',
|
`force_execution` tinyint(1) default '0',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
FOREIGN KEY (`id_agent_module`) REFERENCES
|
FOREIGN KEY (`id_agent_module`) REFERENCES tagente_modulo(`id_agente_modulo`)
|
||||||
tagente_modulo(`id_agente_modulo`)
|
|
||||||
ON DELETE CASCADE ON UPDATE CASCADE,
|
ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
FOREIGN KEY (`id_alert_template`) REFERENCES talert_templates(`id`)
|
FOREIGN KEY (`id_alert_template`) REFERENCES talert_templates(`id`)
|
||||||
ON DELETE RESTRICT ON UPDATE CASCADE,
|
ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||||
@ -122,6 +113,8 @@ talert_template_modules(`id`)
|
|||||||
ON DELETE RESTRICT ON UPDATE CASCADE
|
ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
ALTER TABLE tagente ADD `custom_id` varchar(255) default '';
|
||||||
|
|
||||||
-- If you have custom stuff here, please make sure you manually
|
-- If you have custom stuff here, please make sure you manually
|
||||||
-- migrate it.
|
-- migrate it.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user