diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index bd1e6273cb..75cd4ffa4a 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.763-220712 +Version: 7.0NG.763-220802 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 878701f279..1456219bcc 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.763-220712" +pandora_version="7.0NG.763-220802" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null @@ -61,7 +61,7 @@ chmod 755 -R temp_package/DEBIAN #cp -aRf * temp_package/usr/share/pandora_agent/ #but don't copy recursive the temp_package into temp_package -for item in `ls | grep -v NT4 | grep -v AIX | grep -v FreeBSD | grep -v HP-UX | grep -v SunOS | grep -v temp_package` +for item in `ls | grep -v NT4 | grep -v AIX | grep -v FreeBSD | grep -v NetBSD | grep -v HP-UX | grep -v SunOS | grep -v Darwin | grep -v OpenWRT | grep -v pandorafms.agent_unix | grep -v temp_package` do #if [ \( $item != 'temp_package' \) -a \( $item != 'NT4' \) ] #then @@ -133,9 +133,9 @@ echo "END" echo "Make the package \"Pandorafms agent\"." if [ "$USE_DOCKER_APP" == "1" ]; then - eval $DPKG_DEB --build temp_package + eval $DPKG_DEB --root-owner-group --build temp_package else - dpkg-deb --build temp_package + dpkg-deb --root-owner-group --build temp_package fi mv temp_package.deb pandorafms.agent_unix_$pandora_version.deb diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index d7237be6ce..62e0c56c8e 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1015,7 +1015,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.763'; -use constant AGENT_BUILD => '220712'; +use constant AGENT_BUILD => '220802'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 8a447346ab..8342bfd9ee 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.763 -%define release 220712 +%define release 220802 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index f380814505..f49a085d43 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.763 -%define release 220712 +%define release 220802 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index df57f81a78..5612c66543 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.763" -PI_BUILD="220712" +PI_BUILD="220802" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/unix/pandora_agent_logrotate b/pandora_agents/unix/pandora_agent_logrotate index 1c7b5e9a9a..032f0dded7 100644 --- a/pandora_agents/unix/pandora_agent_logrotate +++ b/pandora_agents/unix/pandora_agent_logrotate @@ -7,4 +7,7 @@ compress notifempty copytruncate + postrotate + /bin/systemctl restart pandora_agent_daemon + endscript } diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 1c65380333..258e150829 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{220712} +{220802} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 426f21690e..f2a851b51d 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.763 Build 220712") +#define PANDORA_VERSION ("7.0NG.763 Build 220802") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index eb972bb494..4ac1d28316 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.763(Build 220712))" + VALUE "ProductVersion", "(7.0NG.763(Build 220802))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/conffiles b/pandora_console/DEBIAN/conffiles deleted file mode 100644 index d3e2621208..0000000000 --- a/pandora_console/DEBIAN/conffiles +++ /dev/null @@ -1 +0,0 @@ -/var/www/pandora_console/include/config.php diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6e81403f87..0b50d2697e 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,10 +1,10 @@ package: pandorafms-console -Version: 7.0NG.763-220712 +Version: 7.0NG.763-220802 Architecture: all Priority: optional Section: admin Installed-Size: 42112 Maintainer: Artica ST -Homepage: http://pandorafms.org/ -Depends: php | php7.2, php7.2-snmp | php-snmp, php7.2-gd | php-gd, php7.2-mysqlnd | php-mysqlnd, php-db, php7.2-xmlrpc | php-xmlrpc, php-gettext, php7.2-curl | php-curl, graphviz, dbconfig-common, php7.2-ldap | php-ldap, mysql-client | virtual-mysql-client, php-xmlrpc, php7.2-zip | php-zip +Homepage: https://pandorafms.com/ +Depends: php, php-snmp, php-gd, php-mysqlnd, php-db, php-xmlrpc, php-curl, graphviz, dbconfig-common, php-ldap, mysql-client | virtual-mysql-client, php-xmlrpc, php-zip, php-mbstring Description: Pandora FMS is an Open Source monitoring tool. It monitor your systems and applications, and allows you to control the status of any element of them. The web console is the graphical user interface (GUI) to manage the pool and to generate reports and graphs from the Pandora FMS monitoring process. diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 3a24309700..ee7b38c235 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -1,6 +1,6 @@ #!/bin/bash -#Pandora FMS- http:#pandorafms.com +#Pandora FMS - https://pandorafms.com # ================================================== # Copyright (c) 2005-2021 Artica Soluciones Tecnologicas # Please see http:#pandorafms.org for full contribution list @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.763-220712" +pandora_version="7.0NG.763-220802" package_pear=0 package_pandora=1 @@ -94,17 +94,19 @@ echo "Make a \"temp_package\" temporary dir for job." mkdir -p temp_package if [ $package_pandora -eq 1 ] then - mkdir -p temp_package/var/www/pandora_console + mkdir -p temp_package/var/www/html/pandora_console + mkdir -p temp_package/var/log/pandora mkdir -p temp_package/etc/logrotate.d + mkdir -p temp_package/etc/init.d echo "Make directory system tree for package." - cp -R $(ls | grep -v temp_package | grep -v DEBIAN ) temp_package/var/www/pandora_console + cp -R $(ls | grep -v temp_package | grep -v DEBIAN | grep -v pandorafms.console_$pandora_version.deb) temp_package/var/www/html/pandora_console cp -R DEBIAN temp_package cp -aRf pandora_console_logrotate_ubuntu temp_package/etc/logrotate.d/pandora_console - find temp_package/var/www/pandora_console -name ".svn" | xargs rm -Rf - rm -Rf temp_package/var/www/pandora_console/pandora_console.spec + cp -aRf pandora_websocket_engine temp_package/etc/init.d/ + find temp_package/var/www/html/pandora_console -name ".svn" | xargs rm -Rf + rm -Rf temp_package/var/www/html/pandora_console/pandora_console.spec chmod 755 -R temp_package/DEBIAN - touch temp_package/var/www/pandora_console/include/config.php echo "Remove the SVN files and other temp files." @@ -128,30 +130,31 @@ then echo "END" echo "Calculate md5sum for md5sums package control file." - for item in `find temp_package` + FILES=`find temp_package` + while read item do echo -n "." - if [ ! -d $item ] + if [ ! -d "$item" ] then - echo $item | grep "DEBIAN" > /dev/null + echo "$item" | grep "DEBIAN" > /dev/null #last command success if [ $? -eq 1 ] then - md5=`md5sum $item | cut -d" " -f1` + md5=`md5sum "$item" | cut -d" " -f1` #delete "temp_package" in the path final_path=${item#temp_package} echo $md5" "$final_path >> temp_package/DEBIAN/md5sums fi fi - done + done < <(echo "$FILES") echo "END" echo "Make the package \"Pandorafms console\"." if [ "$USE_DOCKER_APP" == "1" ]; then - eval $DPKG_DEB --build temp_package + eval $DPKG_DEB --root-owner-group --build temp_package else - dpkg-deb --build temp_package + dpkg-deb --root-owner-group --build temp_package fi mv temp_package.deb pandorafms.console_$pandora_version.deb fi diff --git a/pandora_console/DEBIAN/postinst b/pandora_console/DEBIAN/postinst index a899c6bf0a..4b871d9187 100755 --- a/pandora_console/DEBIAN/postinst +++ b/pandora_console/DEBIAN/postinst @@ -1,20 +1,15 @@ #!/bin/bash -echo Change the user and group to /var/www/pandora_console. -chmod -R u+rwX,g+rX,g-w,o-rwx /var/www/pandora_console -chgrp www-data /var/www/pandora_console -R -chown www-data /var/www/pandora_console -R -if [ -d /var/www/html ]; then mv /var/www/pandora_console /var/www/html/; fi - +echo Change the user and group to /var/www/html/pandora_console. +chmod -R u+rwX,g+rX,g-w,o-rwx /var/www/html/pandora_console +chgrp www-data /var/www/html/pandora_console -R +chown www-data /var/www/html/pandora_console -R + if [ -f /etc/init.d/apache2 ]; then echo Restart the apache. /etc/init.d/apache2 restart fi -# Install pandora_websocket_engine service. -cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ -chmod +x /etc/init.d/pandora_websocket_engine - echo "You can now start the Pandora FMS Websocket service by executing" echo " /etc/init.d/pandora_websocket_engine start" diff --git a/pandora_console/extras/mr/56.sql b/pandora_console/extras/mr/56.sql index bd7681301c..da07b1612e 100644 --- a/pandora_console/extras/mr/56.sql +++ b/pandora_console/extras/mr/56.sql @@ -23,4 +23,21 @@ CREATE TABLE IF NOT EXISTS `tuser_task_scheduled` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; +ALTER TABLE `tautoconfig` ADD COLUMN `type_execution` VARCHAR(100) NOT NULL DEFAULT 'start'; +ALTER TABLE `tautoconfig` ADD COLUMN `type_periodicity` VARCHAR(100) NOT NULL DEFAULT 'weekly'; +ALTER TABLE `tautoconfig` ADD COLUMN `monday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `tuesday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `wednesday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `thursday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `friday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `saturday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `sunday` TINYINT DEFAULT 0; +ALTER TABLE `tautoconfig` ADD COLUMN `periodically_day_from` INT UNSIGNED DEFAULT NULL; +ALTER TABLE `tautoconfig` ADD COLUMN `periodically_time_from` time NULL DEFAULT NULL; +ALTER TABLE `tautoconfig` ADD COLUMN `executed` TINYINT UNSIGNED NOT NULL DEFAULT 0; + +ALTER TABLE `tusuario` DROP COLUMN `metaconsole_assigned_server`; + +ALTER TABLE `tevent_filter` ADD COLUMN `search_secondary_groups` INT NOT NULL DEFAULT 0; + COMMIT; diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index 85fd409f33..6bc2c266d3 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -938,7 +938,9 @@ echo sprintf('
', $menuTypeClass); layout: '%M%nn%M:%S%nn%S', labels: ['', '', '', '', '', '', ''], onExpiry: function () { - dt_events.draw(false); + $("#table_events") + .DataTable() + .draw(false); } }); } diff --git a/pandora_console/general/noaccess.php b/pandora_console/general/noaccess.php index 771b5e669e..39e343a0fc 100644 --- a/pandora_console/general/noaccess.php +++ b/pandora_console/general/noaccess.php @@ -1,98 +1,115 @@ - - - -
- + +
)'> +
- images/input_cross.png'> + images/input_cross.png'>
-
- +
+
@@ -141,7 +158,6 @@ font-size:10pt; } } ?> -
@@ -149,18 +165,14 @@ font-size:10pt;
-
- \ No newline at end of file + $('div#page').css('background-color', '#d3d3d3'); + diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index eebb4e213c..91045ce0ea 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -89,6 +89,7 @@ if ($id) { $tag_without_base64 = base64_encode($tag_without_json_clean); $filter_only_alert = $filter['filter_only_alert']; + $search_secondary_groups = $filter['search_secondary_groups']; $custom_data = $filter['custom_data']; $custom_data_filter_type = $filter['custom_data_filter_type']; @@ -126,6 +127,7 @@ if ($id) { $tag_without_json = $tag_without_json_clean = json_encode([]); $tag_without_base64 = base64_encode($tag_without_json); $filter_only_alert = ''; + $search_secondary_groups = 0; } if ($update || $create) { @@ -167,6 +169,8 @@ if ($update || $create) { $tag_without_json = io_safe_input(base64_decode($tag_without_base64)); $filter_only_alert = get_parameter('filter_only_alert', ''); + $search_secondary_groups = get_parameter('search_secondary_groups', 0); + $custom_data = get_parameter('custom_data', ''); $custom_data_filter_type = get_parameter('custom_data_filter_type', ''); @@ -193,6 +197,7 @@ if ($update || $create) { 'id_extra' => $id_extra, 'user_comment' => $user_comment, 'filter_only_alert' => $filter_only_alert, + 'search_secondary_groups' => $search_secondary_groups, 'custom_data' => $custom_data, 'custom_data_filter_type' => $custom_data_filter_type, ]; diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 04a7e1126a..3ed36f8737 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -301,7 +301,6 @@ if ($new_user && $config['admin_can_add_user']) { if (enterprise_installed() && is_metaconsole() === true) { $user_info['metaconsole_agents_manager'] = 0; - $user_info['metaconsole_assigned_server'] = ''; $user_info['metaconsole_access_node'] = 0; } @@ -375,7 +374,6 @@ if ($create_user) { if (defined('METACONSOLE')) { $values['metaconsole_access'] = get_parameter('metaconsole_access', 'basic'); $values['metaconsole_agents_manager'] = ($user_is_admin == 1 ? 1 : get_parameter('metaconsole_agents_manager', '0')); - $values['metaconsole_assigned_server'] = get_parameter('metaconsole_assigned_server', ''); $values['metaconsole_access_node'] = ($user_is_admin == 1 ? 1 : get_parameter('metaconsole_access_node', '0')); } } @@ -588,7 +586,6 @@ if ($update_user) { if (enterprise_installed() && defined('METACONSOLE')) { $values['metaconsole_access'] = get_parameter('metaconsole_access'); $values['metaconsole_agents_manager'] = get_parameter('metaconsole_agents_manager', '0'); - $values['metaconsole_assigned_server'] = get_parameter('metaconsole_assigned_server', ''); $values['metaconsole_access_node'] = get_parameter('metaconsole_access_node', '0'); } @@ -1357,15 +1354,6 @@ if ($meta) { true ).'
'; - $metaconsole_assigned_server = '

'.__('Assigned node').ui_print_help_tip(__('Server where the agents created of this user will be placed'), true).'

'; - $servers = metaconsole_get_servers(); - $servers_for_select = []; - foreach ($servers as $server) { - $servers_for_select[$server['id']] = $server['server_name']; - } - - $metaconsole_assigned_server .= html_print_select($servers_for_select, 'metaconsole_assigned_server', $user_info['metaconsole_assigned_server'], '', '', -1, true, false, false).'
'; - $metaconsole_access_node = '

'.__('Enable node access').ui_print_help_tip(__('With this option enabled, the user will can access to nodes console'), true).'

'; $metaconsole_access_node .= html_print_checkbox( 'metaconsole_access_node', @@ -1416,7 +1404,7 @@ if (!is_metaconsole()) { '.$area_data_timezone_polys.$area_data_timezone_rects.'
'; } else { - echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_assigned_server.$metaconsole_access_node; + echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_access_node; } echo '
@@ -1535,16 +1523,16 @@ $(document).ready (function () { }); $('#checkbox-is_admin').change(function() { - if($('#checkbox-is_admin').is(':checked') == true) { - $('#metaconsole_agents_manager_div').show(); - $('#metaconsole_access_node_div').show(); - if($('#checkbox-metaconsole_agents_manager').prop('checked')) { - $('#metaconsole_assigned_server_div').show(); - } - } else { + if ($('#checkbox-is_admin').is(':checked') == true) { $('#metaconsole_agents_manager_div').hide(); $('#metaconsole_access_node_div').hide(); $('#metaconsole_assigned_server_div').hide(); + } else { + $('#metaconsole_agents_manager_div').show(); + $('#metaconsole_access_node_div').show(); + if ($('#checkbox-metaconsole_agents_manager').prop('checked')) { + $('#metaconsole_assigned_server_div').show(); + } } }); diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index 4baae3d20b..5388aa9a45 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -664,7 +664,7 @@ class DiscoveryTaskList extends HTML $data[0] .= '\''; if ($task['type'] == DISCOVERY_HOSTDEVICES) { $title = __('Are you sure?'); - $message = 'This action will rescan the target networks.'; + $message = __('This action will rescan the target networks.'); $data[0] .= ', {title: \''.$title.'\', message: \''.$message.'\'}'; } diff --git a/pandora_console/include/ajax/alert_list.ajax.php b/pandora_console/include/ajax/alert_list.ajax.php index 6604188365..2bcdbf7af4 100644 --- a/pandora_console/include/ajax/alert_list.ajax.php +++ b/pandora_console/include/ajax/alert_list.ajax.php @@ -37,6 +37,8 @@ $get_actions_module = (bool) get_parameter('get_actions_module'); $show_update_action_menu = (bool) get_parameter('show_update_action_menu'); $get_agent_alerts_agent_view = (bool) get_parameter('get_agent_alerts_agent_view'); $resize_event_week = (bool) get_parameter('resize_event_week'); +$get_agent_alerts_datatable = (bool) get_parameter('get_agent_alerts_datatable', 0); +$alert_validate = (bool) get_parameter('alert_validate', false); if ($get_agent_alerts_simple) { $id_agent = (int) get_parameter('id_agent'); @@ -620,4 +622,325 @@ if ($resize_event_week === true) { return; } +if ($alert_validate === true) { + include_once 'operation/agentes/alerts_status.functions.php'; + $all_groups = get_parameter('all_groups'); + $alert_ids = get_parameter('alert_ids', ''); + + if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') || check_acl_one_of_groups($config['id_user'], $all_groups, 'LM')) { + $result = validateAlert($alert_ids); + } else { + $result = ui_print_error_message(__('Insufficient permissions to validate alerts'), '', true); + } + + echo json_encode($result); + + return; +} + +if ($get_agent_alerts_datatable === true) { + // Datatables offset, limit and order. + $filter_alert = get_parameter('filter', []); + unset($filter_alert[0]); + $start = (int) get_parameter('start', 0); + $length = (int) get_parameter('length', $config['block_size']); + $order = get_datatable_order(true); + $url = get_parameter('url', '#'); + + $free_search_alert = $filter_alert['free_search_alert']; + $idGroup = $filter_alert['ag_group']; + $tag_filter = $filter_alert['tag_filter']; + $action_filter = $filter_alert['action']; + + try { + ob_start(); + include_once $config['homedir'].'/include/functions_agents.php'; + include_once $config['homedir'].'/operation/agentes/alerts_status.functions.php'; + include_once $config['homedir'].'/include/functions_users.php'; + + $agent_a = check_acl($config['id_user'], 0, 'AR'); + $agent_w = check_acl($config['id_user'], 0, 'AW'); + $access = ($agent_a == true) ? 'AR' : (($agent_w == true) ? 'AW' : 'AR'); + + $all_groups = get_parameter('all_groups'); + $idAgent = (int) get_parameter('id_agent'); + + $sortField = $order['field']; + $sort = $order['direction']; + $selected = true; + $selectModuleUp = false; + $selectModuleDown = false; + $selectTemplateUp = false; + $selectTemplateDown = false; + $selectLastFiredUp = false; + $selectLastFiredDown = false; + + switch ($sortField) { + case 'module': + switch ($sort) { + case 'asc': + $selectModuleasc = $selected; + $order = [ + 'field' => 'agent_module_name', + 'order' => 'ASC', + ]; + break; + + case 'desc': + $selectModuledesc = $selected; + $order = [ + 'field' => 'agent_module_name', + 'order' => 'DESC', + ]; + break; + } + break; + + case 'template': + switch ($sort) { + case 'asc': + $selectTemplateasc = $selected; + $order = [ + 'field' => 'template_name', + 'order' => 'ASC', + ]; + break; + + case 'desc': + $selectTemplatedesc = $selected; + $order = [ + 'field' => 'template_name', + 'order' => 'DESC', + ]; + break; + } + break; + + case 'lastFired': + switch ($sort) { + case 'asc': + $selectLastFiredasc = $selected; + $order = [ + 'field' => 'last_fired', + 'order' => 'ASC', + ]; + break; + + case 'desc': + $selectLastFireddesc = $selected; + $order = [ + 'field' => 'last_fired', + 'order' => 'DESC', + ]; + break; + } + break; + + case 'agent': + switch ($sort) { + case 'asc': + $selectLastFiredasc = $selected; + $order = [ + 'field' => 'agent_name', + 'order' => 'ASC', + ]; + break; + + case 'desc': + $selectLastFireddesc = $selected; + $order = [ + 'field' => 'agent_name', + 'order' => 'DESC', + ]; + break; + } + break; + + case 'status': + switch ($sort) { + case 'asc': + $selectLastFiredasc = $selected; + $order = [ + 'field' => 'times_fired', + 'order' => 'ASC', + ]; + break; + + case 'desc': + $selectLastFireddesc = $selected; + $order = [ + 'field' => 'times_fired', + 'order' => 'DESC', + ]; + break; + } + break; + + default: + $selectDisabledasc = ''; + $selectDisableddesc = ''; + $selectModuleasc = $selected; + $selectModuledesc = false; + $selectTemplateasc = false; + $selectTemplatedesc = false; + $selectLastFiredasc = false; + $selectLastFireddesc = false; + $order = [ + 'field' => 'agent_module_name', + 'order' => 'ASC', + ]; + break; + } + + if ($free_search_alert != '') { + $whereAlertSimple = 'AND ('.'id_alert_template IN ( + SELECT id + FROM talert_templates + WHERE name LIKE "%'.$free_search_alert.'%") OR '.'id_alert_template IN ( + SELECT id + FROM talert_templates + WHERE id_alert_action IN ( + SELECT id + FROM talert_actions + WHERE name LIKE "%'.$free_search_alert.'%")) OR '.'talert_template_modules.id IN ( + SELECT id_alert_template_module + FROM talert_template_module_actions + WHERE id_alert_action IN ( + SELECT id + FROM talert_actions + WHERE name LIKE "%'.$free_search_alert.'%")) OR '.'id_agent_module IN ( + SELECT id_agente_modulo + FROM tagente_modulo + WHERE nombre LIKE "%'.$free_search_alert.'%") OR '.'id_agent_module IN ( + SELECT id_agente_modulo + FROM tagente_modulo + WHERE alias LIKE "%'.$free_search_alert.'%")'.')'; + } else { + $whereAlertSimple = ''; + } + + // Add checks for user ACL. + $groups = users_get_groups($config['id_user'], $access); + $id_groups = array_keys($groups); + + if (empty($id_groups)) { + $whereAlertSimple .= ' AND (1 = 0) '; + } else { + $whereAlertSimple .= sprintf( + ' AND id_agent_module IN ( + SELECT tam.id_agente_modulo + FROM tagente_modulo tam + WHERE tam.id_agente IN (SELECT ta.id_agente + FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON + ta.id_agente = tasg.id_agent + WHERE (ta.id_grupo IN (%s) OR tasg.id_group IN (%s)))) ', + implode(',', $id_groups), + implode(',', $id_groups) + ); + } + + $alerts = []; + if ($agent_view_page === true) { + $options_simple = ['order' => $order]; + } else { + $options_simple = [ + 'order' => $order, + 'limit' => $length, + 'offset' => $start, + ]; + } + + if ($idAgent !== 0) { + $filter_alert['disabled'] = 'all_enabled'; + } + + if (is_metaconsole() === true) { + include_once $config['homedir'].'/enterprise/meta/include/functions_alerts_meta.php'; + if ($idAgent != 0) { + $alerts['alerts_simple'] = alerts_meta_get_alerts($agents, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); + + $countAlertsSimple = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); + } else { + $id_groups = array_keys( + users_get_groups($config['id_user'], 'AR', false) + ); + + $alerts['alerts_simple'] = alerts_meta_get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); + + $countAlertsSimple = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); + } + } else { + if ($idAgent != 0) { + $alerts['alerts_simple'] = agents_get_alerts_simple($idAgent, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter); + + $countAlertsSimple = agents_get_alerts_simple($idAgent, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter); + } else { + $id_groups = array_keys( + users_get_groups($config['id_user'], $access, false) + ); + + $alerts['alerts_simple'] = get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); + + $countAlertsSimple = get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); + } + } + + $data = []; + if ($alerts['alerts_simple']) { + foreach ($alerts['alerts_simple'] as $alert) { + $data[] = ui_format_alert_row($alert, true, $url, 'font-size: 7pt;'); + } + + $data = array_reduce( + $data, + function ($carry, $row) { + // Transforms array of arrays $data into an array + // of objects, making a post-process of certain fields. + $tmp = new stdClass(); + + // Standby. + $tmp->policy = $row[0]; + $tmp->standby = $row[1]; + $tmp->force = $row[2]; + $tmp->agent = $row[3]; + $tmp->module = $row[4]; + $tmp->template = $row[5]; + $tmp->action = $row[6]; + $tmp->lastFired = $row[7]; + $tmp->status = $row[8]; + $tmp->validate = $row[9]; + + $carry[] = $tmp; + return $carry; + } + ); + } + + // Datatables format: RecordsTotal && recordsfiltered. + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $countAlertsSimple, + 'recordsFiltered' => $countAlertsSimple, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (\Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + // If not valid, show error with issue. + json_decode($response); + if (json_last_error() == JSON_ERROR_NONE) { + // If valid dump. + echo $response; + } else { + echo json_encode( + ['error' => $response] + ); + } +} + return; diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 5a92d33c16..0618ae83c3 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -90,6 +90,7 @@ $node_id = (int) get_parameter('node_id', 0); if ($get_comments === true) { $event = get_parameter('event', false); + $event_rep = get_parameter('event_rep', false); if ($event === false) { return __('Failed to retrieve comments'); } @@ -97,13 +98,11 @@ if ($get_comments === true) { $eventsGrouped = []; // Consider if the event is grouped. $whereGrouped = '1=1'; - if (isset($event['event_rep']) === true && $event['event_rep'] > 0) { + if (isset($event_rep) === true && $event_rep > 0) { // Default grouped message filtering (evento and estado). $whereGrouped = sprintf( - '`evento` = "%s" AND `estado` = "%s" AND `event_type` = "%s" ', - $event['evento'], - $event['estado'], - $event['event_type'] + '`evento` = "%s"', + $event['evento'] ); // If id_agente is reported, filter the messages by them as well. @@ -120,6 +119,8 @@ if ($get_comments === true) { (int) $event['id_agentmodule'] ); } + } else { + $whereGrouped = sprintf('`id_evento` = %d', $event['id_evento']); } try { @@ -358,6 +359,7 @@ if ($save_event_filter) { io_json_mb_encode([]) ); $values['filter_only_alert'] = get_parameter('filter_only_alert'); + $values['search_secondary_groups'] = get_parameter('search_secondary_groups'); $values['id_group_filter'] = get_parameter('id_group_filter'); $values['date_from'] = get_parameter('date_from'); $values['time_from'] = get_parameter('time_from'); @@ -414,6 +416,7 @@ if ($update_event_filter) { io_json_mb_encode([]) ); $values['filter_only_alert'] = get_parameter('filter_only_alert'); + $values['search_secondary_groups'] = get_parameter('search_secondary_groups'); $values['id_group_filter'] = get_parameter('id_group_filter'); $values['date_from'] = get_parameter('date_from'); $values['time_from'] = get_parameter('time_from'); @@ -459,31 +462,32 @@ if ($get_filter_values) { if ($event_filter === false) { $event_filter = [ - 'status' => EVENT_NO_VALIDATED, - 'event_view_hr' => $config['event_view_hr'], - 'group_rep' => 1, - 'tag_with' => [], - 'tag_without' => [], - 'history' => false, - 'module_search' => '', - 'filter_only_alert' => '-1', - 'user_comment' => '', - 'id_extra' => '', - 'id_user_ack' => '', - 'date_from' => '', - 'time_from' => '', - 'date_to' => '', - 'time_to' => '', - 'severity' => '', - 'event_type' => '', - 'group_rep' => 0, - 'id_group' => 0, - 'id_group_filter' => 0, - 'group_name' => 'All', - 'text_agent' => '', - 'id_agent' => 0, - 'id_name' => 'None', - 'filter_id' => 0, + 'status' => EVENT_NO_VALIDATED, + 'event_view_hr' => $config['event_view_hr'], + 'group_rep' => 1, + 'tag_with' => [], + 'tag_without' => [], + 'history' => false, + 'module_search' => '', + 'filter_only_alert' => '-1', + 'search_secondary_groups' => 0, + 'user_comment' => '', + 'id_extra' => '', + 'id_user_ack' => '', + 'date_from' => '', + 'time_from' => '', + 'date_to' => '', + 'time_to' => '', + 'severity' => '', + 'event_type' => '', + 'group_rep' => 0, + 'id_group' => 0, + 'id_group_filter' => 0, + 'group_name' => 'All', + 'text_agent' => '', + 'id_agent' => 0, + 'id_name' => 'None', + 'filter_id' => 0, ]; } else { $event_filter['module_search'] = io_safe_output( @@ -651,6 +655,8 @@ function load_form_filter() { $("#hidden-tag_without").val(val); if (i == 'filter_only_alert') $("#filter_only_alert").val(val); + if (i == 'search_secondary_groups') + $("#checkbox-search_secondary_groups").val(val); if (i == 'id_group_filter') $("#id_group_filter").val(val); if (i == 'source') @@ -893,6 +899,7 @@ function save_new_filter() { "tag_with": Base64.decode($("#hidden-tag_with").val()), "tag_without": Base64.decode($("#hidden-tag_without").val()), "filter_only_alert" : $("#filter_only_alert").val(), + "search_secondary_groups" : $("#checkbox-search_secondary_groups").val(), "id_group_filter": $("#id_group_filter").val(), "date_from": $("#text-date_from").val(), "time_from": $("#text-time_from").val(), @@ -968,6 +975,7 @@ function save_update_filter() { "tag_with" : Base64.decode($("#hidden-tag_with").val()), "tag_without" : Base64.decode($("#hidden-tag_without").val()), "filter_only_alert" : $("#filter_only_alert").val(), + "search_secondary_groups" : $("#checkbox-search_secondary_groups").val(), "id_group_filter": $("#id_group_filter").val(), "date_from": $("#text-date_from").val(), "time_from": $("#text-time_from").val(), @@ -1624,7 +1632,7 @@ if ($get_extended_event) { $filter = get_parameter('filter', []); $similar_ids = get_parameter('similar_ids', $event_id); $group_rep = $filter['group_rep']; - $event_rep = $event['event_rep']; + $event_rep = $group_rep; $timestamp_first = $event['timestamp_first']; $timestamp_last = $event['timestamp_last']; $server_id = $event['server_id']; @@ -1959,7 +1967,8 @@ if ($get_extended_event) { data : { page: "include/ajax/events", get_comments: 1, - event: '.json_encode($event).' + event: '.json_encode($event).', + event_rep: '.$event_rep.' }, dataType : "html", success: function (data) { @@ -2469,6 +2478,7 @@ if ($get_events_fired) { 'tag_with' => [], 'tag_without' => [], 'filter_only_alert' => -1, + 'search_secondary_groups' => 0, 'source' => '', 'id_extra' => '', 'user_comment' => '', diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index a0cfb1347d..801cf26a53 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -2483,14 +2483,12 @@ class ConsoleSupervisor SERVER_TYPE_ENTERPRISE_SATELLITE ) ); - $missed = 0; - if (is_array($server_version_list) === true) { foreach ($server_version_list as $server) { if (strpos( $server['version'], - (string) floor($config['current_package']) + (string) floor((int) $config['current_package']) ) === false ) { $missed++; diff --git a/pandora_console/include/class/TreeService.class.php b/pandora_console/include/class/TreeService.class.php index b9420eba44..4b3a9061cc 100644 --- a/pandora_console/include/class/TreeService.class.php +++ b/pandora_console/include/class/TreeService.class.php @@ -252,6 +252,7 @@ class TreeService extends Tree protected function getProcessedServices() { $is_favourite = $this->getServiceFavouriteFilter(); + $service_search = $this->getServiceNameSearchFilter(); if (users_can_manage_group_all('AR')) { $groups_acl = ''; @@ -259,6 +260,16 @@ class TreeService extends Tree $groups_acl = 'AND ts.id_group IN ('.implode(',', $this->userGroupsArray).')'; } + $exclude_children = 'ts.id NOT IN ( + SELECT DISTINCT id_service_child + FROM tservice_element + WHERE id_server_meta = 0 + )'; + + if ($service_search !== '') { + $exclude_children = '1=1'; + } + $sql = sprintf( 'SELECT ts.id, @@ -277,15 +288,14 @@ class TreeService extends Tree FROM tservice ts LEFT JOIN tservice_element tse ON tse.id_service = ts.id - WHERE ts.id NOT IN ( - SELECT DISTINCT id_service_child - FROM tservice_element - WHERE id_server_meta = 0 - ) + WHERE %s + %s %s %s GROUP BY ts.id', + $exclude_children, $is_favourite, + $service_search, $groups_acl ); @@ -722,6 +732,23 @@ class TreeService extends Tree } + /** + * Retrieve SQL filter for current filter + * + * @return string SQL filter. + */ + protected function getServiceNameSearchFilter() + { + if (isset($this->filter['searchService']) === true + && empty($this->filter['searchService']) === false + ) { + return " AND (ts.name LIKE '%".$this->filter['searchService']."%' OR ts.description LIKE '%".$this->filter['searchService']."%')"; + } + + return ''; + } + + /** * Overwrites partial functionality of general Tree.class. * diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index b9c6e35c49..eb2ab5b0c0 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC220712'; +$build_version = 'PC220802'; $pandora_version = 'v7.0NG.763'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index ca5c7e260d..f2a2a51508 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -5996,6 +5996,18 @@ function send_test_email( } +/** + * Microtime float number. + * + * @return float + */ +function microtime_float() +{ + list($usec, $sec) = explode(' ', microtime()); + return ((float) $usec + (float) $sec); +} + + /** * Return array of ancestors of item, given array. * diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 5b5d66c85f..ac608e6acf 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -369,7 +369,11 @@ function agents_get_alerts_simple($id_agent=false, $filter='', $options=false, $ } // Filter by agents id. - $id_agents_list = implode(',', $id_agent); + if (is_array($id_agent) === true && empty($id_agent) === false) { + $id_agents_list = implode(',', $id_agent); + } else { + $id_agents_list = $id_agent; + } if ($id_agents_list === '') { $id_agents_list = '0'; @@ -4294,3 +4298,140 @@ function agents_get_offspring(int $id_agent) return $return; } + + +function agents_get_starmap(int $id_agent, float $width=0, float $height=0) +{ + ui_require_css_file('heatmap'); + + $all_modules = agents_get_modules($id_agent); + if (empty($all_modules)) { + return null; + } + + $total_modules = count($all_modules); + + // Best square. + $high = (float) max($width, $height); + $low = 0.0; + + while (abs($high - $low) > 0.000001) { + $mid = (($high + $low) / 2.0); + $midval = (floor($width / $mid) * floor($height / $mid)); + if ($midval >= $total_modules) { + $low = $mid; + } else { + $high = $mid; + } + } + + $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); + + // Print starmap. + $html = sprintf( + '', + $id_agent, + $width, + $height + ); + + $html .= ''; + $row = 0; + $column = 0; + $x = 0; + $y = 0; + $cont = 1; + foreach ($all_modules as $key => $value) { + // Colour by status. + $status = modules_get_agentmodule_status($key); + switch ($status) { + case 0: + case 4: + case 300: + $status = 'normal'; + break; + + case 1: + case 100: + $status = 'critical'; + break; + + case 2: + case 200: + $status = 'warning'; + break; + + case 3: + $status = 'unknown'; + break; + + case 5: + $status = 'notinit'; + break; + } + + $html .= sprintf( + '', + 'rect_'.$cont, + $x, + $y, + $row, + $column, + $square_length, + $square_length, + $status, + random_int(1, 10) + ); + + $y += $square_length; + $row++; + if ((int) ($y + $square_length) > (int) $height) { + $y = 0; + $x += $square_length; + $row = 0; + $column++; + } + + if ((int) ($x + $square_length) > (int) $width) { + $x = 0; + $y += $square_length; + $column = 0; + $row++; + } + + $cont++; + } + ?> + + '; + $html .= ''; + + return $html; +} diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php index 20caaf529e..4b5fec001e 100644 --- a/pandora_console/include/functions_alerts.php +++ b/pandora_console/include/functions_alerts.php @@ -2109,7 +2109,7 @@ function get_group_alerts( if (is_array($filter)) { $disabled = $filter['disabled']; - if (isset($filter['standby'])) { + if ((isset($filter['standby']) === true) && ($filter['standby'] !== '')) { $filter = $group_query.' AND talert_template_modules.standby = "'.$filter['standby'].'"'; } else { $filter = $group_query; diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index d0a42460b1..b210187247 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -626,6 +626,7 @@ function events_update_status($id_evento, $status, $filter=null) * 'tag_with' * 'tag_without' * 'filter_only_alert' + * 'search_secondary_groups' * 'module_search' * 'group_rep' * 'server_id' @@ -904,11 +905,18 @@ function events_get_all( $groups = [ $groups ]; } - $sql_filters[] = sprintf( - ' AND (te.id_grupo IN (%s) OR tasg.id_group IN (%s))', - join(',', $groups), - join(',', $groups) - ); + if ((bool) $filter['search_secondary_groups'] === true) { + $sql_filters[] = sprintf( + ' AND (te.id_grupo IN (%s) OR tasg.id_group IN (%s))', + join(',', $groups), + join(',', $groups) + ); + } else { + $sql_filters[] = sprintf( + ' AND te.id_grupo IN (%s)', + join(',', $groups) + ); + } } // Skip system messages if user is not PM. @@ -982,11 +990,18 @@ function events_get_all( $EW_groups = users_get_groups($config['id_user'], 'EW', true, true); // Get groups where user have ER grants. - $sql_filters[] = sprintf( - ' AND (te.id_grupo IN ( %s ) OR tasg.id_group IN (%s))', - join(', ', array_keys($ER_groups)), - join(', ', array_keys($ER_groups)) - ); + if ((bool) $filter['search_secondary_groups'] === true) { + $sql_filters[] = sprintf( + ' AND (te.id_grupo IN ( %s ) OR tasg.id_group IN (%s))', + join(', ', array_keys($ER_groups)), + join(', ', array_keys($ER_groups)) + ); + } else { + $sql_filters[] = sprintf( + ' AND te.id_grupo IN ( %s )', + join(', ', array_keys($ER_groups)) + ); + } } // Prepare agent join sql filters. @@ -1076,18 +1091,36 @@ function events_get_all( // Custom data. if (empty($filter['custom_data']) === false) { - if ($filter['custom_data_filter_type'] === '1') { - $sql_filters[] = sprintf( - ' AND JSON_VALID(custom_data) = 1 - AND (JSON_EXTRACT(custom_data, "$.*") LIKE lower("%%%s%%") COLLATE utf8mb4_0900_ai_ci) ', - io_safe_output($filter['custom_data']) - ); + if (isset($config['dbconnection']->server_version) === true + && $config['dbconnection']->server_version > 80000 + ) { + if ($filter['custom_data_filter_type'] === '1') { + $sql_filters[] = sprintf( + ' AND JSON_VALID(custom_data) = 1 + AND (JSON_EXTRACT(custom_data, "$.*") LIKE lower("%%%s%%") COLLATE utf8mb4_0900_ai_ci) ', + io_safe_output($filter['custom_data']) + ); + } else { + $sql_filters[] = sprintf( + ' AND JSON_VALID(custom_data) = 1 + AND (JSON_SEARCH(JSON_KEYS(custom_data), "all", lower("%%%s%%") COLLATE utf8mb4_0900_ai_ci) IS NOT NULL) ', + io_safe_output($filter['custom_data']) + ); + } } else { - $sql_filters[] = sprintf( - ' AND JSON_VALID(custom_data) = 1 - AND (JSON_SEARCH(JSON_KEYS(custom_data), "all", lower("%%%s%%") COLLATE utf8mb4_0900_ai_ci) IS NOT NULL) ', - io_safe_output($filter['custom_data']) - ); + if ($filter['custom_data_filter_type'] === '1') { + $sql_filters[] = sprintf( + ' AND JSON_VALID(custom_data) = 1 AND JSON_EXTRACT(custom_data, "$.*") LIKE lower("%%%s%%") ', + $filter['custom_data'], + $filter['custom_data'] + ); + } else { + $sql_filters[] = sprintf( + ' AND JSON_VALID(custom_data) = 1 AND JSON_KEYS(custom_data) REGEXP "%s" ', + $filter['custom_data'], + $filter['custom_data'] + ); + } } } @@ -1368,7 +1401,7 @@ function events_get_all( case '1': // Group by events. - $group_by .= 'te.evento, te.id_agente, te.id_agentmodule, te.estado'; + $group_by .= 'te.evento, te.id_agente, te.id_agentmodule'; break; case '2': @@ -1396,19 +1429,33 @@ function events_get_all( ) { $tgrupo_join = 'INNER'; if (is_array($groups) === true) { - $tgrupo_join_filters[] = sprintf( - ' (te.id_grupo = tg.id_grupo AND tg.id_grupo IN (%s)) - OR (tg.id_grupo = tasg.id_group AND tasg.id_group IN (%s))', - join(', ', $groups), - join(', ', $groups) - ); + if ((bool) $filter['search_secondary_groups'] === true) { + $tgrupo_join_filters[] = sprintf( + ' (te.id_grupo = tg.id_grupo AND tg.id_grupo IN (%s)) + OR (tg.id_grupo = tasg.id_group AND tasg.id_group IN (%s))', + join(', ', $groups), + join(', ', $groups) + ); + } else { + $tgrupo_join_filters[] = sprintf( + ' (te.id_grupo = tg.id_grupo AND tg.id_grupo IN (%s))', + join(', ', $groups) + ); + } } else { - $tgrupo_join_filters[] = sprintf( - ' (te.id_grupo = tg.id_grupo AND tg.id_grupo = %s) - OR (tg.id_grupo = tasg.id_group AND tasg.id_group = %s)', - $groups, - $groups - ); + if ((bool) $filter['search_secondary_groups'] === true) { + $tgrupo_join_filters[] = sprintf( + ' (te.id_grupo = tg.id_grupo AND tg.id_grupo = %s) + OR (tg.id_grupo = tasg.id_group AND tasg.id_group = %s)', + $groups, + $groups + ); + } else { + $tgrupo_join_filters[] = sprintf( + ' (te.id_grupo = tg.id_grupo AND tg.id_grupo = %s)', + $groups + ); + } } } else { $tgrupo_join_filters[] = ' te.id_grupo = tg.id_grupo'; @@ -1418,7 +1465,9 @@ function events_get_all( $event_lj = ''; if (!$user_is_admin || ($user_is_admin && isset($groups) === true && $groups > 0)) { db_process_sql('SET group_concat_max_len = 9999999'); - $event_lj = events_get_secondary_groups_left_join($table); + if ((bool) $filter['search_secondary_groups'] === true) { + $event_lj = events_get_secondary_groups_left_join($table); + } } $group_selects = ''; @@ -2199,9 +2248,9 @@ function events_create_event( 'id_usuario' => $id_user, 'id_grupo' => $id_group, 'estado' => $status, - 'timestamp' => 'NOW()', + 'timestamp' => date('Y-m-d H:i:s'), 'evento' => $event, - 'utimestamp' => 'UNIX_TIMESTAMP(NOW())', + 'utimestamp' => time(), 'event_type' => $event_type, 'id_agentmodule' => $id_agent_module, 'id_alert_am' => $id_aam, @@ -3706,7 +3755,7 @@ function events_get_response_target( // Parse the event custom data. if (empty($event['custom_data']) === false) { - $custom_data = json_decode(base64_decode($event['custom_data'])); + $custom_data = json_decode($event['custom_data']); foreach ($custom_data as $key => $value) { $target = str_replace('_customdata_'.$key.'_', $value, $target); } @@ -4248,7 +4297,7 @@ function events_page_custom_data($event) $table->head = []; $table->class = 'table_modal_alternate'; - $json_custom_data = base64_decode($event['custom_data']); + $json_custom_data = $event['custom_data']; $custom_data = json_decode($json_custom_data); if ($custom_data === null) { @@ -5259,7 +5308,7 @@ function events_get_field_value_by_event_id( // Parse the event custom data. if (!empty($event['custom_data'])) { - $custom_data = json_decode(base64_decode($event['custom_data'])); + $custom_data = json_decode($event['custom_data']); foreach ($custom_data as $key => $val) { $value = str_replace('_customdata_'.$key.'_', $val, $value); } diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 4f471f31f1..11012b96eb 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -2558,7 +2558,8 @@ function combined_graph_summatory_average( function graphic_agentaccess( int $id_agent, int $period=0, - ?bool $return=false + ?bool $return=false, + ?bool $agent_view=false ) { global $config; @@ -2599,6 +2600,10 @@ function graphic_agentaccess( $options = []; $options['grid']['hoverable'] = true; + if ($agent_view === true) { + $options['agent_view'] = true; + } + if ($return === true) { return vbar_graph($data_array, $options, 1); } else { diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 94d329fb8e..b97e0398b6 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -1013,13 +1013,17 @@ function html_print_select( if(count_shift_'.$id.' == 2 ){ if(shift_array_'.$id.'[0] <= shift_array_'.$id.'[1]) { for (var i = shift_array_'.$id.'[0]; i <= shift_array_'.$id.'[1]; i++) { - var option_value = $("#'.$id.' option").eq(i).val(); - options_selecteds_'.$id.'.push(option_value); + if ($("#'.$id.' option").eq(i).text().includes($(".select2-search__field").val()) == true) { + var option_value = $("#'.$id.' option").eq(i).val(); + options_selecteds_'.$id.'.push(option_value); + } } } else { for (var i = shift_array_'.$id.'[0]; i >= shift_array_'.$id.'[1]; i--) { - var option_value = $("#'.$id.' option").eq(i).val(); - options_selecteds_'.$id.'.push(option_value); + if ($("#'.$id.' option").eq(i).text().includes($(".select2-search__field").val()) == true) { + var option_value = $("#'.$id.' option").eq(i).val(); + options_selecteds_'.$id.'.push(option_value); + } } } @@ -6134,3 +6138,36 @@ function html_print_select_agent_secondary($agent, $id_agente, $options=[]) return $output; } + + +/** + * Prints a simple 'Go Back' button. + * + * @param string $url Destination Url. + * @param array $options Options. + * `button_class`: Class for button. 'w100p' by default. + * `title`: Title of the button. 'Go Back' by default. + * `action_class`: Class of icon of button. 'cancel' by default. + * @param boolean $return If true, return a formed HTML element. + * + * @return mixed + */ +function html_print_go_back_button(string $url, array $options=[], bool $return=false) +{ + $output = html_print_div( + [ + 'class' => ($options['button_class'] ?? 'w100p'), + 'content' => html_print_button( + ($options['title'] ?? __('Go back')), + 'go_back', + false, + 'window.location.href = \''.$url.'\'', + 'class="sub '.($options['action_class'] ?? ' cancel').' right"', + true + ), + ], + $return + ); + + return $output; +} diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 08936c170b..c52b2bf5eb 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -7079,6 +7079,10 @@ function reporting_sql($report, $content) $historical_db = db_get_value_sql( 'SELECT historical_db from treport_content where id_rc ='.$content['id_rc'] ); + + if (is_metaconsole() === true) { + $historical_db = $content['historical_db']; + } } else { $historical_db = $content['historical_db']; } @@ -11121,7 +11125,7 @@ function reporting_get_group_stats($id_group=0, $access='AR', $recursion=true) * * @return array Group statistics */ -function reporting_get_group_stats_resume($id_group=0, $access='AR', $ignore_permissions=false) +function reporting_get_group_stats_resume($id_group=0, $access='AR', $ignore_permissions=false, $recursive=false) { global $config; @@ -11165,6 +11169,8 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR', $ignore_per $id_group = array_keys( users_get_groups($config['id_user'], $access, false) ); + } else if ($recursive === true) { + $id_group = groups_get_children_ids($id_group); } // ----------------------------------------------------------------- @@ -11295,7 +11301,7 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR', $ignore_per $group_stat = db_get_all_rows_sql($sql); $data = [ 'monitor_checks' => (int) $group_stat[0]['modules'], - 'monitor_alerts' => (int) groups_monitor_alerts($group_array), + 'monitor_alerts' => (int) groups_monitor_alerts($group_stat[0]['id_group']), 'monitor_alerts_fired' => (int) $group_stat[0]['alerts_fired'], 'monitor_alerts_fire_count' => (int) $group_stat[0]['alerts_fired'], 'monitor_ok' => (int) $group_stat[0]['normal'], @@ -11309,10 +11315,33 @@ function reporting_get_group_stats_resume($id_group=0, $access='AR', $ignore_per 'agent_warning' => (int) $group_stat[0]['agents_warnings'], 'agent_critical' => (int) $group_stat[0]['agents_critical'], 'total_checks' => (int) $group_stat[0]['modules'], - 'total_alerts' => (int) groups_monitor_alerts($group_array), + 'total_alerts' => (int) groups_monitor_alerts($group_stat[0]['id_group']), 'total_agents' => (int) $group_stat[0]['agents'], 'utimestamp' => (int) $group_stat[0]['utimestamp'], ]; + + if ($recursive === true) { + unset($group_stat[0]); + foreach ($group_stat as $value) { + $data['monitor_checks'] = ($data['monitor_checks'] + $value['modules']); + $data['monitor_alerts'] = ($data['monitor_alerts'] + groups_monitor_alerts($value['id_group'])); + $data['monitor_alerts_fired'] = ($data['monitor_alerts_fired'] + $value['alerts_fired']); + $data['monitor_alerts_fire_count'] = ($data['monitor_alerts_fire_count'] + $value['alerts_fired']); + $data['monitor_ok'] = ($data['monitor_ok'] + $value['normal']); + $data['monitor_warning'] = ($data['monitor_warning'] + $value['warning']); + $data['monitor_critical'] = ($data['monitor_critical'] + $value['critical']); + $data['monitor_unknown'] = ($data['monitor_unknown'] + $value['unknown']); + $data['monitor_not_init'] = ($data['monitor_not_init'] + $value['non-init']); + $data['agent_not_init'] = ($data['agent_not_init'] + $value['agents_not_init']); + $data['agent_unknown'] = ($data['agent_unknown'] + $value['agents_unknown']); + $data['agent_ok'] = ($data['agent_ok'] + $value['agents_normal']); + $data['agent_warning'] = ($data['agent_warning'] + $value['agents_warnings']); + $data['agent_critical'] = ($data['agent_critical'] + $value['agents_critical']); + $data['total_checks'] = ($data['total_checks'] + $value['modules']); + $data['total_alerts'] = ($data['total_alerts'] + groups_monitor_alerts($value['id_group'])); + $data['total_agents'] = ($data['total_agents'] + $value['agents']); + } + } } } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index d0e747e031..d30171eba3 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1178,8 +1178,14 @@ function ui_format_alert_row( $id_agent = modules_get_agentmodule_agent($alert['id_agent_module']); } - if (is_metaconsole() === true || !can_user_access_node()) { - $data[$index['agent_name']] = ui_print_truncate_text($agent_name, 'agent_small', false, true, true, '[…]', ''); + if (is_metaconsole() === true) { + // Do not show link if user cannot access node + if ((bool) can_user_access_node() === true) { + $url = $server['server_url'].'/index.php?'.'sec=estado&'.'sec2=operation/agentes/ver_agente&'.'id_agente='.$agente['id_agente']; + $data[$index['agent_name']] .= ''.''.$agente['alias'].''; + } else { + $data[$index['agent_name']] .= ''.$agente['alias'].''; + } } else { if ($agent_style !== false) { $data[$index['agent_name']] .= ' '.$agente['alias'].''; @@ -3173,6 +3179,7 @@ function ui_progress_extend( * 'class' => th class. * 'style' => th style. * 'text' => 'column1'. + * 'title' => 'column title'. * ] * ], * 'columns' => [ @@ -3208,12 +3215,15 @@ function ui_progress_extend( * 'option2' * ... * ] + * 'no_toggle' => Pint form withouth UI toggle. * ] * ], * 'extra_html' => HTML content to be placed after 'filter' section. * 'drawCallback' => function to be called after draw. Sample in: * https://datatables.net/examples/advanced_init/row_grouping.html * ] + * 'zeroRecords' => Message when zero records obtained from filter.(Leave blank for default). + * 'emptyTable' => Message when table data empty.(Leave blank for default). * End. * * @return string HTML code with datatable. @@ -3392,16 +3402,18 @@ function ui_print_datatable(array $parameters) $filter .= ''; $filter .= '
'; - $filter = ui_toggle( - $filter, - __('Filter'), - '', - '', - true, - false, - 'white_box white_box_opened', - 'no-border' - ); + if (isset($parameters['form']['no_toggle']) === false && ($parameters['form']['no_toggle'] !== true)) { + $filter = ui_toggle( + $filter, + __('Filter'), + '', + '', + true, + false, + 'white_box white_box_opened', + 'no-border' + ); + } } else if (isset($parameters['form_html'])) { $filter = ui_toggle( $parameters['form_html'], @@ -3416,7 +3428,20 @@ function ui_print_datatable(array $parameters) } // Languages. - $processing = __('Processing'); + $processing = '
'; + $processing .= ''.__('Processing').' '; + $processing .= str_replace( + '"', + "'", + html_print_image( + 'images/spinner.gif', + true + ) + ); + $processing .= '
'; + + $zeroRecords = isset($parameters['zeroRecords']) === true ? $parameters['zeroRecords'] : __('No matching records found'); + $emptyTable = isset($parameters['emptyTable']) === true ? $parameters['emptyTable'] : __('No data available in table'); // Extra html. $extra = ''; @@ -3441,6 +3466,7 @@ function ui_print_datatable(array $parameters) foreach ($names as $column) { if (is_array($column)) { $table .= ''.__($column['text']); $table .= $column['extra']; $table .= ''; @@ -3500,7 +3526,9 @@ function ui_print_datatable(array $parameters) responsive: true, dom: "plfrtiBp", language: { - processing:"'.$processing.'" + processing:"'.$processing.'", + zeroRecords:"'.$zeroRecords.'", + emptyYable:"'.$emptyTable.'", }, buttons: '.$parameters['csv'].'== 1 ? [ { @@ -3524,6 +3552,10 @@ function ui_print_datatable(array $parameters) url: "'.ui_get_full_url('ajax.php', false, false, false).'", type: "POST", dataSrc: function (json) { + if($("#'.$form_id.'_search_bt") != undefined) { + $("#'.$form_id.'_loading").remove(); + } + if (json.error) { console.error(json.error); $("#error-'.$table_id.'").html(json.error); @@ -3570,6 +3602,18 @@ function ui_print_datatable(array $parameters) } }, data: function (data) { + if($("#'.$form_id.'_search_bt") != undefined) { + var loading = \''.html_print_image( + 'images/spinner.gif', + true, + [ + 'id' => $form_id.'_loading', + 'class' => 'loading-search-datatables-button', + ] + ).'\'; + $("#'.$form_id.'_search_bt").parent().append(loading); + } + inputs = $("#'.$form_id.' :input"); values = {}; diff --git a/pandora_console/include/get_file.php b/pandora_console/include/get_file.php index 474a48f03c..f312340df5 100644 --- a/pandora_console/include/get_file.php +++ b/pandora_console/include/get_file.php @@ -46,6 +46,12 @@ $hash = get_parameter('hash'); $file_raw = get_parameter('file'); $file = base64_decode(urldecode($file_raw)); +// Avoid possible inifite loop with referer. +if (isset($_SERVER['HTTP_ORIGIN']) === false || (isset($_SERVER['HTTP_ORIGIN']) === true && $_SERVER['HTTP_REFERER'] === $_SERVER['HTTP_ORIGIN'].$_SERVER['REQUEST_URI'])) { + $refererPath = ui_get_full_url('index.php'); +} else { + $refererPath = $_SERVER['HTTP_REFERER']; +} if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$config['server_unique_identifier']) || isset($_SERVER['HTTP_REFERER']) === false) { $errorMessage = __('Security error. Please contact the administrator.'); @@ -84,12 +90,6 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c if (empty($downloadable_file) === true || file_exists($downloadable_file) === false) { $errorMessage = __('File is missing in disk storage. Please contact the administrator.'); - // Avoid possible inifite loop with referer. - if (isset($_SERVER['HTTP_ORIGIN']) === true && $_SERVER['HTTP_REFERER'] === $_SERVER['HTTP_ORIGIN'].$_SERVER['REQUEST_URI']) { - $refererPath = ui_get_full_url('index.php'); - } else { - $refererPath = $_SERVER['HTTP_REFERER']; - } } else { // Everything went well. header('Content-type: aplication/octet-stream;'); @@ -106,11 +106,12 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c document.addEventListener('DOMContentLoaded', function () { var refererPath = ''; var errorFileOutput = ''; - + if(refererPath != ''){ document.body.innerHTML = `
`; document.forms['failedReturn'].submit(); + } }, false); diff --git a/pandora_console/include/graphs/fgraph.php b/pandora_console/include/graphs/fgraph.php index b734fd3553..7082439384 100644 --- a/pandora_console/include/graphs/fgraph.php +++ b/pandora_console/include/graphs/fgraph.php @@ -494,7 +494,7 @@ function vbar_graph( 'weight' => $options['x']['font']['weight'], 'family' => $options['x']['font']['family'], 'variant' => $options['x']['font']['variant'], - 'color' => $options['x']['font']['color'], + 'color' => ($options['agent_view'] === true) ? 'black' : $options['x']['font']['color'], ], 'show' => $options['x']['show'], 'position' => $options['x']['position'], @@ -516,7 +516,7 @@ function vbar_graph( 'weight' => $options['y']['font']['weight'], 'family' => $options['y']['font']['family'], 'variant' => $options['y']['font']['variant'], - 'color' => $options['y']['font']['color'], + 'color' => ($options['agent_view'] === true) ? 'black' : $options['y']['font']['color'], ], 'show' => $options['y']['show'], 'position' => $options['y']['position'], @@ -534,8 +534,8 @@ function vbar_graph( 'aboveData' => $options['grid']['aboveData'], 'color' => $options['grid']['color'], 'backgroundColor' => $options['grid']['backgroundColor'], - 'margin' => $options['grid']['margin'], - 'labelMargin' => $options['grid']['labelMargin'], + 'margin' => ($options['agent_view'] === true) ? 6 : $options['grid']['margin'], + 'labelMargin' => ($options['agent_view'] === true) ? 12 : $options['grid']['labelMargin'], 'axisMargin' => $options['grid']['axisMargin'], 'markings' => $options['grid']['markings'], 'borderWidth' => $options['grid']['borderWidth'], @@ -561,6 +561,10 @@ function vbar_graph( ], ]; + if ($options['agent_view'] === true) { + $params['agent_view'] = true; + } + if (empty($params['data']) === true) { return graph_nodata_image( 0, diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php index 033382e5ea..8f5256e757 100644 --- a/pandora_console/include/graphs/functions_flot.php +++ b/pandora_console/include/graphs/functions_flot.php @@ -670,6 +670,10 @@ function flot_vcolumn_chart(array $options) $style .= 'height:'.$options['generals']['pdf']['height'].'px;'; } + if ($options['agent_view'] === true) { + $style = 'width: 95%; height: 85px'; + } + $class = ''; if ($options['generals']['rotate'] === true) { $class = 'bars-graph-rotate'; diff --git a/pandora_console/include/graphs/pandora.d3.js b/pandora_console/include/graphs/pandora.d3.js index d081cf7fca..896149b892 100644 --- a/pandora_console/include/graphs/pandora.d3.js +++ b/pandora_console/include/graphs/pandora.d3.js @@ -2869,7 +2869,7 @@ function donutNarrowGraph( arc = d3.svg .arc() .outerRadius(radius) - .innerRadius(radius - radius / 6); + .innerRadius(radius - radius / 4); svg = donutbody .append("svg") diff --git a/pandora_console/include/lib/Core/Config.php b/pandora_console/include/lib/Core/Config.php index 8970d03835..3030491202 100644 --- a/pandora_console/include/lib/Core/Config.php +++ b/pandora_console/include/lib/Core/Config.php @@ -64,39 +64,55 @@ final class Config || $config['history_db_connection'] === false ) { ob_start(); - $config['history_db_connection'] = db_connect( - $config['history_db_host'], - $config['history_db_name'], + + $link = mysqli_init(); + $link->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2); + $rc = mysqli_real_connect( + $link, + $$config['history_db_host'], $config['history_db_user'], io_output_password($config['history_db_pass']), - $config['history_db_port'], - false + $config['history_db_name'], + $config['history_db_port'] ); + if ($rc === false) { + $config['history_db_connection'] = false; + } else { + $config['history_db_connection'] = db_connect( + $config['history_db_host'], + $config['history_db_name'], + $config['history_db_user'], + io_output_password($config['history_db_pass']), + $config['history_db_port'], + false + ); + } + ob_get_clean(); - } - if ($config['history_db_connection'] !== false) { - $data = \db_get_all_rows_sql( - 'SELECT * FROM `tconfig`', - false, - false, - $config['history_db_connection'] + if ($config['history_db_connection'] !== false) { + $data = \db_get_all_rows_sql( + 'SELECT * FROM `tconfig`', + false, + false, + $config['history_db_connection'] + ); + } + + if (is_array($data) !== true) { + return []; + } + + self::$settings = array_reduce( + $data, + function ($carry, $item) { + $carry[$item['token']] = $item['value']; + return $carry; + }, + [] ); } - - if (is_array($data) !== true) { - return []; - } - - self::$settings = array_reduce( - $data, - function ($carry, $item) { - $carry[$item['token']] = $item['value']; - return $carry; - }, - [] - ); } diff --git a/pandora_console/include/lib/Core/DBMaintainer.php b/pandora_console/include/lib/Core/DBMaintainer.php index aa09c385f8..88841c5990 100644 --- a/pandora_console/include/lib/Core/DBMaintainer.php +++ b/pandora_console/include/lib/Core/DBMaintainer.php @@ -156,7 +156,10 @@ final class DBMaintainer return true; } - $dbc = new \mysqli( + $link = mysqli_init(); + $link->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2); + $rc = mysqli_real_connect( + $link, $this->host, $this->user, $this->pass, @@ -164,25 +167,39 @@ final class DBMaintainer $this->port ); - if ((bool) $dbc->connect_error === true) { + if ($rc === false) { $this->dbh = null; $this->connected = false; - $this->lastError = $dbc->connect_errno.': '.$dbc->connect_error; + $this->lastError = __('Connection problems'); } else { - $this->dbh = $dbc; - if (empty($this->charset) === false) { - $dbc->set_charset($this->charset); - } + $dbc = new \mysqli( + $this->host, + $this->user, + $this->pass, + null, + $this->port + ); - if ($this->dbh->select_db($this->name) === false) { - $this->lastError = $this->dbh->errno.': '.$this->dbh->error; - $this->ready = false; + if ((bool) $dbc->connect_error === true) { + $this->dbh = null; + $this->connected = false; + $this->lastError = $dbc->connect_errno.': '.$dbc->connect_error; } else { - $this->lastError = null; - $this->ready = true; - } + $this->dbh = $dbc; + if (empty($this->charset) === false) { + $dbc->set_charset($this->charset); + } - $this->connected = true; + if ($this->dbh->select_db($this->name) === false) { + $this->lastError = $this->dbh->errno.': '.$this->dbh->error; + $this->ready = false; + } else { + $this->lastError = null; + $this->ready = true; + } + + $this->connected = true; + } } } diff --git a/pandora_console/include/lib/Dashboard/Widgets/groups_status.php b/pandora_console/include/lib/Dashboard/Widgets/groups_status.php index c250da93da..51a6018d47 100755 --- a/pandora_console/include/lib/Dashboard/Widgets/groups_status.php +++ b/pandora_console/include/lib/Dashboard/Widgets/groups_status.php @@ -193,6 +193,10 @@ class GroupsStatusWidget extends Widget $values['groupId'] = $decoder['groupId']; } + if (isset($decoder['groupRecursion']) === true) { + $values['groupRecursion'] = $decoder['groupRecursion']; + } + return $values; } @@ -224,6 +228,16 @@ class GroupsStatusWidget extends Widget ], ]; + $inputs[] = [ + 'label' => __('Group recursion'), + 'arguments' => [ + 'name' => 'groupRecursion', + 'id' => 'groupRecursion', + 'type' => 'switch', + 'value' => $values['groupRecursion'], + ], + ]; + return $inputs; } @@ -239,6 +253,7 @@ class GroupsStatusWidget extends Widget $values = parent::getPost(); $values['groupId'] = \get_parameter('groupId', 0); + $values['groupRecursion'] = \get_parameter_switch('groupRecursion', 0); return $values; } @@ -260,9 +275,12 @@ class GroupsStatusWidget extends Widget $output = ''; - $user_groups = \users_get_groups(false, 'AR', false); - - $stats = \reporting_get_group_stats_resume($this->values['groupId'], 'AR', true); + $stats = \reporting_get_group_stats_resume( + $this->values['groupId'], + 'AR', + true, + (bool) $this->values['groupRecursion'] + ); $data = '
'; $data .= ui_print_group_icon( @@ -393,7 +411,7 @@ class GroupsStatusWidget extends Widget $table->data[0][0] .= ''; $table->data[0][1] = ''; $table->data[0][1] .= ''; - $table->data[0][1] .= $stats['monitor_total']; + $table->data[0][1] .= $stats['total_checks']; $table->data[0][1] .= ''; $table->data[0][1] .= ''; diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 194bd81c70..2e92c0d302 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -39,7 +39,7 @@ form.flex-row ul { margin: 0.5em 3em 0.5em 0; } -div.filter_input_little { +form div.filter_input_little { flex: 1; display: flex; flex-direction: row; @@ -132,6 +132,14 @@ table.dataTable tbody td { flex: 1; } +form.flex-row div.filter_input.filter_input_switch { + justify-content: flex-start; +} + +form.flex-row div.filter_input.filter_input_switch .p-slider { + width: 30px; +} + fieldset { margin: 0 auto; } diff --git a/pandora_console/include/styles/heatmap.css b/pandora_console/include/styles/heatmap.css index bac09b561e..12db5cc399 100644 --- a/pandora_console/include/styles/heatmap.css +++ b/pandora_console/include/styles/heatmap.css @@ -159,10 +159,26 @@ fill: #cccccc; } +.notinit_10, +.notinit_9, +.notinit_8, .notinit { fill: #4a83f3; } +.notinit_7, +.notinit_6, +.notinit_5, +.notinit_4 { + fill: #6695f5; +} + +.notinit_3, +.notinit_2, +.notinit_1 { + fill: #79a3f6; +} + .hover { cursor: pointer; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index ae109ba20d..eeff4d2fce 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1705,6 +1705,17 @@ div#agent_wizard_subtabs { -webkit-border-radius: 4px; border-radius: 4px; } + +.databox.no-border { + margin-bottom: 5px; + margin-top: 0px; + margin-left: 0px; + border: none; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} + .databox_color { padding-top: 5px; background-color: #fafafa; @@ -5614,12 +5625,12 @@ div#bullets_modules div { } .agent_details_col_left { - width: 40%; - min-width: 300px; + width: 49%; + min-width: 450px; } .agent_details_col_right { - width: 59%; - min-width: 480px; + width: 49%; + min-width: 450px; } .agent_access_rate_events { @@ -5630,14 +5641,15 @@ div#bullets_modules div { } .white_table_graph#table_access_rate { - flex: 1 1 auto; - min-width: 450px; - margin-right: 1%; + margin-left: 1px; + margin-right: 1px; + width: 49%; } .white_table_graph#table_events { - flex: 1 1 auto; - min-width: 450px; + margin-left: 1px; + margin-right: 1px; + width: 49%; } @media screen and (max-width: 1150px) { @@ -5676,7 +5688,7 @@ div#status_pie { justify-content: flex-end; align-items: center; border-bottom: 1px solid #e2e2e2; - padding: 6px 20px; + padding: 8px 20px; } .agent_details_content { @@ -9077,3 +9089,33 @@ div#err_msg_centralised { margin-bottom: 4px !important; padding: 2px 5px !important; } + +.dataTables_wrapper { + overflow: auto; +} + +.dataTables_wrapper .dataTables_processing { + margin-top: -37px !important; + top: 50px !important; + padding-top: 0px !important; + height: 0px !important; + background: transparent !important; +} + +.dataTables_wrapper .dataTables_processing .processing-datatables-inside { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + height: 100%; +} + +.dataTables_wrapper .dataTables_processing .processing-datatables-inside img { + margin-left: 20px; +} + +.loading-search-datatables-button { + float: right; + margin-right: -110px; + margin-top: 13px; +} diff --git a/pandora_console/install.php b/pandora_console/install.php index ca55df12b7..cad8324a88 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
getRequest('password', null); } - if (!empty($user) && !empty($password)) { - $user_in_db = process_user_login($user, $password); - if ($user_in_db !== false) { - $this->logged = true; - $this->user = $user_in_db; - $this->loginTime = time(); - $this->errorLogin = false; + if (empty($user) === false + && empty($password) === false + ) { + $user_in_db = db_get_row_filter( + 'tusuario', + ['id_user' => $user], + '*' + ); - // The user login was successful, but the second step is not completed - if ($this->isDobleAuthRequired()) { - $this->needDoubleAuth = true; - } - } else { - $this->logged = false; + $this->logged = false; $this->loginTime = false; $this->errorLogin = true; $this->needDoubleAuth = false; $this->errorDoubleAuth = false; + + if ($user_in_db !== false) { + if (((bool) $user_in_db['is_admin'] === false) + && ((bool) $user_in_db['not_login'] === true + || (is_metaconsole() === false + && has_metaconsole() === true + && is_management_allowed() === false + && (bool) $user_in_db['metaconsole_access_node'] === false)) + ) { + $this->logged = false; + $this->loginTime = false; + $this->errorLogin = true; + $this->needDoubleAuth = false; + $this->errorDoubleAuth = false; + } else { + $user_proccess_login = process_user_login($user, $password); + if ($user_proccess_login !== false) { + $this->logged = true; + $this->user = $user_proccess_login; + $this->loginTime = time(); + $this->errorLogin = false; + // The user login was successful, but the second step is not completed. + if ($this->isDobleAuthRequired()) { + $this->needDoubleAuth = true; + } + } + } } } diff --git a/pandora_console/mobile/index.php b/pandora_console/mobile/index.php index 1e65c30bdf..dc79e07c04 100644 --- a/pandora_console/mobile/index.php +++ b/pandora_console/mobile/index.php @@ -193,15 +193,23 @@ switch ($action) { if ($user->isWaitingDoubleAuth()) { if ($user->validateDoubleAuthCode()) { - // Logged. Refresh the page - header('Location: .'); + $url = ui_get_full_url(''); + $url = str_replace("\n", '', $url); + $url = str_replace('?action=logout', '', $url); + + // Logged. Refresh the page. + header('Location: '.$url); return; } else { $user->showDoubleAuthPage(); } } else { - // Logged. Refresh the page - header('Location: .'); + $url = ui_get_full_url(''); + $url = str_replace("\n", '', $url); + $url = str_replace('?action=logout', '', $url); + + // Logged. Refresh the page. + header('Location: '.$url); return; } } else { @@ -294,6 +302,42 @@ switch ($action) { $_GET['id'] = $id_map; break; + case 'External link': + $full_url = ui_get_full_url(); + $section_data = io_safe_output($section_data); + + $host_full = parse_url($full_url, PHP_URL_HOST); + $host_section = parse_url($section_data, PHP_URL_HOST); + + if ($host_full !== $host_section) { + $has_mobile = strpos($section_data, 'mobile'); + if ($has_mobile === false) { + $pos = strpos($section_data, '/index'); + if ($pos !== false) { + $section_data = substr_replace($section_data, '/mobile', $pos, 0); + } + } + + echo ''; + } else { + if (strpos($full_url, 'event') !== false) { + $page = 'events'; + } + + if (strpos($full_url, 'alert') !== false) { + $page = 'alerts'; + } + + if (strpos($full_url, 'tactical') !== false) { + $page = 'tactical'; + } + + if (strpos($full_url, 'visual_console') !== false) { + $page = 'visualmap'; + } + } + break; + case 'Group view': default: // No content. diff --git a/pandora_console/mobile/operation/agent.php b/pandora_console/mobile/operation/agent.php index 84e45f3164..4806cfda4d 100644 --- a/pandora_console/mobile/operation/agent.php +++ b/pandora_console/mobile/operation/agent.php @@ -363,12 +363,6 @@ class Agent $events = new Events(); $events->addJavascriptDialog(); - $options = $events->get_event_dialog_options(); - $ui->addDialog($options); - - $options = $events->get_event_dialog_error_options($options); - $ui->addDialog($options); - $ui->contentAddHtml(""); $ui->contentAddHtml(""); diff --git a/pandora_console/mobile/operation/events.php b/pandora_console/mobile/operation/events.php index dfdf58dd28..360f2710d6 100644 --- a/pandora_console/mobile/operation/events.php +++ b/pandora_console/mobile/operation/events.php @@ -1101,7 +1101,7 @@ class Events if (is_metaconsole() === false) { $count = events_get_all( 'count', - $filters, + $filters ); if ($count !== false) { diff --git a/pandora_console/operation/agentes/alerts_status.functions.php b/pandora_console/operation/agentes/alerts_status.functions.php index b7e2fe3b1c..f77b6a4daf 100755 --- a/pandora_console/operation/agentes/alerts_status.functions.php +++ b/pandora_console/operation/agentes/alerts_status.functions.php @@ -37,19 +37,21 @@ function forceExecution($id_group) } -function validateAlert() +function validateAlert($ids) { - $ids = (array) get_parameter_post('validate', []); - if (!empty($ids)) { include_once 'include/functions_alerts.php'; $result = alerts_validate_alert_agent_module($ids); - ui_print_result_message( + return ui_print_result_message( $result, __('Alert(s) validated'), - __('Error processing alert(s)') + __('Error processing alert(s)'), + '', + true ); + } else { + return ui_print_error_message(__('No alert selected')); } } @@ -61,11 +63,11 @@ function printFormFilterAlert($id_group, $filter, $free_search, $url, $filter_st $table = new StdClass(); $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox filters no-border'; $table->cellpadding = '0'; $table->cellspacing = '0'; if (defined('METACONSOLE')) { - $table->class = 'databox filters'; + $table->class = 'databox filters no-border'; $table->width = '100%'; $table->cellpadding = '0'; $table->cellspacing = '0'; @@ -97,12 +99,11 @@ function printFormFilterAlert($id_group, $filter, $free_search, $url, $filter_st $alert_status_filter['disabled'] = __('Disabled'); $alert_standby = []; - $alert_standby['all'] = __('All'); - $alert_standby['standby_on'] = __('Standby on'); - $alert_standby['standby_off'] = __('Standby off'); + $alert_standby['1'] = __('Standby on'); + $alert_standby['0'] = __('Standby off'); $table->data[0][2] = __('Status'); - $table->data[0][3] = html_print_select($alert_status_filter, 'filter', $filter, '', '', '', true); + $table->data[0][3] = html_print_select($alert_status_filter, 'disabled', $filter, '', '', '', true); $table->data[0][4] = __('Tags').ui_print_help_tip(__('Only it is show tags in use.'), true); @@ -111,7 +112,7 @@ function printFormFilterAlert($id_group, $filter, $free_search, $url, $filter_st if (empty($tags)) { $table->data[0][5] .= html_print_input_text('tags', __('No tags'), '', 20, 40, true, true); } else { - $table->data[0][5] .= html_print_select($tags, 'tag_filter', $tag_filter, '', __('All'), '', true, false, true, '', false, 'width: 150px;'); + $table->data[0][5] .= html_print_select($tags, 'tag', $tag_filter, '', __('All'), '', true, false, true, '', false, 'width: 150px;'); } $table->data[1][0] = __('Free text for search').ui_print_help_tip( @@ -121,32 +122,14 @@ function printFormFilterAlert($id_group, $filter, $free_search, $url, $filter_st $table->data[1][1] = html_print_input_text('free_search', $free_search, '', 20, 40, true); $table->data[1][2] = __('Standby'); - $table->data[1][3] = html_print_select($alert_standby, 'filter_standby', $filter_standby, '', '', '', true); + $table->data[1][3] = html_print_select($alert_standby, 'standby', $filter_standby, '', __('All'), '', true); $table->data[1][4] = __('Action'); $alert_action = alerts_get_alert_actions_filter(); - if (empty($alert_action)) { - $table->data[1][5] .= html_print_input_text('action', __('No actions'), '', 20, 40, true, true); - } else { - $table->data[1][5] = html_print_select($alert_action, 'action_filter', $action_filter, '', __('All'), '', true); - } - $table->data[1][5] = html_print_select($alert_action, 'action_filter', $action_filter, '', __('All'), '', true); - - if (defined('METACONSOLE')) { - $table->data[0][7] = html_print_submit_button(__('Filter'), 'filter_button', false, 'class="sub filter"', true); - $table->rowspan[0][7] = 2; - $data = '
'; - } else { - $data = ''; - } + $table->data[1][5] = html_print_select($alert_action, 'action', $action_filter, '', __('All'), '', true); $data .= html_print_table($table, true); - if (!defined('METACONSOLE')) { - $data .= "
".html_print_submit_button(__('Filter'), 'filter_button', false, 'class="sub filter"', true).'
'; - } - - $data .= '
'; if ($return) { return $data; @@ -156,7 +139,7 @@ function printFormFilterAlert($id_group, $filter, $free_search, $url, $filter_st } -function printFormFilterAlertAgent($agent_view_page, $free_search, $id_agent) +function printFormFilterAlertAgent($agent_view_page, $free_search, $id_agent, $return=false) { $table_filter = new stdClass(); $table_filter->width = '100%'; @@ -188,41 +171,11 @@ function printFormFilterAlertAgent($agent_view_page, $free_search, $id_agent) true ).''; - $table_filter->data[0][1] = '
'; - if ($agent_view_page === true) { - $table_filter->data[0][1] .= html_print_button( - __('Search'), - '', - false, - 'filter_agent_alerts('.$id_agent.');', - 'class="sub search"', - true - ); + $form = html_print_table($table_filter, true); + + if ($return === true) { + return $form; } else { - $table_filter->data[0][1] .= html_print_submit_button( - __('Search'), - '', - false, - 'class="sub search"', - true - ); - } - - $table_filter->data[0][1] .= '
'; - - if ($agent_view_page === true) { - echo html_print_table($table_filter); - } else { - $sortField = get_parameter('sort_field'); - $sort = get_parameter('sort', 'none'); - $order = ''; - - if ($sortField != '' && $sort != '') { - $order = '&sort_field='.$sortField.'&sort='.$sort; - } - - echo '
'; - echo html_print_table($table_filter); - echo '
'; + echo $form; } } diff --git a/pandora_console/operation/agentes/alerts_status.php b/pandora_console/operation/agentes/alerts_status.php index 00384b16a0..fea8db97ca 100755 --- a/pandora_console/operation/agentes/alerts_status.php +++ b/pandora_console/operation/agentes/alerts_status.php @@ -53,9 +53,8 @@ $isFunctionPolicies = enterprise_include_once('include/functions_policies.php'); $strict_user = db_get_value('strict_acl', 'tusuario', 'id_user', $config['id_user']); -$filter = get_parameter('filter', 'all_enabled'); -$filter_standby = get_parameter('filter_standby', 'all'); -$offset_simple = (int) get_parameter_get('offset_simple', 0); +$filter = get_parameter('disabled', 'all_enabled'); +$filter_standby = get_parameter('standby', 'all'); $id_group = (int) get_parameter('ag_group', 0); // 0 is the All group (selects all groups) $free_search = get_parameter('free_search', ''); @@ -99,7 +98,7 @@ if ($tag_filter) { } } -$action_filter = get_parameter('action_filter', 0); +$action_filter = get_parameter('action', 0); $sec2 = get_parameter_get('sec2'); $sec2 = safe_url_extraclean($sec2); @@ -210,249 +209,11 @@ if ($idAgent != 0) { } } -if ($alert_validate) { - if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') || check_acl_one_of_groups($config['id_user'], $all_groups, 'LM')) { - validateAlert(); - } else { - ui_print_error_message(__('Insufficient permissions to validate alerts')); - } -} enterprise_hook('open_meta_frame'); -if ($free_search != '') { - $whereAlertSimple = 'AND ('.'id_alert_template IN ( - SELECT id - FROM talert_templates - WHERE name LIKE "%'.$free_search.'%") OR '.'id_alert_template IN ( - SELECT id - FROM talert_templates - WHERE id_alert_action IN ( - SELECT id - FROM talert_actions - WHERE name LIKE "%'.$free_search.'%")) OR '.'talert_template_modules.id IN ( - SELECT id_alert_template_module - FROM talert_template_module_actions - WHERE id_alert_action IN ( - SELECT id - FROM talert_actions - WHERE name LIKE "%'.$free_search.'%")) OR '.'id_agent_module IN ( - SELECT id_agente_modulo - FROM tagente_modulo - WHERE nombre LIKE "%'.$free_search.'%") OR '.'id_agent_module IN ( - SELECT id_agente_modulo - FROM tagente_modulo - WHERE id_agente IN ( - SELECT id_agente - FROM tagente - WHERE nombre LIKE "%'.$free_search.'%") - OR alias LIKE "%'.$free_search.'%")'.')'; -} else { - $whereAlertSimple = ''; -} - -$sortField = get_parameter('sort_field'); -$sort = get_parameter('sort', 'none'); -$selected = true; -$selectAgentUp = false; -$selectAgentDown = false; -$selectModuleUp = false; -$selectModuleDown = false; -$selectTemplateUp = false; -$selectTemplateDown = false; -$selectLastFiredUp = false; -$selectLastFiredDown = false; - -switch ($sortField) { - case 'agent': - switch ($sort) { - case 'up': - $selectAgentUp = $selected; - $order = [ - 'field' => 'agent_name', - 'order' => 'ASC', - ]; - break; - - case 'down': - $selectAgentDown = $selected; - $order = [ - 'field' => 'agent_name', - 'order' => 'DESC', - ]; - break; - } - break; - - case 'module': - switch ($sort) { - case 'up': - $selectModuleUp = $selected; - $order = [ - 'field' => 'agent_module_name', - 'order' => 'ASC', - ]; - break; - - case 'down': - $selectModuleDown = $selected; - $order = [ - 'field' => 'agent_module_name', - 'order' => 'DESC', - ]; - break; - } - break; - - case 'template': - switch ($sort) { - case 'up': - $selectTemplateUp = $selected; - $order = [ - 'field' => 'template_name', - 'order' => 'ASC', - ]; - break; - - case 'down': - $selectTemplateDown = $selected; - $order = [ - 'field' => 'template_name', - 'order' => 'DESC', - ]; - break; - } - break; - - case 'last_fired': - switch ($sort) { - case 'up': - $selectLastFiredUp = $selected; - $order = [ - 'field' => 'last_fired', - 'order' => 'ASC', - ]; - break; - - case 'down': - $selectLastFiredDown = $selected; - $order = [ - 'field' => 'last_fired', - 'order' => 'DESC', - ]; - break; - } - break; - - default: - if ($print_agent) { - $selectDisabledUp = ''; - $selectDisabledDown = ''; - $selectAgentUp = false; - $selectAgentDown = false; - $selectModuleUp = $selected; - $selectModuleDown = false; - $selectTemplateUp = false; - $selectTemplateDown = false; - $selectLastFiredUp = false; - $selectLastFiredDown = false; - $order = [ - 'field' => 'agent_module_name', - 'order' => 'ASC', - ]; - } else { - $selectDisabledUp = ''; - $selectDisabledDown = ''; - $selectAgentUp = false; - $selectAgentDown = false; - $selectModuleUp = $selected; - $selectModuleDown = false; - $selectTemplateUp = false; - $selectTemplateDown = false; - $selectLastFiredUp = false; - $selectLastFiredDown = false; - $order = [ - 'field' => 'agent_module_name', - 'order' => 'ASC', - ]; - } - break; -} - - -// Add checks for user ACL -$groups = users_get_groups($config['id_user'], $access); -$id_groups = array_keys($groups); - -if (empty($id_groups)) { - $whereAlertSimple .= ' AND (1 = 0) '; -} else { - $whereAlertSimple .= sprintf( - ' AND id_agent_module IN ( - SELECT tam.id_agente_modulo - FROM tagente_modulo tam - WHERE tam.id_agente IN (SELECT ta.id_agente - FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON - ta.id_agente = tasg.id_agent - WHERE (ta.id_grupo IN (%s) OR tasg.id_group IN (%s)))) ', - implode(',', $id_groups), - implode(',', $id_groups) - ); -} - $alerts = []; -if ($agent_view_page === true) { - $options_simple = ['order' => $order]; -} else { - $options_simple = [ - 'offset' => $offset_simple, - 'limit' => $config['block_size'], - 'order' => $order, - ]; -} - -$filter_alert = []; -if ($filter_standby == 'standby_on') { - $filter_alert['disabled'] = $filter; - $filter_alert['standby'] = '1'; -} else if ($filter_standby == 'standby_off') { - $filter_alert['disabled'] = $filter; - $filter_alert['standby'] = '0'; -} else { - $filter_alert['disabled'] = $filter; -} - -if (is_metaconsole() === true) { - include_once $config['homedir'].'/enterprise/meta/include/functions_alerts_meta.php'; - if ($idAgent != 0) { - $alerts['alerts_simple'] = alerts_meta_get_alerts($agents, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); - - $countAlertsSimple = alerts_meta_get_alerts($agents, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); - } else { - $id_groups = array_keys( - users_get_groups($config['id_user'], 'AR', false) - ); - - $alerts['alerts_simple'] = alerts_meta_get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); - - $countAlertsSimple = alerts_meta_get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); - } -} else { - if ($idAgent != 0) { - $alerts['alerts_simple'] = agents_get_alerts_simple($idAgent, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter); - - $countAlertsSimple = agents_get_alerts_simple($idAgent, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter); - } else { - $id_groups = array_keys( - users_get_groups($config['id_user'], $access, false) - ); - - $alerts['alerts_simple'] = get_group_alerts($id_groups, $filter_alert, $options_simple, $whereAlertSimple, false, false, $idGroup, false, $strict_user, $tag_filter, $action_filter); - - $countAlertsSimple = get_group_alerts($id_groups, $filter_alert, false, $whereAlertSimple, false, false, $idGroup, true, $strict_user, $tag_filter, $action_filter); - } -} if ($tab != null) { $url = $url.'&tab='.$tab; @@ -466,313 +227,248 @@ if ($free_search != '') { $url .= '&free_search='.$free_search; } -// Filter form -if ($print_agent) { - if (is_metaconsole()) { - ui_toggle( - printFormFilterAlert( - $id_group, - $filter, - $free_search, - $url, - $filter_standby, - $tag_filter, + + + $columns = ['standby']; + + $column_names = [ + [ + 'title' => 'Standby', + 'text' => 'S.', + ], + ]; + + if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) { + array_unshift( + $column_names, + [ + 'title' => 'Policy', + 'text' => 'P.', + ], + ); + + $columns = array_merge( + ['policy'], + $columns + ); + } + + if (is_metaconsole() === false) { + if (check_acl($config['id_user'], $id_group, 'LW') || check_acl($config['id_user'], $id_group, 'LM')) { + array_unshift( + $column_names, + [ + 'title' => 'Validate', + 'text' => html_print_checkbox('all_validate', 0, false, true, false), + 'class' => 'dt-left', + ], + ); + + $columns = array_merge( + ['validate'], + $columns, + ); + } + + if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { + array_push( + $column_names, + [ + 'title' => 'Force execution', + 'text' => 'F.', + ], + ); + + $columns = array_merge( + $columns, + ['force'] + ); + } + } + + if ($print_agent === true) { + array_push( + $column_names, + ['text' => 'Agent'], + ); + + $columns = array_merge( + $columns, + ['agent'], + ); + } + + array_push( + $column_names, + ['text' => 'Module'], + ['text' => 'Template'], + ['text' => 'Action'], + ['text' => 'Last fired'], + ['text' => 'Status'], + ); + + $columns = array_merge( + $columns, + ['module'], + ['template'], + ['action'], + ['lastFired'], + ['status'], + ); + + + + if (is_metaconsole() === true) { + $no_sortable_columns = [ + 0, + 1, + 5, + ]; + } else { + $no_sortable_columns = [ + 0, + 1, + 2, + 3, + 7, + ]; + } + + + $alert_action = empty(alerts_get_alert_actions_filter()) === false ? alerts_get_alert_actions_filter() : ['' => __('No actions')]; + + + ob_start(); + + if ($agent_view_page === true) { + ui_print_datatable( + [ + 'id' => 'alerts_status_datatable', + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'no_sortable_columns' => $no_sortable_columns, + 'ajax_url' => 'include/ajax/alert_list.ajax', + 'ajax_data' => [ + 'get_agent_alerts_datatable' => 1, + 'id_agent' => $id_agent, + 'url' => $url, + 'agent_view_page' => true, + 'all_groups' => $all_groups, + ], + 'drawCallback' => 'alerts_table_controls()', + 'order' => [ + 'field' => 'module', + 'direction' => 'asc', + ], + 'zeroRecords' => __('No alerts found'), + 'emptyTable' => __('No alerts found'), + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Free text for search (*):').ui_print_help_tip( + __('Filter by module name, template name or action name'), + true + ), + 'type' => 'text', + 'name' => 'free_search_alert', + 'value' => $free_search, + 'size' => 20, + 'maxlength' => 100, + ], + ], + 'no_toggle' => true, + ], + ], + ); + } else { + ui_print_datatable( + [ + 'id' => 'alerts_status_datatable', + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'no_sortable_columns' => $no_sortable_columns, + 'ajax_url' => 'include/ajax/alert_list.ajax', + 'ajax_data' => [ + 'get_agent_alerts_datatable' => 1, + 'id_agent' => $id_agent, + 'url' => $url, + ], + 'drawCallback' => 'alerts_table_controls()', + 'order' => [ + 'field' => 'module', + 'direction' => 'asc', + ], + 'zeroRecords' => __('No alerts found'), + 'emptyTable' => __('No alerts found'), + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'html' => printFormFilterAlert( + $id_group, + $filter, + $free_search, + $url, + $filter_standby, + $tag_filter, + true, + true, + $strict_user + ), + ], + ], + ); + } + + if (!is_metaconsole()) { + if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { + echo '
'; + html_print_submit_button(__('Validate'), 'alert_validate', false, 'class="sub ok"', false); + echo '
'; + } + } + + + $html_content = ob_get_clean(); + + if ($agent_view_page === true) { + // Create controlled toggle content. + ui_toggle( + $html_content, + __('Full list of alerts'), + 'status_monitor_agent', + !$alerts_defined, false, - true, - $strict_user - ), - __('Show Options') - ); - ; - } else { - ui_toggle( - printFormFilterAlert( - $id_group, - $filter, - $free_search, - $url, - $filter_standby, - $tag_filter, - $action_filter, - true, - $strict_user - ), - __('Alert control filter'), - __('Toggle filter(s)'), - $access - ); - } -} - -// Urls to sort the table. -$url_up_agente = $url.'&sort_field=agent&sort=up'; -$url_down_agente = $url.'&sort_field=agent&sort=down'; -$url_up_module = $url.'&sort_field=module&sort=up'; -$url_down_module = $url.'&sort_field=module&sort=down'; -$url_up_template = $url.'&sort_field=template&sort=up'; -$url_down_template = $url.'&sort_field=template&sort=down'; -$url_up_lastfired = $url.'&sort_field=last_fired&sort=up'; -$url_down_lastfired = $url.'&sort_field=last_fired&sort=down'; - -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; -$table->cellpadding = '0'; -$table->cellspacing = '0'; -$table->size = []; -$table->head = []; -$table->align = []; - -if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) { - if ($print_agent) { - if (!is_metaconsole()) { - $table->size[8] = '4%'; - if (check_acl($config['id_user'], $id_group, 'LW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[9] = html_print_checkbox('all_validate', 0, false, true, false); - $table->align[9] = 'left'; - $table->size[9] = '5%'; - } + '', + 'white_table_graph_content no-padding-imp', + 'white_table_graph_content' + ); + } else { + // Dump entire content. + echo $html_content; } - $table->head[0] = "".__('P.').''; + // strict user hidden + echo ''; - if (!is_metaconsole()) { - if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[2] = "".__('F.').''; - } - } - - $table->head[3] = __('Agent'); - $table->head[4] = __('Module'); - $table->head[5] = __('Template'); - $table->head[6] = __('Action'); - $table->head[7] = __('Last fired'); - $table->head[8] = __('Status'); - - $table->align[8] = 'center'; - - // Sort buttons are only for normal console - if (!is_metaconsole()) { - $table->head[3] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectAgentUp, $selectAgentDown); - $table->head[4] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown); - $table->head[5] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown); - $table->head[7] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown); - } - } else { - if (!is_metaconsole()) { - $table->size[7] = '5%'; - if (check_acl_one_of_groups($config['id_user'], $all_groups, 'LW') || check_acl_one_of_groups($config['id_user'], $all_groups, 'LM')) { - $table->head[8] = __('Validate'); - $table->align[8] = 'left'; - $table->size[8] = '5%'; - } - } - - $table->head[0] = "".__('P.').''; - - $table->head[1] = "".__('S.').''; - - if (!is_metaconsole()) { - if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') || check_acl_one_of_groups($config['id_user'], $all_groups, 'LM')) { - $table->head[2] = "".__('F.').''; - } - } - - $table->head[3] = __('Module'); - $table->head[4] = __('Template'); - $table->head[5] = __('Action'); - $table->head[6] = __('Last fired'); - $table->head[7] = __('Status'); + enterprise_hook('close_meta_frame'); - $table->align[7] = 'center'; - - // Sort buttons are only for normal console - if (!is_metaconsole()) { - $table->head[3] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown); - $table->head[4] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown); - $table->head[6] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown); - } - } -} else { - if ($print_agent) { - if (!is_metaconsole()) { - $table->size[7] = '5%'; - if (check_acl($config['id_user'], $id_group, 'LW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[8] = __('Validate'); - $table->align[8] = 'left'; - $table->size[8] = '5%'; - } - } - - $table->head[0] = "".__('S.').''; - if (!is_metaconsole()) { - if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[1] = "".__('F.').''; - } - } - - $table->head[2] = __('Agent'); - $table->head[3] = __('Module'); - $table->head[4] = __('Template'); - $table->head[5] = __('Action'); - $table->head[6] = __('Last fired'); - $table->head[7] = __('Status'); - - $table->align[7] = 'center'; - - // Sort buttons are only for normal console - if (!is_metaconsole()) { - $table->head[3] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectAgentUp, $selectAgentDown); - $table->head[4] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown); - $table->head[5] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown); - $table->head[6] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown); - } - } else { - if (!is_metaconsole()) { - $table->size[6] = '5%'; - if (check_acl($config['id_user'], $id_group, 'LW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[7] = __('Validate'); - $table->align[7] = 'left'; - $table->size[7] = '5%'; - } - } - - $table->head[0] = "".__('S.').''; - if (!is_metaconsole()) { - if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { - $table->head[1] = "".__('F.').''; - } - } - - $table->head[2] = __('Module'); - $table->head[3] = __('Template'); - $table->head[4] = __('Action'); - $table->head[5] = __('Last fired'); - $table->head[6] = __('Status'); - - $table->align[6] = 'center'; - - // Sort buttons are only for normal console - if (!is_metaconsole()) { - $table->head[2] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown); - $table->head[3] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown); - $table->head[5] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown); - } - } -} - - -if ($sortField) { - $url .= '&sort_field='.$sortField; - $url .= '&sort='.$sort; -} - -$table->data = []; - -$rowPair = true; -$iterator = 0; -foreach ($alerts['alerts_simple'] as $alert) { - $row = ui_format_alert_row($alert, $print_agent, $url, 'font-size: 7pt;'); - $table->data[] = $row; -} - -if (!empty($table->data)) { - $class = ''; - if ($agent_view_page === true) { - $class = 'w100p no-padding-imp'; - printFormFilterAlertAgent($agent_view_page, $free_search, $idAgent); - } - - echo '
'; - - if ($agent_view_page !== true) { - ui_pagination( - $countAlertsSimple, - $url, - $offset_simple, - 0, - false, - 'offset_simple' - ); - } - - echo '
'; - html_print_table($table); - echo '
'; - - if ($agent_view_page !== true) { - ui_pagination( - $countAlertsSimple, - $url, - $offset_simple, - 0, - false, - 'offset_simple', - true, - 'pagination-bottom' - ); - } - - if (!is_metaconsole()) { - if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { - if (count($alerts['alerts_simple']) > 0) { - echo '
'; - html_print_submit_button(__('Validate'), 'alert_validate', false, 'class="sub ok"', false); - echo '
'; - } - } - } - - echo '
'; - $alerts_defined = true; -} else { - ui_print_info_message(['no_close' => true, 'message' => __('No alerts found') ]); - $alerts_defined = false; -} - -$html_content = ob_get_clean(); - -if ($agent_view_page === true) { - // Create controlled toggle content. - ui_toggle( - $html_content, - __('Full list of alerts'), - 'status_monitor_agent', - !$alerts_defined, - false, - '', - 'white_table_graph_content no-padding-imp' - ); -} else { - if (!$print_agent) { - printFormFilterAlertAgent($agent_view_page, $free_search, $idAgent); - } - - // Dump entire content. - echo $html_content; -} - - -// strict user hidden -echo ''; - -enterprise_hook('close_meta_frame'); - - -ui_require_css_file('cluetip', 'include/styles/js/'); -ui_require_jquery_file('cluetip'); -?> + ui_require_css_file('cluetip', 'include/styles/js/'); + ui_require_jquery_file('cluetip'); + ?> diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 57109fa837..42d325e7f0 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -74,9 +74,7 @@ if (! check_acl_one_of_groups($config['id_user'], $all_groups, 'AR') return; } -$alive_animation = agents_get_status_animation( - agents_get_interval_status($agent, false) -); +$alive_animation = agents_get_starmap($id_agente, 200, 50); /* * START: TABLE AGENT BUILD. @@ -170,10 +168,10 @@ $status_img = agents_detail_view_status_img( $table_agent_header .= '
'.$status_img.'
'; // Fixed width non interactive charts. -$status_chart_width = 180; -$graph_width = 180; +$status_chart_width = 150; +$graph_width = 150; -$table_agent_graph = '
'; +$table_agent_graph = '
'; $table_agent_graph .= graph_agent_status( $id_agente, $graph_width, @@ -604,6 +602,7 @@ if ($config['agentaccess'] && $access_agent > 0) { $table_access_rate .= graphic_agentaccess( $id_agente, SECONDS_1DAY, + true, true ); $table_access_rate .= '
'; diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 781301e2e0..019ccbb006 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -169,6 +169,10 @@ $filter_only_alert = get_parameter( 'filter[filter_only_alert]', ($filter['filter_only_alert'] ?? '') ); +$search_secondary_groups = get_parameter( + 'filter[search_secondary_groups]', + 0 +); $id_group_filter = get_parameter( 'filter[id_group_filter]', ($filter['id_group_filter'] ?? '') @@ -482,21 +486,23 @@ if (is_ajax() === true) { $tmp->b64 = base64_encode(json_encode($tmp)); // Show comments events. - $tmp->user_comment = $tmp->comments; - if ($tmp->comments !== 'undefined' && strlen($tmp->comments) > 80) { - $tmp->user_comment .= '  '; - $tmp->user_comment .= ''; $in .= $data.'
'; $inputs[] = $in; +// Search secondary groups. +$data = html_print_checkbox_switch( + 'search_secondary_groups', + $search_secondary_groups, + $search_secondary_groups, + true, + false, + 'search_in_secondary_groups(this);', + true +); + +$in = '
'; +$in .= $data.'
'; +$inputs[] = $in; + +// Trick view in table. +$inputs[] = '
'; + $buttons = []; $buttons[] = [ @@ -2931,7 +2956,14 @@ $(document).ready( function() { }); - +function search_in_secondary_groups(element) { + var value = $("#checkbox-"+element.name).val(); + if (value == 0) { + $("#checkbox-"+element.name).val(1); + } else { + $("#checkbox-"+element.name).val(0); + } +} function datetime_picker_callback() { $("#text-time_from, #text-time_to").timepicker({ diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec index 0ae9f5fc7c..11ccba1cce 100644 --- a/pandora_console/pandora_console.redhat.spec +++ b/pandora_console/pandora_console.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_console %define version 7.0NG.763 -%define release 220712 +%define release 220802 # User and Group under which Apache is running %define httpd_name httpd diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec index e8eb9314d5..ab6de6b960 100644 --- a/pandora_console/pandora_console.rhel7.spec +++ b/pandora_console/pandora_console.rhel7.spec @@ -3,7 +3,7 @@ # %define name pandorafms_console %define version 7.0NG.763 -%define release 220712 +%define release 220802 # User and Group under which Apache is running %define httpd_name httpd diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec index 1c6b2c27d4..54038161c1 100644 --- a/pandora_console/pandora_console.spec +++ b/pandora_console/pandora_console.spec @@ -3,7 +3,7 @@ # %define name pandorafms_console %define version 7.0NG.763 -%define release 220712 +%define release 220802 %define httpd_name httpd # User and Group under which Apache is running %define httpd_name apache2 diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 145cabd447..fe41d0ce80 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1243,6 +1243,7 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` ( `tag_with` TEXT, `tag_without` TEXT, `filter_only_alert` INT NOT NULL DEFAULT -1, + `search_secondary_groups` INT NOT NULL DEFAULT 0, `date_from` date DEFAULT NULL, `date_to` date DEFAULT NULL, `source` TINYTEXT, @@ -1291,7 +1292,6 @@ CREATE TABLE IF NOT EXISTS `tusuario` ( `not_login` TINYINT UNSIGNED NOT NULL DEFAULT 0, `local_user` TINYINT UNSIGNED NOT NULL DEFAULT 0, `metaconsole_agents_manager` TINYINT UNSIGNED NOT NULL DEFAULT 0, - `metaconsole_assigned_server` INT UNSIGNED NOT NULL DEFAULT 0, `metaconsole_access_node` TINYINT UNSIGNED NOT NULL DEFAULT 0, `strict_acl` TINYINT UNSIGNED NOT NULL DEFAULT 0, `id_filter` INT UNSIGNED NULL DEFAULT NULL, @@ -3575,6 +3575,18 @@ CREATE TABLE IF NOT EXISTS `tautoconfig` ( `order` INT NOT NULL DEFAULT 0, `description` TEXT, `disabled` TINYINT DEFAULT 0, + `type_execution` VARCHAR(100) NOT NULL DEFAULT 'start', + `type_periodicity` VARCHAR(100) NOT NULL DEFAULT 'weekly', + `monday` TINYINT DEFAULT 0, + `tuesday` TINYINT DEFAULT 0, + `wednesday` TINYINT DEFAULT 0, + `thursday` TINYINT DEFAULT 0, + `friday` TINYINT DEFAULT 0, + `saturday` TINYINT DEFAULT 0, + `sunday` TINYINT DEFAULT 0, + `periodically_day_from` INT UNSIGNED DEFAULT NULL, + `periodically_time_from` time NULL DEFAULT NULL, + `executed` TINYINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index b21d59f6be..dc1dc8dac3 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -109,10 +109,10 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('MR', 55), +('MR', 56), ('identification_reminder', 1), ('identification_reminder_timestamp', 0), -('current_package', 763), +('current_package', 764), ('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.00097656250000":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'), ('custom_docs_logo', 'default_docs.png'), ('custom_support_logo', 'default_support.png'), diff --git a/pandora_plugins/cisco_ipsla/pandora_ipsla.sh b/pandora_plugins/cisco_ipsla/pandora_ipsla.sh new file mode 100755 index 0000000000..1919d80c7c --- /dev/null +++ b/pandora_plugins/cisco_ipsla/pandora_ipsla.sh @@ -0,0 +1,779 @@ +#!/bin/bash +# IPSLA remote Plugin for Pandora FMS +# (c) ArticaST 2014 + + +# Default values +COMMUNITY="public" +TAG_TABLE_CACHE="/tmp/ipsla_cache" + +function help { + echo -e "Cisco IP SLA Server Plugin for Pandora FMS. http://pandorafms.com" + echo -e "Syntax:\n\n-c -t -v [other options]\n" + echo -e "\t\t-c community" + echo -e "\t\t-t target" + echo -e "\t\t-v version" + echo -e "Other options\n"; + echo -e "\t\t-s show defined tags for cisco ipsla device and exit" + echo -e "\t\t-l " + echo -e "\t\t-u " + echo -e "\t\t-a " + echo -e "\t\t-A " + echo -e "\t\t-x " + echo -e "\t\t-X " + echo -e "\t\t-g " + echo -e "\t\t-m \n" + echo -e "Available Modules list: \n" + echo -e "\tICPIF - Calculated Planning Impairment Factor for specified tag" + echo -e "\tMOS - Mean Opinion Score" + echo -e "\tPacket_Out_of_Sequence - Packets arriving out of sequence " + echo -e "\tPacket_Late_Arrival - Packets arriving late" + echo -e "\tAverage_Jitter - Average jitter is the estimated average jitter observed in the last XX RTP packets" + echo -e "\tPacketLossSD - Packet loss from source to destination" + echo -e "\tPacketLossDS - Packet loss from destination to source" + echo -e "\tPacketLost - The number of packets that are lost for which we cannot determine the direction " + echo -e "\tNegativesSD - The sum of number of all negative jitter values from packets sent from source to destination " + echo -e "\tNegativesDS - The sum of number of all negative jitter values from packets sent from destination to source" + echo -e "\tPositivesSD - The sum of number of all positive jitter values from packets sent from source to destination" + echo -e "\tPositivesDS - The sum of number of all positive jitter values from packets sent from source to destination" + echo -e "\tRTTMax - Max Round Trip Time" + echo -e "\tRTTMin - Min Round Trip Time" + echo -e "\tOperNumOfRTT - The number of successful round trips" + echo -e "\tOperPacketLossSD - Packet loss from source to destination for jitter tests" + echo -e "\tOperPacketLossDS - Packet loss from destination to source for jitter tests" + echo -e "\tRttOperSense - A sense code for the completion status of the latest RTT operation." + echo -e "\tRttOperCompletionTime - The completion time of the latest RTT operation successfully completed." + echo -e "\tRttOperTime - The value of the agent system time at the time of the latest RTT operation." + echo -e "\tRttOperAddress - A string which specifies the address of the target." + echo -e "\tHTTPOperRTT - Round Trip Time taken to perform HTTP operation. This value is the sum of DNSRTT, TCPConnectRTT and TransactionRTT." + echo -e "\tHTTPOperDNSRTT Round Trip Time taken to perform DNS query within the HTTP operation." + echo -e "\tHTTPOperTCPConnectRTT - Round Trip Time taken to connect to the HTTP server." + echo -e "\tIcmpJitterAvgJitter The average of positive and negative jitter values in Source-to-Destionation and Destination-to-Source direction." + echo -e "\tHTTPOperTransactionRTT - Round Trip Time taken to download the object specified by the URL." + echo -e "" + echo -e " Example execution" + echo -e " snmp version 3: ./pandora_ipsla.sh -t -v 3 -l authPriv -u pandorafms -a MD5 -A pandorafms -x AES -X pandorafms -g jitter -m Average_Jitter" + echo -e " snmp version 2c: ./pandora_ipsla.sh -t -v 2c -c public -g jitter -m Average_Jitter" + + + echo "" + exit +} + +function show_tags { + local TAG_TABLE_CACHE=$TAG_TABLE_CACHE.$TARGET + + if [ $version != "3" ] + then + snmpwalk -v 1 -Onq -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + if [ $version == "3" ] + #if snmp v3 snmpget with v3 + then + if [ $auth == "authPriv" ] + # if authpriv snmpget with all parameters + then + snmpwalk -v 3 -Onq -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + if [ $auth == "authNoPriv" ] + then + + snmpget -v 3 -Onq -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + fi + + cat $TAG_TABLE_CACHE + exit +} + +function update_tags { + local TAG_TABLE_CACHE=$TAG_TABLE_CACHE.$TARGET + + if [ $version != "3" ] + then + snmpwalk -v 1 -Onq -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + if [ $version == "3" ] + #if snmp v3 snmpget with v3 + then + if [ $auth == "authPriv" ] + # if authpriv snmpget with all parameters + then + snmpwalk -v 3 -Onq -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + if [ $auth == "authNoPriv" ] + then + + snmpget -v 3 -Onq -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.1.1.3 > $TAG_TABLE_CACHE + fi + fi + + +} + +function get_index { + cat $TAG_TABLE_CACHE.$TARGET | grep "\"$1\"" | grep -o "[0-9]*\s" +} + +# This function requires two arguments. MODULE_TYPE TAG +function get_module { + MODULE_TYPE=$1 + update_tags + INDICE=$2 + + if [ $version != "3" ] + + then + + if [ "$MODULE_TYPE" == "ICPIF" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.43.$INDICE` + fi + if [ "$MODULE_TYPE" == "MOS" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.42.$INDICE` + fi + if [ "$MODULE_TYPE" == "Packet_Out_of_Sequence" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.28.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Packet_Late_Arrival" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.30.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Average_Jitter" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.46.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossSD" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossDS" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLost" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.29.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesSD" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.12.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesDS" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.22.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesSD" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.7.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesDS" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.17.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMax" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMin" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.4.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperNumOfRTT" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossSD" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossDS" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperCompletionTime" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperSense" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperTime" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperAddress" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.6.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperRTT" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperDNSRTT" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTCPConnectRTT" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.3.$INDICE` + fi + + if [ "$MODULE_TYPE" == "IcmpJitterAvgJitter" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.4.1.44.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTransactionRTT" ] + then + VALOR=`snmpget -v $version -Oqv -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.4.$INDICE` + fi + fi + + if [ $version == "3" ] + + #if snmp v3 snmpget with v3 + then + if [ $auth == "authPriv" ] + # if authpriv snmpget with all parameters + then + if [ "$MODULE_TYPE" == "ICPIF" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.43.$INDICE` + fi + if [ "$MODULE_TYPE" == "MOS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.42.$INDICE` + fi + if [ "$MODULE_TYPE" == "Packet_Out_of_Sequence" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.28.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Packet_Late_Arrival" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.30.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Average_Jitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.46.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLost" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.29.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.12.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.22.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.7.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.17.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMax" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMin" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.4.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperNumOfRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperCompletionTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperSense" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperAddress" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.6.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperDNSRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTCPConnectRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.3.$INDICE` + fi + + if [ "$MODULE_TYPE" == "IcmpJitterAvgJitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.4.1.44.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTransactionRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -x $hash2 -X $hash2pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.4.$INDICE` + fi + fi + if [ $auth == "authNoPriv" ] + then + if [ "$hash1" ] + then + if [ "$MODULE_TYPE" == "ICPIF" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.43.$INDICE` + fi + if [ "$MODULE_TYPE" == "MOS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.42.$INDICE` + fi + if [ "$MODULE_TYPE" == "Packet_Out_of_Sequence" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.28.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Packet_Late_Arrival" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.30.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Average_Jitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.46.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLost" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.29.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.12.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.22.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.7.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.17.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMax" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMin" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.4.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperNumOfRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperCompletionTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperSense" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperAddress" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.6.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperDNSRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTCPConnectRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.3.$INDICE` + fi + + if [ "$MODULE_TYPE" == "IcmpJitterAvgJitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.4.1.44.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTransactionRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -a $hash1 -A $hash1pass -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.4.$INDICE` + fi + else + if [ "$MODULE_TYPE" == "ICPIF" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.43.$INDICE` + fi + if [ "$MODULE_TYPE" == "MOS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.42.$INDICE` + fi + if [ "$MODULE_TYPE" == "Packet_Out_of_Sequence" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.28.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Packet_Late_Arrival" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.30.$INDICE` + fi + + if [ "$MODULE_TYPE" == "Average_Jitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.46.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PacketLost" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.29.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.12.$INDICE` + fi + + if [ "$MODULE_TYPE" == "NegativesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.22.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.7.$INDICE` + fi + + if [ "$MODULE_TYPE" == "PositivesDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.17.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMax" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RTTMin" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.4.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperNumOfRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossSD" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.26.$INDICE` + fi + + if [ "$MODULE_TYPE" == "OperPacketLossDS" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.2.1.27.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperCompletionTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperSense" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperTime" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.5.$INDICE` + fi + + if [ "$MODULE_TYPE" == "RttOperAddress" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.2.10.1.6.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.1.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperDNSRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.2.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTCPConnectRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.3.$INDICE` + fi + + if [ "$MODULE_TYPE" == "IcmpJitterAvgJitter" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.4.1.44.$INDICE` + fi + + if [ "$MODULE_TYPE" == "HTTPOperTransactionRTT" ] + then + VALOR=`snmpget -v 3 -l $auth -u $user -c $COMMUNITY $TARGET 1.3.6.1.4.1.9.9.42.1.5.1.1.4.$INDICE` + fi + + fi + + fi + fi + + echo -n $VALOR | awk '{print $NF}' + exit 0 +} + +if [ -z "`which snmpwalk`" ] +then + echo "ERROR: snmpwalk is not in the path. Exiting..." + exit -1 +fi + +if [ $# -eq 0 ] +then + help +fi + +# Main parsing code + +while getopts ":hc:t:v:l:u:a:A:x:X:sm:g:" optname + do + case "$optname" in + "h") + help + ;; + "c") + COMMUNITY=$OPTARG + ;; + "t") + TARGET=$OPTARG + ;; + "v") + version=$OPTARG + ;; + "l") + auth=$OPTARG + ;; + "u") + user=$OPTARG + ;; + "a") + hash1=$OPTARG + ;; + "A") + hash1pass=$OPTARG + ;; + "x") + hash2=$OPTARG + ;; + "X") + hash2pass=$OPTARG + ;; + "g") + TAG=$OPTARG + ;; + "s") + SHOWTAGS=1 + ;; + "m") + MODULE=$OPTARG + ;; + ?) + help + ;; + default) + help + ;; + + esac +done + +# Execution +[ "$SHOWTAGS" ] && echo "Showing avaliables ipsla tags for the device $TARGET and OID 1.3.6.1.4.1.9.9.42.1.2.1.1.3" && show_tags + +[ -z "$TARGET" ] && echo "Error missing target ip definition please use -t to difine it or -h to see help" && exit 1 +[ -z "$MODULE" ] && echo "Error missing module definition please use -m to difine it or -h to see help" && exit 1 +[ -z "$TAG" ] && echo "Error missing id definition please use -g to difine it or -h to see help" && exit 1 +[ -z "$version" ] && echo "Error missing snmp version definition please use -v to difine it or -h to see help" && exit 1 + + +get_module $MODULE $TAG +echo "DEBUG" + +exit 0 + +#RttOperSense +# 0:other +# 1:ok +# 2:disconnected +# 3:overThreshold +# 4:timeout +# 5:busy +# 6:notConnected +# 7:dropped +# 8:sequenceError +# 9:verifyError +# 10:applicationSpecific +# 11:dnsServerTimeout +# 12:tcpConnectTimeout +# 13:httpTransactionTimeout +# 14:dnsQueryError +# 15:httpError +# 16:error +# 17:mplsLspEchoTxError +# 18:mplsLspUnreachable +# 19:mplsLspMalformedReq +# 20:mplsLspReachButNotFEC +# 21:enableOk +# 22:enableNoConnect +# 23:enableVersionFail +# 24:enableInternalError +# 25:enableAbort +# 26:enableFail +# 27:enableAuthFail +# 28:enableFormatError +# 29:enablePortInUse +# 30:statsRetrieveOk +# 31:statsRetrieveNoConnect +# 32:statsRetrieveVersionFail +# 33:statsRetrieveInternalError +# 34:statsRetrieveAbort +# 35:statsRetrieveFail +# 36:statsRetrieveAuthFail +# 37:statsRetrieveFormatError +# 38:statsRetrievePortInUse \ No newline at end of file diff --git a/pandora_plugins/cisco_ironports/pandora_ironports.py b/pandora_plugins/cisco_ironports/pandora_ironports.py new file mode 100644 index 0000000000..b51da28606 --- /dev/null +++ b/pandora_plugins/cisco_ironports/pandora_ironports.py @@ -0,0 +1,410 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse,sys,requests +from requests.auth import HTTPBasicAuth +from ast import List +import xml.etree.ElementTree as ET +import os +from subprocess import * +from datetime import datetime +from xml.etree import ElementTree + +__author__ = "Alejandro Sánchez Carrion" +__copyright__ = "Copyright 2021, PandoraFMS" +__maintainer__ = "Projects department" +__status__ = "Production" +__version__ = "180722" + +description= f""" +Pandora_ironports tool ver {__version__} + +python3 pandora_ironports.py --url -u -p [ --agent_name ] [ --as_agent_plugin ] [ --tentacle_port ] [ --tentacle_address ] [ -g ] [ --data_dir ] + +""" + +parser = argparse.ArgumentParser(description= description, formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('--url', help='', required=True) +parser.add_argument('-u', '--user', help='username', required=True) +parser.add_argument('-p', '--password', help='password',required=True ) +parser.add_argument('--tentacle_port', help='tentacle port', default=41121) +parser.add_argument('--tentacle_address', help='tentacle adress', default=None) +parser.add_argument('--agent_name', help='Name of the agent', default= "Cisco_ironport") +parser.add_argument('-g', '--group', help='PandoraFMS destination group (default cisco)', default='Cisco') +parser.add_argument('--data_dir', help='PandoraFMS data dir (default: /var/spool/pandora/data_in/)', default='/var/spool/pandora/data_in/') +parser.add_argument('--as_agent_plugin', help='mode plugin', default=0,type=int) + + +args = parser.parse_args() + +### Pandora Tools ###------------------------------------------------------------------------------------------------------- +modules = [] + +config = { + "data_in": args.data_dir, + "group" : args.group +} + +######################################################################################### +# print_agent +######################################################################################### +def print_agent(agent, modules, data_dir="/var/spool/pandora/data_in/", log_modules= None, print_flag = None): + """Prints agent XML. Requires agent conf (dict) and modules (list) as arguments. + - Use print_flag to show modules' XML in STDOUT. + - Returns a tuple (xml, data_file). + """ + data_file=None + + header = "\n" + header += "\n" + "\t\n" + "\t" + str(data["type"]) + "\n" + ) + + if type(data["type"]) is not str and "string" not in data["type"]: #### Strip spaces if module not generic_data_string + data["value"] = data["value"].strip() + if isinstance(data["value"], list): # Checks if value is a list + module_xml += "\t\n" + for value in data["value"]: + if type(value) is dict and "value" in value: + module_xml += "\t\n" + module_xml += "\t\t\n" + if "timestamp" in value: + module_xml += "\t\t\n" + module_xml += "\t\n" + module_xml += "\t\n" + else: + module_xml += "\t\n" + if "desc" in data: + module_xml += "\t\n" + if "unit" in data: + module_xml += "\t\n" + if "interval" in data: + module_xml += "\t\n" + if "tags" in data: + module_xml += "\t" + str(data["tags"]) + "\n" + if "module_group" in data: + module_xml += "\t" + str(data["module_group"]) + "\n" + if "module_parent" in data: + module_xml += "\t" + str(data["module_parent"]) + "\n" + if "min_warning" in data: + module_xml += "\t\n" + if "min_warning_forced" in data: + module_xml += "\t\n" + if "max_warning" in data: + module_xml += "\t\n" + if "max_warning_forced" in data: + module_xml += "\t\n" + if "min_critical" in data: + module_xml += "\t\n" + if "min_critical_forced" in data: + module_xml += "\t\n" + if "max_critical" in data: + module_xml += "\t\n" + if "max_critical_forced" in data: + module_xml += "\t\n" + if "str_warning" in data: + module_xml += "\t\n" + if "str_warning_forced" in data: + module_xml += "\t\n" + if "str_critical" in data: + module_xml += "\t\n" + if "str_critical_forced" in data: + module_xml += "\t\n" + if "critical_inverse" in data: + module_xml += "\t\n" + if "warning_inverse" in data: + module_xml += "\t\n" + if "max" in data: + module_xml += "\t\n" + if "min" in data: + module_xml += "\t\n" + if "post_process" in data: + module_xml += "\t\n" + if "disabled" in data: + module_xml += "\t\n" + if "min_ff_event" in data: + module_xml += "\t\n" + if "status" in data: + module_xml += "\t\n" + if "timestamp" in data: + module_xml += "\t\n" + if "custom_id" in data: + module_xml += "\t\n" + if "critical_instructions" in data: + module_xml += "\t\n" + if "warning_instructions" in data: + module_xml += "\t\n" + if "unknown_instructions" in data: + module_xml += "\t\n" + if "quiet" in data: + module_xml += "\t\n" + if "module_ff_interval" in data: + module_xml += "\t\n" + if "crontab" in data: + module_xml += "\t\n" + if "min_ff_event_normal" in data: + module_xml += "\t\n" + if "min_ff_event_warning" in data: + module_xml += "\t\n" + if "min_ff_event_critical" in data: + module_xml += "\t\n" + if "ff_type" in data: + module_xml += "\t\n" + if "ff_timeout" in data: + module_xml += "\t\n" + if "each_ff" in data: + module_xml += "\t\n" + if "module_parent_unlink" in data: + module_xml += "\t\n" + if "global_alerts" in data: + for alert in data["alert"]: + module_xml += "\t\n" + module_xml += "\n" + + if print_flag: + print (module_xml) + + return (module_xml) + +######################################################################################### +# write_xml +######################################################################################### + +def write_xml(xml, agent_name, data_dir="/var/spool/pandora/data_in/"): + """Creates a agent .data file in the specified data_dir folder\n + Args: + - xml (str): XML string to be written in the file. + - agent_name (str): agent name for the xml and file name. + - data_dir (str): folder in which the file will be created.""" + Utime = datetime.now().strftime('%s') + data_file = "%s/%s.%s.data" %(str(data_dir),agent_name,str(Utime)) + try: + with open(data_file, 'x') as data: + data.write(xml) + except OSError as o: + sys.exit(f"ERROR - Could not write file: {o}, please check directory permissions") + except Exception as e: + sys.exit(f"{type(e).__name__}: {e}") + return (data_file) + +# # default agent +def clean_agent() : + global agent + agent = { + "agent_name" : "", + "agent_alias" : "", + "parent_agent_name" : "", + "description" : "", + "version" : "", + "os_name" : "", + "os_version" : "", + "timestamp" : datetime.today().strftime('%Y/%m/%d %H:%M:%S'), + #"utimestamp" : int(datetime.timestamp(datetime.today())), + "address" : "", + "group" : config["group"], + "interval" : "", + "agent_mode" : "1", + } + return agent + +# default module +def clean_module() : + global modulo + modulo = { + "name" : "", + "type" : "generic_data_string", + "desc" : "", + "value" : "", + } + return modulo + +######################################################################################### +# tentacle_xml +######################################################################################### +def tentacle_xml(file, tentacle_ops,tentacle_path='', debug=0): + """Sends file using tentacle protocol\n + - Only works with one file at time. + - file variable needs full file path. + - tentacle_opts should be a dict with tentacle options (address [password] [port]). + - tentacle_path allows to define a custom path for tentacle client in case is not in sys path). + - if debug is enabled, the data file will not be removed after being sent. + + Returns 0 for OK and 1 for errors. + """ + + if file is None : + sys.stderr.write("Tentacle error: file path is required.") + else : + data_file = file + + if tentacle_ops['address'] is None : + sys.stderr.write("Tentacle error: No address defined") + return 1 + + try : + with open(data_file, 'r') as data: + data.read() + data.close() + except Exception as e : + sys.stderr.write(f"Tentacle error: {type(e).__name__} {e}") + return 1 + + tentacle_cmd = f"{tentacle_path}tentacle_client -v -a {tentacle_ops['address']} " + if "port" in tentacle_ops: + tentacle_cmd += f"-p {tentacle_ops['port']} " + if "password" in tentacle_ops: + tentacle_cmd += f"-x {tentacle_ops['password']} " + tentacle_cmd += f"{data_file} " + + tentacle_exe=Popen(tentacle_cmd, stdout=PIPE, shell=True) + rc=tentacle_exe.wait() + + if rc != 0 : + sys.stderr.write("Tentacle error") + return 1 + elif debug == 0 : + os.remove(file) + + return 0 + +## funcion agent +def agentplugin(modules,agent,plugin_type="server",data_dir="/var/spool/pandora/data_in/",tentacle=False,tentacle_conf=None) : + if plugin_type == "server": + for modulo in modules: + print_module(modulo,1) + + elif tentacle == True and tentacle_conf is not None: + agent_file=print_agent(agent, modules,data_dir) + if agent_file[1] is not None: + tentacle_xml(agent_file[1],tentacle_conf) + print ("1") + else: + print_agent(agent, modules,data_dir) + print ("1") + +# Create agent +clean_agent() +agent.update( + agent_name = args.agent_name , + agent_alias =args.agent_name , + description ="" +) + +headers = { + 'Accept':'application/xml', + 'Content-Type': 'application/xml', +} + +req = { + "urlxml": args.url +} +try: + result = requests.get(req["urlxml"], verify=False, headers=headers, auth=HTTPBasicAuth(args.u, args.p)) + tree = ElementTree.fromstring(result.content) + +except Exception as e : + print('0') + sys.exit("\nError requesting %s, please check conectivity" %(req["urlxml"],)) + + + +dicc_gauge= {} +dicc_feature={} +dicc_counter={} +dicc_rate={} + +for element in tree: + for atributo in element: + if atributo.tag=='gauge': + dicc_gauge[atributo.tag+"_"+atributo.attrib['name']] = atributo.attrib['current'] + elif atributo.tag=='feature': + dicc_feature[atributo.tag+"_"+atributo.attrib['name']] = atributo.attrib['time_remaining'] + elif atributo.tag=='counter': + dicc_counter[atributo.tag+"_"+atributo.attrib['name']+"_reset"] = atributo.attrib['reset'] + dicc_counter[atributo.tag+"_"+atributo.attrib['name']+"_uptime"] = atributo.attrib['uptime'] + dicc_counter[atributo.tag+"_"+atributo.attrib['name']+"_lifetime"] = atributo.attrib['lifetime'] + elif atributo.tag=='rate': + dicc_rate[atributo.tag+"_"+atributo.attrib['name']+"_last_1_min"] = atributo.attrib['last_1_min'] + dicc_rate[atributo.tag+"_"+atributo.attrib['name']+"_last_5_min"] = atributo.attrib['last_5_min'] + dicc_rate[atributo.tag+"_"+atributo.attrib['name']+"_last_15_min"] = atributo.attrib['last_15_min'] + + +for key,value in dicc_gauge.items(): + clean_module() + modulo.update( + name = key, + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + +for key,value in dicc_feature.items(): + clean_module() + modulo.update( + name = key, + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + +for key,value in dicc_counter.items(): + clean_module() + modulo.update( + name = key, + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + +for key,value in dicc_rate.items(): + clean_module() + modulo.update( + name = key, + type = "generic_data", + desc = "", + value = value + ) + modules.append(modulo) + +if args.tentacle_address is not None: + tentacle_conf={"address":args.tentacle_address,"port":args.tentacle_port} + agentplugin(modules,agent,"agent",config["data_in"],True,tentacle_conf) +elif args.as_agent_plugin!=1: + agentplugin(modules,agent,"agent",config["data_in"]) +else: + agentplugin(modules,agent) diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control index c782d78f0e..20b3077097 100644 --- a/pandora_server/DEBIAN/control +++ b/pandora_server/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-server -Version: 7.0NG.763-220712 +Version: 7.0NG.763-220802 Architecture: all Priority: optional Section: admin diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh index 8b55597a2a..c2aecea877 100644 --- a/pandora_server/DEBIAN/make_deb_package.sh +++ b/pandora_server/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.763-220712" +pandora_version="7.0NG.763-220802" package_cpan=0 package_pandora=1 diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index 14ae4914db..ce091872e2 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -139,9 +139,12 @@ sub pandora_startup () { # Start the policy queue thread. start_server_thread(\&pandora_process_policy_queue, [\%Config]) if ($Config{'__enterprise_enabled'} == 1 && $Config{'policy_manager'} == 1); - + + # Start agent autoconfiguration thread. + start_server_thread(\&pandora_agent_autoconfiguration_scheduled, [\%Config]) if ($Config{'__enterprise_enabled'} == 1 && $Config{'autoconfigure_agents'} == 1); + pandora_audit (\%Config, $Config{'rb_product_name'} . ' Server Daemon starting', 'SYSTEM', 'System', $DBH); - + # Load servers if (!is_metaconsole(\%Config)) { pandora_reset_server (\%Config, $DBH); @@ -308,6 +311,67 @@ sub pandora_stop_netflow_daemon () { return 0; } +sub pandora_agent_autoconfiguration_scheduled($) { + my $pa_config = shift; + + my %pa_config = %{$pa_config}; + + my $dbh = db_connect ($pa_config{'dbengine'}, $pa_config{'dbname'}, $pa_config{'dbhost'}, $pa_config{'dbport'}, + $pa_config{'dbuser'}, $pa_config{'dbpass'}); + + while ($THRRUN == 1) { + eval {{ + local $SIG{__DIE__}; + + my @autoconfig = get_db_rows ( + $dbh, + 'SELECT *, DATE_FORMAT(DATE_ADD(periodically_time_from, INTERVAL ' . $pa_config->{'autoconfigure_agents_threshold'} . ' SECOND), "%H:%i:%S") AS time_minutes + FROM tautoconfig WHERE executed = 0 AND type_execution LIKE "scheduled" AND disabled = 0' + ); + + # Get current time. + my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time()); + my $time = sprintf ("%.2d:%.2d:%.2d", $hour, $min, $sec); + + foreach my $conf (@autoconfig) { + if (($conf->{'type_periodicity'} eq 'daily') || + ($conf->{'type_periodicity'} eq 'monthly' && $conf->{'periodically_day_from'} eq $mday) || + ($conf->{'type_periodicity'} eq 'weekly' && (($conf->{'sunday'} eq 1 && $wday eq 0) || + ($conf->{'monday'} eq 1 && $wday eq 1) || ($conf->{'tuesday'} eq 1 && $wday eq 2) || + ($conf->{'wednesday'} eq 1 && $wday eq 3) || ($conf->{'thursday'} eq 1 && $wday eq 4) || + ($conf->{'friday'} eq 1 && $wday eq 5) || ($conf->{'saturday'} eq 1 && $wday eq 6))) + ) { + if ($time ge $conf->{'periodically_time_from'} && $time le $conf->{'time_minutes'}) { + # Update executed. + db_process_update ($dbh, 'tautoconfig', {'executed' => 1}, {'id' => $conf->{'id'}}); + # Get agents. + my @agents = get_db_rows( + $dbh, + 'SELECT id_agente, alias, id_grupo, id_os, os_version, direccion, nombre AS agent_name FROM tagente + WHERE `disabled` = 0' + ); + + foreach my $agent (@agents) { + # Check if the agent matches the rules. + my $match = enterprise_hook('autoconf_evaluate_rules', [$pa_config, $dbh, $agent, $conf->{'id'}, $agent->{'id_agente'}, 1]); + if (defined($match) && $match > 0) { + enterprise_hook('autoconf_execute_actions', [$pa_config, $dbh, $agent->{'id_agente'}, $agent, $conf->{'id'}]); + } + } + + # Update executed. + db_process_update ($dbh, 'tautoconfig', {'executed' => 0}, {'id' => $conf->{'id'}}); + } + } + } + }}; + + sleep ($pa_config->{'autoconfigure_agents_threshold'}); + } + + db_disconnect($dbh); +} + ######################################################################################## # Additional tasks executed periodically by the Pandora FMS Server ######################################################################################## diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index b9a92b9699..0b896b272f 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -46,7 +46,7 @@ our @EXPORT = qw( # version: Defines actual version of Pandora Server for this module only my $pandora_version = "7.0NG.763"; -my $pandora_build = "220712"; +my $pandora_build = "220802"; our $VERSION = $pandora_version." ".$pandora_build; # Setup hash @@ -539,6 +539,7 @@ sub pandora_load_config { $pa_config->{"provisioning_cache_interval"} = 300; # 7.0 720 $pa_config->{"autoconfigure_agents"} = 1; # 7.0 725 + $pa_config->{"autoconfigure_agents_threshold"} = 300; #7.0 764 $pa_config->{'snmp_extlog'} = ""; # 7.0 726 @@ -1265,6 +1266,9 @@ sub pandora_load_config { elsif ($parametro =~ m/^autoconfigure_agents\s+([0-1])/i){ $pa_config->{'autoconfigure_agents'}= clean_blank($1); } + elsif ($parametro =~ m/^autoconfigure_agents_threshold\s+([0-1])/i){ + $pa_config->{'autoconfigure_agents_threshold'}= clean_blank($1); + } elsif ($parametro =~ m/^snmp_extlog\s(.*)/i) { $pa_config->{'snmp_extlog'} = clean_blank($1); } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index f1419da6db..16c0ecb0ba 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -573,7 +573,7 @@ sub pandora_evaluate_alert ($$$$$$$;$$$$) { if ($timeBlock->{'start'} eq $timeBlock->{'end'}) { # All day. $inSlot = 1; - } elsif ($timeBlock->{'start'} le $time && $timeBlock->{'end'} ge $time) { + } elsif ($timeBlock->{'start'} le $time && (($timeBlock->{'end'} eq '00:00:00') || ($timeBlock->{'end'} ge $time))) { # In range. $inSlot = 1; } diff --git a/pandora_server/lib/PandoraFMS/PluginTools.pm b/pandora_server/lib/PandoraFMS/PluginTools.pm index 0b24dd2b6e..56367013be 100644 --- a/pandora_server/lib/PandoraFMS/PluginTools.pm +++ b/pandora_server/lib/PandoraFMS/PluginTools.pm @@ -34,7 +34,7 @@ our @ISA = qw(Exporter); # version: Defines actual version of Pandora Server for this module only my $pandora_version = "7.0NG.763"; -my $pandora_build = "220712"; +my $pandora_build = "220802"; our $VERSION = $pandora_version." ".$pandora_build; our %EXPORT_TAGS = ( 'all' => [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 7d1583d591..198e358d2c 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.763 -%define release 220712 +%define release 220802 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 464df38586..00b27bfbac 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.763 -%define release 220712 +%define release 220802 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index cdac4f4da0..3339c3adc3 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.763" -PI_BUILD="220712" +PI_BUILD="220802" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ef4509e7d0..c408718bbd 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.763 Build 220712"; +my $version = "7.0NG.763 Build 220802"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0ed23d8fc4..1f2cd46893 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.763 Build 220712"; +my $version = "7.0NG.763 Build 220802"; # save program name for logging my $progname = basename($0);