From dccd950e9ed6247e5b60258a0a3a7addea463e64 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Wed, 30 Nov 2022 10:14:42 +0100 Subject: [PATCH] Changes --- .../extensions/files_repo/files_repo_list.php | 2 +- .../godmode/agentes/agent_template.php | 2 +- .../godmode/agentes/configurar_agente.php | 862 ++++++++---------- .../godmode/agentes/fields_manager.php | 2 +- .../godmode/agentes/modificar_agente.php | 2 +- .../godmode/agentes/module_manager.php | 83 +- .../godmode/agentes/module_manager_editor.php | 90 +- .../agentes/module_manager_editor_common.php | 754 +++++++-------- .../godmode/alerts/alert_actions.php | 4 +- .../godmode/alerts/alert_commands.php | 2 +- .../godmode/alerts/alert_list.list.php | 4 +- .../godmode/alerts/alert_templates.php | 2 +- pandora_console/godmode/category/category.php | 2 +- .../godmode/events/event_filter.php | 2 +- .../godmode/events/event_responses.list.php | 2 +- pandora_console/godmode/extensions.php | 2 +- pandora_console/godmode/groups/group_list.php | 2 +- .../godmode/groups/modu_group_list.php | 2 +- .../godmode/modules/manage_nc_groups.php | 2 +- .../modules/manage_network_components.php | 2 +- .../modules/manage_network_templates.php | 2 +- pandora_console/godmode/netflow/nf_edit.php | 2 +- pandora_console/godmode/reporting/graphs.php | 2 +- .../godmode/reporting/map_builder.php | 4 +- .../reporting_builder.list_items.php | 2 +- .../godmode/reporting/reporting_builder.php | 2 +- .../godmode/servers/modificar_server.php | 97 +- .../godmode/servers/servers.build_table.php | 2 +- pandora_console/godmode/setup/gis.php | 2 +- pandora_console/godmode/setup/links.php | 2 +- pandora_console/godmode/setup/news.php | 2 +- pandora_console/godmode/setup/os.list.php | 2 +- .../godmode/snmpconsole/snmp_filters.php | 2 +- pandora_console/godmode/tag/tag.php | 2 +- .../godmode/users/profile_list.php | 2 +- pandora_console/godmode/users/user_list.php | 2 +- .../wizards/DiscoveryTaskList.class.php | 2 +- .../images/svg/Iconset_7_11_22.zip | Bin 110340 -> 0 bytes .../include/class/AuditLog.class.php | 4 +- .../include/class/ConfigPEN.class.php | 2 +- .../include/class/CredentialStore.class.php | 2 +- .../include/class/ModuleTemplates.class.php | 2 +- pandora_console/include/functions_agents.php | 14 + pandora_console/include/functions_html.php | 34 +- pandora_console/include/functions_ui.php | 2 +- .../lib/Dashboard/Widgets/events_list.php | 2 +- pandora_console/include/styles/pandora.css | 86 +- .../include/styles/pandora_black.css | 4 +- pandora_console/include/styles/tables.css | 66 +- pandora_console/index.php | 1 - .../operation/agentes/pandora_networkmap.php | 6 +- .../operation/agentes/status_monitor.php | 2 +- pandora_console/operation/events/events.php | 4 +- .../operation/gis_maps/gis_map.php | 2 +- .../incidents/list_integriaims_incidents.php | 2 +- .../operation/messages/message_list.php | 2 +- pandora_console/pandoradb_data.sql | 40 +- pandora_console/views/calendar/list.php | 2 +- pandora_console/views/dashboard/list.php | 6 +- 59 files changed, 1135 insertions(+), 1106 deletions(-) delete mode 100644 pandora_console/images/svg/Iconset_7_11_22.zip diff --git a/pandora_console/extensions/files_repo/files_repo_list.php b/pandora_console/extensions/files_repo/files_repo_list.php index 783e155dc4..6c75218d18 100644 --- a/pandora_console/extensions/files_repo/files_repo_list.php +++ b/pandora_console/extensions/files_repo/files_repo_list.php @@ -98,7 +98,7 @@ if (!empty($files)) { // Last modification // Public URL $data[4] = ''; - $table->cellclass[][4] = 'action_buttons'; + $table->cellclass[][4] = 'table_action_buttons'; if (!empty($file['hash'])) { $public_url = ui_get_full_url( EXTENSIONS_DIR.'/files_repo/files_repo_get_file.php?file='.$file['hash'] diff --git a/pandora_console/godmode/agentes/agent_template.php b/pandora_console/godmode/agentes/agent_template.php index b4313aee88..64ef76af2b 100644 --- a/pandora_console/godmode/agentes/agent_template.php +++ b/pandora_console/godmode/agentes/agent_template.php @@ -269,7 +269,7 @@ foreach ($result as $row) { $data[2] = mb_substr($row['descripcion'], 0, 60); - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter', 'border' => '0', 'alt' => __('Delete'), 'onclick' => "if (!confirm('".__('Are you sure?')."')) return false;"]).''; $data[3] .= ''.html_print_image('images/config.png', true, ['class' => 'invert_filter', 'border' => '0', 'alt' => __('Update')]).''; diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 70df1cb88e..d072bbc02c 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -42,24 +42,184 @@ use PandoraFMS\Event; check_login(); -// Get tab parameter to check ACL in each tabs. -$tab = get_parameter('tab', 'main'); +$tab = (string) get_parameter('tab', 'main'); +$id_agente = (int) get_parameter('id_agente'); +$agentAddress = (string) get_parameter('direccion'); +$alias = (string) get_parameter('alias'); +$alias_as_name = (int) get_parameter_post('alias_as_name'); +$direccion_agente = (string) get_parameter_post('direccion'); +$unique_ip = (int) get_parameter_post('unique_ip'); +// $alerttype = get_parameter('alerttype'); UNUSED. +$id_module = (int) get_parameter('id_module'); +$id_agent_module = (int) get_parameter('id_agent_module'); +$intervalo = (string) get_parameter_post('intervalo', SECONDS_5MINUTES); +$comentarios = (string) get_parameter_post('comentarios'); +$modo = (int) get_parameter_post('modo'); +$id_parent = (int) get_parameter_post('id_agent_parent'); +$server_name = (string) get_parameter_post('server_name'); +$id_os = (int) get_parameter_post('id_os'); +$disabled = (int) get_parameter_post('disabled'); +$custom_id = (string) get_parameter_post('custom_id'); +$cascade_protection = (int) get_parameter_post('cascade_protection'); +$cascade_protection_module = (int) get_parameter_post('cascade_protection_module'); +$safe_mode = (int) get_parameter_post('safe_mode'); +$safe_mode_module = (int) get_parameter_post('safe_mode_module'); +$icon_path = (string) get_parameter_post('icon_path'); +$update_gis_data = (int) get_parameter_post('update_gis_data'); +$url_description = (string) get_parameter('url_description'); +$quiet = (int) get_parameter('quiet'); +$cps = (int) get_parameter_switch('cps', -1); +$fixed_ip = (int) get_parameter_switch('fixed_ip'); +$secondary_groups = (string) get_parameter('secondary_hidden'); +$grupo = (int) get_parameter_post('grupo'); +$id_extension = get_parameter('id_extension'); +$type_module_t = get_parameter('moduletype'); +$wizardSection = (string) get_parameter('wizard_section'); +$fix_module = get_parameter_get('fix_module', 0); +$address_list = (string) get_parameter_post('address_list'); +$agentName = (string) get_parameter_post('agente'); +$disabled = (bool) get_parameter_post('disabled'); +$satellite_server = (int) get_parameter('satellite_server', 0); +$max_timeout = (int) get_parameter('max_timeout'); +$max_retries = (int) get_parameter('max_retries'); +$min = (int) get_parameter('min'); +$max = (int) get_parameter('max'); +$interval = (int) get_parameter('module_interval', $intervalo); +$ff_interval = (int) get_parameter('module_ff_interval'); +$quiet_module = (int) get_parameter('quiet_module'); +$cps_module = (int) get_parameter('cps_module'); +$id_plugin = (int) get_parameter('id_plugin'); +$id_export = (int) get_parameter('id_export'); +$disabled = (bool) get_parameter('disabled'); +$tcp_send = (string) get_parameter('tcp_send'); +$tcp_rcv = (string) get_parameter('tcp_rcv'); +$tcp_port = (int) get_parameter('tcp_port'); +$delete_ip = (string) get_parameter_post('address_list'); +// Correction in order to not insert 0 as port. +$is_port_empty = (string) get_parameter('tcp_port'); +$prediction_module = (int) get_parameter('prediction_module'); -// See if id_agente is set (either POST or GET, otherwise -1. -$id_agente = (int) get_parameter('id_agente'); +$id_module_type = (int) get_parameter('id_module_type'); +$name = (string) get_parameter('name'); +$description = (string) get_parameter('description'); +$id_module_group = (int) get_parameter('id_module_group'); +$flag = (bool) get_parameter('flag'); +$post_process = (string) get_parameter('post_process', 0.0); +$configuration_data = (string) get_parameter('configuration_data'); +$old_configuration_data = (string) get_parameter('old_configuration_data'); +$custom_string_1 = (string) get_parameter('custom_string_1'); +$custom_string_2 = (string) get_parameter('custom_string_2'); +$custom_string_3 = (string) get_parameter('custom_string_3'); +$custom_integer_1 = (int) get_parameter('custom_integer_1'); +$custom_integer_2 = (int) get_parameter('custom_integer_2'); +$custom_id = (string) get_parameter('custom_id'); +$history_data = (int) get_parameter('history_data'); +$dynamic_interval = (int) get_parameter('dynamic_interval'); +$dynamic_max = (int) get_parameter('dynamic_max'); +$dynamic_min = (int) get_parameter('dynamic_min'); +$dynamic_two_tailed = (int) get_parameter('dynamic_two_tailed'); +$min_warning = (float) get_parameter('min_warning'); +$max_warning = (float) get_parameter('max_warning'); +$str_warning = (string) get_parameter('str_warning'); +$min_critical = (float) get_parameter('min_critical'); +$max_critical = (float) get_parameter('max_critical'); +$str_critical = (string) get_parameter('str_critical'); +$ff_event = (int) get_parameter('ff_event'); +$ff_event_normal = (int) get_parameter('ff_event_normal'); +$ff_event_warning = (int) get_parameter('ff_event_warning'); +$ff_event_critical = (int) get_parameter('ff_event_critical'); +$ff_type = (int) get_parameter('ff_type'); +$each_ff = (int) get_parameter('each_ff', $module['each_ff']); +$ff_timeout = (int) get_parameter('ff_timeout'); +$unit = (string) get_parameter('unit'); +$id_tag = (array) get_parameter('id_tag_selected'); +$serialize_ops = (string) get_parameter('serialize_ops'); +$critical_instructions = (string) get_parameter('critical_instructions'); +$warning_instructions = (string) get_parameter('warning_instructions'); +$unknown_instructions = (string) get_parameter('unknown_instructions'); +$critical_inverse = (int) get_parameter('critical_inverse'); +$warning_inverse = (int) get_parameter('warning_inverse'); +$percentage_critical = (int) get_parameter('percentage_critical'); +$percentage_warning = (int) get_parameter('percentage_warning'); +$combo_snmp_oid = (string) get_parameter_post('combo_snmp_oid'); +$id_category = (int) get_parameter('id_category'); +$hour_from = get_parameter('hour_from'); +$minute_from = get_parameter('minute_from'); +$mday_from = get_parameter('mday_from'); +$month_from = get_parameter('month_from'); +$wday_from = get_parameter('wday_from'); +$hour_to = get_parameter('hour_to'); +$minute_to = get_parameter('minute_to'); +$mday_to = get_parameter('mday_to'); +$month_to = get_parameter('month_to'); +$wday_to = get_parameter('wday_to'); +$http_user = get_parameter('http_user'); +$http_pass = get_parameter('http_pass'); +$snmp_community = (string) get_parameter('snmp_community'); +$snmp_oid = (string) get_parameter('snmp_oid'); +$select_snmp_oid = (string) get_parameter('select_snmp_oid'); +$tcp_send = (string) get_parameter('snmp_version'); +$plugin_user = (string) get_parameter('snmp3_auth_user'); +$snmp3_auth_pass = (string) get_parameter('snmp3_auth_pass'); +$snmp3_privacy_pass = (string) get_parameter('snmp3_privacy_pass'); +$snmp3_security_level = (string) get_parameter('snmp3_security_level'); +$snmp3_auth_method = (string) get_parameter('snmp3_auth_method'); +$custom_string_1 = (string) get_parameter('snmp3_privacy_method'); +$command_os = (string) get_parameter('command_os'); +$command_text = (string) get_parameter('command_text'); +$command_credential_identifier = (string) get_parameter('command_credential_identifier'); +$plugin_user = (string) get_parameter('plugin_user'); +$id_module_component_type = (int) get_parameter('id_module_component_type'); +$plugin_parameter = (string) get_parameter('plugin_parameter'); +$parent_module_id = (int) get_parameter('parent_module_id'); +$ip_target = (string) get_parameter('ip_target'); +$estimation_type = (string) get_parameter('estimation_type', 'estimation_calculation'); +$estimation_days = (int) get_parameter('estimation_days', -1); +$estimation_interval = (string) get_parameter('estimation_interval', '300'); +$active_snmp_v3 = get_parameter('active_snmp_v3'); +$throw_unknown_events = (bool) get_parameter('throw_unknown_events'); +$module_macro_names = (array) get_parameter('module_macro_names'); +$module_macro_values = (array) get_parameter('module_macro_values'); +$moduletype = (int) get_parameter('moduletype'); +$id_extension = (int) get_parameter('id_extension'); +$updateGisData = get_parameter('update_gis_data'); +$lastLatitude = get_parameter('latitude'); +$lastLongitude = get_parameter('longitude'); +$lastAltitude = get_parameter('altitude'); +$idAgente = get_parameter('id_agente'); +// Get macros. +$macros = (string) get_parameter('macros'); +$macros_names = (array) get_parameter('macro_name', []); +// Actions. +$pure = (bool) get_parameter('pure'); +$create_agent = (bool) get_parameter('create_agent'); +$update_agent = (bool) get_parameter('update_agent'); +$delete_conf_file = (bool) get_parameter('delete_conf_file'); +$action_delete_ip = (bool) get_parameter('delete_ip'); +$updateGIS = (bool) get_parameter('update_gis'); +$update_module = (bool) get_parameter('update_module'); +$create_module = (bool) get_parameter('create_module'); +$edit_module = (bool) get_parameter('edit_module'); +$delete_module = (bool) get_parameter('delete_module'); +$enable_module = (int) get_parameter('enable_module'); +$disable_module = (int) get_parameter('disable_module'); +// It is the id_agent_module to duplicate. +$duplicate_module = (int) get_parameter('duplicate_module'); + +// Variable definitions. $group = 0; $all_groups = [$group]; -if ($id_agente) { +if ($id_agente > 0) { $group = agents_get_agent_group($id_agente); $all_groups = agents_get_all_groups_agent($id_agente, $group); } -if (!check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { +if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === false) { $access_granted = false; switch ($tab) { case 'alert': case 'module': - if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AD')) { + if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AD') === true) { $access_granted = true; } break; @@ -69,7 +229,7 @@ if (!check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { break; } - if (!$access_granted) { + if ($access_granted === false) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access agent manager' @@ -83,22 +243,10 @@ require_once 'include/functions_modules.php'; require_once 'include/functions_alerts.php'; require_once 'include/functions_reporting.php'; -// Get passed variables. -$alerttype = get_parameter('alerttype'); -$id_agent_module = (int) get_parameter('id_agent_module'); - // Init vars. -$descripcion = ''; -$comentarios = ''; -$campo_1 = ''; -$campo_2 = ''; -$campo_3 = ''; -$maximo = 0; -$minimo = 0; $nombre_agente = ''; -$alias = get_parameter('alias', ''); $alias_as_name = 0; -$direccion_agente = get_parameter('direccion', ''); +$direccion_agente = $agentAddress; $direccion_agente = trim(io_safe_output($direccion_agente)); $direccion_agente = io_safe_input($direccion_agente); $unique_ip = 0; @@ -110,20 +258,6 @@ $id_server = ''; $max_alerts = 0; $modo = 1; $update_module = 0; -$modulo_id_agente = ''; -$modulo_id_tipo_modulo = ''; -$modulo_nombre = ''; -$modulo_descripcion = ''; -$alerta_id_aam = ''; -$alerta_campo1 = ''; -$alerta_campo2 = ''; -$alerta_campo3 = ''; -$alerta_dis_max = ''; -$alerta_dis_min = ''; -$alerta_min_alerts = 0; -$alerta_max_alerts = 1; -$alerta_time_threshold = ''; -$alerta_descripcion = ''; $disabled = ''; $id_parent = 0; $modulo_max = ''; @@ -174,31 +308,23 @@ $quiet = 0; $macros = ''; $cps = 0; $fixed_ip = 0; - -$create_agent = (bool) get_parameter('create_agent'); $module_macros = []; // Create agent. -if ($create_agent) { - $mssg_warning = 0; - $alias_safe_output = strip_tags(io_safe_output(get_parameter('alias', ''))); +if ($create_agent === true) { + $mssg_warning = false; + $alias_safe_output = strip_tags(io_safe_output($alias)); $alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output))); - $alias_as_name = (int) get_parameter_post('alias_as_name', 0); - $direccion_agente = (string) get_parameter_post('direccion', ''); - $unique_ip = (int) get_parameter_post('unique_ip', 0); - // Safe_output only validate ip. $direccion_agente = trim(io_safe_output($direccion_agente)); - if (!validate_address($direccion_agente)) { - $mssg_warning = 1; + if (validate_address($direccion_agente) === false) { + $mssg_warning = true; } // Safe-input before validate ip. $direccion_agente = io_safe_input($direccion_agente); - - $nombre_agente = hash('sha256', $alias.'|'.$direccion_agente.'|'.time().'|'.sprintf('%04d', rand(0, 10000))); - $grupo = (int) get_parameter_post('grupo'); + $nombre_agente = hash_agent_name($alias, $nombre_agente); if ((bool) check_acl($config['id_user'], $grupo, 'AW') === false) { db_pandora_audit( @@ -209,26 +335,6 @@ if ($create_agent) { return; } - $intervalo = (string) get_parameter_post('intervalo', SECONDS_5MINUTES); - $comentarios = (string) get_parameter_post('comentarios', ''); - $modo = (int) get_parameter_post('modo'); - $id_parent = (int) get_parameter_post('id_agent_parent'); - $server_name = (string) get_parameter_post('server_name'); - $id_os = (int) get_parameter_post('id_os'); - $disabled = (int) get_parameter_post('disabled'); - $custom_id = (string) get_parameter_post('custom_id', ''); - $cascade_protection = (int) get_parameter_post('cascade_protection', 0); - $cascade_protection_module = (int) get_parameter_post('cascade_protection_module', 0); - $safe_mode = (int) get_parameter_post('safe_mode', 0); - $safe_mode_module = (int) get_parameter_post('safe_mode_module', 0); - $icon_path = (string) get_parameter_post('icon_path', ''); - $update_gis_data = (int) get_parameter_post('update_gis_data', 0); - $url_description = (string) get_parameter('url_description'); - $quiet = (int) get_parameter('quiet', 0); - $cps = (int) get_parameter_switch('cps', -1); - $fixed_ip = (int) get_parameter_switch('fixed_ip', 0); - - $secondary_groups = (string) get_parameter('secondary_hidden', ''); $fields = db_get_all_fields_in_table('tagent_custom_fields'); if ($fields === false) { @@ -242,14 +348,14 @@ if ($create_agent) { } // Check if agent exists (BUG WC-50518-2). - if ($alias == '') { + if (empty($alias) === true) { $agent_creation_error = __('No agent alias specified'); $agent_created_ok = 0; } else if (group_allow_more_agents($grupo, true, 'create') === false) { $agent_creation_error = __('Agent cannot be created due to the maximum agent limit for this group'); $agent_created_ok = 0; } else { - if ($alias_as_name) { + if ((bool) $alias_as_name === true) { $sql = 'SELECT nombre FROM tagente WHERE nombre = "'.$alias.'"'; $exists_alias = db_get_row_sql($sql); $nombre_agente = $alias; @@ -443,12 +549,7 @@ if ($id_agente) { ] ).''; - if ($tab == 'template') { - $templatetab['active'] = true; - } else { - $templatetab['active'] = false; - } - + $templatetab['active'] = ($tab === 'template'); // Inventory. $inventorytab = enterprise_hook('inventory_tab'); @@ -491,35 +592,42 @@ if ($id_agente) { } // Group tab. - $grouptab['text'] = ''.html_print_image( - 'images/group.png', - true, + $grouptab['text'] = html_print_anchor( [ - 'title' => __('Group'), - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&ag_group='.$group, + 'content' => html_print_image( + 'images/group.png', + true, + [ + 'title' => __('Group'), + 'class' => 'invert_filter', + ] + ), + ], + true + ); $grouptab['active'] = false; $gistab = []; - // GIS tab. - if ($config['activate_gis']) { - $gistab['text'] = ''.html_print_image( - 'images/gm_gis.png', - true, + if ((bool) $config['activate_gis'] === true) { + $gistab['text'] = html_print_anchor( [ - 'title' => __('GIS data'), - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=gis&id_agente='.$id_agente, + 'content' => html_print_image( + 'images/gm_gis.png', + true, + [ + 'title' => __('GIS data'), + 'class' => 'invert_filter', + ] + ), + ], + true + ); - if ($tab == 'gis') { - $gistab['active'] = true; - } else { - $gistab['active'] = false; - } + $gistab['active'] = ($tab === 'gis'); } // Agent wizard tab. @@ -565,89 +673,71 @@ if ($id_agente) { ).''; $agent_wizard['sub_menu'] .= ''; $agent_wizard['sub_menu'] .= ''; - - - if ($tab == 'agent_wizard') { - $agent_wizard['active'] = true; - } else { - $agent_wizard['active'] = false; - } - + $agent_wizard['active'] = ($tab === 'agent_wizard'); $total_incidents = agents_get_count_incidents($id_agente); // Incident tab. if ($total_incidents > 0) { - $incidenttab['text'] = ''.html_print_image( - 'images/book_edit.png', - true, + $incidenttab['text'] = html_print_anchor( [ - 'title' => __('Incidents'), - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=incident&id_agente='.$id_agente, + 'content' => html_print_image( + 'images/book_edit.png', + true, + [ + 'title' => __('Incidents'), + 'class' => 'invert_filter', + ] + ), + ], + true + ); - if ($tab == 'incident') { - $incidenttab['active'] = true; - } else { - $incidenttab['active'] = false; - } + $incidenttab['active'] = ($tab === 'incident'); } - if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { - if ($has_remote_conf) { + if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) { + $onheader = [ + 'view' => $viewtab, + 'separator' => '', + 'main' => $maintab, + 'module' => $moduletab, + 'ncm' => $ncm_tab, + 'alert' => $alerttab, + 'template' => $templatetab, + 'inventory' => $inventorytab, + 'pluginstab' => $pluginstab, + 'collection' => $collectiontab, + 'group' => $grouptab, + 'gis' => $gistab, + 'agent_wizard' => $agent_wizard, + + ]; + + if ((bool) $has_remote_conf === true) { $agent_name = agents_get_name($id_agente); $agent_name = io_safe_output($agent_name); $agent_md5 = md5($agent_name, false); - $remote_configuration_tab['text'] = ''.html_print_image( - 'images/remote_configuration.png', - true, + $remote_configuration_tab['text'] = html_print_anchor( [ - 'title' => __('Remote configuration'), - 'class' => 'invert_filter', - ] - ).''; - if ($tab == 'remote_configuration') { - $remote_configuration_tab['active'] = true; - } else { - $remote_configuration_tab['active'] = false; - } + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=remote_configuration&id_agente='.$id_agente.'&disk_conf='.$agent_md5, + 'content' => html_print_image( + 'images/remote_configuration.png', + true, + [ + 'title' => __('Remote configuration'), + 'class' => 'invert_filter', + ] + ), + ], + true + ); + $remote_configuration_tab['active'] = ($tab === 'remote_configuration'); - $onheader = [ - 'view' => $viewtab, - 'separator' => '', - 'main' => $maintab, - 'remote_configuration' => $remote_configuration_tab, - 'module' => $moduletab, - 'ncm' => $ncm_tab, - 'alert' => $alerttab, - 'template' => $templatetab, - 'inventory' => $inventorytab, - 'pluginstab' => $pluginstab, - 'collection' => $collectiontab, - 'group' => $grouptab, - 'gis' => $gistab, - 'agent_wizard' => $agent_wizard, - ]; - } else { - $onheader = [ - 'view' => $viewtab, - 'separator' => '', - 'main' => $maintab, - 'module' => $moduletab, - 'ncm' => $ncm_tab, - 'alert' => $alerttab, - 'template' => $templatetab, - 'inventory' => $inventorytab, - 'pluginstab' => $pluginstab, - 'collection' => $collectiontab, - 'group' => $grouptab, - 'gis' => $gistab, - 'agent_wizard' => $agent_wizard, - - ]; + $onheader[] = $remote_configuration_tab; } // Only if the agent has incidents associated show incidents tab. @@ -665,14 +755,12 @@ if ($id_agente) { // Extensions tabs. foreach ($config['extensions'] as $extension) { - if (isset($extension['extension_god_tab'])) { + if (isset($extension['extension_god_tab']) === true) { if (check_acl($config['id_user'], $group, $extension['extension_god_tab']['acl'])) { $image = $extension['extension_god_tab']['icon']; $name = $extension['extension_god_tab']['name']; $id = $extension['extension_god_tab']['id']; - $id_extension = get_parameter('id_extension', ''); - if ($id_extension == $id) { $active = true; } else { @@ -719,7 +807,6 @@ if ($id_agente) { break; case 'module': - $type_module_t = get_parameter('moduletype', ''); $tab_name = __('Modules'); if ($type_module_t === 'webux') { $help_header = 'wux_console'; @@ -751,7 +838,7 @@ if ($id_agente) { break; case 'agent_wizard': - switch (get_parameter('wizard_section')) { + switch ($wizardSection) { case 'snmp_explorer': $help_header = 'agent_snmp_explorer_tab'; $tab_name = __('SNMP Wizard'); @@ -774,7 +861,6 @@ if ($id_agente) { break; case 'extension': - $id_extension = get_parameter('id_extension', ''); switch ($id_extension) { case 'snmp_explorer': $tab_description = '- '.__('SNMP explorer'); @@ -792,14 +878,12 @@ if ($id_agente) { break; } - $helper = ($help_header === 'main_tab') ? 'main_tab' : ''; - $pure = get_parameter('pure', 0); - if (!$pure) { + if ($pure === false) { ui_print_standard_header( agents_get_alias($id_agente), 'images/agent.png', false, - $helper, + ($help_header === 'main_tab') ? $help_header : '', false, $onheader, [ @@ -839,9 +923,7 @@ if ($id_agente) { ); } -$delete_conf_file = (bool) get_parameter('delete_conf_file'); - -if ($delete_conf_file) { +if ($delete_conf_file === true) { $correct = false; // Delete remote configuration. if (isset($config['remote_config'])) { @@ -865,8 +947,8 @@ if ($delete_conf_file) { } // Show agent creation results. -if ($create_agent) { - if (!isset($agent_creation_error)) { +if ($create_agent === true) { + if (isset($agent_creation_error) === false) { $agent_creation_error = __('Could not be created'); } @@ -876,14 +958,13 @@ if ($create_agent) { $agent_creation_error ); - if ($mssg_warning) { + if ($mssg_warning === true) { ui_print_warning_message(__('The ip or dns name entered cannot be resolved')); } } // Fix / Normalize module data. -if (isset($_GET['fix_module'])) { - $id_module = get_parameter_get('fix_module', 0); +if (isset($_GET['fix_module']) === true) { // Get info about this module. $media = reporting_get_agentmodule_data_average($id_module, 30758400); // Get average over the year. @@ -892,7 +973,7 @@ if (isset($_GET['fix_module'])) { $result = true; // If the value of media is 0 or something went wrong, don't delete. - if (!empty($media)) { + if (empty($media) === false) { $where = [ 'datos' => '>'.$media, 'id_agente_modulo' => $id_module, @@ -918,31 +999,23 @@ if (isset($_GET['fix_module'])) { ); } -$update_agent = (bool) get_parameter('update_agent'); - // Update AGENT. -if ($update_agent) { +if ($update_agent === true) { // If modified some agent paramenter. - $mssg_warning = 0; - $id_agente = (int) get_parameter_post('id_agente'); - $nombre_agente = str_replace('`', '‘', (string) get_parameter_post('agente', '')); - $alias_safe_output = strip_tags(io_safe_output(get_parameter('alias', ''))); + $mssg_warning = false; + $nombre_agente = str_replace('`', '‘', $agentName); + $alias_safe_output = strip_tags(io_safe_output($alias)); $alias = io_safe_input(trim(preg_replace('/[\/\\\|%#&$]/', '', $alias_safe_output))); - $alias_as_name = (int) get_parameter_post('alias_as_name', 0); - $direccion_agente = (string) get_parameter_post('direccion', ''); - $unique_ip = (int) get_parameter_post('unique_ip', 0); // Safe_output only validate ip. $direccion_agente = trim(io_safe_output($direccion_agente)); - if (!validate_address($direccion_agente)) { - $mssg_warning = 1; + if (validate_address($direccion_agente) === false) { + $mssg_warning = true; } // Safe-input before validate ip. $direccion_agente = io_safe_input($direccion_agente); - $address_list = (string) get_parameter_post('address_list', ''); - if ($address_list != $direccion_agente && $direccion_agente == agents_get_address($id_agente) && $address_list != agents_get_address($id_agente) @@ -954,34 +1027,14 @@ if ($update_agent) { * c) selectbox is not the current IP. */ - if (!empty($address_list)) { + if (empty($address_list) === false) { $direccion_agente = $address_list; } } - $grupo = (int) get_parameter_post('grupo', 0); - $intervalo = (int) get_parameter_post('intervalo', SECONDS_5MINUTES); - $comentarios = str_replace('`', '‘', (string) get_parameter_post('comentarios', '')); - $modo = (int) get_parameter_post('modo', 0); - // Mode: Learning, Normal or Autodisabled. - $id_os = (int) get_parameter_post('id_os'); - $disabled = (bool) get_parameter_post('disabled'); - $server_name = (string) get_parameter_post('server_name', ''); - $id_parent = (int) get_parameter_post('id_agent_parent'); - $custom_id = (string) get_parameter_post('custom_id', ''); - $cascade_protection = (int) get_parameter_post('cascade_protection', 0); - $cascade_protection_module = (int) get_parameter('cascade_protection_module', 0); - $safe_mode_module = (int) get_parameter('safe_mode_module', 0); - $icon_path = (string) get_parameter_post('icon_path', ''); - $update_gis_data = (int) get_parameter_post('update_gis_data', 0); - $url_description = (string) get_parameter('url_description'); - $quiet = (int) get_parameter('quiet', 0); - $cps = get_parameter_switch('cps', -1); + $comentarios = str_replace('`', '‘', $comentarios); $old_values = db_get_row('tagente', 'id_agente', $id_agente); $fields = db_get_all_fields_in_table('tagent_custom_fields'); - $secondary_groups = (string) get_parameter('secondary_hidden', ''); - $satellite_server = (int) get_parameter('satellite_server', 0); - $fixed_ip = (int) get_parameter_switch('fixed_ip', 0); if ($fields === false) { $fields = []; @@ -1028,12 +1081,12 @@ if ($update_agent) { } } - if ($mssg_warning) { + if ($mssg_warning === true) { ui_print_warning_message(__('The ip or dns name entered cannot be resolved')); } // Verify if there is another agent with the same name but different ID. - if ($alias == '') { + if (empty($alias) === true) { ui_print_error_message(__('No agent alias specified')); // If there is an agent with the same name, but a different ID. } @@ -1052,16 +1105,14 @@ if ($update_agent) { ui_print_error_message(__('Duplicate main IP address')); } else { // If different IP is specified than previous, add the IP. - if ($direccion_agente != '' + if (empty($direccion_agente) === false && $direccion_agente != agents_get_address($id_agente) ) { agents_add_address($id_agente, $direccion_agente); } - $action_delete_ip = (bool) get_parameter('delete_ip', false); // If IP is set for deletion, delete first. - if ($action_delete_ip) { - $delete_ip = get_parameter_post('address_list'); + if ($action_delete_ip === true) { if (empty($direccion_agente) === true) { $direccion_agente = agents_delete_address($id_agente, $delete_ip, true); } else { @@ -1194,7 +1245,7 @@ if ($id_agente) { } $agent = db_get_row('tagente', 'id_agente', $id_agente, false, false); - if (empty($agent)) { + if (empty($agent) === true) { // Close out the page. ui_print_error_message(__('There was a problem loading the agent')); return; @@ -1203,9 +1254,9 @@ if ($id_agente) { $intervalo = $agent['intervalo']; // Define interval in seconds. $nombre_agente = $agent['nombre']; - if (empty($alias)) { + if (empty($alias) === true) { $alias = $agent['alias']; - if (empty($alias)) { + if (empty($alias) === true) { $alias = $nombre_agente; } } @@ -1234,15 +1285,6 @@ if ($id_agente) { $fixed_ip = (int) $agent['fixed_ip']; } -$update_module = (bool) get_parameter('update_module'); -$create_module = (bool) get_parameter('create_module'); -$delete_module = (bool) get_parameter('delete_module'); -$enable_module = (int) get_parameter('enable_module'); -$disable_module = (int) get_parameter('disable_module'); -// It is the id_agent_module to duplicate. -$duplicate_module = (int) get_parameter('duplicate_module'); -$edit_module = (bool) get_parameter('edit_module'); - // GET DATA for MODULE UPDATE OR MODULE INSERT. if ($update_module || $create_module) { $id_grupo = agents_get_agent_group($id_agente); @@ -1257,56 +1299,23 @@ if ($update_module || $create_module) { exit; } - $id_agent_module = (int) get_parameter('id_agent_module'); - $id_module_type = (int) get_parameter('id_module_type'); - $name = (string) get_parameter('name'); - $description = (string) get_parameter('description'); - $id_module_group = (int) get_parameter('id_module_group'); - $flag = (bool) get_parameter('flag'); - /* * Don't read as (float) because it lost it's decimals when put into MySQL * where are very big and PHP uses scientific notation, p.e: * 1.23E-10 is 0.000000000123. */ - $post_process = (string) get_parameter('post_process', 0.0); - if (get_parameter('prediction_module')) { - $prediction_module = 1; - } else { - $prediction_module = 0; - } - - $max_timeout = (int) get_parameter('max_timeout'); - $max_retries = (int) get_parameter('max_retries'); - $min = (int) get_parameter('min'); - $max = (int) get_parameter('max'); - $interval = (int) get_parameter('module_interval', $intervalo); - $ff_interval = (int) get_parameter('module_ff_interval'); - $quiet_module = (int) get_parameter('quiet_module'); - $cps_module = (int) get_parameter('cps_module'); - $id_plugin = (int) get_parameter('id_plugin'); - $id_export = (int) get_parameter('id_export'); - $disabled = (bool) get_parameter('disabled'); - $tcp_send = (string) get_parameter('tcp_send'); - $tcp_rcv = (string) get_parameter('tcp_rcv'); - $tcp_port = (int) get_parameter('tcp_port'); - // Correction in order to not insert 0 as port. - $is_port_empty = get_parameter('tcp_port', ''); - if ($is_port_empty === '') { + if (empty($is_port_empty) === true) { $tcp_port = null; } - $configuration_data = (string) get_parameter('configuration_data'); - $old_configuration_data = (string) get_parameter('old_configuration_data'); $new_configuration_data = ''; - $custom_string_1_default = ''; $custom_string_2_default = ''; $custom_string_3_default = ''; $custom_integer_1_default = 0; $custom_integer_2_default = 0; - if ($update_module) { + if ($update_module === true) { $module = modules_get_agentmodule($id_agent_module); $custom_string_1_default = $module['custom_string_1']; @@ -1318,33 +1327,26 @@ if ($update_module || $create_module) { if ($id_module_type === 25) { // Web analysis, from MODULE_WUX. - $custom_string_1 = base64_encode((string) get_parameter('custom_string_1')); + $custom_string_1 = base64_encode($custom_string_1); // If the custom_string_1 parameter come empty, set the content // of the module (it is base64_encoded). if (empty($custom_string_1) === true) { $custom_string_1 = $custom_string_1_default; } - - $custom_integer_1 = (int) get_parameter('custom_integer_1', $custom_integer_1_default); - } else { - $custom_string_1 = (string) get_parameter('custom_string_1', $custom_string_1_default); - $custom_integer_1 = (int) get_parameter('prediction_module', $custom_integer_1_default); } - $custom_string_2 = (string) get_parameter('custom_string_2', $custom_string_2_default); - $custom_string_3 = (string) get_parameter('custom_string_3', $custom_string_3_default); - $custom_integer_2 = (int) get_parameter('custom_integer_2', 0); - - // Get macros. - $macros = (string) get_parameter('macros'); - $macros_names = (array) get_parameter('macro_name', []); + $custom_string_1 = (empty($custom_string_1) === true) ? $custom_string_1_default : $custom_string_1; + $custom_string_2 = (empty($custom_string_2) === true) ? $custom_string_2_default : $custom_string_2; + $custom_string_3 = (empty($custom_string_3) === true) ? $custom_string_3_default : $custom_string_3; + $custom_integer_1 = ($custom_integer_1 === 0) ? $custom_integer_1_default : $custom_integer_1; + $custom_integer_2 = ($custom_integer_2 === 0) ? $custom_integer_2_default : $custom_integer_2; if (empty($macros) === false) { $macros = json_decode(base64_decode($macros), true); foreach ($macros as $k => $m) { $m_hide = '0'; - if (isset($m['hide'])) { + if (isset($m['hide']) === true) { $m_hide = $m['hide']; } @@ -1397,146 +1399,79 @@ if ($update_module || $create_module) { agents_get_name($id_agente) ); - $snmp_community = (string) get_parameter('snmp_community'); - $snmp_oid = (string) get_parameter('snmp_oid'); // Change double quotes by single. $snmp_oid = preg_replace('/"/', ''', $snmp_oid); if (empty($snmp_oid) === true) { // The user did not set any OID manually but did a SNMP walk. - $snmp_oid = (string) get_parameter('select_snmp_oid'); + $snmp_oid = $select_snmp_oid; } if ($id_module_type >= 15 && $id_module_type <= 18) { // New support for snmp v3. - $tcp_send = (string) get_parameter('snmp_version'); - $plugin_user = (string) get_parameter('snmp3_auth_user'); - $plugin_pass = io_input_password( - (string) get_parameter('snmp3_auth_pass') - ); - $plugin_parameter = (string) get_parameter('snmp3_auth_method'); - - $custom_string_1 = (string) get_parameter('snmp3_privacy_method'); - $custom_string_2 = io_input_password( - (string) get_parameter('snmp3_privacy_pass') - ); - $custom_string_3 = (string) get_parameter('snmp3_security_level'); + $plugin_pass = io_input_password($snmp3_auth_pass); + $custom_string_1 = $snmp3_privacy_method; + $custom_string_2 = io_input_password($snmp3_privacy_pass); + $custom_string_3 = $snmp3_security_level; + $plugin_parameter = $snmp3_auth_method; } else if ($id_module_type >= 34 && $id_module_type <= 37) { - $tcp_send = (string) get_parameter('command_text'); - $custom_string_1 = (string) get_parameter( - 'command_credential_identifier' - ); - $custom_string_2 = (string) get_parameter('command_os'); + $tcp_send = $command_text; + $custom_string_1 = $command_credential_identifier; + $custom_string_2 = $command_os; } else { - $plugin_user = (string) get_parameter('plugin_user'); - if (get_parameter('id_module_component_type') == 7) { - $plugin_pass = (int) get_parameter('plugin_pass'); - } else { - $plugin_pass = io_input_password( - (string) get_parameter('plugin_pass') - ); + if ($id_module_component_type !== 7) { + $plugin_pass = io_input_password($plugin_pass); } - - $plugin_parameter = (string) get_parameter('plugin_parameter'); } - $parent_module_id = (int) get_parameter('parent_module_id'); - $ip_target = (string) get_parameter('ip_target'); // No autofill if the module is a webserver module. - if ($ip_target == '' + if (empty($ip_target) === true && $id_module_type < MODULE_TYPE_WEB_DATA && $id_module_type > MODULE_TYPE_WEB_CONTENT_STRING ) { $ip_target = 'auto'; } - $custom_id = (string) get_parameter('custom_id'); - $history_data = (int) get_parameter('history_data'); - $dynamic_interval = (int) get_parameter('dynamic_interval'); - $dynamic_max = (int) get_parameter('dynamic_max'); - $dynamic_min = (int) get_parameter('dynamic_min'); - $dynamic_two_tailed = (int) get_parameter('dynamic_two_tailed'); - $min_warning = (float) get_parameter('min_warning'); - $max_warning = (float) get_parameter('max_warning'); - $str_warning = (string) get_parameter('str_warning'); - $min_critical = (float) get_parameter('min_critical'); - $max_critical = (float) get_parameter('max_critical'); - $str_critical = (string) get_parameter('str_critical'); - $ff_event = (int) get_parameter('ff_event'); - $ff_event_normal = (int) get_parameter('ff_event_normal'); - $ff_event_warning = (int) get_parameter('ff_event_warning'); - $ff_event_critical = (int) get_parameter('ff_event_critical'); - $ff_type = (int) get_parameter('ff_type'); - $each_ff = (int) get_parameter('each_ff', $module['each_ff']); - $ff_timeout = (int) get_parameter('ff_timeout'); - $unit = (string) get_parameter('unit'); if ($unit === '0') { $unit = ''; } - $id_tag = (array) get_parameter('id_tag_selected'); - $serialize_ops = (string) get_parameter('serialize_ops'); - $critical_instructions = (string) get_parameter('critical_instructions'); - $warning_instructions = (string) get_parameter('warning_instructions'); - $unknown_instructions = (string) get_parameter('unknown_instructions'); - $critical_inverse = (int) get_parameter('critical_inverse'); - $warning_inverse = (int) get_parameter('warning_inverse'); - $percentage_critical = (int) get_parameter('percentage_critical'); - $percentage_warning = (int) get_parameter('percentage_warning'); - - $id_category = (int) get_parameter('id_category'); - - $hour_from = get_parameter('hour_from'); - $minute_from = get_parameter('minute_from'); - $mday_from = get_parameter('mday_from'); - $month_from = get_parameter('month_from'); - $wday_from = get_parameter('wday_from'); - - $hour_to = get_parameter('hour_to'); - $minute_to = get_parameter('minute_to'); - $mday_to = get_parameter('mday_to'); - $month_to = get_parameter('month_to'); - $wday_to = get_parameter('wday_to'); - - $http_user = get_parameter('http_user'); - $http_pass = get_parameter('http_pass'); - - if ($hour_to != '*') { + if ($hour_to !== '*') { $hour_to = '-'.$hour_to; } else { $hour_to = ''; } - if ($minute_to != '*') { + if ($minute_to !== '*') { $minute_to = '-'.$minute_to; } else { $minute_to = ''; } - if ($mday_to != '*') { + if ($mday_to !== '*') { $mday_to = '-'.$mday_to; } else { $mday_to = ''; } - if ($month_to != '*') { + if ($month_to !== '*') { $month_to = '-'.$month_to; } else { $month_to = ''; } - if ($wday_to != '*') { + if ($wday_to !== '*') { $wday_to = '-'.$wday_to; } else { $wday_to = ''; } $cron_interval = $minute_from.$minute_to.' '.$hour_from.$hour_to.' '.$mday_from.$mday_to.' '.$month_from.$month_to.' '.$wday_from.$wday_to; - if (!cron_check_syntax($cron_interval)) { + if (cron_check_syntax($cron_interval) === false) { $cron_interval = ''; } - if ($prediction_module != MODULE_PREDICTION_SYNTHETIC) { + if ((int) $prediction_module !== MODULE_PREDICTION_SYNTHETIC) { unset($serialize_ops); enterprise_hook( 'modules_delete_synthetic_operations', @@ -1545,30 +1480,17 @@ if ($update_module || $create_module) { } if ($prediction_module === MODULE_PREDICTION_PLANNING) { - $custom_string_2 = get_parameter('estimation_type', 'estimation_calculation'); + $custom_string_2 = $estimation_type; if ($custom_string_2 === 'estimation_calculation') { - $custom_string_1 = get_parameter('estimation_days', -1); + $custom_string_1 = $estimation_days; } else { - $custom_string_1 = get_parameter('estimation_interval', '300'); + $custom_string_1 = $estimation_interval; } } - $active_snmp_v3 = get_parameter('active_snmp_v3'); - - /* - * if ($active_snmp_v3) { - * // LOST CODE?. - * - * } - */ - - $throw_unknown_events = (bool) get_parameter('throw_unknown_events', false); // Set the event type that can show. $disabled_types_event = [EVENTS_GOING_UNKNOWN => (int) $throw_unknown_events]; $disabled_types_event = io_json_mb_encode($disabled_types_event); - - $module_macro_names = (array) get_parameter('module_macro_names', []); - $module_macro_values = (array) get_parameter('module_macro_values', []); $module_macros = modules_get_module_macros_json($module_macro_names, $module_macro_values); // Make changes in the conf file if necessary. @@ -1582,9 +1504,7 @@ if ($update_module || $create_module) { $success_action = NOERR; // MODULE UPDATE. -if ($update_module) { - $id_agent_module = (int) get_parameter('id_agent_module'); - +if ($update_module === true) { $values = [ 'id_agente_modulo' => $id_agent_module, 'descripcion' => $description, @@ -1654,13 +1574,13 @@ if ($update_module) { ]; - if ($id_module_type == 30 || $id_module_type == 31 || $id_module_type == 32 || $id_module_type == 33) { + if ($id_module_type === 30 || $id_module_type === 31 || $id_module_type === 32 || $id_module_type === 33) { $plugin_parameter_split = explode(' ', $values['plugin_parameter']); $values['plugin_parameter'] = ''; foreach ($plugin_parameter_split as $key => $value) { - if ($key == 1) { + if ((int) $key === 1) { if ($http_user) { $values['plugin_parameter'] .= 'http_auth_user '.$http_user.' '; } @@ -1668,23 +1588,21 @@ if ($update_module) { if ($http_pass) { $values['plugin_parameter'] .= 'http_auth_pass '.$http_pass.' '; } - - $values['plugin_parameter'] .= $value.' '; - } else { - $values['plugin_parameter'] .= $value.' '; } + + $values['plugin_parameter'] .= $value.' '; } } // In local modules, the interval is updated by agent. - $module_kind = (int) get_parameter('moduletype'); - if ($module_kind == MODULE_DATA) { + $module_kind = $moduletype; + if ($module_kind === MODULE_DATA) { unset($values['module_interval']); } - if ($prediction_module == MODULE_PREDICTION_SYNTHETIC - && $serialize_ops == '' + if ($prediction_module === MODULE_PREDICTION_SYNTHETIC + && empty($serialize_ops) === true ) { $result = false; } else { @@ -1693,10 +1611,10 @@ if ($update_module) { FROM tagente_modulo WHERE id_agente_modulo ='.$id_agent_module ); - if (($check_dynamic['dynamic_interval'] == $dynamic_interval) - && ($check_dynamic['dynamic_max'] == $dynamic_max) - && ($check_dynamic['dynamic_min'] == $dynamic_min) - && ($check_dynamic['dynamic_two_tailed'] == $dynamic_two_tailed) + if (((int) $check_dynamic['dynamic_interval'] === $dynamic_interval) + && ((int) $check_dynamic['dynamic_max'] === $dynamic_max) + && ((int) $check_dynamic['dynamic_min'] === $dynamic_min) + && ((int) $check_dynamic['dynamic_two_tailed'] === $dynamic_two_tailed) ) { $result = modules_update_agent_module($id_agent_module, $values, false, $id_tag); } else { @@ -1705,7 +1623,7 @@ if ($update_module) { } } - if (is_error($result)) { + if (is_error($result) === true) { switch ($result) { case ERR_EXIST: $msg = __('There was a problem updating module. Another module already exists with the same name.'); @@ -1768,32 +1686,14 @@ if ($update_module) { } // MODULE INSERT. -if ($create_module) { +if ($create_module === true) { // Old configuration data must always be empty in case of creation. $old_configuration_data = ''; - if (isset($_POST['combo_snmp_oid'])) { - $combo_snmp_oid = get_parameter_post('combo_snmp_oid'); - } - - if ($snmp_oid == '') { + if (empty($snmp_oid) === true) { $snmp_oid = $combo_snmp_oid; } - $id_module = (int) get_parameter('id_module'); - - switch ($config['dbtype']) { - case 'oracle': - if (empty($description) || !isset($description)) { - $description = ' '; - } - break; - - default: - // Default. - break; - } - $values = [ 'id_tipo_modulo' => $id_module_type, 'descripcion' => $description, @@ -1883,7 +1783,7 @@ if ($create_module) { } } - if ($prediction_module == MODULE_PREDICTION_SYNTHETIC && $serialize_ops == '') { + if ($prediction_module === MODULE_PREDICTION_SYNTHETIC && empty($serialize_ops) === true) { $id_agent_module = false; } else { $id_agent_module = modules_create_agent_module( @@ -1895,7 +1795,7 @@ if ($create_module) { ); } - if (is_error($id_agent_module)) { + if (is_error($id_agent_module) === true) { switch ($id_agent_module) { case ERR_EXIST: $msg = __('There was a problem adding module. Another module already exists with the same name.'); @@ -1956,7 +1856,7 @@ if ($create_module) { // MODULE ENABLE/DISABLE // =====================. -if ($enable_module) { +if ($enable_module === true) { $result = modules_change_disabled($enable_module, 0); $module_name = modules_get_agentmodule_name($enable_module); @@ -1991,7 +1891,7 @@ if ($enable_module) { } } -if ($disable_module) { +if ($disable_module === true) { $result = modules_change_disabled($disable_module, 1); $module_name = modules_get_agentmodule_name($disable_module); @@ -2013,7 +1913,6 @@ if ($disable_module) { // Successfull action. $success_action = $result; - if ($result === NOERR) { db_pandora_audit( AUDIT_LOG_MODULE_MANAGEMENT, @@ -2051,19 +1950,18 @@ if ($update_module || $create_module // MODULE DELETION // =================. -if ($delete_module) { +if ($delete_module === true) { // DELETE agent module ! - $id_borrar_modulo = (int) get_parameter_get('delete_module', 0); $module_data = db_get_row_sql( 'SELECT tam.id_agente, tam.nombre FROM tagente_modulo tam, tagente_estado tae WHERE tam.id_agente_modulo = tae.id_agente_modulo - AND tam.id_agente_modulo = '.$id_borrar_modulo + AND tam.id_agente_modulo = '.$id_agent_module ); $id_grupo = (int) agents_get_agent_group($id_agente); $all_groups = agents_get_all_groups_agent($id_agente, $id_grupo); - if (! check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { + if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === false) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to delete a module without admin rights' @@ -2073,7 +1971,7 @@ if ($delete_module) { exit; } - if (empty($module_data) || $id_borrar_modulo < 1) { + if (empty($module_data) === true || $id_agent_module < 1) { db_pandora_audit( AUDIT_LOG_HACK_ATTEMPT, 'Expected variable from form is not correct' @@ -2084,10 +1982,10 @@ if ($delete_module) { } // Also call base function to delete modules. - modules_delete_agent_module($id_borrar_modulo); + modules_delete_agent_module($id_agent_module); // Check for errors. - if ($error != 0) { + if (isset($error) === true && (empty($error) === false || $error !== 0)) { ui_print_error_message(__('There was a problem deleting the module')); } else { echo ' diff --git a/pandora_console/godmode/agentes/fields_manager.php b/pandora_console/godmode/agentes/fields_manager.php index b310f049c9..19855ebb95 100644 --- a/pandora_console/godmode/agentes/fields_manager.php +++ b/pandora_console/godmode/agentes/fields_manager.php @@ -150,7 +150,7 @@ foreach ($fields as $field) { ); } - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = ''.html_print_image('images/config.png', true, ['alt' => __('Edit'), 'title' => __('Edit'), 'border' => '0', 'class' => 'invert_filter']).''; $data[3] .= ''.html_print_image('images/cross.png', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'border' => '0', 'class' => 'invert_filter']).''; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index b1aa96fd7e..7b0a48e460 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -905,7 +905,7 @@ if ($agents !== false) { $offsetArg = $offset; } - echo ""; + echo ""; if ($agent['disabled']) { echo "class = 'pacullos'; $tableCreateModule->width = '100%'; $tableCreateModule->data = []; $tableCreateModule->style = []; - $tableCreateModule->data['caption_type'] = '
'; - $tableCreateModule->data['caption_type'] .= html_print_input_hidden('edit_module', 1); + $tableCreateModule->data['caption_type'] = html_print_input_hidden('edit_module', 1); $tableCreateModule->data['caption_type'] .= __('Type'); $tableCreateModule->data['type'] = html_print_select( $modules, @@ -215,33 +215,22 @@ if ($show_creation === true) { false, '', false, - 'max-width:400px;' + 'width:380px;' ); - $tableCreateModule->data['submitButton'] = html_print_submit_button( - __('Create'), - 'updbutton', - false, - [ - 'icon' => 'next', - 'mode' => 'mini secondary', - ], - true - ); - - $tableCreateModule->data['submitButton'] .= '
'; -} - -// echo ''; -/* - if (!$config['disable_help']) { - echo '
'; - echo ''; - echo "".__('Get more modules on Monitoring Library').''; - echo ''; - echo '
'; + // Link for get more modules. + if ((bool) $config['disable_help'] === false) { + $tableCreateModule->data['get_more_modules'] = html_print_anchor( + [ + 'href' => 'https://pandorafms.com/Library/Library/', + 'target' => '_blank', + 'class' => 'color-black-grey', + 'content' => __('Get more modules on Monitoring Library'), + ], + true + ); } -*/ +} if (isset($id_agente) === false) { return; @@ -1083,9 +1072,9 @@ foreach ($modules as $module) { $data[7] = ''; } - if ($module['disabled']) { + if ((bool) $module['disabled'] === true) { $data[8] = "".html_print_image( - 'images/lightbulb_off.png', + 'images/svg/change-active.svg', true, [ 'alt' => __('Enable module'), @@ -1095,7 +1084,7 @@ foreach ($modules as $module) { ).''; } else { $data[8] = "".html_print_image( - 'images/lightbulb.png', + 'images/svg/change-pause.svg', true, [ 'alt' => __('Disable module'), @@ -1108,7 +1097,7 @@ foreach ($modules as $module) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/copy.png', + 'images/svg/duplicate.svg', true, [ 'title' => __('Duplicate'), @@ -1118,11 +1107,11 @@ foreach ($modules as $module) { $data[8] .= ' '; // Make a data normalization. - if (isset($numericModules[$type])) { + if (isset($numericModules[$type]) === true) { if ($numericModules[$type] === true) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/chart.png', + 'images/svg/module-graph.svg', true, [ 'title' => __('Normalize'), @@ -1133,16 +1122,19 @@ foreach ($modules as $module) { } } else { $data[8] .= html_print_image( - 'images/chart_curve.disabled.png', + 'images/svg/module-graph.svg', true, - ['title' => __('Normalize (Disabled)')] + [ + 'title' => __('Normalize (Disabled)'), + 'style' => 'opacity: 0.5;', + ] ); $data[8] .= '  '; } // Create network component action. - if ((is_user_admin($config['id_user'])) - && ($module['id_modulo'] == MODULE_NETWORK) + if ((is_user_admin($config['id_user']) === true) + && ((int) $module['id_modulo'] === MODULE_NETWORK) ) { $data[8] .= ''; @@ -1170,7 +1162,7 @@ foreach ($modules as $module) { $data[9] = ''; $data[9] .= html_print_image( - 'images/cross.png', + 'images/svg/delete.svg', true, [ 'title' => __('Delete'), @@ -1181,13 +1173,13 @@ foreach ($modules as $module) { } $table->cellclass[] = [ - 8 => 'action_buttons', - 9 => 'action_buttons', + 8 => 'table_action_buttons', + 9 => 'table_action_buttons', ]; array_push($table->data, $data); $table->cellclass[] = [ - 8 => 'action_buttons', - 9 => 'action_buttons', + 8 => 'table_action_buttons', + 9 => 'table_action_buttons', ]; } @@ -1254,12 +1246,12 @@ if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === tr [ 'class' => 'action-buttons', 'content' => html_print_submit_button( - __('Add'), - 'create_module_dialog', + __('Create'), + 'create_module', false, [ - 'icon' => 'add', - 'mode' => 'secondary mini', + 'icon' => 'next', + 'mode' => 'mini secondary', ], true ), @@ -1281,7 +1273,6 @@ if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === tr - 'action-buttons', - 'content' => html_print_submit_button( - __('Create'), - 'crtbutton', - false, - [ 'icon' => 'wand' ], - true - ), - ] + $actionButtons = html_print_submit_button( + __('Create'), + 'crtbutton', + false, + [ 'icon' => 'wand' ], + true ); - html_print_input_hidden('id_module', $moduletype); - html_print_input_hidden('create_module', 1); - if ($config['enterprise_installed'] && $remote_conf) { - ?> - - 'form_action'] + ); +} + +if ((bool) $config['enterprise_installed'] === true && $remote_conf === true) { + ?> + + '; echo ''; ui_require_jquery_file('ui'); diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index c59fc48ccb..68b903e687 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -194,7 +194,7 @@ $update_module_id = (int) get_parameter_get('update_module'); $edit_module = (bool) get_parameter_get('edit_module'); $table_simple = new stdClass(); $table_simple->id = 'simple'; -$table_simple->class = 'w100p mrgn_10px'; +$table_simple->class = 'w100p mrgn_10px floating_form'; $table_simple->data = []; $table_simple->style = []; $table_simple->cellclass = []; @@ -220,13 +220,13 @@ if (empty($id_agent_module) === false && isset($id_agente) === true) { $moduleIdContent = ''; } -$table_simple->data[$dataRow][$dataCol++] = __('Name'); -$table_simple->data[$dataRow][$dataCol++] = html_print_input_text_extended( +$table_simple->data['caption_module_name'][0] = __('Name'); +$table_simple->data['module_name'][0] = html_print_input_text_extended( 'name', $name, 'text-name', '', - 45, + 65, 100, $disabledBecauseInPolicy, '', @@ -246,9 +246,17 @@ if ($policy_link != 0) { $disabled_enable = 1; } -$table_simple->cellclass[$dataRow][$dataCol] = 'flex_center '; -$table_simple->data[$dataRow][$dataCol] = __('Disabled'); -$table_simple->data[$dataRow][$dataCol++] .= html_print_checkbox( +$table_simple->rowclass['disable_module'] = 'flex_center '; +$table_simple->data['disable_module'][0] = __('Disabled'); +$table_simple->data['disable_module'][1] .= html_print_checkbox_switch( + 'disabled', + 1, + $disabled, + true, + $disabled_enable +); +/* + html_print_checkbox( 'disabled', 1, $disabled, @@ -259,13 +267,18 @@ $table_simple->data[$dataRow][$dataCol++] .= html_print_checkbox( '', '', 'style="margin-left: 5px;"' -); - -$dataRow++; -$dataCol = 0; -$table_simple->data[$dataRow][$dataCol++] = __('Module group'); -$table_simple->colspan[$dataRow][$dataCol] = '3'; -$table_simple->data[$dataRow][$dataCol++] .= html_print_select_from_sql( + ); +*/ +// Caption for Module group and Type. +$table_simple->cellstyle['captions_module_n_type'][0] = 'width: 50%;'; +$table_simple->cellstyle['captions_module_n_type'][1] = 'width: 50%;'; +$table_simple->data['captions_module_n_type'][0] = html_print_input_hidden('id_module_type_hidden', $id_module_type, true); +$table_simple->data['captions_module_n_type'][0] .= __('Module group'); +$table_simple->data['captions_module_n_type'][1] = __('Type').ui_print_help_icon($help_type, true, '', 'images/help_green.png', '', 'module_type_help'); +// Module group and Type. +$table_simple->cellstyle['module_n_type'][0] = 'width: 50%;'; +$table_simple->cellstyle['module_n_type'][1] = 'width: 50%;'; +$table_simple->data['module_n_type'][0] .= html_print_select_from_sql( 'SELECT id_mg, name FROM tmodule_group ORDER BY name', 'id_module_group', $id_module_group, @@ -276,10 +289,10 @@ $table_simple->data[$dataRow][$dataCol++] .= html_print_select_from_sql( false, true, $disabledBecauseInPolicy, - 'width: 280px' + 'width: 480px' ); -if ((isset($id_agent_module) === true && $id_agent_module) || $id_policy_module != 0) { +if ((isset($id_agent_module) === true && $id_agent_module > 0) || (int) $id_policy_module !== 0) { $edit = false; } else { $edit = true; @@ -287,12 +300,6 @@ if ((isset($id_agent_module) === true && $id_agent_module) || $id_policy_module $in_policy = strstr($page, 'policy_modules'); -$dataRow++; -$dataCol = 0; -$table_simple->data[$dataRow][$dataCol] .= html_print_input_hidden('id_module_type_hidden', $id_module_type, true); -$table_simple->data[$dataRow][$dataCol++] = __('Type').ui_print_help_icon($help_type, true, '', 'images/help_green.png', '', 'module_type_help'); -$table_simple->colspan[$dataRow][$dataCol] = '3'; - if ($edit === false) { $sql = sprintf( 'SELECT id_tipo, nombre @@ -309,23 +316,18 @@ if ($edit === false) { $type_names_hash[$tn['id_tipo']] = $tn['nombre']; } - $table_simple->data[$dataRow][$dataCol] = ''.modules_get_moduletype_description($id_module_type).' ('.$type_names_hash[$id_module_type].')'; - $table_simple->data[$dataRow][$dataCol] .= html_print_input_hidden( + $table_simple->data['module_n_type'][1] = ''.modules_get_moduletype_description($id_module_type).' ('.$type_names_hash[$id_module_type].')'; + $table_simple->data['module_n_type'][1] .= html_print_input_hidden( 'type_names', base64_encode(io_json_mb_encode($type_names_hash)), true ); } else { - if (isset($id_module_type) === true) { - $idModuleType = $id_module_type; - } else { - $idModuleType = ''; - } - + $idModuleType = (isset($id_module_type) === true) ? $idModuleType : ''; // Removed web analysis and log4x from select. $tipe_not_in = '24, 25'; if (is_metaconsole() === true) { - $tipe_not_in = '24, 25, 34, 35, 36, 37'; + $tipe_not_in .= ', 34, 35, 36, 37'; } $sql = sprintf( @@ -351,7 +353,7 @@ if ($edit === false) { } } - $table_simple->data[$dataRow][$dataCol] = html_print_select( + $table_simple->data['module_n_type'][1] = html_print_select( $type_description_hash, 'id_module_type', $idModuleType, @@ -363,24 +365,24 @@ if ($edit === false) { false, '', false, - 'width: 280px;', + 'width: 480px;', false, 100 ); // Store the relation between id and name of the types on a hidden field. - $table_simple->data[$dataRow][$dataCol] .= html_print_input_hidden( + $table_simple->data['module_n_type'][1] .= html_print_input_hidden( 'type_names', base64_encode(io_json_mb_encode($type_names_hash)), true ); } -if ($edit_module) { +if ($edit_module === true) { $id_module_type = (int) $id_module_type; if (($id_module_type >= 1 && $id_module_type <= 5) || ($id_module_type >= 21 && $id_module_type <= 23) - || ($id_module_type == 100) + || ($id_module_type === 100) ) { $help_header = 'local_module'; } @@ -403,157 +405,182 @@ if ($edit_module) { } } -if ($disabledBecauseInPolicy) { - $table_simple->data[$dataRow][3] .= html_print_input_hidden( +if ((bool) $disabledBecauseInPolicy === true) { + $table_simple->data['module'][0] .= html_print_input_hidden( 'id_module_group', $id_module_group, true ); } -$dataRow++; -$table_simple->data[$dataRow][0] .= __('Warning threshold'); -$table_simple->cellclass[$dataRow][1] = 'module_thresholds_fields'; -if (modules_is_string_type($id_module_type) === false || $edit === true) { - $table_simple->data[$dataRow][1] .= ''.__('Min. ').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( +// Thresholds Table. +$tableBasicThresholds = new stdClass(); +$tableBasicThresholds->class = 'w100p table_section'; +$tableBasicThresholds->id = 'basic_thresholds'; +$tableBasicThresholds->style = []; +$tableBasicThresholds->data = []; + +// WARNING THRESHOLD. +if (modules_is_string_type($id_module_type) === false) { + $tableBasicThresholds->cellclass['caption_warning_threshold'] = 'show_hide_thresholds_minmax'; + $tableBasicThresholds->cellclass['warning_threshold'] = 'show_hide_thresholds_minmax'; + $tableBasicThresholds->data['caption_warning_threshold'][0] .= __('Warning threshold').' ('.__('Min / Max').')'; + $tableBasicThresholds->data['warning_threshold'][0] .= html_print_input_text( 'min_warning', $min_warning, '', 10, 255, true, - $disabledBecauseInPolicy, + $disabledBecauseInPolicy || $edit === true, false, '', $classdisabledBecauseInPolicy ); - $table_simple->data[$dataRow][1] .= ''.__('Max.').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( + $tableBasicThresholds->data['warning_threshold'][1] .= html_print_input_text( 'max_warning', $max_warning, '', 10, 255, true, - $disabledBecauseInPolicy, + $disabledBecauseInPolicy || $edit === true, false, '', $classdisabledBecauseInPolicy ).''; + + $tableBasicThresholds->data['switch_warning_threshold'][0] .= html_print_switch_radio_button( + [ + html_print_radio_button_extended('warning_thresholds_checks', 'normal_warning', __('Normal'), ($percentage_warning && $warning_inverse) === false, false, '', '', true, false, '', 'radius-normal_warning'), + html_print_radio_button_extended('warning_thresholds_checks', 'warning_inverse', __('Inverse interval'), $warning_inverse, $disabledBecauseInPolicy, '', '', true, false, '', 'radius-warning_inverse'), + html_print_radio_button_extended('warning_thresholds_checks', 'percentage_warning', __('Percentage'), $percentage_warning, $disabledBecauseInPolicy, '', '', true, false, '', 'radius-percentage_warning'), + ], + [], + true + ); } -if (modules_is_string_type($id_module_type) === true || $edit === true) { - $table_simple->data[$dataRow][1] .= ''.__('Str.').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( +if (modules_is_string_type($id_module_type) === true) { + $tableBasicThresholds->cellclass['caption_warning_threshold'] = 'show_hide_thresholds_string'; + $tableBasicThresholds->cellclass['warning_threshold'] = 'show_hide_thresholds_string'; + $tableBasicThresholds->data['caption_warning_threshold'][0] .= __('Warning threshold').' ('.__('Str.').')'; + $tableBasicThresholds->data['warning_threshold'][1] .= html_print_input_text( 'str_warning', str_replace('"', '', $str_warning), '', 10, 1024, true, - $disabledBecauseInPolicy, + $disabledBecauseInPolicy || $edit === false, false, '', $classdisabledBecauseInPolicy ).''; -} -$table_simple->data[$dataRow][1] .= '
'.__('Inverse interval').''; -$table_simple->data[$dataRow][1] .= html_print_checkbox('warning_inverse', 1, $warning_inverse, true, $disabledBecauseInPolicy); -$table_simple->data[$dataRow][1] .= '
'; + $divPercentageContent = __('Percentage'); + $divPercentageContent .= html_print_checkbox_switch('percentage_warning', 1, $percentage_warning, true, $disabledBecauseInPolicy); + $divPercentageContent .= ui_print_help_tip('Defines threshold as a percentage of value decrease/increment', true); -if (modules_is_string_type($id_module_type) === false) { - $table_simple->data[$dataRow][1] .= '
'.__('Percentage').''; - $table_simple->data[$dataRow][1] .= html_print_checkbox('percentage_warning', 1, $percentage_warning, true, $disabledBecauseInPolicy); - $table_simple->data[$dataRow][1] .= ui_print_help_tip('Defines threshold as a percentage of value decrease/increment', true); - $table_simple->data[$dataRow][1] .= '
'; -} - - - -if (modules_is_string_type($id_module_type) === false || (bool) $edit === true) { - $table_simple->cellstyle[$dataRow][2] = 'top: 160px; left: 700px; position: absolute; width: 280px;'; - $table_simple->colspan[$dataRow][2] = '2'; - $table_simple->data[$dataRow][2] = ' '; -} - -$dataRow++; -$table_simple->data[$dataRow][0] = __('Critical threshold'); -$table_simple->cellclass[$dataRow][1] = 'module_thresholds_fields'; -if (modules_is_string_type($id_module_type) === false || $edit === true) { - $table_simple->data[$dataRow][1] .= ''.__('Min').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( - 'min_critical', - $min_critical, - '', - 10, - 255, - true, - $disabledBecauseInPolicy, - false, - '', - $classdisabledBecauseInPolicy + $tableBasicThresholds->data['switch_warning_threshold'][0] .= html_print_div( + [ + 'id' => 'percentage_warning', + 'content' => $divPercentageContent, + ], + true ); - $table_simple->data[$dataRow][1] .= '
'.__('Max').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( - 'max_critical', - $max_critical, - '', - 10, - 255, - true, - $disabledBecauseInPolicy, - false, - '', - $classdisabledBecauseInPolicy - ).'
'; } -if (modules_is_string_type($id_module_type) === true || $edit === true) { - $table_simple->data[$dataRow][1] .= ''.__('Str.').''; - $table_simple->data[$dataRow][1] .= html_print_input_text( - 'str_critical', - str_replace('"', '', $str_critical), - '', - 10, - 1024, - true, - $disabledBecauseInPolicy, - false, - '', - $classdisabledBecauseInPolicy - ).''; + +// CRITICAL THRESHOLD. +$tableBasicThresholds->cellclass['caption_critical_threshold'] = 'show_hide_thresholds_minmax'; +$tableBasicThresholds->cellclass['critical_threshold'] = 'show_hide_thresholds_minmax'; +$tableBasicThresholds->data['caption_critical_threshold'][0] .= __('Critical threshold').' ('.__('Min / Max').')'; +$tableBasicThresholds->data['critical_threshold'][0] .= html_print_input_text( + 'min_critical', + $min_critical, + '', + 10, + 255, + true, + $disabledBecauseInPolicy || $edit === false, + false, + '', + $classdisabledBecauseInPolicy +); +$tableBasicThresholds->data['critical_threshold'][1] .= html_print_input_text( + 'max_critical', + $max_critical, + '', + 10, + 255, + true, + $disabledBecauseInPolicy || $edit === false, + false, + '', + $classdisabledBecauseInPolicy +).''; + +$tableBasicThresholds->data['switch_critical_threshold'][0] .= html_print_switch_radio_button( + [ + html_print_radio_button_extended('critical_thresholds_checks', 'normal_critical', __('Normal'), ($percentage_critical && $critical_inverse) === false, false, '', '', true, false, '', 'radius-normal_critical'), + html_print_radio_button_extended('critical_thresholds_checks', 'critical_inverse', __('Inverse interval'), $critical_inverse, $disabledBecauseInPolicy, '', '', true, false, '', 'radius-critical_inverse'), + html_print_radio_button_extended('critical_thresholds_checks', 'percentage_critical', __('Percentage'), $percentage_critical, $disabledBecauseInPolicy, '', '', true, false, '', 'radius-percentage_critical'), + ], + [], + true +); + +$divPercentageContent = __('Percentage'); +$divPercentageContent .= html_print_checkbox_switch('percentage_critical', 1, $percentage_critical, true, $disabledBecauseInPolicy); +$divPercentageContent .= ui_print_help_tip('Defines threshold as a percentage of value decrease/increment', true); + +$tableBasicThresholds->data['switch_critical_threshold'][0] .= html_print_div( + [ + 'id' => 'percentage_critical', + 'content' => $divPercentageContent, + ], + true +); + +$tableBasicThresholds->cellclass['caption_critical_threshold'] = 'show_hide_thresholds_string'; +$tableBasicThresholds->cellclass['critical_threshold'] = 'show_hide_thresholds_string'; +$tableBasicThresholds->data['caption_critical_threshold'][0] .= __('Critical threshold').' ('.__('Str.').')'; +$tableBasicThresholds->data['critical_threshold'][1] .= html_print_input_text( + 'str_critical', + str_replace('"', '', $str_critical), + '', + 10, + 1024, + true, + $disabledBecauseInPolicy, + false, + '', + $classdisabledBecauseInPolicy +); + +$table_simple->cellstyle['thresholds_table'][0] = 'width: 50%;'; +$table_simple->data['thresholds_table'][0] = html_print_table($tableBasicThresholds, true); +if (modules_is_string_type($id_module_type) === false || (bool) $edit === true) { + $table_simple->cellstyle['thresholds_table'][1] = 'width: 50%;'; + $table_simple->data['thresholds_table'][1] = ' '; } -$table_simple->data[$dataRow][1] .= '
'.__('Inverse interval').''; -$table_simple->data[$dataRow][1] .= html_print_checkbox('critical_inverse', 1, $critical_inverse, true, $disabledBecauseInPolicy); -$table_simple->data[$dataRow][1] .= '
'; - - -if (modules_is_string_type($id_module_type) === false) { - $table_simple->data[$dataRow][1] .= '
'.__('Percentage').''; - $table_simple->data[$dataRow][1] .= html_print_checkbox('percentage_critical', 1, $percentage_critical, true, $disabledBecauseInPolicy); - $table_simple->data[$dataRow][1] .= ui_print_help_tip('Defines threshold as a percentage of value decrease/increment', true); - $table_simple->data[$dataRow][1] .= '
'; -} - -$dataRow++; -$table_simple->data[$dataRow][0] = __('Historical data'); +$table_simple->data['historical_data'][0] = __('Historical data'); if ($disabledBecauseInPolicy) { // If is disabled, we send a hidden in his place and print a false // checkbox because HTML dont send disabled fields // and could be disabled by error. - $table_simple->data[$dataRow][1] = html_print_checkbox( + $table_simple->data['historical_data'][1] = html_print_checkbox_switch( 'history_data_fake', 1, $history_data, true, $disabledBecauseInPolicy ); - $table_simple->data[$dataRow][1] .= ''; + $table_simple->data['historical_data'][1] .= html_print_input_hidden('history_data', (int) $history_data, true); } else { - $table_simple->data[$dataRow][1] = html_print_checkbox( + $table_simple->data['historical_data'][1] = html_print_checkbox_switch( 'history_data', 1, $history_data, @@ -574,9 +601,10 @@ $table_advanced->colspan = []; $table_advanced->colspan[5][1] = 3; -$table_advanced->data[0][0] = __('Custom ID'); -$table_advanced->colspan[0][1] = 2; -$table_advanced->data[0][1] = html_print_input_text( +$table_advanced->data['captions_custom_id_unit'][0] = __('Custom ID'); +$table_advanced->data['captions_custom_id_unit'][1] = __('Unit'); +// $table_advanced->colspan[0][1] = 2; +$table_advanced->data['custom_id_unit'][0] = html_print_input_text( 'custom_id', $custom_id, '', @@ -589,8 +617,7 @@ $table_advanced->data[0][1] = html_print_input_text( (($config['module_custom_id_ro'] && $__code_from != 'policies') ? 'readonly' : $classdisabledBecauseInPolicy) ); -$table_advanced->data[0][3] = __('Unit'); -$table_advanced->data[0][4] = html_print_input_text( +$table_advanced->data['custom_id_unit'][1] = html_print_input_text( 'unit', $unit, '', @@ -603,7 +630,7 @@ $table_advanced->data[0][4] = html_print_input_text( $classdisabledBecauseInPolicy ); // $table_advanced->colspan[1][4] = 3; -$table_advanced->data[0][4] = html_print_extended_select_for_unit( +$table_advanced->data['custom_id_unit'][1] = html_print_extended_select_for_unit( 'unit', $unit, '', @@ -616,8 +643,163 @@ $table_advanced->data[0][4] = html_print_extended_select_for_unit( ); $table_advanced->colspan[0][4] = 3; +// Tags +global $__code_from; +$table_advanced->data['caption_tags_module_parent'][0] = __('Tags available'); +$table_advanced->data['caption_tags_module_parent'][1] = __('Tags selected'); +$table_advanced->data['caption_tags_module_parent'][2] = __('Tags from policy'); +// Code comes from module_editor. +if ($__code_from === 'modules') { + $__table_modules = 'ttag_module'; + $__id_where = 'b.id_agente_modulo'; + $__id = (int) $id_agent_module; + + $__sql = ' AND b.id_policy_module = 0'; + $__sql_policy = ' AND b.id_policy_module != 0'; +} else { + // Code comes from policy module editor. + global $__id_pol_mod; + $__table_modules = 'ttag_policy_module'; + $__id_where = 'b.id_policy_module'; + $__id = $__id_pol_mod; + + $__sql = ''; +} + +if (tags_has_user_acl_tags($config['id_user']) === false) { + $table_advanced->data['tags_module_parent'][0] = html_print_select_from_sql( + "SELECT id_tag, name + FROM ttag + WHERE id_tag NOT IN ( + SELECT a.id_tag + FROM ttag a, $__table_modules b + WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) + ORDER BY name", + 'id_tag_available[]', + '', + '', + '', + '', + true, + true, + false, + $disabledBecauseInPolicy, + 'width: 200px', + '5' + ); +} else { + $user_tags = tags_get_user_tags($config['id_user'], 'AW'); + if (empty($user_tags) === false) { + $id_user_tags = array_keys($user_tags); + + $table_advanced->data['tags_module_parent'][0] = html_print_select_from_sql( + 'SELECT id_tag, name + FROM ttag + WHERE id_tag IN ('.implode(',', $id_user_tags).") AND + id_tag NOT IN ( + SELECT a.id_tag + FROM ttag a, $__table_modules b + WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) + ORDER BY name", + 'id_tag_available[]', + '', + '', + '', + '', + true, + true, + false, + $disabledBecauseInPolicy, + 'width: 200px', + '5' + ); + } else { + $table_advanced->data['tags_module_parent'][0] = html_print_select_from_sql( + "SELECT id_tag, name + FROM ttag + WHERE id_tag NOT IN ( + SELECT a.id_tag + FROM ttag a, $__table_modules b + WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) + ORDER BY name", + 'id_tag_available[]', + '', + '', + '', + '', + true, + true, + false, + $disabledBecauseInPolicy, + 'width: 200px', + '5' + ); + } +} + +$table_advanced->data['tags_module_parent'][2] = html_print_image( + 'images/darrowright.png', + true, + [ + 'id' => 'right', + 'title' => __('Add tags to module'), + 'class' => 'invert_filter', + ] +); +$table_advanced->data['tags_module_parent'][2] .= '



'.html_print_image( + 'images/darrowleft.png', + true, + [ + 'id' => 'left', + 'title' => __('Delete tags to module'), + 'class' => 'invert_filter', + ] +); +$table_advanced->data['tags_module_parent'][3] = ''; +// .__('Tags selected') +$table_advanced->data['tags_module_parent'][4] = html_print_select_from_sql( + "SELECT a.id_tag, name + FROM ttag a, $__table_modules b + WHERE a.id_tag = b.id_tag AND $__id_where = $__id + $__sql + ORDER BY name", + 'id_tag_selected[]', + '', + '', + '', + '', + true, + true, + false, + $disabledBecauseInPolicy, + 'width: 200px', + '5' +); + +if ($__code_from === 'modules') { + $table_advanced->data['tags_module_parent'][5] = ''.''.''; + $table_advanced->data['tags_module_parent'][6] = html_print_select_from_sql( + "SELECT a.id_tag, name + FROM ttag a, $__table_modules b + WHERE a.id_tag = b.id_tag AND $__id_where = $__id + $__sql_policy + ORDER BY name", + 'id_tag_policy[]', + '', + '', + '', + '', + true, + true, + false, + $disabledBecauseInPolicy, + 'width: 200px', + '5' + ); +} + $module_id_policy_module = 0; -if (isset($module['id_policy_module'])) { +if (isset($module['id_policy_module']) === true) { $module_id_policy_module = $module['id_policy_module']; } @@ -908,160 +1090,6 @@ if (!preg_match('/async/', $module_type_name) || $edit) { $table_advanced->colspan[6][4] = 3; -/* - Tags */ -// This var comes from module_manager_editor.php or policy_modules.php -global $__code_from; -$table_advanced->data[7][0] = __('Tags available'); -// Code comes from module_editor -if ($__code_from == 'modules') { - $__table_modules = 'ttag_module'; - $__id_where = 'b.id_agente_modulo'; - $__id = (int) $id_agent_module; - - $__sql = ' AND b.id_policy_module = 0'; - $__sql_policy = ' AND b.id_policy_module != 0'; -} else { - // Code comes from policy module editor - global $__id_pol_mod; - $__table_modules = 'ttag_policy_module'; - $__id_where = 'b.id_policy_module'; - $__id = $__id_pol_mod; - - $__sql = ''; -} - -if (!tags_has_user_acl_tags($config['id_user'])) { - $table_advanced->data[7][1] = html_print_select_from_sql( - "SELECT id_tag, name - FROM ttag - WHERE id_tag NOT IN ( - SELECT a.id_tag - FROM ttag a, $__table_modules b - WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) - ORDER BY name", - 'id_tag_available[]', - '', - '', - '', - '', - true, - true, - false, - $disabledBecauseInPolicy, - 'width: 200px', - '5' - ); -} else { - $user_tags = tags_get_user_tags($config['id_user'], 'AW'); - if (!empty($user_tags)) { - $id_user_tags = array_keys($user_tags); - - $table_advanced->data[7][1] = html_print_select_from_sql( - 'SELECT id_tag, name - FROM ttag - WHERE id_tag IN ('.implode(',', $id_user_tags).") AND - id_tag NOT IN ( - SELECT a.id_tag - FROM ttag a, $__table_modules b - WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) - ORDER BY name", - 'id_tag_available[]', - '', - '', - '', - '', - true, - true, - false, - $disabledBecauseInPolicy, - 'width: 200px', - '5' - ); - } else { - $table_advanced->data[7][1] = html_print_select_from_sql( - "SELECT id_tag, name - FROM ttag - WHERE id_tag NOT IN ( - SELECT a.id_tag - FROM ttag a, $__table_modules b - WHERE a.id_tag = b.id_tag AND $__id_where = $__id ) - ORDER BY name", - 'id_tag_available[]', - '', - '', - '', - '', - true, - true, - false, - $disabledBecauseInPolicy, - 'width: 200px', - '5' - ); - } -} - -$table_advanced->data[7][2] = html_print_image( - 'images/darrowright.png', - true, - [ - 'id' => 'right', - 'title' => __('Add tags to module'), - 'class' => 'invert_filter', - ] -); -$table_advanced->data[7][2] .= '



'.html_print_image( - 'images/darrowleft.png', - true, - [ - 'id' => 'left', - 'title' => __('Delete tags to module'), - 'class' => 'invert_filter', - ] -); -$table_advanced->data[7][3] = ''.__('Tags selected').''; -$table_advanced->data[7][4] = html_print_select_from_sql( - "SELECT a.id_tag, name - FROM ttag a, $__table_modules b - WHERE a.id_tag = b.id_tag AND $__id_where = $__id - $__sql - ORDER BY name", - 'id_tag_selected[]', - '', - '', - '', - '', - true, - true, - false, - $disabledBecauseInPolicy, - 'width: 200px', - '5' -); - -if ($__code_from == 'modules') { - $table_advanced->data[7][5] = ''.__('Tags from policy').''; - $table_advanced->data[7][6] = html_print_select_from_sql( - "SELECT a.id_tag, name - FROM ttag a, $__table_modules b - WHERE a.id_tag = b.id_tag AND $__id_where = $__id - $__sql_policy - ORDER BY name", - 'id_tag_policy[]', - '', - '', - '', - '', - true, - true, - false, - $disabledBecauseInPolicy, - 'width: 200px', - '5' - ); -} - $table_advanced->data[8][0] = __('Quiet'); $table_advanced->data[8][1] = html_print_checkbox('quiet_module', 1, $quiet_module, true, $disabledBecauseInPolicy); @@ -1667,71 +1695,87 @@ $(document).ready (function () { } }); - if ($('#checkbox-warning_inverse').prop('checked') === true) { - $('#percentage_warning').hide(); - } - - if ($('#checkbox-critical_inverse').prop('checked') === true) { - $('#percentage_critical').hide(); - } - - if ($('#checkbox-percentage_warning').prop('checked') === true) { - $('#warning_inverse').hide(); - } - - if ($('#checkbox-percentage_critical').prop('checked') === true) { - $('#critical_inverse').hide(); - } - - $('#checkbox-warning_inverse').change (function() { - paint_graph_values(); - if ($('#checkbox-warning_inverse').prop('checked') === true){ - $('#checkbox-percentage_warning').prop('checked', false); - $('#percentage_warning').attr('onClick', 'return false;'); - $('#percentage_warning>em').addClass('color_666'); - } else { - $('#percentage_warning').removeAttr('onClick'); - $('#percentage_warning>em').removeClass('color_666'); + $('.switch_radio_button label').on('click', function(){ + var thisLabel = $(this).attr('for'); + /* + console.log(thisLabel); + console.log($('#'+thisLabel).attr('name')); + console.log($('#'+thisLabel).attr('value')); + console.log($('[name='+$('#'+thisLabel).attr('name')+']')); + */ + //console.log($('#'+$('#'+thisLabel).attr('name')).val()); + //$('[name='+$('#'+thisLabel).attr('name')+']').val($('#'+thisLabel).attr('value')); + //$('[name='+$('#'+thisLabel).attr('name')+']').prop('checked', true); + $('#'+thisLabel).attr('checked', 'checked'); + $('#'+thisLabel).siblings().attr('checked', false); + + if ($('#radius-warning_inverse').prop('checked') === true) { + $('#percentage_warning').hide(); } - }); - $('#checkbox-critical_inverse').change (function() { - paint_graph_values(); - - if ($('#checkbox-critical_inverse').prop('checked') === true){ - $('#checkbox-percentage_critical').prop('checked', false); - $('#percentage_critical').attr('onClick', 'return false;'); - $('#percentage_critical>em').addClass('color_666'); - } else { - $('#percentage_critical').removeAttr('onClick'); - $('#percentage_critical>em').removeClass('color_666'); + if ($('#radius-critical_inverse').prop('checked') === true) { + $('#percentage_critical').hide(); } + + if ($('#radius-percentage_warning').prop('checked') === true) { + $('#warning_inverse').hide(); + } + + if ($('#radius-percentage_critical').prop('checked') === true) { + $('#critical_inverse').hide(); + } + + $('#radius-warning_inverse').change (function() { + paint_graph_values(); + if ($('#radius-warning_inverse').prop('checked') === true){ + $('#radius-percentage_warning').prop('checked', false); + $('#percentage_warning').attr('onClick', 'return false;'); + $('#percentage_warning>em').addClass('color_666'); + } else { + $('#percentage_warning').removeAttr('onClick'); + $('#percentage_warning>em').removeClass('color_666'); + } + }); + + $('#radius-critical_inverse').change (function() { + paint_graph_values(); + + if ($('#radius-critical_inverse').prop('checked') === true){ + $('#radius-percentage_critical').prop('checked', false); + $('#percentage_critical').attr('onClick', 'return false;'); + $('#percentage_critical>em').addClass('color_666'); + } else { + $('#percentage_critical').removeAttr('onClick'); + $('#percentage_critical>em').removeClass('color_666'); + } + }); + + $('#radius-percentage_warning').change (function() { + paint_graph_values(); + if ($('#radius-percentage_warning').prop('checked') === true){ + $('#radius-warning_inverse').prop('checked', false); + $('#warning_inverse').attr('onClick', 'return false;'); + $('#warning_inverse>em').addClass('color_666'); + } else { + $('#warning_inverse').removeAttr('onClick'); + $('#warning_inverse>em').removeClass('color_666'); + } + }); + + $('#radius-percentage_critical').change (function() { + paint_graph_values(); + if ($('#radius-percentage_critical').prop('checked') === true){ + $('#radius-critical_inverse').prop('checked', false); + $('#critical_inverse').attr('onClick', 'return false;'); + $('#critical_inverse>em').addClass('color_666'); + } else { + $('#critical_inverse').removeAttr('onClick'); + $('#critical_inverse>em').removeClass('color_666'); + } + }); }); - $('#checkbox-percentage_warning').change (function() { - paint_graph_values(); - if ($('#checkbox-percentage_warning').prop('checked') === true){ - $('#checkbox-warning_inverse').prop('checked', false); - $('#warning_inverse').attr('onClick', 'return false;'); - $('#warning_inverse>em').addClass('color_666'); - } else { - $('#warning_inverse').removeAttr('onClick'); - $('#warning_inverse>em').removeClass('color_666'); - } - }); - - $('#checkbox-percentage_critical').change (function() { - paint_graph_values(); - if ($('#checkbox-percentage_critical').prop('checked') === true){ - $('#checkbox-critical_inverse').prop('checked', false); - $('#critical_inverse').attr('onClick', 'return false;'); - $('#critical_inverse>em').addClass('color_666'); - } else { - $('#critical_inverse').removeAttr('onClick'); - $('#critical_inverse>em').removeClass('color_666'); - } - - }); + }); @@ -1998,9 +2042,9 @@ function paint_graph_values(){ if(min_c =='0.00'){ min_c = 0; } var max_c = parseFloat($('#text-max_critical').val()); if(max_c =='0.00'){ max_c = 0; } - var inverse_w = $('input:checkbox[name=warning_inverse]:checked').val(); + var inverse_w = $('input:radio[name=warning_inverse]:checked').val(); if(!inverse_w){ inverse_w = 0; } - var inverse_c = $('input:checkbox[name=critical_inverse]:checked').val(); + var inverse_c = $('input:radio[name=critical_inverse]:checked').val(); if(!inverse_c){ inverse_c = 0; } //inicialiced error diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index 873d91598c..379d27fcca 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -416,8 +416,8 @@ foreach ($actions as $action) { && check_acl($config['id_user'], $action['id_group'], 'LM') ) { $table->cellclass[] = [ - 3 => 'action_buttons', - 4 => 'action_buttons', + 3 => 'table_action_buttons', + 4 => 'table_action_buttons', ]; $id_action = $action['id']; diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 121828de32..464df772d2 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -793,7 +793,7 @@ foreach ($commands as $command) { io_safe_output($command['description']) ); $data['action'] = ''; - $table->cellclass[]['action'] = 'action_buttons'; + $table->cellclass[]['action'] = 'table_action_buttons'; // (IMPORTANT, DO NOT CHANGE!) only users with permissions over "All" group have access to edition of commands belonging to "All" group. if ($is_management_allowed === true && !$command['internal'] && check_acl_restricted_all($config['id_user'], $command['id_group'], 'LM')) { diff --git a/pandora_console/godmode/alerts/alert_list.list.php b/pandora_console/godmode/alerts/alert_list.list.php index f087bfe664..435cc19322 100644 --- a/pandora_console/godmode/alerts/alert_list.list.php +++ b/pandora_console/godmode/alerts/alert_list.list.php @@ -834,8 +834,8 @@ foreach ($simple_alerts as $alert) { } $table_alert_list->cellclass[] = [ - 1 => 'action_buttons', - 4 => 'action_buttons', + 1 => 'table_action_buttons', + 4 => 'table_action_buttons', ]; $data[4] = '
'; if ($alert['disabled']) { diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index c0374c210b..0227f2eb93 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -419,7 +419,7 @@ foreach ($templates as $template) { if (is_management_allowed() === true && check_acl($config['id_user'], $template['id_group'], 'LM') ) { - $table->cellclass[][4] = 'action_buttons'; + $table->cellclass[][4] = 'table_action_buttons'; $data[4] = ''; $data[4] .= html_print_input_hidden('duplicate_template', 1, true); $data[4] .= html_print_input_hidden('source_id', $template['id'], true); diff --git a/pandora_console/godmode/category/category.php b/pandora_console/godmode/category/category.php index 4ac78b7414..b20bbc85b5 100755 --- a/pandora_console/godmode/category/category.php +++ b/pandora_console/godmode/category/category.php @@ -202,7 +202,7 @@ if (empty($result) === false) { } if ($is_management_allowed === true) { - $table->cellclass[][1] = 'action_buttons'; + $table->cellclass[][1] = 'table_action_buttons'; $data[1] = "".html_print_image( 'images/config.png', true, diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index b781f31a9f..ca75e6ff27 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -184,7 +184,7 @@ foreach ($filters as $filter) { if (check_acl_restricted_all($config['id_user'], $filter['id_group'], 'EW') || check_acl_restricted_all($config['id_user'], $filter['id_group'], 'EM') ) { - $table->cellclass[][6] = 'action_buttons'; + $table->cellclass[][6] = 'table_action_buttons'; $data[6] = "".html_print_image( 'images/cross.png', true, diff --git a/pandora_console/godmode/events/event_responses.list.php b/pandora_console/godmode/events/event_responses.list.php index 550ac994e9..2ae6361537 100644 --- a/pandora_console/godmode/events/event_responses.list.php +++ b/pandora_console/godmode/events/event_responses.list.php @@ -63,7 +63,7 @@ foreach ($event_responses as $response) { $data[0] = ''.$response['name'].''; $data[1] = $response['description']; $data[2] = ui_print_group_icon($response['id_group'], true); - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = ''.html_print_image( 'images/cross.png', true, diff --git a/pandora_console/godmode/extensions.php b/pandora_console/godmode/extensions.php index a9df7146c3..966ecd0ce7 100644 --- a/pandora_console/godmode/extensions.php +++ b/pandora_console/godmode/extensions.php @@ -252,7 +252,7 @@ foreach ($extensions as $file => $extension) { // Avoid to delete or disabled update_manager if ($file != 'update_manager.php') { - $table->cellclass[][10] = 'action_buttons'; + $table->cellclass[][10] = 'table_action_buttons'; if (!$extension['enabled']) { $data[] = ''.html_print_image('images/cross.disabled.png', true, ['class' => 'filter_none']).''.' '.html_print_image('images/lightbulb_off.png', true, ['class' => 'filter_none']).''; } else { diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php index 990b0bac77..87d0e91b53 100644 --- a/pandora_console/godmode/groups/group_list.php +++ b/pandora_console/godmode/groups/group_list.php @@ -909,7 +909,7 @@ if ($tab == 'tree') { $table->data[$key][4] = $group['parent_name']; $table->data[$key][5] = $group['description']; if ($is_management_allowed === true) { - $table->cellclass[$key][6] = 'action_buttons'; + $table->cellclass[$key][6] = 'table_action_buttons'; $table->data[$key][6] = ''.html_print_image( 'images/config.png', true, diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index 5fa233ce86..cbd9a4c0d5 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -272,7 +272,7 @@ if (empty($groups) === false) { if (is_metaconsole() === true) { $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } else { - $table->cellclass[][2] = 'action_buttons'; + $table->cellclass[][2] = 'table_action_buttons'; $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } } else { diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index e3a546d16f..60d72aea79 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -270,7 +270,7 @@ foreach ($groups as $group) { $data[0] = $tabulation.''.$group['name'].''; } - $table->cellclass[][1] = 'action_buttons'; + $table->cellclass[][1] = 'table_action_buttons'; if (is_management_allowed() === true || is_metaconsole()) { $data[1] = "".html_print_image('images/cross.png', true, ['title' => __('Delete')]).''; diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index 6841449ea6..54ff9f07cb 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -851,7 +851,7 @@ foreach ($components as $component) { $data[5] = $component['max'].' / '.$component['min']; if ($is_management_allowed === true) { - $table->cellclass[][6] = 'action_buttons'; + $table->cellclass[][6] = 'table_action_buttons'; $data[6] = ''.html_print_image( 'images/copy.png', true, diff --git a/pandora_console/godmode/modules/manage_network_templates.php b/pandora_console/godmode/modules/manage_network_templates.php index 00dab888b2..2fd5707570 100644 --- a/pandora_console/godmode/modules/manage_network_templates.php +++ b/pandora_console/godmode/modules/manage_network_templates.php @@ -261,7 +261,7 @@ foreach ($result as $row) { $data[0] = html_print_checkbox_extended('delete_multiple[]', $row['id_np'], false, false, '', 'class="check_delete"', true); $data[1] = ''.io_safe_output($row['name']).''; $data[2] = ui_print_truncate_text(io_safe_output($row['description']), 'description', true, true, true, '[…]'); - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = html_print_input_image( 'delete_profile', 'images/cross.png', diff --git a/pandora_console/godmode/netflow/nf_edit.php b/pandora_console/godmode/netflow/nf_edit.php index 4ba54a9c75..0df87401ac 100644 --- a/pandora_console/godmode/netflow/nf_edit.php +++ b/pandora_console/godmode/netflow/nf_edit.php @@ -191,7 +191,7 @@ foreach ($filters as $filter) { $data[3] = ''; if (check_acl_restricted_all($config['id_user'], $filter['id_group'], 'AW')) { - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = "".html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; } diff --git a/pandora_console/godmode/reporting/graphs.php b/pandora_console/godmode/reporting/graphs.php index 67131715cf..b5c3524d93 100644 --- a/pandora_console/godmode/reporting/graphs.php +++ b/pandora_console/godmode/reporting/graphs.php @@ -348,7 +348,7 @@ $table_aux = new stdClass(); $data[3] = ui_print_group_icon($graph['id_group'], true); $data[4] = ''; - $table->cellclass[][4] = 'action_buttons'; + $table->cellclass[][4] = 'table_action_buttons'; if (($report_w || $report_m)) { $data[4] = ''.html_print_image( 'images/config.png', diff --git a/pandora_console/godmode/reporting/map_builder.php b/pandora_console/godmode/reporting/map_builder.php index dd35798ff6..575c5456e6 100644 --- a/pandora_console/godmode/reporting/map_builder.php +++ b/pandora_console/godmode/reporting/map_builder.php @@ -509,8 +509,8 @@ if (!$maps && is_metaconsole() === false) { if ($vconsoles_write_action_btn || $vconsoles_manage_action_btn) { if (is_metaconsole() === false) { $table->cellclass[] = [ - 3 => 'action_buttons', - 4 => 'action_buttons', + 3 => 'table_action_buttons', + 4 => 'table_action_buttons', ]; $data[3] = ''.html_print_image( 'images/copy.png', diff --git a/pandora_console/godmode/reporting/reporting_builder.list_items.php b/pandora_console/godmode/reporting/reporting_builder.list_items.php index c69f98d3c1..ae2d92bfbc 100755 --- a/pandora_console/godmode/reporting/reporting_builder.list_items.php +++ b/pandora_console/godmode/reporting/reporting_builder.list_items.php @@ -616,7 +616,7 @@ foreach ($items as $item) { $row[6] = ''; if (check_acl($config['id_user'], $item['id_group'], 'RM')) { - $table->cellclass[][6] = 'action_buttons'; + $table->cellclass[][6] = 'table_action_buttons'; $row[6] .= ''.html_print_image( 'images/config.png', true, diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index d12c8212ab..3979a2159d 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1148,7 +1148,7 @@ switch ($action) { if ($edit || $delete) { $columnview = true; - $table->cellclass[][$next] = 'action_buttons'; + $table->cellclass[][$next] = 'table_action_buttons'; if (!isset($table->head[$next])) { $table->head[$next] = ''.__('Op.').''.html_print_checkbox('all_delete', 0, false, true, false); diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index f7775e7a6f..cbfe76dc0f 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -1,17 +1,32 @@ '', + 'label' => __('Servers'), + ], + [ + 'link' => 'index.php?sec=gservers&sec2=godmode/servers/modificar_server', + 'label' => __('%s servers', get_product_name()), + ], + ] + ); + $sql = sprintf('SELECT name, ip_address, description, server_type, exec_proxy, port FROM tserver WHERE id_server = %d', $id_server); $row = db_get_row_sql($sql); echo ''; @@ -67,7 +100,7 @@ if (isset($_GET['server'])) { html_print_input_text('description', $row['description'], '', 50, 0, true), ]; - if (enterprise_installed()) { + if (enterprise_installed() === true) { $table->data[] = [ __('Type'), $server_type, @@ -163,7 +196,24 @@ if (isset($_GET['server'])) { $buttons[$tab]['active'] = true; - ui_print_page_header(__('Remote Configuration'), 'images/gm_servers.png', false, 'servers', true, $buttons); + ui_print_standard_header( + __('Remote Configuration'), + 'images/gm_servers.png', + false, + 'servers', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Servers'), + ], + [ + 'link' => 'index.php?sec=gservers&sec2=godmode/servers/modificar_server', + 'label' => __('%s servers', get_product_name()), + ], + ] + ); if ($tab === 'standard_editor') { $advanced_editor = false; @@ -186,7 +236,20 @@ if (isset($_GET['server'])) { enterprise_include('godmode/servers/server_disk_conf_editor.php'); } else { // Header. - ui_print_page_header(__('%s servers', get_product_name()), 'images/gm_servers.png', false, '', true); + ui_print_standard_header( + __('%s servers', get_product_name()), + 'images/gm_servers.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Servers'), + ], + ] + ); // Move SNMP modules back to the enterprise server. if (isset($_GET['server_reset_snmp_enterprise']) === true) { diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index 9629dccb22..4943d7af0d 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -106,7 +106,7 @@ foreach ($servers as $server) { $table->cellclass[] = [ 3 => 'progress_bar', - 8 => 'action_buttons', + 8 => 'table_action_buttons', ]; $data[0] = ''.strip_tags($server['name']).''; diff --git a/pandora_console/godmode/setup/gis.php b/pandora_console/godmode/setup/gis.php index ff0f4f426c..960529d930 100755 --- a/pandora_console/godmode/setup/gis.php +++ b/pandora_console/godmode/setup/gis.php @@ -85,7 +85,7 @@ if ($mapsConnections !== false) { ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).'', ]; - $table->cellclass[][2] = 'action_buttons'; + $table->cellclass[][2] = 'table_action_buttons'; } } diff --git a/pandora_console/godmode/setup/links.php b/pandora_console/godmode/setup/links.php index adb23600d5..f1a5e9fca2 100644 --- a/pandora_console/godmode/setup/links.php +++ b/pandora_console/godmode/setup/links.php @@ -171,7 +171,7 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { } echo "".$row['name'].''; - echo ''.html_print_image( + echo ''.html_print_image( 'images/cross.png', true, ['class' => 'invert_filter'] diff --git a/pandora_console/godmode/setup/news.php b/pandora_console/godmode/setup/news.php index a7a22cfe67..633e8f224f 100644 --- a/pandora_console/godmode/setup/news.php +++ b/pandora_console/godmode/setup/news.php @@ -287,7 +287,7 @@ if ((isset($_GET['form_add'])) || (isset($_GET['form_edit']))) { echo "".__('No').''; } - echo ''.html_print_image('images/cross.png', true, ['border' => '0', 'class' => 'invert_filter']).''; + echo ''.html_print_image('images/cross.png', true, ['border' => '0', 'class' => 'invert_filter']).''; } echo ''; diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index 507f098bc0..48a8b9b534 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -117,7 +117,7 @@ foreach ($osList as $os) { $data[] = ui_print_truncate_text(io_safe_output($os['description']), 'description', true, true); if ($is_management_allowed === true) { - $table->cellclass[][4] = 'action_buttons'; + $table->cellclass[][4] = 'table_action_buttons'; if ($os['id_os'] > 16) { if (is_metaconsole()) { $data[] = ''.html_print_image('images/cross.png', true).''; diff --git a/pandora_console/godmode/snmpconsole/snmp_filters.php b/pandora_console/godmode/snmpconsole/snmp_filters.php index de9f86697a..59b01469ca 100644 --- a/pandora_console/godmode/snmpconsole/snmp_filters.php +++ b/pandora_console/godmode/snmpconsole/snmp_filters.php @@ -320,7 +320,7 @@ if ($edit_filter > -2) { $data[0] = $compose_id; $data[1] = implode(' AND ', $compose_filter); $data[2] = $compose_action; - $table->cellclass[][2] = 'action_buttons'; + $table->cellclass[][2] = 'table_action_buttons'; array_push($table->data, $data); } } diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index b808edde9b..da4a638208 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -381,7 +381,7 @@ if (empty($result) === false) { $data[5] = $output; if ($is_management_allowed === true) { - $table->cellclass[][6] = 'action_buttons'; + $table->cellclass[][6] = 'table_action_buttons'; $data[6] = ""; $data[6] .= html_print_image( 'images/config.png', diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index 7ce7c82cc0..da8eac4e9e 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -425,7 +425,7 @@ foreach ($profiles as $profile) { $data['NW'] = (empty($profile['network_config_edit']) === false) ? $img : ''; $data['NM'] = (empty($profile['network_config_management']) === false) ? $img : ''; $data['PM'] = (empty($profile['pandora_management']) === false) ? $img : ''; - $table->cellclass[]['operations'] = 'action_buttons'; + $table->cellclass[]['operations'] = 'table_action_buttons'; if ($is_management_allowed === true) { $data['operations'] = ''.html_print_image( 'images/config.png', diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index b7e45f0fac..c9f6dce01f 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -769,7 +769,7 @@ foreach ($info as $user_id => $user_info) { $data[5] = ui_print_string_substr($user_info['comments'], 24, true); if ($is_management_allowed === true) { - $table->cellclass[][6] = 'action_buttons'; + $table->cellclass[][6] = 'table_action_buttons'; $data[6] = ''; if ($user_is_admin || $config['id_user'] == $user_info['id_user'] diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index 8b94093eb1..76ab825db3 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -1033,7 +1033,7 @@ class DiscoveryTaskList extends HTML $data[9] = '-'; } - $table->cellclass[][9] = 'action_buttons'; + $table->cellclass[][9] = 'table_action_buttons'; // Div neccesary for modal progress task. echo ''; diff --git a/pandora_console/images/svg/Iconset_7_11_22.zip b/pandora_console/images/svg/Iconset_7_11_22.zip deleted file mode 100644 index d5605989f370783fb699aed362874d709cbbd695..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110340 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 'security', - 'class' => 'w80px action_buttons show_security_info', + 'class' => 'w80px table_action_buttons show_security_info', ], [ 'text' => 'action', - 'class' => 'w80px action_buttons show_extended_info', + 'class' => 'w80px table_action_buttons show_extended_info', ] ); diff --git a/pandora_console/include/class/ConfigPEN.class.php b/pandora_console/include/class/ConfigPEN.class.php index b3e8d9d319..87bfd223a2 100644 --- a/pandora_console/include/class/ConfigPEN.class.php +++ b/pandora_console/include/class/ConfigPEN.class.php @@ -599,7 +599,7 @@ class ConfigPEN extends HTML __('Description'), [ 'text' => __('Options'), - 'class' => 'action_buttons', + 'class' => 'table_action_buttons', ], ]; diff --git a/pandora_console/include/class/CredentialStore.class.php b/pandora_console/include/class/CredentialStore.class.php index a134f999b8..01810c341a 100644 --- a/pandora_console/include/class/CredentialStore.class.php +++ b/pandora_console/include/class/CredentialStore.class.php @@ -843,7 +843,7 @@ class CredentialStore extends Wizard __('User'), [ 'text' => __('Options'), - 'class' => 'action_buttons', + 'class' => 'table_action_buttons', ], ]; diff --git a/pandora_console/include/class/ModuleTemplates.class.php b/pandora_console/include/class/ModuleTemplates.class.php index 312c69bf86..e60bad1951 100644 --- a/pandora_console/include/class/ModuleTemplates.class.php +++ b/pandora_console/include/class/ModuleTemplates.class.php @@ -870,7 +870,7 @@ class ModuleTemplates extends HTML $data[0] = html_print_checkbox_extended('delete_multiple[]', $row['id_np'], false, false, '', 'class="check_delete"', true); $data[1] = ''.io_safe_output($row['name']).''; $data[2] = ui_print_truncate_text(io_safe_output($row['description']), 'description', true, true, true, '[…]'); - $table->cellclass[][3] = 'action_buttons'; + $table->cellclass[][3] = 'table_action_buttons'; $data[3] = html_print_input_image( 'delete_profile', 'images/cross.png', diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index c0d91e35f1..5e654faa3b 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -4456,3 +4456,17 @@ function agents_get_starmap(int $id_agent, float $width=0, float $height=0) return $html; } + + +/** + * Defines a hash for agent name. + * + * @param string $alias Alias. + * @param string $nombre_agente Agent name. + * + * @return string. + */ +function hash_agent_name(string $alias, string $nombre_agente) +{ + return hash('sha256', $alias.'|'.$nombre_agente.'|'.time().'|'.sprintf('%04d', rand(0, 10000))); +} \ No newline at end of file diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 97a9e56f21..5bf22a21d8 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4053,6 +4053,28 @@ function html_print_radio_button($name, $value, $label='', $checkedvalue='', $re } +/** + * Render a Switch-Radio selector buttons. + * + * @param array $switches Switches for add (html_print_radio_button). + * @param array $attributes Special attributes. + * @param boolean $return Return. False by default. + * + * @return mixed. + */ +function html_print_switch_radio_button(array $switches, array $attributes=[], bool $return=false) +{ + return html_print_div( + [ + 'id' => ($attributes['id'] ?? ''), + 'class' => 'switch_radio_button '.($attributes['class'] ?? ''), + 'content' => implode('', $switches), + ], + $return + ); +} + + /** * Render a checkbox button input. Extended version, use html_print_checkbox() to simplify. * @@ -4065,6 +4087,7 @@ function html_print_radio_button($name, $value, $label='', $checkedvalue='', $re * @param boolean $return Whether to return an output string or echo now (optional, echo by default). * @param string $id Custom id. * @param string $customAttributes Custom Attribute for customized checkbox. + * @param string $customHTML Custom HTML for customized checkbox. * * @return string HTML code if return parameter is true. */ @@ -4077,7 +4100,8 @@ function html_print_checkbox_extended( $attributes, $return=false, $id='', - $customAttributes='' + $customAttributes='', + $customHTML='' ) { static $idcounter = []; @@ -4097,6 +4121,7 @@ function html_print_checkbox_extended( $output .= ((bool) $disabled === true) ? ' disabled="disabled"' : ''; $output .= ' '.$attributes; $output .= ' />'; + $output .= $customHTML; $output .= ''; $output .= ''; $output .= "\n"; @@ -4122,6 +4147,7 @@ function html_print_checkbox_extended( * @param string $attributes Extra attributes. * @param string $id Custom ID. * @param string $customAttributes Custom Attribute for customized checkbox. + * @param string $customHTML Custom HTML for customized checkbox. * * @return string HTML code if return parameter is true. */ @@ -4135,7 +4161,8 @@ function html_print_checkbox( $disabled_hidden=false, $attributes='', $id='', - $customAttributes='' + $customAttributes='', + $customHTML='' ) { $output = html_print_checkbox_extended( $name, @@ -4146,7 +4173,8 @@ function html_print_checkbox( $attributes, true, $id, - $customAttributes + $customAttributes, + $customHTML ); if (!$disabled_hidden) { $output .= html_print_input_hidden($name.'_sent', 1, true); diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index c5a1a643c6..d2eec15e5f 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3580,7 +3580,7 @@ function ui_print_datatable(array $parameters) if($("#button-'.$form_id.'_search_bt") != undefined) { $("#'.$form_id.'_loading").remove(); } - // Move elements to action_buttons bar. + // Move elements to table_action_buttons bar. $(".action_buttons_right_content").append($("#'.$table_id.'_wrapper > .dataTables_paginate.paging_simple_numbers")); $(".action_buttons_right_content").append($("#'.$table_id.'_wrapper > #table_events_length")); diff --git a/pandora_console/include/lib/Dashboard/Widgets/events_list.php b/pandora_console/include/lib/Dashboard/Widgets/events_list.php index 2dc1d57426..58c947f4bf 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/events_list.php +++ b/pandora_console/include/lib/Dashboard/Widgets/events_list.php @@ -617,7 +617,7 @@ class EventsListWidget extends Widget 'event_type', [ 'text' => 'options', - 'class' => 'action_buttons w120px', + 'class' => 'table_action_buttons w120px', ], ]; $fields = explode(',', $config['event_fields']); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e7e008185b..1f9f043f3a 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1047,12 +1047,13 @@ select:-internal-list-box { div#page { background: #fbfbfb; background-image: none; - clear: both; + /* clear: both; */ width: auto; - padding-top: 5px; - /*padding-right: 3em;*/ + /* padding-top: 5px; */ + /* padding-right: 3em; */ display: flex; flex-direction: column; + margin-top: 58px; } body.pure { @@ -1068,11 +1069,13 @@ div#container { } div#main { - /*width: 100%;*/ - /*margin-left: 3em;*/ + display: flex; + /* width: 100%; */ + /* margin-left: 3em; */ margin-bottom: 3em; position: relative; - margin-top: 8.8em; + /* margin-top: 8.8em; */ + flex-direction: column; } textarea.conf_editor { @@ -1711,23 +1714,23 @@ div.title_line { #menu_tab_frame, #menu_tab_frame_view, #menu_tab_frame_view_bc { - position: fixed; + position: sticky; top: 59px; z-index: 10; display: flex; align-items: flex-end; justify-content: space-between; border-bottom: 4px solid #14524f; - /*width: calc(100% + 3em);*/ + /* width: calc(100% + 3em); */ width: -webkit-fill-available; width: -moz-fill-available; padding-right: 0px; - margin-bottom: 20px; + /* margin-bottom: 20px; */ height: 56px; box-sizing: border-box; background-color: #fff; - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1); - /*margin-left: -3em;*/ + box-shadow: 1px 1px 4px rgb(0 0 0 / 10%); + /* margin-left: -3em;*/ } /* Breadcrum */ @@ -2257,8 +2260,8 @@ table#simple span#component { table#simple label { display: inline; - font-weight: normal; - font-style: italic; + /*font-weight: normal;*/ + /*font-style: italic;*/ } .clickable { @@ -5280,42 +5283,6 @@ input:checked + .p-slider:before { color: #4d4d4d; } -/* This class is for the icons of actions and operations in the tables. */ -.action_buttons a[href] img, -.action_buttons input[type="image"], -.action_button_img { - border-radius: 4px; - border: 1px solid #dcdcdc !important; - padding: 1px !important; - box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); - max-width: 21px; -} - -/* This class is for only one icon to be a button type. */ -.action_button_img { - cursor: pointer; -} - -.action_buttons a, -.action_buttons input[type="image"] { - margin-right: 5px; - display: inline-block; -} - -.action_buttons a:last-child, -.action_buttons input[type="image"]:last-child { - margin-right: 0px; -} - -.action_buttons a:hover { - background-color: #fff; - border-radius: 4px; -} - -.action_buttons input[type="image"]:hover { - background-color: #fff; -} - /* Tables to upload files */ #table_filemanager tr:first-child th span { font-weight: bold; @@ -5706,6 +5673,7 @@ div.label_select_child_left > span { .switch_radio_button { display: flex; overflow: hidden; + height: 32px; } .switch_radio_button input { @@ -5720,7 +5688,7 @@ div.label_select_child_left > span { .switch_radio_button label { background-color: #fff; color: rgba(0, 0, 0, 0.6); - line-height: 1; + line-height: 0; text-align: center; padding: 14px 10px; margin-right: -1px; @@ -5728,7 +5696,7 @@ div.label_select_child_left > span { transition: all 0.1s ease-in-out; } -.switch_radio_button label:first-child { +.switch_radio_button label:first { border-top-left-radius: 4px; border-bottom-left-radius: 4px; } @@ -5743,12 +5711,22 @@ div.label_select_child_left > span { cursor: pointer; } -.switch_radio_button input:checked + label { +.switch_radio_button input:checked + label, +.switch_radio_button input:checked:has(.custom_checkbox) { background-color: #1d7873; box-shadow: none; color: #fff !important; } +/* +.switch_radio_button .custom_checkbox_show { + display: none; +} +.switch_radio_button .custom_checkbox_caption { + line-height: 0; +} + +*/ /* * --------------------------------------------------------------------- * - MODULE GRAPHS @@ -10632,12 +10610,12 @@ pre.external_tools_output { } .fixed_filter_bar { - position: fixed; + position: sticky; height: 60px; top: 114px; border: 1px solid #e5e9ed; background-color: #fff; - z-index: 0; + z-index: 1; width: -webkit-fill-available; width: -moz-fill-available; } diff --git a/pandora_console/include/styles/pandora_black.css b/pandora_console/include/styles/pandora_black.css index 2affa15eb4..4cb0411131 100644 --- a/pandora_console/include/styles/pandora_black.css +++ b/pandora_console/include/styles/pandora_black.css @@ -330,8 +330,8 @@ table.black_table_modal_alternate tr:nth-child(even) td { color: #fff; } -.action_buttons a[href] img, -.action_buttons input[type="image"], +.table_action_buttons a[href] img, +.table_action_buttons input[type="image"], .action_button_img { filter: brightness(4.5) contrast(50%); background-color: transparent !important; diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index c0c3875521..8e3fdddbe8 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -91,7 +91,6 @@ .info_table { background-color: #fff; /* margin-bottom: 10px; */ - margin: 64px auto 0; border-spacing: 0; border-collapse: collapse; overflow: hidden; @@ -99,7 +98,8 @@ } .info_table > tbody > tr:nth-child(even) { - background-color: #f5f5f5; + /*background-color: #f5f5f5;*/ + background-color: #f6f7fb; } .info_table tr > td:first-child, @@ -164,7 +164,7 @@ } .info_table > tbody > tr { - border-bottom: 1px solid #e2e2e2; + /*border-bottom: 1px solid #e2e2e2;*/ } .info_table > tbody > tr > td { @@ -193,9 +193,19 @@ vertical-align: middle; } +.table_action_buttons > a, +.table_action_buttons > img { + visibility: hidden; +} .info_table > tbody > tr:hover { /* This !important is necessary to overwrite the white background of tables with less than 5 rows. */ - background-color: #eee !important; + /*background-color: #eee !important;*/ + background-color: #d9efee !important; +} + +.info_table > tbody > tr:hover .table_action_buttons > a, +.info_table > tbody > tr:hover .table_action_buttons > img { + visibility: visible; } .info_.profile_list > thead > tr > th > a.tip { @@ -233,9 +243,8 @@ .datos4 *, .info_table .datos3 *, .info_table .datos4 * { - font-size: 8.6pt; - font-weight: 600; - padding: 1.3em 0; + font-size: 11pt; + padding: 1.5em 0 0.5em; } .datos5 * { @@ -263,7 +272,6 @@ table.dataTable.info_table.no-footer { a.pandora_pagination { background-color: #f6f7fb; - border: 1px solid #c0ccdc; padding: 11px; color: #000; border: 1px solid #cacaca; @@ -367,3 +375,45 @@ a.pandora_pagination.current:hover { .info_table tr th.sorting_desc { padding-left: 15px; } + +/* This class is for the icons of actions and operations in the tables. */ +.table_action_buttons a[href] img, +.table_action_buttons input[type="image"], +.action_button_img { + border-radius: 4px; + /*border: 1px solid #dcdcdc !important;*/ + padding: 1px !important; + /*box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1);*/ + width: 24px; + height: 24px; +} + +/* This class is for only one icon to be a button type. */ +.action_button_img { + cursor: pointer; +} + +.table_action_buttons a, +.table_action_buttons input[type="image"] { + margin-right: 5px; + display: inline-block; +} + +.table_action_buttons a:last-child, +.table_action_buttons input[type="image"]:last-child { + margin-right: 0px; +} + +.table_action_buttons a:hover { + background-color: #fff; + border-radius: 4px; +} + +.table_action_buttons input[type="image"]:hover { + background-color: #fff; +} + +.table_action_buttons_image { + width: 24px; + height: 24px; +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 050cdcac38..6e872cc1bf 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1566,7 +1566,6 @@ require 'include/php_to_js_values.php'; } // Set the position of principal action buttons. //actionButtons.setAttribute('style', $left+$bottom); - } } diff --git a/pandora_console/operation/agentes/pandora_networkmap.php b/pandora_console/operation/agentes/pandora_networkmap.php index 5a03df54a4..ac011ae87b 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.php +++ b/pandora_console/operation/agentes/pandora_networkmap.php @@ -802,9 +802,9 @@ switch ($tab) { if ($networkmap_write || $networkmap_manage) { $table->cellclass[] = [ - 'copy' => 'action_buttons', - 'edit' => 'action_buttons', - 'delete' => 'action_buttons', + 'copy' => 'table_action_buttons', + 'edit' => 'table_action_buttons', + 'delete' => 'table_action_buttons', ]; $data['copy'] = ''.html_print_image('images/copy.png', true, ['class' => 'invert_filter']).''; $data['edit'] = ''.html_print_image('images/config.png', true, ['class' => 'invert_filter']).''; diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 2f9e747fcf..3cb91d03ca 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1519,7 +1519,7 @@ if (!empty($result)) { } if ($show_edit_icon) { - $table->cellclass[][2] = 'action_buttons'; + $table->cellclass[][2] = 'table_action_buttons'; $data[2] .= ''.html_print_image( 'images/config.png', true, diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index ea53180ad8..bd4b875fe9 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2177,7 +2177,7 @@ try { 'event_type', [ 'text' => 'options', - 'class' => 'action_buttons w120px', + 'class' => 'table_action_buttons w120px', ], [ 'text' => 'm', @@ -2221,7 +2221,7 @@ try { [ [ 'text' => 'options', - 'class' => 'action_buttons mw120px', + 'class' => 'table_action_buttons mw120px', ], [ 'text' => 'm', diff --git a/pandora_console/operation/gis_maps/gis_map.php b/pandora_console/operation/gis_maps/gis_map.php index a8a12b0012..0e044d37cb 100644 --- a/pandora_console/operation/gis_maps/gis_map.php +++ b/pandora_console/operation/gis_maps/gis_map.php @@ -186,7 +186,7 @@ if ($maps !== false) { $data['default'] = html_print_radio_button_extended('default_map', $map['id_tgis_map'], '', $checked, false, 'setDefault('.$map['id_tgis_map'].');', '', true); } - $table->cellclass[]['op'] = 'action_buttons'; + $table->cellclass[]['op'] = 'table_action_buttons'; $data['op'] = ''.html_print_image('images/config.png', true, ['title' => __('Edit')]).''.''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; } diff --git a/pandora_console/operation/incidents/list_integriaims_incidents.php b/pandora_console/operation/incidents/list_integriaims_incidents.php index 5f32cb7398..cb66d978d4 100644 --- a/pandora_console/operation/incidents/list_integriaims_incidents.php +++ b/pandora_console/operation/incidents/list_integriaims_incidents.php @@ -545,7 +545,7 @@ foreach ($incidents_paginated as $key => $value) { $table->data[$i][6] = $array_get_incidents[$key][10]; $table->data[$i][7] = $array_get_incidents[$key][5]; $table->data[$i][8] = ''; - $table->cellclass[$i][8] = 'action_buttons'; + $table->cellclass[$i][8] = 'table_action_buttons'; $table->data[$i][8] .= ''; $table->data[$i][8] .= html_print_image('images/config.png', true, ['title' => __('Edit')]); $table->data[$i][8] .= ''; diff --git a/pandora_console/operation/messages/message_list.php b/pandora_console/operation/messages/message_list.php index f39cc920aa..b57d1f6532 100644 --- a/pandora_console/operation/messages/message_list.php +++ b/pandora_console/operation/messages/message_list.php @@ -266,7 +266,7 @@ if (empty($messages) === true) { ['prominent' => 'timestamp'] ); - $table->cellclass[][4] = 'action_buttons'; + $table->cellclass[][4] = 'table_action_buttons'; if ($show_sent === true) { $data[4] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 1c25b7404f..f4a6693277 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -155,26 +155,26 @@ UNLOCK TABLES; LOCK TABLES `tconfig_os` WRITE; INSERT INTO `tconfig_os` (`id_os`, `name`, `description`, `icon_name`, `previous_name`) VALUES -(1,'Linux','Linux: All versions','so_linux.png', ''), -(2,'Solaris','Sun Solaris','so_solaris.png', ''), -(3,'AIX','IBM AIX','so_aix.png', ''), -(4,'BSD','OpenBSD, FreeBSD and Others','so_bsd.png', ''), -(5,'HP-UX','HP-UX Unix OS','so_hpux.png', ''), -(7,'Cisco','CISCO IOS','so_cisco.png', ''), -(8,'MacOS','MAC OS','so_mac.png', ''), -(9,'Windows','Microsoft Windows OS','so_win.png', ''), -(10,'Other','Other SO','so_other.png', ''), -(11,'Network','Network Agent','network.png', ''), -(12,'Web Server','Web Server/Application','network.png', ''), -(13,'Sensor','Hardware Agent (Sensor)','network.png', ''), -(14,'Embedded','Embedded device running an agent','embedded.png', ''), -(15,'Android','Android agent','android.png', ''), -(16, 'VMware', 'VMware Architecture', 'so_vmware.png', ''), -(17, 'Router', 'Generic router', 'so_router.png', ''), -(18, 'Switch', 'Generic switch', 'so_switch.png', ''), -(19, 'Satellite', 'Satellite agent', 'satellite.png', ''), -(20, 'Mainframe', 'Mainframe agent', 'so_mainframe.png', ''), -(100, 'Cluster', 'Cluster agent', 'so_cluster.png', ''); +(1,'Linux','Linux: All versions','linux@svg.svg', ''), +(2,'Solaris','Sun Solaris','solaris@svg.svg', ''), +(3,'AIX','IBM AIX','aix@svg.svg', ''), +(4,'BSD','OpenBSD, FreeBSD and Others','freebsd@svg.svg', ''), +(5,'HP-UX','HP-UX Unix OS','HP@svg.svg', ''), +(7,'Cisco','CISCO IOS','cisco@svg.svg', ''), +(8,'MacOS','MAC OS','apple@svg.svg', ''), +(9,'Windows','Microsoft Windows OS','windows@svg.svg', ''), +(10,'Other','Other SO','other-OS@svg.svg', ''), +(11,'Network','Network Agent','network-server@svg.svg', ''), +(12,'Web Server','Web Server/Application','network-server@svg.svg', ''), +(13,'Sensor','Hardware Agent (Sensor)','network-server@svg.svg', ''), +(14,'Embedded','Embedded device running an agent','embedded@svg.svg', ''), +(15,'Android','Android agent','android@svg.svg', ''), +(16, 'VMware', 'VMware Architecture', 'vmware@svg.svg', ''), +(17, 'Router', 'Generic router', 'routers@svg.svg', ''), +(18, 'Switch', 'Generic switch', 'switch@svg.svg', ''), +(19, 'Satellite', 'Satellite agent', 'satellite@svg.svg', ''), +(20, 'Mainframe', 'Mainframe agent', 'mainframe@svg.svg', ''), +(100, 'Cluster', 'Cluster agent', 'cluster@svg.svg', ''); UNLOCK TABLES; diff --git a/pandora_console/views/calendar/list.php b/pandora_console/views/calendar/list.php index 80a1811b8f..65fc99554d 100644 --- a/pandora_console/views/calendar/list.php +++ b/pandora_console/views/calendar/list.php @@ -84,7 +84,7 @@ try { 'description', [ 'text' => 'options', - 'class' => 'w150px action_buttons', + 'class' => 'w150px table_action_buttons', ], ]; diff --git a/pandora_console/views/dashboard/list.php b/pandora_console/views/dashboard/list.php index c1117e3f36..46b1cd68cc 100644 --- a/pandora_console/views/dashboard/list.php +++ b/pandora_console/views/dashboard/list.php @@ -192,9 +192,9 @@ if (empty($dashboards) === true) { } $table->cellclass[] = [ - 'full_screen' => 'action_buttons', - 'copy' => 'action_buttons', - 'delete' => 'action_buttons', + 'full_screen' => 'table_action_buttons', + 'copy' => 'table_action_buttons', + 'delete' => 'table_action_buttons', ]; $table->data[] = $data;