<?php // Pandora FMS- https://pandorafms.com // ================================================== // Copyright (c) 2005-2023 Pandora FMS // Please see https://pandorafms.com/community/ for full contribution list // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation; version 2 // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. global $config; require_once $config['homedir'].'/include/functions_agents.php'; require_once $config['homedir'].'/include/functions_reporting.php'; enterprise_include_once('include/functions_metaconsole.php'); // Clean the possible blanks introduced by the included files ob_clean(); // Get list of agent + ip // Params: // * search_agents 1 // * id_agent // * q // * id_group $search_agents = (bool) get_parameter('search_agents'); $get_agents_interfaces = (bool) get_parameter('get_agents_interfaces'); $id_agents = get_parameter('id_agents', []); $get_agents_group = (bool) get_parameter('get_agents_group', false); $force_local = (bool) get_parameter('force_local', false); // Agent detail filter. $load_filter_modal = get_parameter('load_filter_modal', 0); $save_filter_modal = get_parameter('save_filter_modal', 0); $get_agent_filters = get_parameter('get_agent_filters', 0); $save_agent_filter = get_parameter('save_agent_filter', 0); $update_agent_filter = get_parameter('update_agent_filter', 0); $delete_agent_filter = get_parameter('delete_agent_filter', 0); if (https_is_running()) { header('Content-type: application/json'); } if ($get_agents_interfaces) { $agents_interfaces = agents_get_network_interfaces($id_agents); // Include alias per agent. foreach ($agents_interfaces as $key => $value) { $agent_alias = agents_get_alias($key); $agents_interfaces[$key]['agent_alias'] = $agent_alias; } echo json_encode($agents_interfaces); return; } if ($get_agents_group) { $id_group = (int) get_parameter('id_group', -1); $mode = (string) get_parameter('mode', 'json'); $id_server = (int) get_parameter('id_server', 0); $serialized = (bool) get_parameter('serialized'); $return = []; if ($id_group != -1) { $filter = []; if (is_metaconsole() && !empty($id_server)) { $filter['id_server'] = $id_server; } $return = agents_get_group_agents($id_group, $filter, 'none', false, false, $serialized); } switch ($mode) { case 'json': default: echo json_encode($return); break; } return; } if ($search_agents && (!is_metaconsole() || $force_local)) { $id_agent = (int) get_parameter('id_agent'); $string = (string) get_parameter('q'); $string = strtoupper($string); // q is what autocomplete plugin gives $id_group = (int) get_parameter('id_group', -1); $addedItems = html_entity_decode((string) get_parameter('add')); $addedItems = json_decode($addedItems); $all = (string) get_parameter('all', 'all'); $delete_offspring_agents = (int) get_parameter('delete_offspring_agents', 0); if ($addedItems != null) { foreach ($addedItems as $item) { echo $item."|\n"; } } $filter = []; if ($id_group != -1) { if ($id_group == 0) { $user_groups = users_get_groups($config['id_user'], 'AR', true); $filter['id_grupo'] = array_keys($user_groups); } else { $filter['id_grupo'] = $id_group; } } if ($all === 'enabled') { $filter['disabled'] = 1; } else { $filter['disabled'] = 0; } $data = []; // Get agents for only the alias. $filter_alias = $filter; $filter_alias[] = '(UPPER(alias) LIKE "%'.$string.'%")'; $agents = agents_get_agents($filter_alias, ['id_agente', 'nombre', 'direccion', 'alias']); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']), 'ip' => io_safe_output($agent['direccion']), 'filter' => 'alias', ]; } } // Get agents for only the name. $filter_agents = $filter; $filter_agents[] = '(UPPER(alias) NOT LIKE "%'.$string.'%" AND UPPER(nombre) LIKE "%'.$string.'%")'; $agents = agents_get_agents($filter_agents, ['id_agente', 'nombre', 'direccion', 'alias']); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']), 'ip' => io_safe_output($agent['direccion']), 'filter' => 'agent', ]; } } // Get agents for only the address. $filter_address = $filter; $filter_address[] = '(UPPER(alias) NOT LIKE "%'.$string.'%" AND UPPER(nombre) NOT LIKE "%'.$string.'%" AND UPPER(direccion) LIKE "%'.$string.'%")'; $agents = agents_get_agents($filter_address, ['id_agente', 'nombre', 'direccion', 'alias']); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']), 'ip' => io_safe_output($agent['direccion']), 'filter' => 'address', ]; } } // Get agents for only the description. $filter_description = $filter; $filter_description[] = '(UPPER(alias) NOT LIKE "%'.$string.'%" AND UPPER(nombre) NOT LIKE "%'.$string.'%" AND UPPER(direccion) NOT LIKE "%'.$string.'%" AND UPPER(comentarios) LIKE "%'.$string.'%")'; $agents = agents_get_agents($filter_description, ['id_agente', 'nombre', 'direccion', 'alias']); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']), 'ip' => io_safe_output($agent['direccion']), 'filter' => 'description', ]; } } if (empty($data) === false && $delete_offspring_agents !== 0) { // Gets offspring and deletes them, including himself. $agents_offspring = agents_get_offspring($delete_offspring_agents); if (empty($agents_offspring) === false) { foreach ($data as $key => $value) { if (isset($agents_offspring[$value['id']]) === true) { unset($data[$key]); } } } } echo json_encode($data); return; } else if ($search_agents && is_metaconsole()) { $id_agent = (int) get_parameter('id_agent'); $string = (string) get_parameter('q'); // Q is what autocomplete plugin gives. $id_group = (int) get_parameter('id_group', -1); $addedItems = html_entity_decode((string) get_parameter('add')); $addedItems = json_decode($addedItems); $all = (string) get_parameter('all', 'all'); if ($addedItems != null) { foreach ($addedItems as $item) { echo $item."|\n"; } } $data = []; $fields = [ 'id_tagente AS id_agente', 'nombre', 'alias', 'direccion', 'id_tmetaconsole_setup AS id_server', 'server_name', ]; $filter = []; if ($id_group != -1) { if ($id_group == 0) { $user_groups = users_get_groups($config['id_user'], 'AR', true); $filter['id_grupo'] = array_keys($user_groups); } else { $filter['id_grupo'] = $id_group; } } switch ($all) { case 'enabled': $filter['disabled'] = 0; break; default: // Not possible. break; } if (empty($id_agent) === false) { $filter['id_agente'] = $id_agent; } if (empty($string) === false) { // Get agents for only the alias. $filter_alias = $filter; $filter_alias[] = '(alias LIKE "%'.$string.'%")'; $agents = db_get_all_rows_filter( 'tmetaconsole_agent', $filter_alias, $fields ); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']).' ('.io_safe_output($agent['server_name']).')', 'ip' => io_safe_output($agent['direccion']), 'id_server' => $agent['id_server'], 'filter' => 'alias', ]; } } // Get agents for only the name. $filter_agents = $filter; $filter_agents[] = '(alias NOT LIKE "%'.$string.'%" AND nombre LIKE "%'.$string.'%")'; $agents = db_get_all_rows_filter( 'tmetaconsole_agent', $filter_agents, $fields ); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']).' ('.io_safe_output($agent['server_name']).')', 'ip' => io_safe_output($agent['direccion']), 'id_server' => $agent['id_server'], 'filter' => 'agent', ]; } } // Get agents for only the address. $filter_address = $filter; $filter_address[] = '(alias NOT LIKE "%'.$string.'%" AND nombre NOT LIKE "%'.$string.'%" AND direccion LIKE "%'.$string.'%")'; $agents = db_get_all_rows_filter( 'tmetaconsole_agent', $filter_address, $fields ); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']).' ('.io_safe_output($agent['server_name']).')', 'ip' => io_safe_output($agent['direccion']), 'id_server' => $agent['id_server'], 'filter' => 'address', ]; } } // Get agents for only the description. $filter_description = $filter; $filter_description[] = '(alias NOT LIKE "%'.$string.'%" AND nombre NOT LIKE "%'.$string.'%" AND direccion NOT LIKE "%'.$string.'%" AND comentarios LIKE "%'.$string.'%")'; $agents = db_get_all_rows_filter( 'tmetaconsole_agent', $filter_description, $fields ); if ($agents !== false) { foreach ($agents as $agent) { $data[] = [ 'id' => $agent['id_agente'], 'name' => io_safe_output($agent['nombre']), 'alias' => io_safe_output($agent['alias']).' ('.io_safe_output($agent['server_name']).')', 'ip' => io_safe_output($agent['direccion']), 'id_server' => $agent['id_server'], 'filter' => 'description', ]; } } } echo json_encode($data); return; } // Saves an event filter. if ($save_agent_filter) { $values = []; $values['id_name'] = get_parameter('id_name'); $values['group_id'] = get_parameter('group_id'); $values['recursion'] = get_parameter('recursion'); $values['status'] = get_parameter('status'); $values['search'] = get_parameter('search'); $values['id_os'] = get_parameter('id_os'); $values['policies'] = json_encode(get_parameter('policies')); $values['search_custom'] = get_parameter('search_custom'); $values['ag_custom_fields'] = get_parameter('ag_custom_fields'); $values['id_group_filter'] = get_parameter('id_group_filter'); $exists = (bool) db_get_value_filter( 'id_filter', 'tagent_filter', $values ); if ($exists === true) { echo 'duplicate'; } else { $result = db_process_sql_insert('tagent_filter', $values); if ($result === false) { echo 'error'; } else { echo $result; } } } if ($update_agent_filter) { $values = []; $id = get_parameter('id'); $values['group_id'] = get_parameter('group_id'); $values['recursion'] = get_parameter('recursion'); $values['status'] = get_parameter('status'); $values['search'] = get_parameter('search'); $values['id_os'] = get_parameter('id_os'); $values['policies'] = json_encode(get_parameter('policies')); $values['search_custom'] = get_parameter('search_custom'); $values['ag_custom_fields'] = get_parameter('ag_custom_fields'); $result = db_process_sql_update( 'tagent_filter', $values, ['id_filter' => $id] ); if ($result === false) { echo 'error'; } else { echo 'ok'; } } if ($delete_agent_filter) { $id = get_parameter('id'); $user_groups = users_get_groups( $config['id_user'], 'AW', users_can_manage_group_all('AW'), true ); $sql = 'DELETE FROM tagent_filter WHERE id_filter = '.$id.' AND id_group_filter IN ('.implode(',', array_keys($user_groups)).')'; $agent_filters = db_process_sql($sql); if ($agent_filters === false) { echo 'error'; } else { echo 'ok'; } } if ($get_agent_filters) { $user_groups = users_get_groups( $config['id_user'], 'AR', users_can_manage_group_all('AR'), true ); $sql = 'SELECT id_filter, id_name FROM tagent_filter WHERE id_group_filter IN ('.implode(',', array_keys($user_groups)).')'; $agent_filters = db_get_all_rows_sql($sql); $result = []; if ($agent_filters !== false) { foreach ($agent_filters as $agent_filter) { $result[$agent_filter['id_filter']] = $agent_filter['id_name']; } } echo io_json_mb_encode($result); } if ((int) $load_filter_modal === 1) { $user_groups = users_get_groups( $config['id_user'], 'AR', users_can_manage_group_all('AR'), true ); $sql = 'SELECT id_filter, id_name FROM tagent_filter WHERE id_group_filter IN ('.implode(',', array_keys($user_groups)).')'; $agent_filters = db_get_all_rows_sql($sql); $filters = []; foreach ($agent_filters as $agent_filter) { $filters[$agent_filter['id_filter']] = $agent_filter['id_name']; } echo '<div id="load-filter-select" class="load-filter-modal">'; echo '<form method="post" id="form_load_filter" action="index.php?sec=view&sec2=operation/agentes/estado_agente&pure=">'; $table = new StdClass; $table->id = 'load_filter_form'; $table->width = '100%'; $table->class = 'filter-table-adv'; $data = []; $table->rowid[3] = 'update_filter_row1'; $data[0] = html_print_label_input_block( __('Load filter'), html_print_select( $filters, 'filter_id', $current, '', __('None'), 0, true, false, true, '', false ) ); $table->data[] = $data; $table->rowclass[] = ''; html_print_table($table); html_print_div( [ 'class' => 'action-buttons', 'content' => html_print_submit_button( __('Load filter'), 'srcbutton', false, [ 'icon' => 'search', 'mode' => 'mini', ], true ), ], false ); echo html_print_input_hidden('load_filter', 1, true); echo '</form>'; echo '</div>'; ?> <script type="text/javascript"> function show_filter() { $("#load-filter-select").dialog({ resizable: true, draggable: true, modal: false, closeOnEscape: true, width: 450 }); } $(document).ready(function() { show_filter(); }); </script> <?php return; } if ($save_filter_modal) { echo '<div id="save-filter-select">'; if (check_acl($config['id_user'], 0, 'AW')) { echo '<div id="#info_box"></div>'; $table = new StdClass; $table->id = 'save_filter_form'; $table->width = '100%'; $table->size = []; $table->size[0] = '50%'; $table->size[1] = '50%'; $table->class = 'filter-table-adv'; $data = []; $table->rowid[0] = 'update_save_selector'; $data[0][0] = html_print_label_input_block( __('New filter'), html_print_radio_button( 'filter_mode', 'new', '', true, true ) ); $data[0][1] = html_print_label_input_block( __('Update/delete filter'), html_print_radio_button( 'filter_mode', 'update', '', false, true ) ); $table->rowid[1] = 'save_filter_row1'; $data[1][0] = html_print_label_input_block( __('Filter name'), html_print_input_text('id_name', '', '', 15, 255, true) ); $labelInput = __('Filter group'); if (is_metaconsole() === true) { $labelInput = __('Save in Group'); } $user_groups_array = users_get_groups_for_select( $config['id_user'], 'AW', users_can_manage_group_all('AW'), true ); $data[1][1] = html_print_label_input_block( $labelInput, html_print_select( $user_groups_array, 'id_group_filter_dialog', $id_group_filter, '', '', 0, true, false, false ), ['div_class' => 'filter-group-dialog'] ); $table->rowid[2] = 'save_filter_row2'; $table->data[] = $data; $table->rowclass[] = ''; $user_groups = users_get_groups( $config['id_user'], 'AW', users_can_manage_group_all('AW'), true ); $sql = 'SELECT id_filter, id_name FROM tagent_filter WHERE id_group_filter IN ('.implode(',', array_keys($user_groups)).')'; $agent_filters = db_get_all_rows_sql($sql); $_filters_update = []; if ($agent_filters !== false) { foreach ($agent_filters as $agent_filter) { $_filters_update[$agent_filter['id_filter']] = $agent_filter['id_name']; } } $data[2][0] = html_print_label_input_block( __('Filter'), html_print_select( $_filters_update, 'overwrite_filter', '', '', '', 0, true ) ); $table->data = $data; html_print_table($table); html_print_div( [ 'id' => 'submit-save_filter', 'class' => 'action-buttons', 'content' => html_print_submit_button( __('Save current filter'), 'srcbutton', false, [ 'icon' => 'search', 'mode' => 'mini', 'onclick' => 'save_new_filter();', ], true ), ], false ); $input_actions = html_print_submit_button( __('Delete filter'), 'delete_filter', false, [ 'icon' => 'delete', 'mode' => 'mini', 'onclick' => 'save_delete_filter();', ], true ); $input_actions .= html_print_submit_button( __('Update filter'), 'srcbutton', false, [ 'icon' => 'update', 'mode' => 'mini', 'onclick' => 'save_update_filter();', ], true ); html_print_div( [ 'id' => 'update_filter_row', 'class' => 'action-buttons', 'content' => $input_actions, ], false ); } else { include 'general/noaccess.php'; } echo '</div>'; ?> <script type="text/javascript"> function show_save_filter() { $('#save_filter_row2').hide(); $('#update_filter_row').hide(); $('#update_delete_row').hide(); $('.filter-group-dialog').show(); // Filter save mode selector $("[name='filter_mode']").click(function() { if ($(this).val() == 'new') { $('#save_filter_row2').hide(); $('#submit-save_filter').show(); $('#update_filter_row').hide(); $('#update_delete_row').hide(); $('.filter-group-dialog').show(); } else { $('#save_filter_row2').show(); $('#update_filter_row').show(); $('#submit-save_filter').hide(); $('#update_delete_row').show(); $('.filter-group-dialog').hide(); } }); $("#save-filter-select").dialog({ resizable: true, draggable: true, modal: false, closeOnEscape: true, width: 450, height: 350 }); } function save_new_filter() { // If the filter name is blank show error if ($('#text-id_name').val() == '') { $('#show_filter_error').html("<h3 class='error'><?php echo __('Filter name cannot be left blank'); ?></h3>"); // Close dialog $('.ui-dialog-titlebar-close').trigger('click'); return false; } var custom_fields_values = $('input[name^="ag_custom_fields"]').map(function() { return this.value; }).get(); var custom_fields_ids = $("input[name^='ag_custom_fields']").map(function() { var name = $(this).attr("name"); var number = name.match(/\[(.*?)\]/)[1]; return number; }).get(); var ag_custom_fields = custom_fields_ids.reduce(function(result, custom_fields_id, index) { result[custom_fields_id] = custom_fields_values[index]; return result; }, {}); var id_filter_save; jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "save_agent_filter" : 1, "id_name": $("#text-id_name").val(), "id" : $("#overwrite_filter").val(), "group_id" : $("#group_id").val(), "recursion" : $("#checkbox-recursion").is(':checked'), "status" : $("#status").val(), "search" : $("#text-search").val(), "id_os" : $("#os").val(), "policies" : $("#policies").val(), "search_custom" : $("#text-search_custom").val(), "ag_custom_fields": JSON.stringify(ag_custom_fields), "id_group_filter": $("#id_group_filter_dialog").val(), }, function (data) { $("#info_box").hide(); if (data == 'error') { $("#info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "error_create_filter") { return true; } else return false; }).show(); } else if (data == 'duplicate') { $("#info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "duplicate_create_filter") { return true; } else return false; }).show(); } else { id_filter_save = data; $("#info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "success_create_filter") { return true; } else return false; }).show(); } // First remove all options of filters select. $('#filter_id').find('option').remove().end(); // Add 'none' option. $('#filter_id').append ($('<option></option>').html ( <?php echo "'".__('None')."'"; ?> ).attr ("value", 0)); // Reload filters select. jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "get_agent_filters" : 1 }, function (data) { jQuery.each (data, function (i, val) { s = js_html_entity_decode(val); $('#filter_id').append($('<option></option>').html (s).attr("value", i)); }); }, "json" ); // Close dialog. $("#save-filter-select").dialog('close'); } ); } function save_update_filter() { var id_filter_update = $("#overwrite_filter").val(); var name_filter_update = $("#overwrite_filter option[value='"+id_filter_update+"']").text(); var custom_fields_values = $('input[name^="ag_custom_fields"]').map(function() { return this.value; }).get(); var custom_fields_ids = $("input[name^='ag_custom_fields']").map(function() { var name = $(this).attr("name"); var number = name.match(/\[(.*?)\]/)[1]; return number; }).get(); var ag_custom_fields = custom_fields_ids.reduce(function(result, custom_fields_id, index) { result[custom_fields_id] = custom_fields_values[index]; return result; }, {}); jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "update_agent_filter" : 1, "id" : $("#overwrite_filter").val(), "group_id" : $("#group_id").val(), "recursion" : $("#checkbox-recursion").is(':checked'), "status" : $("#status").val(), "search" : $("#text-search").val(), "id_os" : $("#os").val(), "policies" : $("#policies").val(), "search_custom" : $("#text-search_custom").val(), "ag_custom_fields": JSON.stringify(ag_custom_fields), }, function (data) { $(".info_box").hide(); if (data == 'ok') { $(".info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "success_update_filter") { return true; } else return false; }).show(); } else { $(".info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "error_create_filter") { return true; } else return false; }).show(); } }); // First remove all options of filters select. $('#filter_id').find('option').remove().end(); // Add 'none' option. $('#filter_id').append ($('<option></option>').html ( <?php echo "'".__('None')."'"; ?> ).attr ("value", 0)); // Reload filters select. jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "get_agent_filters" : 1 }, function (data) { jQuery.each (data, function (i, val) { s = js_html_entity_decode(val); if (i == id_filter_update) { $('#filter_id').append ($('<option selected="selected"></option>').html (s).attr ("value", i)); } else { $('#filter_id').append ($('<option></option>').html (s).attr ("value", i)); } }); }, "json" ); // Close dialog $('.ui-dialog-titlebar-close').trigger('click'); // Update the info with the loaded filter $("#hidden-id_name").val($('#text-id_name').val()); $('#filter_loaded_span').html($('#filter_loaded_text').html() + ': ' + name_filter_update); return false; } function save_delete_filter() { var id_filter_update = $("#overwrite_filter").val(); jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "delete_agent_filter" : 1, "id" : $("#overwrite_filter").val(), }, function (data) { $(".info_box").hide(); if (data == 'ok') { $(".info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "success_update_filter") { return true; } else return false; }).show(); } else { $(".info_box").filter(function(i, item) { if ($(item).data('type_info_box') == "error_create_filter") { return true; } else return false; }).show(); } }); // First remove all options of filters select. $('#filter_id').find('option').remove().end(); // Add 'none' option. $('#filter_id').append ($('<option></option>').html ( <?php echo "'".__('None')."'"; ?> ).attr ("value", 0)); // Reload filters select. jQuery.post ("<?php echo ui_get_full_url('ajax.php', false, false, false); ?>", { "page" : "include/ajax/agent", "get_agent_filters" : 1 }, function (data) { jQuery.each (data, function (i, val) { s = js_html_entity_decode(val); if (i == id_filter_update) { $('#filter_id').append ($('<option selected="selected"></option>').html (s).attr ("value", i)); } else { $('#filter_id').append ($('<option></option>').html (s).attr ("value", i)); } }); }, "json" ); // Close dialog $('.ui-dialog-titlebar-close').trigger('click'); return false; } $(document).ready(function() { show_save_filter(); }); </script> <?php return; } return;