'string', 'data' => urldecode($other), ]; break; default: if (strpos($otherType, 'url_encode_separator_') !== false) { $separator = str_replace('url_encode_separator_', '', $otherType); $returnVar = [ 'type' => 'array', 'data' => explode($separator, $other), ]; foreach ($returnVar['data'] as $index => $element) { $returnVar['data'][$index] = $rawDecode ? rawurldecode($element) : urldecode($element); } } else { $returnVar = [ 'type' => 'string', 'data' => $rawDecode ? rawurldecode($other) : urldecode($other), ]; } break; } return $returnVar; } /** * * @param $typeError * @param $returnType * @return unknown_type */ function returnError($typeError, $returnType='string') { switch ($typeError) { case 'no_set_no_get_no_help': returnData( $returnType, [ 'type' => 'string', 'data' => __('Not `set`, `get` or `help` operation selected.'), ] ); break; case 'no_exist_operation': returnData( $returnType, [ 'type' => 'string', 'data' => __('This operation does not exist.'), ] ); break; case 'id_not_found': returnData( $returnType, [ 'type' => 'string', 'data' => __('The Id does not exist in database.'), ] ); break; case 'not_allowed_operation_cluster': returnData( $returnType, [ 'type' => 'string', 'data' => __('This operation can not be used in cluster elements.'), ] ); break; case 'forbidden': returnData( $returnType, [ 'type' => 'string', 'data' => __('The user has not enough permissions for perform this action.'), ] ); break; case 'no_data_to_show': returnData( $returnType, [ 'type' => 'string', 'data' => __('No data to show.'), ] ); break; case 'centralized': returnData( $returnType, [ 'type' => 'string', 'data' => __('This console is not the environment administrator. Please, manage this feature from centralized manager console (Metaconsole).'), ] ); break; case 'auth_error': returnData( $returnType, [ 'type' => 'string', 'data' => __('Auth error'), ] ); break; case 'license_error': returnData( $returnType, [ 'type' => 'string', 'data' => __('License not allowed for this operation.'), ] ); break; default: returnData( $returnType, [ 'type' => 'string', 'data' => __($typeError), ] ); break; } } /** * @param $returnType * @param $data * @param $separator * @return */ function returnData($returnType, $data, $separator=';') { switch ($returnType) { case 'string': if (is_array($data['data'])) { echo convert_array_multi($data['data'], $separator); } else { echo $data['data']; } break; case 'csv': case 'csv_head': if (is_array($data['data'])) { if (array_key_exists('list_index', $data)) { if ($returnType == 'csv_head') { header('Content-type: text/csv'); foreach ($data['list_index'] as $index) { echo $index; if (end($data['list_index']) == $index) { echo "\n"; } else { echo $separator; } } } foreach ($data['data'] as $dataContent) { foreach ($data['list_index'] as $index) { if (array_key_exists($index, $dataContent)) { echo str_replace("\n", ' ', $dataContent[$index]); } if (end($data['list_index']) == $index) { echo "\n"; } else { echo $separator; } } } } else { if (!empty($data['data'])) { foreach ($data['data'] as $dataContent) { $clean = array_map('array_apply_io_safe_output', (array) $dataContent); foreach ($clean as $k => $v) { $clean[$k] = str_replace("\r", "\n", $clean[$k]); $clean[$k] = str_replace("\n", ' ', $clean[$k]); $clean[$k] = strip_tags($clean[$k]); $clean[$k] = str_replace(';', ' ', $clean[$k]); } $row = implode($separator, $clean); echo $row."\n"; } } } } else { echo $data['data']; } break; case 'json': $data = array_apply_io_safe_output($data); header('Content-type: application/json'); // Allows extra parameters to json_encode, like JSON_FORCE_OBJECT if ($separator == ';') { $separator = null; } if (empty($separator)) { echo json_encode($data); } else { echo json_encode($data, $separator); } break; } } function array_apply_io_safe_output($item) { return io_safe_output($item); } /** * * @param $ip * @return unknown_type */ function isInACL($ip) { global $config; if (! is_array($config['list_ACL_IPs_for_API'])) { $config['list_ACL_IPs_for_API'] = explode(';', $config['list_ACL_IPs_for_API']); } if (in_array($ip, $config['list_ACL_IPs_for_API'])) { return true; } // If the IP is not in the list, we check one by one, all the wildcard registers foreach ($config['list_ACL_IPs_for_API'] as $acl_ip) { if (preg_match('/\*/', $acl_ip)) { if ($acl_ip[0] == '*' && strlen($acl_ip) > 1) { // example *.lab.artica.es == 151.80.15.* $acl_ip = str_replace('*.', '', $acl_ip); $name = []; $name = gethostbyname($acl_ip); $names = explode('.', $name); $names[3] = ''; $names = implode('.', $names); if (preg_match('/'.$names.'/', $ip)) { return true; } } else { // example 192.168.70.* or * $acl_ip = str_replace('.', '\.', $acl_ip); // Replace wilcard by .* to do efective in regular expression $acl_ip = str_replace('*', '.*', $acl_ip); // If the string match with the beginning of the IP give it access if (preg_match('/'.$acl_ip.'/', $ip)) { return true; } } // Scape for protection } else { // example lab.artica.es without '*' $name = []; $name = gethostbyname($acl_ip); if (preg_match('/'.$name.'/', $ip, $matches)) { // This is for false matches, like '' or $. if (count($matches) == 1 && $matches[0] == '') { continue; } else { return true; } } } } return false; } // Return string OK,[version],[build] function api_get_test() { global $pandora_version; global $build_version; echo "OK,$pandora_version,$build_version"; if (defined('METACONSOLE')) { echo ',meta'; } } // Return OK if agent cache is activated function api_get_test_agent_cache() { if (defined('METACONSOLE')) { return; } $status = enterprise_hook('test_agent_cache', []); if ($status === ENTERPRISE_NOT_HOOK) { echo 'ERR'; return; } echo $status; } // -------------------------DEFINED OPERATIONS FUNCTIONS----------------- /** * Example: http://localhost/pandora_console/include/api.php?op=get&op2=license&user=admin&apipass=1234&pass=pandora&return_type=json * Retrieve license information. * * @param null $trash1 Not used. * @param null $trash1 Not used. * @param null $trash1 Not used. * @param string $returnType Return type (string, json...). * * @return void */ function api_get_license($trash1, $trash2, $trash3, $returnType='json') { global $config; check_login(); if (! check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', $returnType); return; } enterprise_include_once('include/functions_license.php'); $license = enterprise_hook('license_get_info'); if ($license === ENTERPRISE_NOT_HOOK) { // Not an enterprise environment? if (license_free()) { $license = 'PANDORA_FREE'; } returnData( $returnType, [ 'type' => 'array', 'data' => ['license_mode' => $license], ] ); return; } returnData( $returnType, [ 'type' => 'array', 'data' => $license, ] ); } /** * Example: http://localhost/pandora_console/include/api.php?op=get&op2=license_remaining&user=admin&apipass=1234&pass=pandora&return_type=json * Retrieve license status agents or modules left. * * @param null $trash1 Not used. * @param null $trash1 Not used. * @param null $trash1 Not used. * @param string $returnType Return type (string, json...). * * @return void */ function api_get_license_remaining( $trash1, $trash2, $trash3, $returnType='json' ) { enterprise_include_once('include/functions_license.php'); $license = enterprise_hook('license_get_info'); if ($license === ENTERPRISE_NOT_HOOK) { if (license_free()) { returnData( $returnType, [ 'type' => 'integer', 'data' => PHP_INT_MAX, ] ); } else { returnError('get-license', 'Failed to verify license.'); } return; } returnData( $returnType, [ 'type' => 'integer', 'data' => ($license['limit'] - $license['count_enabled']), ] ); } function api_get_groups($thrash1, $thrash2, $other, $returnType, $user_in_db) { $returnAllGroup = true; $returnAllColumns = false; if (isset($other['data'][1])) { $returnAllGroup = ( $other['data'][1] == '1' ? true : false); } if (isset($other['data'][2])) { $returnAllColumns = ( $other['data'][2] == '1' ? true : false); } $groups = users_get_groups($user_in_db, 'AR', $returnAllGroup, $returnAllColumns); $data_groups = []; foreach ($groups as $id => $group) { $data_groups[] = [ $id, $group, ]; } if (!isset($other['data'][0])) { $separator = ';'; // by default } else { $separator = $other['data'][0]; } $data['type'] = 'array'; $data['data'] = $data_groups; returnData($returnType, $data, $separator); } function api_get_agent_module_name_last_value($agentName, $moduleName, $other=';', $returnType) { $idAgent = agents_get_agent_id($agentName); $sql = sprintf( 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente = %d AND nombre LIKE "%s"', $idAgent, $moduleName ); $idModuleAgent = db_get_value_sql($sql); api_get_module_last_value($idModuleAgent, null, $other, $returnType); } function api_get_agent_module_name_last_value_alias($alias, $moduleName, $other=';', $returnType) { $sql = sprintf( 'SELECT tagente_modulo.id_agente_modulo FROM tagente_modulo INNER JOIN tagente ON tagente_modulo.id_agente = tagente.id_agente WHERE tagente.alias LIKE "%s" AND tagente_modulo.nombre LIKE "%s"', $alias, $moduleName ); $idModuleAgent = db_get_value_sql($sql); api_get_module_last_value($idModuleAgent, null, $other, $returnType); } function api_get_module_last_value($idAgentModule, $trash1, $other=';', $returnType) { global $config; if (defined('METACONSOLE')) { return; } $check_access = agents_check_access_agent(modules_get_agentmodule_agent($idAgentModule)); if ($check_access === false || !check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', $returnType); return; } $sql = sprintf( 'SELECT datos FROM tagente_estado WHERE id_agente_modulo = %d', $idAgentModule ); $value = db_get_value_sql($sql); if ($value === false) { if (isset($other['data'][1]) && $other['data'][0] == 'error_value') { returnData($returnType, ['type' => 'string', 'data' => $other['data'][1]]); } else if ($check_access) { returnError('no_data_to_show', $returnType); } else { returnError('id_not_found', $returnType); } return; } $data = [ 'type' => 'string', 'data' => $value, ]; returnData($returnType, $data); } /*** * end of DB column mapping table ***/ /** * * @param $trash1 * @param $trahs2 * @param mixed $other If $other is string is only the separator, * but if it's array, $other as param is ;;(,...) in this order * and separator char (after text ; ) must be diferent that separator (and other) url (pass in param othermode as othermode=url_encode_separator_) * example: * * return csv with fields type_row,group_id and agent_name, separate with ";" and the return of the text replace for " " * api.php?op=get&op2=tree_agents&return_type=csv&other=;| |type_row,group_id,agent_name&other_mode=url_encode_separator_| * * @param $returnType * @return unknown_type */ function api_get_tree_agents($trash1, $trahs2, $other, $returnType) { global $config; if (defined('METACONSOLE')) { return; } if ($other['type'] == 'array') { $separator = $other['data'][0]; $returnReplace = $other['data'][1]; if (trim($other['data'][2]) == '') { $fields = false; } else { $fields = explode(',', $other['data'][2]); foreach ($fields as $index => $field) { $fields[$index] = trim($field); } } } else { if (strlen($other['data']) == 0) { $separator = ';'; // by default } else { $separator = $other['data']; } $returnReplace = ' '; $fields = false; } /* NOTE: if you want to add an output field, you have to add it to; 1. $master_fields (field name) 2. one of following field_column_mapping array (a pair of field name and corresponding column designation) e.g. To add a new field named 'agent_NEWFIELD' that comes from tagente's COLUMN_X , you have to add; 1. "agent_NEW_FIELD" to $master_fields 2. "'agent_NEW_FIELD' => 'agent_NEWFIELD as COLUMN_X'" to $agent_field_column_mapping */ // all of output field names $master_fields = [ 'type_row', 'group_id', 'group_name', 'group_parent', 'disabled', 'custom_id', 'group_description', 'group_contact', 'group_other', 'agent_id', 'alias', 'agent_direction', 'agent_comentary', 'agent_id_group', 'agent_last_contant', 'agent_mode', 'agent_interval', 'agent_id_os', 'agent_os_version', 'agent_version', 'agent_last_remote_contact', 'agent_disabled', 'agent_id_parent', 'agent_custom_id', 'agent_server_name', 'agent_cascade_protection', 'agent_cascade_protection_module', 'agent_name', 'module_id_agent_modulo', 'module_id_agent', 'module_id_module_type', 'module_description', 'module_name', 'module_max', 'module_min', 'module_interval', 'module_tcp_port', 'module_tcp_send', 'module_tcp_rcv', 'module_snmp_community', 'module_snmp_oid', 'module_ip_target', 'module_id_module_group', 'module_flag', 'module_id_module', 'module_disabled', 'module_id_export', 'module_plugin_parameter', 'module_plugin_pass', 'module_plugin_user', 'module_id_plugin', 'module_post_process', 'module_prediction_module', 'module_max_timeout', 'module_max_retries', 'module_custom_id', 'module_history_data', 'module_min_warning', 'module_max_warning', 'module_str_warning', 'module_min_critical', 'module_max_critical', 'module_str_critical', 'module_min_ff_event', 'module_delete_pending', 'module_id_agent_state', 'module_data', 'module_timestamp', 'module_state', 'module_last_try', 'module_utimestamp', 'module_current_interval', 'module_running_by', 'module_last_execution_try', 'module_status_changes', 'module_last_status', 'module_plugin_macros', 'module_macros', 'module_critical_inverse', 'module_warning_inverse', 'alert_id_agent_module', 'alert_id_alert_template', 'alert_internal_counter', 'alert_last_fired', 'alert_last_reference', 'alert_times_fired', 'alert_disabled', 'alert_force_execution', 'alert_id_alert_action', 'alert_type', 'alert_value', 'alert_matches_value', 'alert_max_value', 'alert_min_value', 'alert_time_threshold', 'alert_max_alerts', 'alert_min_alerts', 'alert_time_from', 'alert_time_to', 'alert_monday', 'alert_tuesday', 'alert_wednesday', 'alert_thursday', 'alert_friday', 'alert_saturday', 'alert_sunday', 'alert_recovery_notify', 'alert_field2_recovery', 'alert_field3_recovery', 'alert_id_alert_template_module', 'alert_fires_min', 'alert_fires_max', 'alert_id_alert_command', 'alert_command', 'alert_internal', 'alert_template_modules_id', 'alert_templates_id', 'alert_template_module_actions_id', 'alert_actions_id', 'alert_commands_id', 'alert_templates_name', 'alert_actions_name', 'alert_commands_name', 'alert_templates_description', 'alert_commands_description', 'alert_template_modules_priority', 'alert_templates_priority', 'alert_templates_field1', 'alert_actions_field1', 'alert_templates_field2', 'alert_actions_field2', 'alert_templates_field3', 'alert_actions_field3', 'alert_templates_id_group', 'alert_actions_id_group', ]; /* * Agent related field mappings (output field => column designation for 'tagente'). * agent_id is not in this list (because it is mandatory). * agent_id_group is not in this list. */ $agent_field_column_mapping = [ 'agent_name' => 'nombre as agent_name', 'agent_direction' => 'direccion as agent_direction', 'agent_comentary' => 'comentarios as agent_comentary', 'agent_last_contant' => 'ultimo_contacto as agent_last_contant', 'agent_mode' => 'modo as agent_mode', 'agent_interval' => 'intervalo as agent_interval', 'agent_id_os' => 'id_os as agent_id_os', 'agent_os_version' => 'os_version as agent_os_version', 'agent_version' => 'agent_version as agent_version', 'agent_last_remote_contact' => 'ultimo_contacto_remoto as agent_last_remote_contact', 'agent_disabled' => 'disabled as agent_disabled', 'agent_id_parent' => 'id_parent as agent_id_parent', 'agent_custom_id' => 'custom_id as agent_custom_id', 'agent_server_name' => 'server_name as agent_server_name', 'agent_cascade_protection' => 'cascade_protection as agent_cascade_protection', 'agent_cascade_protection_module' => 'cascade_protection_module as agent_cascade_protection_module', ]; // module related field mappings 1/2 (output field => column for 'tagente_modulo') // module_id_agent_modulo is not in this list // module_plugin_user, module_plugin_pass, module_plugin_macros are not in this list due to security purposes. $module_field_column_mapping = [ 'module_id_agent' => 'id_agente as module_id_agent', 'module_id_module_type' => 'id_tipo_modulo as module_id_module_type', 'module_description' => 'descripcion as module_description', 'module_name' => 'nombre as module_name', 'module_max' => 'max as module_max', 'module_min' => 'min as module_min', 'module_interval' => 'module_interval', 'module_tcp_port' => 'tcp_port as module_tcp_port', 'module_tcp_send' => 'tcp_send as module_tcp_send', 'module_tcp_rcv' => 'tcp_rcv as module_tcp_rcv', 'module_snmp_community' => 'snmp_community as module_snmp_community', 'module_snmp_oid' => 'snmp_oid as module_snmp_oid', 'module_ip_target' => 'ip_target as module_ip_target', 'module_id_module_group' => 'id_module_group as module_id_module_group', 'module_flag' => 'flag as module_flag', 'module_id_module' => 'id_modulo as module_id_module', 'module_disabled' => 'disabled as module_disabled', 'module_id_export' => 'id_export as module_id_export', 'module_plugin_parameter' => 'plugin_parameter as module_plugin_parameter', 'module_id_plugin' => 'id_plugin as module_id_plugin', 'module_post_process' => 'post_process as module_post_process', 'module_prediction_module' => 'prediction_module as module_prediction_module', 'module_max_timeout' => 'max_timeout as module_max_timeout', 'module_max_retries' => 'max_retries as module_max_retries', 'module_custom_id' => 'custom_id as module_custom_id', 'module_history_data' => 'history_data as module_history_data', 'module_min_warning' => 'min_warning as module_min_warning', 'module_max_warning' => 'max_warning as module_max_warning', 'module_str_warning' => 'str_warning as module_str_warning', 'module_min_critical' => 'min_critical as module_min_critical', 'module_max_critical' => 'max_critical as module_max_critical', 'module_str_critical' => 'str_critical as module_str_critical', 'module_min_ff_event' => 'min_ff_event as module_min_ff_event', 'module_delete_pending' => 'delete_pending as module_delete_pending', 'module_macros' => 'module_macros as module_macros', 'module_critical_inverse' => 'critical_inverse as module_critical_inverse', 'module_warning_inverse' => 'warning_inverse as module_warning_inverse', ]; // module related field mappings 2/2 (output field => column for 'tagente_estado') // module_id_agent_modulo is not in this list $estado_fields_to_columns_mapping = [ 'module_id_agent_state' => 'id_agente_estado as module_id_agent_state', 'module_data' => 'datos as module_data', 'module_timestamp' => 'timestamp as module_timestamp', 'module_state' => 'estado as module_state', 'module_last_try' => 'last_try as module_last_try', 'module_utimestamp' => 'utimestamp as module_utimestamp', 'module_current_interval' => 'current_interval as module_current_interval', 'module_running_by' => 'running_by as module_running_by', 'module_last_execution_try' => 'last_execution_try as module_last_execution_try', 'module_status_changes' => 'status_changes as module_status_changes', 'module_last_status' => 'last_status as module_last_status', ]; // alert related field mappings (output field => column for 'talert_template_modules', ... ) $alert_fields_to_columns_mapping = [ // 'alert_id_agent_module (id_agent_module) is not in this list 'alert_template_modules_id' => 't1.id as alert_template_modules_id', 'alert_id_alert_template' => 't1.id_alert_template as alert_id_alert_template', 'alert_internal_counter' => 't1.internal_counter as alert_internal_counter', 'alert_last_fired' => 't1.last_fired as alert_last_fired', 'alert_last_reference' => 't1.last_reference as alert_last_reference', 'alert_times_fired' => 't1.times_fired as alert_times_fired', 'alert_disabled' => 't1.disabled as alert_disabled', 'alert_force_execution' => 't1.force_execution as alert_force_execution', 'alert_template_modules_priority' => 't1.priority as alert_template_modules_priority', 'alert_templates_id' => 't2.id as alert_templates_id', 'alert_type' => 't2.type as alert_type', 'alert_value' => 't2.value as alert_value', 'alert_matches_value' => 't2.matches_value as alert_matches_value', 'alert_max_value' => 't2.max_value as alert_max_value', 'alert_min_value' => 't2.min_value as alert_min_value', 'alert_time_threshold' => 't2.time_threshold as alert_time_threshold', 'alert_max_alerts' => 't2.max_alerts as alert_max_alerts', 'alert_min_alerts' => 't2.min_alerts as alert_min_alerts', 'alert_time_from' => 't2.time_from as alert_time_from', 'alert_time_to' => 't2.time_to as alert_time_to', 'alert_monday' => 't2.monday as alert_monday', 'alert_tuesday' => 't2.tuesday as alert_tuesday', 'alert_wednesday' => 't2.wednesday as alert_wednesday', 'alert_thursday' => 't2.thursday as alert_thursday', 'alert_friday' => 't2.friday as alert_friday', 'alert_saturday' => 't2.saturday as alert_saturday', 'alert_sunday' => 't2.sunday as alert_sunday', 'alert_templates_name' => 't2.name as alert_templates_name', 'alert_templates_description' => 't2.description as alert_templates_description', 'alert_templates_priority' => 't2.priority as alert_templates_priority', 'alert_templates_id_group' => 't2.id_group as alert_templates_id_group', 'alert_recovery_notify' => 't2.recovery_notify as alert_recovery_notify', 'alert_field2_recovery' => 't2.field2_recovery as alert_field2_recovery', 'alert_field3_recovery' => 't2.field3_recovery as alert_field3_recovery', 'alert_templates_field1' => 't2.field1 as alert_templates_field1', 'alert_templates_field2' => 't2.field2 as alert_templates_field2', 'alert_templates_field3' => 't2.field3 as alert_templates_field3', 'alert_template_module_actions_id' => 't3.id as alert_template_module_actions_id', 'alert_id_alert_action' => 't3.id_alert_action as alert_id_alert_action', 'alert_id_alert_template_module' => 't3.id_alert_template_module as alert_id_alert_template_module', 'alert_fires_min' => 't3.fires_min as alert_fires_min', 'alert_fires_max' => 't3.fires_max as alert_fires_max', 'alert_actions_id' => 't4.id as alert_actions_id', 'alert_actions_name' => 't4.name as alert_actions_name', 'alert_id_alert_command' => 't4.id_alert_command as alert_id_alert_command', 'alert_actions_id_group' => 't4.id_group as alert_actions_id_group', 'alert_actions_field1' => 't4.field1 as alert_actions_field1', 'alert_actions_field2' => 't4.field2 as alert_actions_field2', 'alert_actions_field3' => 't4.field3 as alert_actions_field3', 'alert_command' => 't5.command as alert_command', 'alert_internal' => 't5.internal as alert_internal', 'alert_commands_id' => 't5.id as alert_commands_id', 'alert_commands_name' => 't5.name as alert_commands_name', 'alert_commands_description' => 't5.description as alert_commands_description', ]; if ($fields == false) { $fields = $master_fields; } // construct column list to query for tagente, tagente_modulo, tagente_estado and alert-related tables { $agent_additional_columns = ''; $module_additional_columns = ''; $estado_additional_columns = ''; $alert_additional_columns = ''; foreach ($fields as $fld) { if (array_key_exists($fld, $agent_field_column_mapping)) { $agent_additional_columns .= (', '.$agent_field_column_mapping[$fld] ); } if (array_key_exists($fld, $module_field_column_mapping)) { $module_additional_columns .= (', '.$module_field_column_mapping[$fld]); } if (array_key_exists($fld, $estado_fields_to_columns_mapping)) { $estado_additional_columns .= (', '.$estado_fields_to_columns_mapping[$fld]); } if (array_key_exists($fld, $alert_fields_to_columns_mapping)) { $alert_additional_columns .= (', '.$alert_fields_to_columns_mapping[$fld]); } } } $returnVar = []; // Get only the user groups $filter_groups = '1 = 1'; if (!users_is_admin($config['id_user'])) { $user_groups = implode(',', array_keys(users_get_groups())); $filter_groups = "id_grupo IN ($user_groups)"; } $groups = db_get_all_rows_sql( 'SELECT id_grupo as group_id, '.'nombre as group_name, parent as group_parent, disabled, custom_id, '.'description as group_description, contact as group_contact, '.'other as group_other FROM tgrupo WHERE '.$filter_groups ); if ($groups === false) { $groups = []; } foreach ($groups as &$group) { if (check_acl($config['id_user'], $group['group_id'], 'AR') === false) { continue; } $group = str_replace('\n', $returnReplace, $group); $group['type_row'] = 'group'; $returnVar[] = $group; // Get the agents for this group $id_group = $group['group_id']; $agents = db_get_all_rows_sql( "SELECT id_agente AS agent_id, id_grupo AS agent_id_group , alias $agent_additional_columns FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent WHERE ta.id_grupo = $id_group OR tasg.id_group = $id_group" ); if ($agents === false) { $agents = []; } if ((bool) check_acl($config['id_user'], $id_group, 'AW') === true) { if (array_search('module_plugin_user', $fields) !== false) { $module_additional_columns .= ' ,plugin_user as module_plugin_user'; } if (array_search('module_plugin_pass', $fields) !== false) { $module_additional_columns .= ' ,plugin_pass as module_plugin_pass'; } if (array_search('module_plugin_macros', $fields) !== false) { $module_additional_columns .= ' ,macros as module_plugin_macros'; } } foreach ($agents as $index => &$agent) { $agent = str_replace('\n', $returnReplace, $agent); $agent['type_row'] = 'agent'; $returnVar[] = $agent; if (strlen($module_additional_columns) <= 0 && strlen($estado_additional_columns) <= 0 && strlen($alert_additional_columns) <= 0 ) { continue; // SKIP collecting MODULES and ALERTS } $sql = 'SELECT * FROM (SELECT id_agente_modulo as module_id_agent_modulo '.$module_additional_columns.' FROM tagente_modulo t1 WHERE id_agente = '.$agent['agent_id'].') t1 INNER JOIN (SELECT id_agente_modulo as module_id_agent_modulo '.$estado_additional_columns.' FROM tagente_estado WHERE id_agente = '.$agent['agent_id'].') t2 ON t1.module_id_agent_modulo = t2.module_id_agent_modulo'; $modules = db_get_all_rows_sql( $sql ); if ($modules === false) { $modules = []; } foreach ($modules as &$module) { $module = str_replace('\n', $returnReplace, $module); $module['type_row'] = 'module'; if ($module['module_macros']) { $module['module_macros'] = base64_decode($module['module_macros']); } $returnVar[] = $module; if (strlen($alert_additional_columns) <= 0) { continue; // SKIP collecting ALERTS info } $alerts = db_get_all_rows_sql( 'SELECT t1.id_agent_module as alert_id_agent_module '.$alert_additional_columns.' FROM (SELECT * FROM talert_template_modules WHERE id_agent_module = '.$module['module_id_agent_modulo'].') t1 INNER JOIN talert_templates t2 ON t1.id_alert_template = t2.id LEFT JOIN talert_template_module_actions t3 ON t1.id = t3.id_alert_template_module LEFT JOIN talert_actions t4 ON t3.id_alert_action = t4.id LEFT JOIN talert_commands t5 ON t4.id_alert_command = t5.id' ); if ($alerts === false) { $alerts = []; } foreach ($alerts as &$alert) { $alert = str_replace('\n', $returnReplace, $alert); $alert['type_row'] = 'alert'; $returnVar[] = $alert; } } } } $data = [ 'type' => 'array', 'data' => $returnVar, ]; $data['list_index'] = $fields; returnData($returnType, $data, $separator); } /** * * @param $id_module * @param $trahs2 * @param mixed $other If $other is string is only the separator, * but if it's array, $other as param is ;;(,...) in this order * and separator char (after text ; ) must be diferent that separator (and other) url (pass in param othermode as othermode=url_encode_separator_) * example: * * return csv with fields type_row,group_id and agent_name, separate with ";" and the return of the text replace for " " * api.php?op=get&op2=module_properties&id=1116&return_type=csv&other=;| |module_id_agent,module_name,module_description,module_last_try,module_data&other_mode=url_encode_separator_| * * @param $returnType * @return unknown_type */ function api_get_module_properties($id_module, $trahs2, $other, $returnType) { if (!util_api_check_agent_and_print_error(modules_get_agentmodule_agent($id_module), $returnType)) { return; } if ($other['type'] == 'array') { $separator = $other['data'][0]; $returnReplace = $other['data'][1]; if (trim($other['data'][2]) == '') { $fields = false; } else { $fields = explode(',', $other['data'][2]); foreach ($fields as $index => $field) { $fields[$index] = trim($field); } } } else { if (strlen($other['data']) == 0) { $separator = ';'; // by default } else { $separator = $other['data']; } $returnReplace = ' '; $fields = false; } get_module_properties($id_module, $fields, $separator, $returnType, $returnReplace); } /** * * @param $agent_name * @param $module_name * @param mixed $other If $other is string is only the separator, * but if it's array, $other as param is ;;(,...) in this order * and separator char (after text ; ) must be diferent that separator (and other) url (pass in param othermode as othermode=url_encode_separator_) * example: * * return csv with fields type_row,group_id and agent_name, separate with ";" and the return of the text replace for " " * api.php?op=get&op2=module_properties_by_name&id=sample_agent&id2=sample_module&return_type=csv&other=;| |module_id_agent,module_name,module_str_critical,module_str_warning&other_mode=url_encode_separator_| * * @param $returnType * @return unknown_type */ function api_get_module_properties_by_name($agent_name, $module_name, $other, $returnType) { if ($other['type'] == 'array') { $separator = $other['data'][0]; $returnReplace = $other['data'][1]; if (trim($other['data'][2]) == '') { $fields = false; } else { $fields = explode(',', $other['data'][2]); foreach ($fields as $index => $field) { $fields[$index] = trim($field); } } } else { if (strlen($other['data']) == 0) { $separator = ';'; // by default } else { $separator = $other['data']; } $returnReplace = ' '; $fields = false; } $agent_id = agents_get_agent_id($agent_name); if ($agent_id == 0) { returnError('Does not exist agent with this name.'); return; } if (!util_api_check_agent_and_print_error($agent_id, $returnType)) { return; } $tagente_modulo = modules_get_agentmodule_id($module_name, $agent_id); if ($tagente_modulo === false) { returnError('Does not exist module with this name.'); return; } $module_id = $tagente_modulo['id_agente_modulo']; get_module_properties($module_id, $fields, $separator, $returnType, $returnReplace); } /* * subroutine for api_get_module_properties() and api_get_module_properties_by_name(). */ /** * * @param $alias * @param $module_name * @param mixed $other If $other is string is only the separator, * but if it's array, $other as param is ;;(,...) in this order * and separator char (after text ; ) must be diferent that separator (and other) url (pass in param othermode as othermode=url_encode_separator_) * example: * * return csv with fields type_row,group_id and agent_name, separate with ";" and the return of the text replace for " " * api.php?op=get&op2=module_properties_by_name&id=sample_agent&id2=sample_module&return_type=csv&other=;| |module_id_agent,module_name,module_str_critical,module_str_warning&other_mode=url_encode_separator_| * * @param $returnType * @return unknown_type */ function api_get_module_properties_by_alias($alias, $module_name, $other, $returnType) { if ($other['type'] == 'array') { $separator = $other['data'][0]; $returnReplace = $other['data'][1]; if (trim($other['data'][2]) == '') { $fields = false; } else { $fields = explode(',', $other['data'][2]); foreach ($fields as $index => $field) { $fields[$index] = trim($field); } } } else { if (strlen($other['data']) == 0) { $separator = ';'; // by default } else { $separator = $other['data']; } $returnReplace = ' '; $fields = false; } $sql = sprintf( 'SELECT tagente_modulo.id_agente_modulo, tagente.id_agente FROM tagente_modulo INNER JOIN tagente ON tagente_modulo.id_agente = tagente.id_agente WHERE tagente.alias LIKE "%s" AND tagente_modulo.nombre LIKE "%s"', $alias, $module_name ); $data = db_get_row_sql($sql); if ($data === false) { returnError('Does not exist the pair alias/module required.'); } if (!util_api_check_agent_and_print_error($data['id_agente'], $returnType)) { return; } $module_id = $data['id_agente_modulo']; get_module_properties($module_id, $fields, $separator, $returnType, $returnReplace); } /* * subroutine for api_get_module_properties() and api_get_module_properties_by_name(). */ function get_module_properties($id_module, $fields, $separator, $returnType, $returnReplace) { /* NOTE: if you want to add an output field, you have to add it to; 1. $module_properties_master_fields (field name in order) 2. Update field_column_mapping array (arraies are shared with get_tree_agents()). Each entry is (DB coloum name => query fragment) */ // all of output field names $module_properties_master_fields = [ 'module_id_agent_modulo', 'module_id_agent', 'module_id_module_type', 'module_description', 'module_name', 'module_max', 'module_min', 'module_interval', 'module_tcp_port', 'module_tcp_send', 'module_tcp_rcv', 'module_snmp_community', 'module_snmp_oid', 'module_ip_target', 'module_id_module_group', 'module_flag', 'module_id_module', 'module_disabled', 'module_id_export', 'module_plugin_user', 'module_plugin_pass', 'module_plugin_parameter', 'module_id_plugin', 'module_post_process', 'module_prediction_module', 'module_max_timeout', 'module_max_retries', 'module_custom_id', 'module_history_data', 'module_min_warning', 'module_max_warning', 'module_str_warning', 'module_min_critical', 'module_max_critical', 'module_str_critical', 'module_min_ff_event', 'module_delete_pending', 'module_id_agent_state', 'module_data', 'module_timestamp', 'module_state', 'module_last_try', 'module_utimestamp', 'module_current_interval', 'module_running_by', 'module_last_execution_try', 'module_status_changes', 'module_last_status', 'module_plugin_macros', 'module_macros', 'module_critical_inverse', 'module_warning_inverse', ]; // module related field mappings 1/2 (output field => column for 'tagente_modulo') // module_id_agent_modulo is not in this list // module_plugin_user, module_plugin_pass, module_plugin_macros are not in this list due to security purposes. $module_field_column_mapping = [ 'module_id_agent' => 'id_agente as module_id_agent', 'module_id_module_type' => 'id_tipo_modulo as module_id_module_type', 'module_description' => 'descripcion as module_description', 'module_name' => 'nombre as module_name', 'module_max' => 'max as module_max', 'module_min' => 'min as module_min', 'module_interval' => 'module_interval', 'module_tcp_port' => 'tcp_port as module_tcp_port', 'module_tcp_send' => 'tcp_send as module_tcp_send', 'module_tcp_rcv' => 'tcp_rcv as module_tcp_rcv', 'module_snmp_community' => 'snmp_community as module_snmp_community', 'module_snmp_oid' => 'snmp_oid as module_snmp_oid', 'module_ip_target' => 'ip_target as module_ip_target', 'module_id_module_group' => 'id_module_group as module_id_module_group', 'module_flag' => 'flag as module_flag', 'module_id_module' => 'id_modulo as module_id_module', 'module_disabled' => 'disabled as module_disabled', 'module_id_export' => 'id_export as module_id_export', 'module_plugin_parameter' => 'plugin_parameter as module_plugin_parameter', 'module_plugin_user' => 'plugin_user as module_plugin_user', 'module_plugin_pass' => 'plugin_pass as module_plugin_pass', 'module_plugin_macros' => 'macros as module_plugin_macros', 'module_id_plugin' => 'id_plugin as module_id_plugin', 'module_post_process' => 'post_process as module_post_process', 'module_prediction_module' => 'prediction_module as module_prediction_module', 'module_max_timeout' => 'max_timeout as module_max_timeout', 'module_max_retries' => 'max_retries as module_max_retries', 'module_custom_id' => 'custom_id as module_custom_id', 'module_history_data' => 'history_data as module_history_data', 'module_min_warning' => 'min_warning as module_min_warning', 'module_max_warning' => 'max_warning as module_max_warning', 'module_str_warning' => 'str_warning as module_str_warning', 'module_min_critical' => 'min_critical as module_min_critical', 'module_max_critical' => 'max_critical as module_max_critical', 'module_str_critical' => 'str_critical as module_str_critical', 'module_min_ff_event' => 'min_ff_event as module_min_ff_event', 'module_delete_pending' => 'delete_pending as module_delete_pending', 'module_macros' => 'module_macros as module_macros', 'module_critical_inverse' => 'critical_inverse as module_critical_inverse', 'module_warning_inverse' => 'warning_inverse as module_warning_inverse', ]; // module related field mappings 2/2 (output field => column for 'tagente_estado') // module_id_agent_modulo is not in this list $estado_fields_to_columns_mapping = [ 'module_id_agent_state' => 'id_agente_estado as module_id_agent_state', 'module_data' => 'datos as module_data', 'module_timestamp' => 'timestamp as module_timestamp', 'module_state' => 'estado as module_state', 'module_last_try' => 'last_try as module_last_try', 'module_utimestamp' => 'utimestamp as module_utimestamp', 'module_current_interval' => 'current_interval as module_current_interval', 'module_running_by' => 'running_by as module_running_by', 'module_last_execution_try' => 'last_execution_try as module_last_execution_try', 'module_status_changes' => 'status_changes as module_status_changes', 'module_last_status' => 'last_status as module_last_status', ]; if ($fields == false) { $fields = $module_properties_master_fields; } // construct column list to query for tagente, tagente_modulo, tagente_estado and alert-related tables $module_additional_columns = ''; $estado_additional_columns = ''; foreach ($fields as $fld) { if (array_key_exists($fld, $module_field_column_mapping)) { $module_additional_columns .= (', '.$module_field_column_mapping[$fld]); } if (array_key_exists($fld, $estado_fields_to_columns_mapping)) { $estado_additional_columns .= (', '.$estado_fields_to_columns_mapping[$fld]); } } // query to the DB $returnVar = []; $modules = db_get_all_rows_sql( 'SELECT * FROM (SELECT id_agente_modulo as module_id_agent_modulo '.$module_additional_columns.' FROM tagente_modulo WHERE id_agente_modulo = '.$id_module.') t1 INNER JOIN (SELECT id_agente_modulo as module_id_agent_modulo '.$estado_additional_columns.' FROM tagente_estado WHERE id_agente_modulo = '.$id_module.') t2 ON t1.module_id_agent_modulo = t2.module_id_agent_modulo' ); if ($modules === false) { $modules = []; } foreach ($modules as &$module) { $module = str_replace('\n', $returnReplace, $module); $module['type_row'] = 'module'; if ($module['module_macros']) { $module['module_macros'] = base64_decode($module['module_macros']); } $returnVar[] = $module; } $data = [ 'type' => 'array', 'data' => $returnVar, ]; $data['list_index'] = $fields; returnData($returnType, $data, $separator); } function api_set_update_agent($id_agent, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } if (!util_api_check_agent_and_print_error($id_agent, 'string', 'AW')) { return; } $alias = $other['data'][0]; $ip = $other['data'][1]; $idParent = $other['data'][2]; $idGroup = $other['data'][3]; $cascadeProtection = $other['data'][4]; $cascadeProtectionModule = $other['data'][5]; $intervalSeconds = $other['data'][6]; $idOS = $other['data'][7]; $nameServer = $other['data'][8]; $customId = $other['data'][9]; $learningMode = $other['data'][10]; $disabled = $other['data'][11]; $description = $other['data'][12]; $osVersion = $other['data'][13]; // Check parameters. if ($idGroup == 0) { $agent_update_error = __('The agent could not be modified. For security reasons, use a group other than 0.'); returnError($agent_update_error); return; } $server_name = db_get_value_sql('SELECT name FROM tserver WHERE BINARY name LIKE "'.$nameServer.'"'); if ($alias == '' && $alias_as_name === 0) { returnError('No agent alias specified'); return; } else if (db_get_value_sql('SELECT id_grupo FROM tgrupo WHERE id_grupo = '.$idGroup) === false) { returnError('The group doesn`t exist.'); return; } else if (db_get_value_sql('SELECT id_os FROM tconfig_os WHERE id_os = '.$idOS) === false) { returnError('The OS doesn`t exist.'); return; } else if ($server_name === false) { returnError('The '.get_product_name().' Server doesn`t exist.'); return; } if ($cascadeProtection == 1) { if (($idParent != 0) && (db_get_value_sql( 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente = '.$idParent.' AND id_agente_modulo = '.$cascadeProtectionModule ) === false) ) { returnError('Cascade protection is not applied because it is not a parent module'); } } else { $cascadeProtectionModule = 0; } // Check ACL group if (!check_acl($config['id_user'], $idGroup, 'AW')) { returnError('forbidden', 'string'); return; } // Check if group allow more agents or have limit stablished. if (group_allow_more_agents($idGroup, true, 'update') === false) { returnError('Agent cannot be updated due to the maximum agent limit for this group'); return; } // Check selected parent if ($idParent != 0) { $parentCheck = agents_check_access_agent($idParent); if ($parentCheck === null) { returnError('The parent agent does not exist.'); return; } if ($parentCheck === false) { returnError('The user cannot access to parent agent.'); return; } $agents_offspring = agents_get_offspring($id_agent); if (empty($agents_offspring) === false) { if (isset($agents_offspring[$idParent]) === true) { returnError('The parent cannot be a offspring'); return; } } } $values_old = db_get_row_filter( 'tagente', ['id_agente' => $id_agent], [ 'id_grupo', 'disabled', ] ); $return = db_process_sql_update( 'tagente', [ 'alias' => $alias, 'direccion' => $ip, 'id_grupo' => $idGroup, 'intervalo' => $intervalSeconds, 'comentarios' => $description, 'modo' => $learningMode, 'id_os' => $idOS, 'disabled' => $disabled, 'cascade_protection' => $cascadeProtection, 'cascade_protection_module' => $cascadeProtectionModule, 'server_name' => $nameServer, 'id_parent' => $idParent, 'custom_id' => $customId, 'os_version' => $osVersion, ], ['id_agente' => $id_agent] ); if ($return && !empty($ip)) { // register ip for this agent in 'taddress' agents_add_address($id_agent, $ip); } if ($return) { // Update config file if (isset($disabled) && $values_old['disabled'] != $disabled) { enterprise_hook( 'config_agents_update_config_token', [ $id_agent, 'standby', $disabled, ] ); } } returnData( 'string', [ 'type' => 'string', 'data' => (int) ((bool) $return), ] ); } /** * Update an agent by indicating a pair of field - value separated by comma. * * @param integer $id_agent Id (or alias) agent to upadate. * @param boolean $use_agent_alias Use alias instead of id. * @param array $params Pair of parameter/value separated by comma. Available fields are: * 'alias', * 'direccion', * 'id_parent', * 'id_grupo', * 'cascade_protection', * 'cascade_protection_module', * 'intervalo', * 'id_os', * 'server_name', * 'custom_id', * 'modo', * 'disabled', * 'comentarios' * * eg . http://127.0.0.1/pandora_console/include/api.php?op=set&op2=update_agent_field&id=pandora&other=id_os,1|alias,pandora|direccion,192.168.10.16|id_parent,1cascade_protection,1|cascade_protection_module,1|intervalo,5||modo|3|&other_mode=url_encode_separator_|&apipass=1234&user=admin&pass=pandora */ function api_set_update_agent_field($id_agent, $use_agent_alias, $params) { global $config; $return = false; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } // Check the agent. if ((bool) $use_agent_alias === true) { $agents_by_alias = agents_get_agent_id_by_alias($id_agent); if (empty($agents_by_alias) === false) { foreach ($agents_by_alias as $agent) { if (agents_check_access_agent($agent['id_agente'], 'AW') === true) { $agents[] = $agent['id_agente']; } } if (empty($agents) === true) { returnError('forbidden', 'string'); return; } } else { returnError('Alias does not match any agent.'); return; } } else { if (!util_api_check_agent_and_print_error($id_agent, 'string', 'AW')) { return; } $agents[] = $id_agent; } // Serialize the data for update. if ($params['type'] === 'array') { // Keys available to change. $available_fields = [ 'alias', 'direccion', 'id_parent', 'id_grupo', 'cascade_protection', 'cascade_protection_module', 'intervalo', 'id_os', 'server_name', 'custom_id', 'modo', 'disabled', 'comentarios', ]; foreach ($params['data'] as $key_value) { list($key, $value) = explode(',', $key_value, 2); if (in_array($key, $available_fields) === true) { $fields[$key] = $value; } } } if (empty($fields) === true) { returnError('Selected field not available. Please, select one the fields avove'); return; } // Check fields. foreach ($fields as $field => $data) { switch ($field) { case 'alias': if (empty($data)) { returnError('No agent alias specified'); return; } break; case 'id_grupo': if (db_get_value_sql('SELECT FROM tgrupo WHERE id_grupo = '.$data) === false) { returnError('The group doesn`t exist.'); return; } break; case 'id_os': if (db_get_value_sql('SELECT id_os FROM tconfig_os WHERE id_os = '.$data) === false) { returnError('The OS doesn`t exist.'); return; } break; case 'server_name': $server_name = db_get_value_sql('SELECT name FROM tserver WHERE BINARY name LIKE "'.$data.'"'); if ($server_name === false) { returnError('The server doesn`t exist.'); return; } break; case 'cascade_protection': if ($data == 1) { if (($field['id_parent'] != 0) && (db_get_value_sql( 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente = '.$fields['id_parent'].' AND id_agente_modulo = '.$fields['cascade_protection_module'] ) === false) ) { returnError('Cascade protection is not applied because it is not a parent module'); } } else { unset($fields['cascade_protection']); } break; case 'id_grupo': // Check ACL group. if (!check_acl($config['id_user'], $data, 'AW')) { returnError('forbidden', 'string'); return; } if ($data == 0) { $agent_update_error = 'The agent could not be modified. For security reasons, use a group other than 0.'; returnError($agent_update_error); return; } break; case 'id_parent': $parentCheck = agents_check_access_agent($data); if (is_null($parentCheck) === true) { returnError('The parent agent does not exist.'); return; } if ($parentCheck === false) { returnError('The user cannot access to parent agent.'); return; } $agents_offspring = agents_get_offspring($id_agent); if (empty($agents_offspring) === false) { if (isset($agents_offspring[$data]) === true) { returnError('The parent cannot be a offspring'); return; } } break; default: // Default empty. break; } } // Var applied in case there is more than one agent. $return = false; $applied = 0; foreach ($agents as $agent) { $values_old = db_get_row_filter( 'tagente', ['id_agente' => $agent], [ 'id_grupo', 'disabled', ] ); $return = db_process_sql_update( 'tagente', $fields, ['id_agente' => $agent] ); if ((count($agents) > 1) && $return !== 0) { $applied += 1; } if ($return && !isset($field['direccion'])) { // register ip for this agent in 'taddress'. agents_add_address($agent, $field['direccion']); } if ($return) { // Update config file if (isset($field['disabled']) && $values_old['disabled'] != $field['disabled']) { enterprise_hook( 'config_agents_update_config_token', [ $agent, 'standby', $field['disabled'], ] ); } } } if (count($agents) > 1) { returnData( 'string', [ 'type' => 'string', 'data' => __('Updated %d/%d agents', $applied, count($agents)), ] ); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('Agent updated.'), ] ); } } /** * Create a new agent, and print the id for new agent. * * @param $id_node Id_node target (if metaconsole) * @param $thrash2 Don't use. * @param array $other it's array, $other as param is ;;;; * ;;;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=new_agent&other=pepito|1.1.1.1|0|4|0|30|8|10||0|0|nose%20nose&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_set_new_agent($id_node, $thrash2, $other, $trhash3, $return=false, $message=false) { global $config; if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } if ((int) $other['data'][3] == 0) { returnError('For security reasons, the agent was not created. Use a group other than 0.'); return; } try { $agent = new Agent(); if (is_metaconsole() === true) { if ($id_node <= 0) { throw new Exception('No node id specified'); } $node = new Node($id_node); $id_agente = $node->callApi( 'new_agent', 'set', null, null, $other['data'], null ); } else { $alias = io_safe_input( trim( preg_replace( '/[\/\\\|%#&$]/', '', preg_replace( '/x20;/', ' ', $other['data'][0] ) ) ) ); $direccion_agente = io_safe_input($other['data'][1]); $id_parent = (int) $other['data'][2]; $grupo = (int) $other['data'][3]; $cascade_protection = (int) $other['data'][4]; $cascade_protection_module = (int) $other['data'][5]; $intervalo = (string) $other['data'][6]; $id_os = (int) $other['data'][7]; $server_name = (string) $other['data'][8]; $custom_id = (string) $other['data'][9]; $modo = (int) $other['data'][10]; $disabled = (int) $other['data'][11]; $comentarios = (string) html_entity_decode($other['data'][12]); $alias_as_name = (int) $other['data'][13]; $update_module_count = (int) $config['metaconsole_agent_cache'] == 1; $agent->nombre($alias); $agent->alias($alias); $agent->alias_as_name($alias_as_name); $agent->direccion($direccion_agente); $agent->id_grupo($grupo); $agent->intervalo($intervalo); $agent->comentarios($comentarios); $agent->modo($modo); $agent->id_os($id_os); $agent->disabled($disabled); $agent->cascade_protection($cascade_protection); $agent->cascade_protection_module($cascade_protection_module); $agent->server_name($server_name); $agent->id_parent($id_parent); $agent->custom_id($custom_id); $agent->timezone_offset(0); $agent->update_module_count($update_module_count); if ($cascade_protection == 1) { if ($id_parent != 0) { try { $parent = new Agent($id_parent); } catch (\Exception $e) { returnError('Cascade protection is not applied because it is not a parent module.'); } } } $server_name = db_get_value_sql('SELECT name FROM tserver WHERE BINARY name LIKE "'.$server_name.'"'); // Check if agent exists (BUG WC-50518-2). if ($alias == '' && $alias_as_name === 0) { if ($message === true) { return 'No agent alias specified'; } returnError('No agent alias specified'); } else if (agents_get_agent_id($nombre_agente)) { if ($message === true) { return 'The agent name already exists in DB.'; } returnError('The agent name already exists in DB.'); } else if (db_get_value_sql('SELECT id_grupo FROM tgrupo WHERE id_grupo = '.$grupo) === false) { if ($message === true) { return 'The group does not exist.'; } returnError('The group does not exist.'); } else if (group_allow_more_agents($grupo, true, 'create') === false) { if ($message === true) { return 'Agent cannot be created due to the maximum agent limit for this group'; } returnError('Agent cannot be created due to the maximum agent limit for this group'); } else if (db_get_value_sql('SELECT id_os FROM tconfig_os WHERE id_os = '.$id_os) === false) { if ($message === true) { return 'The OS does not exist.'; } returnError('The OS does not exist.'); } else if ($server_name === false) { if ($message === true) { return 'The '.get_product_name().' Server does not exist.'; } returnError('The '.get_product_name().' Server does not exist.'); } else { if ($alias_as_name === 1) { $exists_alias = db_get_row_sql('SELECT nombre FROM tagente WHERE nombre = "'.$alias.'"'); $nombre_agente = $alias; } $exists_ip = false; if ($config['unique_ip'] && $direccion_agente != '') { $exists_ip = db_get_row_sql('SELECT direccion FROM tagente WHERE direccion = "'.$direccion_agente.'"'); } $agent->save((bool) $alias_as_name); $id_agente = $agent->id_agente(); $agent->updateFromCache(); } } if ($return === false) { returnData( 'string', [ 'type' => 'string', 'data' => $id_agente, ] ); } else { return $id_agente; } } catch (\Exception $e) { returnError($e->getMessage()); return; } } function api_set_create_os($thrash1, $thrash2, $other, $thrash3) { global $config; if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } $values = []; $values['name'] = $other['data'][0]; $values['description'] = $other['data'][1]; if (($other['data'][2] !== 0) && ($other['data'][2] != '')) { $values['icon_name'] = $other['data'][2]; } $resultOrId = false; if ($other['data'][0] != '') { $resultOrId = db_process_sql_insert('tconfig_os', $values); if ($resultOrId) { echo __('Success creating OS'); } else { echo __('Could not create OS'); } } } function api_set_update_os($id_os, $thrash2, $other, $thrash3) { global $config; if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } $values = []; $values['name'] = $other['data'][0]; $values['description'] = $other['data'][1]; if (($other['data'][2] !== 0) && ($other['data'][2] != '')) { $values['icon_name'] = $other['data'][2]; ; } $result = false; if ($other['data'][0] != '') { if (db_process_sql_update('tconfig_os', $values, ['id_os' => $id_os])) { echo __('Success updating OS'); } else { echo __('Could not update OS'); } } } /** * Creates a custom field * * @param string $name Custom field name * @param boolean $display_front Flag to display custom field in agent's operation view */ function api_set_create_custom_field($t1, $t2, $other, $returnType) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', $returnType); return; } if ($other['type'] == 'string') { returnError('Parameter error.'); return; } else if ($other['type'] == 'array') { $name = ''; if ($other['data'][0] != '') { $name = $other['data'][0]; } else { returnError('Custom field name required'); return; } $display_front = 0; if ($other['data'][1] != '') { $display_front = $other['data'][1]; } else { returnError('Custom field display flag required'); return; } $is_password_type = 0; if ($other['data'][2] != '') { $is_password_type = $other['data'][2]; } else { returnError('Custom field is password type required'); return; } $result = db_process_sql_insert( 'tagent_custom_fields', [ 'name' => $name, 'display_on_front' => $display_front, 'is_password_type' => $is_password_type, ] ); $data['type'] = 'string'; $data['data'] = $result; returnData('string', $data); } } /** * Returns ID of custom field zero if not exists * * @param string $name Custom field name */ function api_get_custom_field_id($t1, $t2, $other, $returnType) { if (defined('METACONSOLE')) { return; } $name = $other['data'][0]; $id = db_get_value('id_field', 'tagent_custom_fields', 'name', $name); if ($id === false) { returnError('id_not_found', $returnType); return; } $data['type'] = 'string'; $data['data'] = $id; returnData('string', $data); } /** * Delete an agent with the name as parameter. * * @param string $id Name of agent to delete. * @param $thrash1 Don't use. * @param $thrast2 Don't use. * @param $thrash3 Don't use. */ function api_set_delete_agent($id, $thrash1, $other, $returnType) { global $config; if (empty($returnType)) { $returnType = 'string'; } $agent_by_alias = false; if ($other['data'][0] === '1') { $agent_by_alias = true; } if (is_metaconsole()) { if (!check_acl($config['id_user'], 0, 'PM') && !check_acl($config['id_user'], 0, 'AW') ) { returnError('forbidden', 'string'); return; } $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { if (metaconsole_connect($server) == NOERR) { if ($agent_by_alias) { $idAgent = agents_get_agent_id_by_alias($id); } else { $idAgent[0] = agents_get_agent_id($id, true); } if (empty($idAgent) === false) { $result = agents_delete_agent($idAgent[0], true); } metaconsole_restore_db(); } } } else { // Delete only if the centralised mode is disabled. $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } // Support for Pandora Enterprise. if (license_free() === false) { define('PANDORA_ENTERPRISE', true); } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias(io_safe_input($id)); foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AD')) { continue; } $result = agents_delete_agent($id['id_agente'], true); if (!$result) { break; } } } else { $idAgent = agents_get_agent_id($id, false); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AD')) { return; } $result = agents_delete_agent($idAgent, false); } } if ($result === false) { if ($returnType !== 'string') { return false; } returnError('The agent could not be deleted', $returnType); } else { if ($returnType !== 'string') { return true; } returnData($returnType, ['type' => 'string', 'data' => __('The agent was successfully deleted')]); } } /** * Get all agents, and print all the result like a csv or other type for example json. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available ;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example for CSV: * * api.php?op=get&op2=all_agents&return_type=csv&other=1|2|warning|j|2|~&other_mode=url_encode_separator_| * * example for JSON: * * api.php?op=get&op2=all_agents&return_type=json&other=1|2|warning|j|2|~&other_mode=url_encode_separator_| * * @param $returnType. */ function api_get_all_agents($thrash1, $thrash2, $other, $returnType) { global $config; $where = ''; // Error if user cannot read agents. if (!check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', $returnType); return; } $groups = '1 = 1'; if (!is_user_admin($config['id_user'])) { $user_groups = implode(',', array_keys(users_get_groups())); $groups = "(id_grupo IN ($user_groups) OR id_group IN ($user_groups))"; } if (isset($other['data'][0])) { // Filter by SO. if ($other['data'][0] != '') { $where .= ' AND tconfig_os.id_os = '.$other['data'][0]; } } if (isset($other['data'][1])) { // Filter by group. if ($other['data'][1] != '') { $ag_groups = $other['data'][1]; // Recursion. if ($other['data'][6] === '1') { $ag_groups = groups_get_children_ids($ag_groups, true); } $ag_groups = implode(',', (array) $ag_groups); $where .= ' AND (id_grupo IN ('.$ag_groups.') OR id_group IN ('.$ag_groups.'))'; } } if (isset($other['data'][3])) { // Filter by alias if ($other['data'][3] != '') { $where .= " AND alias LIKE ('%".$other['data'][3]."%')"; } } if (isset($other['data'][4])) { // Filter by policy if ($other['data'][4] != '') { $filter_by_policy = enterprise_hook('policies_get_filter_by_agent', [$other['data'][4]]); if ($filter_by_policy !== ENTERPRISE_NOT_HOOK) { $where .= $filter_by_policy; } } } if (!isset($other['data'][5])) { $separator = ';'; // by default } else { $separator = $other['data'][5]; } // Initialization of array $result_agents = []; // Filter by state if (is_metaconsole()) { $sql = 'SELECT id_agente, alias, direccion, comentarios, tconfig_os.name, url_address, nombre FROM tconfig_os, tmetaconsole_agent LEFT JOIN tmetaconsole_agent_secondary_group ON tmetaconsole_agent.id_agente = tmetaconsole_agent_secondary_group.id_agent WHERE tmetaconsole_agent.id_os = tconfig_os.id_os AND disabled = 0 '.$where.' AND '.$groups; } else { $sql = 'SELECT id_agente, alias, direccion, comentarios, tconfig_os.name, url_address, nombre FROM tconfig_os, tagente LEFT JOIN tagent_secondary_group ON tagente.id_agente = tagent_secondary_group.id_agent WHERE tagente.id_os = tconfig_os.id_os AND disabled = 0 '.$where.' AND '.$groups; } // Group by agent $sql .= ' GROUP BY id_agente'; $all_agents = db_get_all_rows_sql($sql); // Filter by status: unknown, warning, critical, without modules if (isset($other['data'][2])) { if ($other['data'][2] != '') { foreach ($all_agents as $agent) { $filter_modules['id_agente'] = $agent['id_agente']; $filter_modules['disabled'] = 0; $filter_modules['delete_pending'] = 0; $modules = db_get_all_rows_filter( 'tagente_modulo', $filter_modules, 'id_agente_modulo' ); $result_modules = []; // Skip non init modules foreach ($modules as $module) { if (modules_get_agentmodule_is_init($module['id_agente_modulo'])) { $result_modules[] = $module; } } // Without modules NO_MODULES if ($other['data'][2] == 'no_modules') { if (empty($result_modules) and $other['data'][2] == 'no_modules') { $result_agents[] = $agent; } } // filter by NORMAL, WARNING, CRITICAL, UNKNOWN, ALERT_FIRED else { $status = agents_get_status($agent['id_agente'], true); // Filter by status switch ($other['data'][2]) { case 'warning': if ($status == AGENT_MODULE_STATUS_WARNING || $status == AGENT_MODULE_STATUS_WARNING_ALERT) { $result_agents[] = $agent; } break; case 'critical': if ($status == AGENT_MODULE_STATUS_CRITICAL_BAD || $status == AGENT_MODULE_STATUS_CRITICAL_ALERT) { $result_agents[] = $agent; } break; case 'unknown': if ($status == AGENT_MODULE_STATUS_UNKNOWN) { $result_agents[] = $agent; } break; case 'normal': if ($status == AGENT_MODULE_STATUS_NORMAL || $status == AGENT_MODULE_STATUS_NORMAL_ALERT) { $result_agents[] = $agent; } break; case 'alert_fired': if ($status == AGENT_STATUS_ALERT_FIRED || $status == AGENT_MODULE_STATUS_WARNING_ALERT || $status == AGENT_MODULE_STATUS_CRITICAL_ALERT || $status == AGENT_MODULE_STATUS_NORMAL_ALERT) { $result_agents[] = $agent; } break; } } } } else { $result_agents = $all_agents; } } else { $result_agents = $all_agents; } if (empty($returnType)) { $returnType = 'string'; } if (empty($separator)) { $separator = ';'; } foreach ($result_agents as $key => $value) { $result_agents[$key]['status'] = agents_get_status($result_agents[$key]['id_agente'], true); } if (count($result_agents) > 0 and $result_agents !== false) { $data = [ 'type' => 'array', 'data' => $result_agents, ]; returnData($returnType, $data, $separator); } else { returnError('No agents retrieved.'); } } /** * Get modules for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=agents_modules&return_type=csv&other=14&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_agent_modules($thrash1, $thrash2, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($other['data'][0], 'csv')) { return; } $sql = sprintf( 'SELECT id_agente, id_agente_modulo, nombre FROM tagente_modulo WHERE id_agente = %d AND disabled = 0 AND delete_pending = 0', $other['data'][0] ); $all_modules = db_get_all_rows_sql($sql); if (count($all_modules) > 0 and $all_modules !== false) { $data = [ 'type' => 'array', 'data' => $all_modules, ]; returnData('csv', $data, ';'); } else { returnError('No modules retrieved.'); } } function api_get_db_uncompress_module_data($id_agente_modulo, $tstart, $other) { global $config; if (!isset($id_agente_modulo)) { return false; } if ((!isset($tstart)) || ($tstart === false)) { // Return data from the begining // $tstart = 0; $tstart = 0; } $tend = $other['data']; if ((!isset($tend)) || ($tend === false)) { // Return data until now $tend = time(); } if ($tstart > $tend) { return false; } $search_historydb = false; $table = 'tagente_datos'; $module = modules_get_agentmodule($id_agente_modulo); if ($module === false) { // module not exists return false; } $module_type = $module['id_tipo_modulo']; $module_type_str = modules_get_type_name($module_type); if (strstr($module_type_str, 'string') !== false) { $table = 'tagente_datos_string'; } // Get first available utimestamp in active DB $query = " SELECT utimestamp, datos FROM $table "; $query .= " WHERE id_agente_modulo=$id_agente_modulo AND utimestamp < $tstart"; $query .= ' ORDER BY utimestamp DESC LIMIT 1'; $ret = db_get_all_rows_sql($query, $search_historydb); if (( $ret === false ) || (( isset($ret[0]['utimestamp']) && ($ret[0]['utimestamp'] > $tstart )))) { // Value older than first retrieved from active DB $search_historydb = true; $ret = db_get_all_rows_sql($query, $search_historydb); } else { $first_data['utimestamp'] = $ret[0]['utimestamp']; $first_data['datos'] = $ret[0]['datos']; } if (( $ret === false ) || (( isset($ret[0]['utimestamp']) && ($ret[0]['utimestamp'] > $tstart )))) { // No previous data. -> not init // Avoid false unknown status $first_data['utimestamp'] = time(); $first_data['datos'] = false; } else { $first_data['utimestamp'] = $ret[0]['utimestamp']; $first_data['datos'] = $ret[0]['datos']; } $query = " SELECT utimestamp, datos FROM $table "; $query .= " WHERE id_agente_modulo=$id_agente_modulo AND utimestamp >= $tstart AND utimestamp <= $tend"; $query .= ' ORDER BY utimestamp ASC'; // Retrieve all data from module in given range $raw_data = db_get_all_rows_sql($query, $search_historydb); if (($raw_data === false) && ($ret === false)) { // No data return false; } // Retrieve going unknown events in range $unknown_events = db_get_module_ranges_unknown($id_agente_modulo, $tstart, $tend); // Retrieve module_interval to build the template $module_interval = modules_get_interval($id_agente_modulo); $slice_size = $module_interval; // We'll return a bidimensional array // Structure returned: schema: // // uncompressed_data => // pool_id (int) // utimestamp (start of current slice) // data // array // utimestamp // datos $return = []; // Point current_timestamp to begin of the set and initialize flags $current_timestamp = $tstart; $last_inserted_value = $first_data['datos']; $last_timestamp = $first_data['utimestamp']; $data_found = 0; // Build template $pool_id = 0; $now = time(); $in_unknown_status = 0; if (is_array($unknown_events)) { $current_unknown = array_shift($unknown_events); } while ($current_timestamp < $tend) { $expected_data_generated = 0; $return[$pool_id]['data'] = []; $tmp_data = []; $data_found = 0; if (is_array($unknown_events)) { $i = 0; while ($current_timestamp >= $unknown_events[$i]['time_to']) { // Skip unknown events in past array_splice($unknown_events, $i, 1); $i++; if (!isset($unknown_events[$i])) { break; } } if (isset($current_unknown)) { // check if recovered from unknown status if (is_array($unknown_events) && isset($current_unknown)) { if ((($current_timestamp + $slice_size) > $current_unknown['time_to']) && ($current_timestamp < $current_unknown['time_to']) && ($in_unknown_status == 1) ) { // Recovered from unknown if (($current_unknown['time_to'] > $current_timestamp) && ($expected_data_generated == 0) ) { // also add the "expected" data $tmp_data['utimestamp'] = $current_timestamp; if ($in_unknown_status == 1) { $tmp_data['datos'] = null; } else { $tmp_data['datos'] = $last_inserted_value; } $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $expected_data_generated = 1; } $tmp_data['utimestamp'] = $current_unknown['time_to']; $tmp_data['datos'] = $last_inserted_value; // debug purpose $tmp_data['obs'] = 'event recovery data'; $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $data_found = 1; $in_unknown_status = 0; } if ((($current_timestamp + $slice_size) > $current_unknown['time_from']) && (($current_timestamp + $slice_size) < $current_unknown['time_to']) && ($in_unknown_status == 0) ) { // Add unknown state detected if ($current_unknown['time_from'] < ($current_timestamp + $slice_size)) { if (($current_unknown['time_from'] > $current_timestamp) && ($expected_data_generated == 0) ) { // also add the "expected" data $tmp_data['utimestamp'] = $current_timestamp; if ($in_unknown_status == 1) { $tmp_data['datos'] = null; } else { $tmp_data['datos'] = $last_inserted_value; } $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $expected_data_generated = 1; } $tmp_data['utimestamp'] = $current_unknown['time_from']; $tmp_data['datos'] = null; // debug purpose $tmp_data['obs'] = 'event data'; $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $data_found = 1; } $in_unknown_status = 1; } if (($in_unknown_status == 0) && ($current_timestamp >= $current_unknown['time_to'])) { $current_unknown = array_shift($unknown_events); } } } //end if } // Search for data $i = 0; if (is_array($raw_data)) { foreach ($raw_data as $data) { if (($data['utimestamp'] >= $current_timestamp) && ($data['utimestamp'] < ($current_timestamp + $slice_size)) ) { // Data in block, push in, and remove from $raw_data (processed) if (($data['utimestamp'] > $current_timestamp) && ($expected_data_generated == 0) ) { // also add the "expected" data $tmp_data['utimestamp'] = $current_timestamp; if ($in_unknown_status == 1) { $tmp_data['datos'] = null; } else { $tmp_data['datos'] = $last_inserted_value; } $tmp_data['obs'] = 'expected data'; $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $expected_data_generated = 1; } $tmp_data['utimestamp'] = intval($data['utimestamp']); $tmp_data['datos'] = $data['datos']; // debug purpose $tmp_data['obs'] = 'real data'; $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); $last_inserted_value = $data['datos']; $last_timestamp = intval($data['utimestamp']); unset($raw_data[$i]); $data_found = 1; $in_unknown_status = 0; } else if ($data['utimestamp'] > ($current_timestamp + $slice_size)) { // Data in future, stop searching new ones break; } } $i++; } if ($data_found == 0) { // No data found, lug the last_value until SECONDS_1DAY + 2*modules_get_interval // UNKNOWN! if (($current_timestamp > $now) || (($current_timestamp - $last_timestamp) > (SECONDS_1DAY + 2 * $module_interval))) { if (isset($last_inserted_value)) { // unhandled unknown status control $unhandled_time_unknown = ($current_timestamp - (SECONDS_1DAY + 2 * $module_interval) - $last_timestamp); if ($unhandled_time_unknown > 0) { // unhandled unknown status detected. Add to previous pool $tmp_data['utimestamp'] = (intval($last_timestamp) + (SECONDS_1DAY + 2 * $module_interval)); $tmp_data['datos'] = null; // debug purpose $tmp_data['obs'] = 'unknown extra'; // add to previous pool if needed if (isset($return[($pool_id - 1)])) { array_push($return[($pool_id - 1)]['data'], $tmp_data); } } } $last_inserted_value = null; } $tmp_data['utimestamp'] = $current_timestamp; if ($in_unknown_status == 1) { $tmp_data['datos'] = null; } else { $tmp_data['datos'] = $last_inserted_value; } // debug purpose $tmp_data['obs'] = 'virtual data'; $return[$pool_id]['utimestamp'] = $current_timestamp; array_push($return[$pool_id]['data'], $tmp_data); } $pool_id++; $current_timestamp += $slice_size; } $data = [ 'type' => 'array', 'data' => $return, ]; returnData('json', $return, ';'); } /** * Get modules id for an agent, and print the result like a csv. * * @param $id Id of agent. * @param array $name name of module. * @param $thrash1 Don't use. * * pi.php?op=get&op2=module_id&id=5&other=Host%20Alive&apipass=1234&user=admin&pass=pandora * * @param $thrash3 Don't use. */ function api_get_module_id($id, $thrash1, $name, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($id, 'csv')) { return; } $sql = sprintf( 'SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente = %d AND nombre = "%s" AND disabled = 0 AND delete_pending = 0', $id, $name['data'] ); $module_id = db_get_all_rows_sql($sql); if (count($module_id) > 0 and $module_id !== false) { $data = [ 'type' => 'array', 'data' => $module_id, ]; returnData('csv', $data, ';'); } else { returnError('Does not exist module or agent'); } } /** * Retrieves custom_id from given module_id. * * @param integer $id Module id. * * @return void */ function api_get_module_custom_id($id) { if (is_metaconsole()) { return; } try { $module = new Module($id); if (!util_api_check_agent_and_print_error( $module->id_agente(), 'json' ) ) { return; } } catch (Exception $e) { returnError('id_not_found', 'json'); } returnData('json', $module->custom_id()); } /** * Retrieves custom_id from given module_id. * * @param integer $id Module id. * * @return void */ function api_set_module_custom_id($id, $value) { if (is_metaconsole()) { return; } try { $module = new Module($id); if (!util_api_check_agent_and_print_error( $module->id_agente(), 'json', 'AW' ) ) { return; } $module->custom_id($value); $module->save(); } catch (Exception $e) { returnError('id_not_found', 'json'); } returnData('json', ['type' => 'string', 'data' => $module->custom_id()]); } /** * Get modules for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=group_agent&return_type=csv&other=14&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_group_agent($thrash1, $thrash2, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $sql = sprintf( 'SELECT groups.nombre nombre FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.disabled = 0 AND groups.disabled = 0 AND agents.id_grupo = groups.id_grupo', $other['data'][0] ); $group_names = db_get_all_rows_sql($sql); if (count($group_names) > 0 and $group_names !== false) { $data = [ 'type' => 'array', 'data' => $group_names, ]; returnData('csv', $data, ';'); } else { returnError('error_group_agent', 'No groups retrieved.'); } } /** * Get name group for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=group_agent&return_type=csv&other=Pepito&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_group_agent_by_name($thrash1, $thrash2, $other, $thrash3) { $group_names = []; if (is_metaconsole()) { $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { if (metaconsole_connect($server) == NOERR) { $agent_id = agents_get_agent_id($other['data'][0], true); if ($agent_id) { $sql = sprintf( 'SELECT groups.nombre nombre FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $agent_id ); $group_server_names = db_get_all_rows_sql($sql); if ($group_server_names) { foreach ($group_server_names as $group_server_name) { $group_names[] = $group_server_name; } } } } metaconsole_restore_db(); } } else { $agent_id = agents_get_agent_id($other['data'][0], true); if (!util_api_check_agent_and_print_error($agent_id, 'csv')) { return; } $sql = sprintf( 'SELECT groups.nombre nombre FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $agent_id ); $group_names = db_get_all_rows_sql($sql); } if (count($group_names) > 0 and $group_names !== false) { $data = [ 'type' => 'array', 'data' => $group_names, ]; returnData('csv', $data, ';'); } else { returnError('No groups retrieved.'); } } /** * Get name group for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=group_agent_by_alias&return_type=csv&other=Pepito&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_group_agent_by_alias($thrash1, $thrash2, $other, $thrash3) { global $config; if (is_metaconsole()) { return; } if (!check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', 'csv'); return; } $group_names = []; if (is_metaconsole()) { $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { if (metaconsole_connect($server) == NOERR) { $sql = sprintf("SELECT tagente.id_agente FROM tagente WHERE alias LIKE '%s' ", $other['data'][0]); $agent_id = db_get_all_rows_sql($sql); foreach ($agent_id as &$id) { $sql = sprintf( 'SELECT groups.nombre nombre FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $id['id_agente'] ); $group_server_names = db_get_all_rows_sql($sql); if ($group_server_names) { foreach ($group_server_names as $group_server_name) { $group_names[] = $group_server_name; } } } } metaconsole_restore_db(); } } else { $sql = sprintf("SELECT tagente.id_agente FROM tagente WHERE alias LIKE '%s' ", $other['data'][0]); $agent_id = db_get_all_rows_sql($sql); foreach ($agent_id as &$id) { if (!users_access_to_agent($id['id_agente'])) { continue; } $sql = sprintf( 'SELECT groups.nombre nombre FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $id['id_agente'] ); $group_name = db_get_all_rows_sql($sql); $group_names[] = $group_name[0]; } } if (count($group_names) > 0 and $group_names !== false) { $data = [ 'type' => 'array', 'data' => $group_names, ]; returnData('csv', $data, ';'); } else { returnError('No groups retrieved.'); } } /** * Get id server whare agent is located, and print all the result like a csv. * * @param $id name of agent. * @param $thrash1 Don't use. * @param $thrash2 Don't use. * example: * * api.php?op=get&op2=locate_agent&return_type=csv&id=Pepito&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_locate_agent($id, $thrash1, $thrash2, $thrash3) { if (!is_metaconsole()) { return; } $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { $id_server = $server['id']; if (metaconsole_connect($server) == NOERR) { $agent_id = agents_get_agent_id($id, true); if ($agent_id && agents_check_access_agent($agent_id)) { $group_servers[]['server'] = $id_server; } } metaconsole_restore_db(); } if (count($group_servers) > 0 and $group_servers !== false) { $data = [ 'type' => 'array', 'data' => $group_servers, ]; returnData('csv', $data, ';'); } else { returnError('No agents located.'); } } /** * Get id group for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=id_group_agent_by_name&return_type=csv&other=Pepito&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_id_group_agent_by_name($thrash1, $thrash2, $other, $thrash3) { if (is_metaconsole()) { return; } $group_names = []; if (is_metaconsole()) { $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { if (metaconsole_connect($server) == NOERR) { $agent_id = agents_get_agent_id($other['data'][0], true); if ($agent_id) { $sql = sprintf( 'SELECT groups.id_grupo id_group FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $agent_id ); $group_server_names = db_get_all_rows_sql($sql); if ($group_server_names) { foreach ($group_server_names as $group_server_name) { $group_names[] = $group_server_name; } } } } metaconsole_restore_db(); } } else { $agent_id = agents_get_agent_id($other['data'][0], true); if (!util_api_check_agent_and_print_error($agent_id, 'csv')) { return; } $sql = sprintf( 'SELECT groups.id_grupo id_group FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $agent_id ); $group_names = db_get_all_rows_sql($sql); } if (count($group_names) > 0 and $group_names !== false) { $data = [ 'type' => 'array', 'data' => $group_names, ]; returnData('csv', $data); } else { returnError('No groups retrieved.'); } } /** * Get id group for an agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=id_group_agent_by_alias&return_type=csv&other=Nova&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_id_group_agent_by_alias($thrash1, $thrash2, $other, $thrash3) { global $config; if (is_metaconsole()) { return; } if (!check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', 'csv'); return; } $group_names = []; if (is_metaconsole()) { $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } foreach ($servers as $server) { if (metaconsole_connect($server) == NOERR) { $sql = sprintf("SELECT tagente.id_agente FROM tagente WHERE alias LIKE '%s' ", $other['data'][0]); $agent_id = db_get_all_rows_sql($sql); foreach ($agent_id as &$id) { $sql = sprintf( 'SELECT groups.id_grupo id_group FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $id['id_agente'] ); $group_server_names = db_get_all_rows_sql($sql); if ($group_server_names) { foreach ($group_server_names as $group_server_name) { $group_names[] = $group_server_name; } } } } metaconsole_restore_db(); } } else { $sql = sprintf("SELECT tagente.id_agente FROM tagente WHERE alias LIKE '%s' ", $other['data'][0]); $agent_id = db_get_all_rows_sql($sql); foreach ($agent_id as &$id) { if (!users_access_to_agent($id['id_agente'])) { continue; } $sql = sprintf( 'SELECT groups.id_grupo id_group FROM tagente agents, tgrupo groups WHERE id_agente = %d AND agents.id_grupo = groups.id_grupo', $id['id_agente'] ); $group_name = db_get_all_rows_sql($sql); $group_names[] = $group_name[0]; } } if (count($group_names) > 0 and $group_names !== false) { $data = [ 'type' => 'array', 'data' => $group_names, ]; returnData('csv', $data); } else { returnError('No groups retrieved.'); } } /** * Get all policies, possible filtered by agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=policies&return_type=csv&other=&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_policies($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'csv'); return; } $user_groups = implode(',', array_keys(users_get_groups($config['id_user'], 'AW'))); if ($other['data'][0] != '') { if (!users_access_to_agent($other['data'][0])) { returnError('forbidden', 'csv'); return; } $where = ' AND pol_agents.id_agent = '.$other['data'][0]; $sql = sprintf( 'SELECT policy.id, name, id_agent FROM tpolicies AS policy, tpolicy_agents AS pol_agents WHERE policy.id = pol_agents.id_policy %s AND id_group IN (%s)', $where, $user_groups ); } else { $sql = "SELECT id, name FROM tpolicies AS policy WHERE id_group IN ($user_groups)"; } $policies = db_get_all_rows_sql($sql); if (count($policies) > 0 and $policies !== false) { $data = [ 'type' => 'array', 'data' => $policies, ]; returnData('csv', $data, ';'); } else { returnError('No policies retrieved.'); } } /** * Get policy modules, possible filtered by agent, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param are the filters available in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=policy_modules&return_type=csv&other=2&other_mode=url_encode_separator_| * * @param $thrash3 Don't use. */ function api_get_policy_modules($thrash1, $thrash2, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $where = ''; if ($other['data'][0] == '') { returnError('Could not retrieve policy modules. Id_policy cannot be left blank.'); return; } $policies = enterprise_hook( 'policies_get_modules_api', [ $other['data'][0], $other['data'][1], ] ); if ($policies === ENTERPRISE_NOT_HOOK) { returnError('Could not retrieve '); return; } if (count($policies) > 0 and $policies !== false) { $data = [ 'type' => 'array', 'data' => $policies, ]; returnData('csv', $data, ';'); } else { returnError('No policy modules retrieved.'); } } /** * Create a network module in agent. * And return the id_agent_module of new module. * * @param string $id Name of agent to add the module. * @param string $thrash1 Don't use. * @param array $other It's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;;; * ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_). * @param string $thrash3 Don't use. * @example: api.php?op=set&op2=create_network_module&id=pepito&other=prueba|0|7|1|10|15|0|16|18|0|15|0|www.google.es|0||0|180|0|0|0|0|latency%20ping&other_mode=url_encode_separator_|* * @return mixed Return. */ function api_set_create_network_module($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $agent_by_alias = false; if ($other['data'][31] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias($id); } else { $idAgent = agents_get_agent_id($id); } if (!$agent_by_alias) { if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } } if ($other['data'][2] < 6 or $other['data'][2] > 18) { returnError( 'Could not be created the network module. Id_module_type is not correct for network modules.' ); return; } $name = $other['data'][0]; $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][22]; $disabled_types_event = json_encode($disabled_types_event); $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'ip_target' => $other['data'][12], 'tcp_port' => $other['data'][13], 'snmp_community' => $other['data'][14], 'snmp_oid' => $other['data'][15], 'module_interval' => $other['data'][16], 'post_process' => $other['data'][17], 'min' => $other['data'][18], 'max' => $other['data'][19], 'custom_id' => $other['data'][20], 'descripcion' => $other['data'][21], 'id_modulo' => 2, 'disabled_types_event' => $disabled_types_event, 'module_macros' => $other['data'][23], 'each_ff' => $other['data'][24], 'min_ff_event_normal' => $other['data'][25], 'min_ff_event_warning' => $other['data'][26], 'min_ff_event_critical' => $other['data'][27], 'critical_inverse' => $other['data'][28], 'warning_inverse' => $other['data'][29], 'ff_type' => $other['data'][30], ]; if (! $values['descripcion']) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null. } if (! $values['module_macros']) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null. } $type_exist = db_get_value_filter( 'id_tipo', 'ttipo_modulo', [ 'id_tipo' => $values['id_tipo_modulo'], ] ); if ((bool) $type_exist === false) { returnError('Module type does not exist'); return; } if ($agent_by_alias) { $agents_affected = 0; $idModule = false; foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { continue; } $idModule = modules_create_agent_module($id['id_agente'], $name, $values, true); if (!is_error($idModule)) { $agents_affected++; } } returnData('string', ['type' => 'string', 'data' => $agents_affected.' agents affected']); return; } else { $idModule = modules_create_agent_module($idAgent, $name, $values, true); } if (is_error($idModule)) { // TODO: Improve the error returning more info. returnError('Could not be created the network module.'); } else { returnData('string', ['type' => 'string', 'data' => $idModule]); } } /** * Update a network module in agent. And return a message with the result of the operation. * * @param string $id Id of the network module to update. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ; * ;;;;;;;; * ;;;;;;; * ;;;;;; * ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=update_network_module&id=271&other=156|0|2|10|15||16|18||7|0|127.0.0.1|0||0|300|30.00|0|0|0|latency%20ping%20modified%20by%20the%20Api&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_network_module($id_module, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($id_module == '') { returnError( 'The network module could not be updated. Module name cannot be left blank.' ); return; } if (!util_api_check_agent_and_print_error( modules_get_agentmodule_agent($id_module), 'string', 'AW' ) ) { return; } $check_id_module = db_get_value('id_agente_modulo', 'tagente_modulo', 'id_agente_modulo', $id_module); if (!$check_id_module) { returnError( 'The network module could not be updated. Id_module does not exist.' ); return; } // If we want to change the module to a new agent if ($other['data'][0] != '') { if (!util_api_check_agent_and_print_error($other['data'][0], 'string', 'AW')) { return; } $id_agent_old = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_module); if ($id_agent_old != $other['data'][0]) { $id_module_exists = db_get_value_filter( 'id_agente_modulo', 'tagente_modulo', [ 'nombre' => $module_name, 'id_agente' => $other['data'][0], ] ); if ($id_module_exists) { returnError( 'The network module could not be updated. Id_module exists in the new agent.' ); return; } } } $network_module_fields = [ 'id_agente', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'ip_target', 'tcp_port', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'descripcion', 'disabled_types_event', 'module_macros', 'each_ff', 'min_ff_event_normal', 'min_ff_event_warning', 'min_ff_event_critical', 'critical_inverse', 'warning_inverse', 'policy_linked', 'ff_type', ]; $values = []; $cont = 0; foreach ($network_module_fields as $field) { if ($other['data'][$cont] != '') { $values[$field] = $other['data'][$cont]; } $cont++; } $values['policy_linked'] = 0; $result_update = modules_update_agent_module($id_module, $values); if ($result_update < 0) { returnError('The network module could not be updated.'); } else { returnData('string', ['type' => 'string', 'data' => __('Network module updated.')]); } } /** * Create a plugin module in agent. And return the id_agent_module of new module. * * @param string $id Name of agent to add the module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; * ;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=create_plugin_module&id=pepito&other=prueba|0|1|2|0|0||0|0||0|0|127.0.0.1|0||0|300|0|0|0|0|plugin%20module%20from%20api|2|admin|pass|-p%20max&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_plugin_module($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($other['data'][22] == '') { returnError('The plugin module could not be created. Id_plugin cannot be left blank.'); return; } $agent_by_alias = false; if ($other['data'][36] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias($id); } else { $idAgent = agents_get_agent_id($id); } if (!$agent_by_alias) { if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][26]; $disabled_types_event = json_encode($disabled_types_event); $name = $other['data'][0]; $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'ip_target' => $other['data'][12], 'tcp_port' => $other['data'][13], 'snmp_community' => $other['data'][14], 'snmp_oid' => $other['data'][15], 'module_interval' => $other['data'][16], 'post_process' => $other['data'][17], 'min' => $other['data'][18], 'max' => $other['data'][19], 'custom_id' => $other['data'][20], 'descripcion' => $other['data'][21], 'id_modulo' => 4, 'id_plugin' => $other['data'][22], 'plugin_user' => $other['data'][23], 'plugin_pass' => $other['data'][24], 'plugin_parameter' => $other['data'][25], 'disabled_types_event' => $disabled_types_event, 'macros' => base64_decode(str_replace(' ', '+', $other['data'][27])), 'module_macros' => $other['data'][28], 'each_ff' => $other['data'][29], 'min_ff_event_normal' => $other['data'][30], 'min_ff_event_warning' => $other['data'][31], 'min_ff_event_critical' => $other['data'][32], 'critical_inverse' => $other['data'][33], 'warning_inverse' => $other['data'][34], 'ff_type' => $other['data'][35], ]; $plugin = db_get_row('tplugin', 'id', $values['id_plugin']); if (empty($plugin)) { returnError('id_not_found'); return; } $plugin_command_macros = $plugin['macros']; if (!empty($values['macros'])) { $macros = io_safe_input_json($values['macros']); if (empty($macros)) { returnError('JSON string in macros is invalid.'); exit; } $values['macros'] = io_merge_json_value($plugin_command_macros, $macros); } if (! $values['descripcion']) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null. } if (! $values['module_macros']) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null. } if ($agent_by_alias) { $agents_affected = 0; foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { continue; } $idModule = modules_create_agent_module($id['id_agente'], $name, $values, true); if (!is_error($idModule)) { $agents_affected++; } } returnData('string', ['type' => 'string', 'data' => $agents_affected.' agents affected']); return; } else { $idModule = modules_create_agent_module($idAgent, $name, $values, true); } if (is_error($idModule)) { // TODO: Improve the error returning more info. returnError('The plugin module could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $idModule]); } } /** * Update a plugin module in agent. And return the id_agent_module of new module. * * @param string $id Id of the plugin module to update. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; * ;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=update_plugin_module&id=293&other=156|0|2|0|0||0|0||0|0|127.0.0.1|0||0|300|0|0|0|0|plugin%20module%20from%20api|2|admin|pass|-p%20max&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_plugin_module($id_module, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($id_module == '') { returnError('The plugin module could not be updated. Id_module cannot be left blank.'); return; } if (!util_api_check_agent_and_print_error( modules_get_agentmodule_agent($id_module), 'string', 'AW' ) ) { return; } // If we want to change the module to a new agent if ($other['data'][0] != '') { if (!util_api_check_agent_and_print_error($other['data'][0], 'string', 'AW')) { return; } $id_agent_old = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_module); if ($id_agent_old != $other['data'][0]) { $id_module_exists = db_get_value_filter('id_agente_modulo', 'tagente_modulo', ['nombre' => $module_name, 'id_agente' => $other['data'][0]]); if ($id_module_exists) { returnError('The plugin module could not be updated. Id_module exists in the new agent.'); return; } } // Check if agent exists $check_id_agent = db_get_value('id_agente', 'tagente', 'id_agente', $other['data'][0]); if (!$check_id_agent) { returnError('The plugin module could not be updated. Id_agent does not exist.'); return; } } $plugin_module_fields = [ 'id_agente', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'ip_target', 'tcp_port', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'descripcion', 'id_plugin', 'plugin_user', 'plugin_pass', 'plugin_parameter', 'disabled_types_event', 'macros', 'module_macros', 'each_ff', 'min_ff_event_normal', 'min_ff_event_warning', 'min_ff_event_critical', 'critical_inverse', 'warning_inverse', 'policy_linked', 'ff_type', ]; $values = []; $cont = 0; foreach ($plugin_module_fields as $field) { if ($other['data'][$cont] != '') { $values[$field] = $other['data'][$cont]; if ($field === 'macros') { $values[$field] = base64_decode(str_replace(' ', '+', $values[$field])); } } $cont++; } $plugin = db_get_row('tplugin', 'id', $values['id_plugin']); if (empty($plugin)) { returnError('id_not_found'); return; } $plugin_command_macros = $plugin['macros']; if (!empty($values['macros'])) { $macros = io_safe_input_json($values['macros']); if (empty($macros)) { returnError('JSON string in macros is invalid.'); exit; } $values['macros'] = io_merge_json_value($plugin_command_macros, $macros); } $values['policy_linked'] = 0; $result_update = modules_update_agent_module($id_module, $values); if ($result_update < 0) { returnError('The plugin module could not be updated'); } else { returnData('string', ['type' => 'string', 'data' => __('Plugin module updated.')]); } } /** * Create a data module in agent. And return the id_agent_module of new module. * Note: Only adds database information, this function doesn't alter config file information. * * @param string $id Name of agent to add the module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;; * ;;;;;; * ;;;; * ;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=create_data_module&id=pepito&other=prueba|0|1|data%20module%20from%20api|1|10|20|10.50|180|10|15||16|20||0&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_data_module($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($other['data'][0] == '') { returnError('The data module could not be created. Module_name cannot be left blank.'); return; } $agent_by_alias = false; if ($other['data'][27] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias($id); } else { $idAgent = agents_get_agent_id($id); } if (!$agent_by_alias) { if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } } $name = $other['data'][0]; $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][16]; $disabled_types_event = json_encode($disabled_types_event); $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'descripcion' => $other['data'][3], 'id_module_group' => $other['data'][4], 'min' => $other['data'][5], 'max' => $other['data'][6], 'post_process' => $other['data'][7], 'module_interval' => $other['data'][8], 'min_warning' => $other['data'][9], 'max_warning' => $other['data'][10], 'str_warning' => $other['data'][11], 'min_critical' => $other['data'][12], 'max_critical' => $other['data'][13], 'str_critical' => $other['data'][14], 'history_data' => $other['data'][15], 'id_modulo' => 1, 'disabled_types_event' => $disabled_types_event, 'module_macros' => $other['data'][17], 'min_ff_event' => $other['data'][18], 'each_ff' => $other['data'][19], 'min_ff_event_normal' => $other['data'][20], 'min_ff_event_warning' => $other['data'][21], 'min_ff_event_critical' => $other['data'][22], 'ff_timeout' => $other['data'][23], 'critical_inverse' => $other['data'][24], 'warning_inverse' => $other['data'][25], 'ff_type' => $other['data'][26], ]; if (! $values['descripcion']) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null. } if (! $values['module_macros']) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null. } if ($agent_by_alias) { $agents_affected = 0; foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { continue; } $idModule = modules_create_agent_module($id['id_agente'], $name, $values, true); if (!is_error($idModule)) { $agents_affected++; } } returnData('string', ['type' => 'string', 'data' => $agents_affected.' agents affected']); return; } else { $idModule = modules_create_agent_module($idAgent, $name, $values, true); } if (is_error($idModule)) { // TODO: Improve the error returning more info. returnError('The data module could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $idModule]); } } /** * Create a synthetic module in agent. And return the id_agent_module of new module. * Note: Only adds database information, this function doesn't alter config file information. * * @param string $id Name of agent to add the module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is OR OR in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=create_synthetic_module&id=pepito&other=prueba|average|Agent%20Name;AVG;Name%20Module|Agent%20Name2;AVG;Name%20Module2&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_synthetic_module($id, $agent_by_alias, $other, $thrash3) { if (defined('METACONSOLE')) { return; } global $config; io_safe_input_array($other); if ($other['data'][0] == '') { returnError('The synthetic module could not be created. Module_name cannot be left blank.'); return; } if ($agent_by_alias == '1') { $ids_agents = agents_get_agent_id_by_alias(io_safe_output($id)); foreach ($ids_agents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { return; } } } else { $idAgent = agents_get_agent_id(io_safe_output($id), true); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } } if ($agent_by_alias) { foreach ($ids_agents as $id) { if (!$id['id_agente']) { returnError('The synthetic module could not be created. Agent name does not exist.'); return; } } } else { if (!$idAgent) { returnError('The synthetic module could not be created. Agent name does not exist.'); return; } } $name = io_safe_output($other['data'][0]); $name = io_safe_input($name); $id_tipo_modulo = db_get_row_sql("SELECT id_tipo FROM ttipo_modulo WHERE nombre = 'generic_data'"); $values = [ 'id_modulo' => 5, 'custom_integer_1' => 0, 'custom_integer_2' => 0, 'prediction_module' => 3, 'id_tipo_modulo' => $id_tipo_modulo['id_tipo'], ]; if (! $values['descripcion']) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null. } if ($agent_by_alias) { foreach ($ids_agents as $id) { $idAgent = $id['id_agente']; $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info. returnError('The synthetic module could not be created.'); } else { $synthetic_type = $other['data'][1]; unset($other['data'][0]); unset($other['data'][1]); $filterdata = []; foreach ($other['data'] as $data) { $data = str_replace(['ADD', 'SUB', 'MUL', 'DIV'], ['+', '-', '*', '/'], $data); $data = io_safe_output($data); // Double safe output is necessary. $split_data = explode(';', io_safe_output($data)); if (preg_match('/[x\/+*-]/', $split_data[0]) && strlen($split_data[0]) == 1) { if (preg_match('/[\/|+|*|-]/', $split_data[0]) && $synthetic_type === 'average') { returnError(sprintf("[ERROR] With this type: %s only be allow use this operator: 'x' \n\n", $synthetic_type)); } $operator = strtolower($split_data[0]); $data_module = [ '', $operator, $split_data[1], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } else { if (count($split_data) == 2) { $idAgent = agents_get_agent_id($split_data[0], true); $data_module = [ $idAgent, '', $split_data[1], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } else { if (strlen($split_data[1]) > 1 && $synthetic_type != 'average') { returnError(sprintf("[ERROR] You can only use +, -, *, / or x, and you use this: %s \n\n", $split_data[1])); return; } if (preg_match('/[\/|+|*|-]/', $split_data[1]) && $synthetic_type === 'average') { returnError(sprintf("[ERROR] With this type: %s only be allow use this operator: 'x' \n\n", $synthetic_type)); return; } $idAgent = agents_get_agent_id(io_safe_output($split_data[0]), true); $operator = strtolower($split_data[1]); $data_module = [ $idAgent, $operator, $split_data[2], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } } } $serialize_ops = implode(',', $filterdata); // modules_create_synthetic_operations $synthetic = enterprise_hook( 'modules_create_synthetic_operations', [ $idModule, $serialize_ops, ] ); if ($synthetic === ENTERPRISE_NOT_HOOK) { returnError('The synthetic module could not be created.'); db_process_sql_delete( 'tagente_modulo', ['id_agente_modulo' => $idModule] ); return; } else { $status = AGENT_MODULE_STATUS_NO_DATA; switch ($config['dbtype']) { case 'mysql': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => '01-01-1970 00:00:00', 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; case 'postgresql': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => null, 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; case 'oracle': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => '#to_date(\'1970-01-01 00:00:00\', \'YYYY-MM-DD HH24:MI:SS\')', 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; } if ($result === false) { db_process_sql_delete( 'tagente_modulo', ['id_agente_modulo' => $idModule] ); returnError('The synthetic module could not be created.'); } else { db_process_sql('UPDATE tagente SET total_count=total_count+1, notinit_count=notinit_count+1 WHERE id_agente='.(int) $idAgent); returnData('string', ['type' => 'string', 'data' => __('Synthetic module created ID: %s', $idModule)]); } } } } } else { $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('The synthetic module could not be created.'); } else { $synthetic_type = $other['data'][1]; unset($other['data'][0]); unset($other['data'][1]); $filterdata = []; foreach ($other['data'] as $data) { $data = str_replace(['ADD', 'SUB', 'MUL', 'DIV'], ['+', '-', '*', '/'], $data); $data = io_safe_output($data); // Double safe output is necessary. $split_data = explode(';', io_safe_output($data)); if (preg_match('/[x\/+*-]/', $split_data[0]) && strlen($split_data[0]) == 1) { if (preg_match('/[\/|+|*|-]/', $split_data[0]) && $synthetic_type === 'average') { returnError(sprintf("[ERROR] With this type: %s only be allow use this operator: 'x' \n\n", $synthetic_type)); } $operator = strtolower($split_data[0]); $data_module = [ '', $operator, $split_data[1], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } else { if (count($split_data) == 2) { $idAgent = agents_get_agent_id($split_data[0], true); $data_module = [ $idAgent, '', $split_data[1], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } else { if (strlen($split_data[1]) > 1 && $synthetic_type != 'average') { returnError(sprintf("[ERROR] You can only use +, -, *, / or x, and you use this: %s \n\n", $split_data[1])); return; } if (preg_match('/[\/|+|*|-]/', $split_data[1]) && $synthetic_type === 'average') { returnError(sprintf("[ERROR] With this type: %s only be allow use this operator: 'x' \n\n", $synthetic_type)); return; } $idAgent = agents_get_agent_id(io_safe_output($split_data[0]), true); $operator = strtolower($split_data[1]); $data_module = [ $idAgent, $operator, $split_data[2], ]; $text_data = implode('_', $data_module); array_push($filterdata, $text_data); } } } $serialize_ops = implode(',', $filterdata); // modules_create_synthetic_operations $synthetic = enterprise_hook( 'modules_create_synthetic_operations', [ $idModule, $serialize_ops, ] ); if ($synthetic === ENTERPRISE_NOT_HOOK) { returnError('The synthetic module could not be created.'); db_process_sql_delete( 'tagente_modulo', ['id_agente_modulo' => $idModule] ); return; } else { $status = AGENT_MODULE_STATUS_NO_DATA; switch ($config['dbtype']) { case 'mysql': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => '01-01-1970 00:00:00', 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; case 'postgresql': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => null, 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; case 'oracle': $result = db_process_sql_insert( 'tagente_estado', [ 'id_agente_modulo' => $idModule, 'datos' => 0, 'timestamp' => '#to_date(\'1970-01-01 00:00:00\', \'YYYY-MM-DD HH24:MI:SS\')', 'estado' => $status, 'id_agente' => (int) $idAgent, 'utimestamp' => 0, 'status_changes' => 0, 'last_status' => $status, 'last_known_status' => $status, ] ); break; } if ($result === false) { db_process_sql_delete( 'tagente_modulo', ['id_agente_modulo' => $idModule] ); returnError('The synthetic module could not be created.'); } else { db_process_sql('UPDATE tagente SET total_count=total_count+1, notinit_count=notinit_count+1 WHERE id_agente='.(int) $idAgent); returnData('string', ['type' => 'string', 'data' => __('Synthetic module created ID: '.$idModule)]); } } } } } /** * Update a data module in agent. And return a message with the result of the operation. * * @param string $id Id of the data module to update. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;;; * ;;;; * in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=update_data_module&id=170&other=44|0|data%20module%20modified%20from%20API|6|0|0|50.00|300|10|15||16|18||0&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_data_module($id_module, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($id_module == '') { returnError('The data module could not be updated. Id_module cannot be left blank.'); return; } if (!util_api_check_agent_and_print_error( modules_get_agentmodule_agent($id_module), 'string', 'AW' ) ) { return; } // If we want to change the module to a new agent if ($other['data'][0] != '') { if (!util_api_check_agent_and_print_error($other['data'][0], 'string', 'AW')) { return; } $id_agent_old = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_module); if ($id_agent_old != $other['data'][0]) { $id_module_exists = db_get_value_filter('id_agente_modulo', 'tagente_modulo', ['nombre' => $module_name, 'id_agente' => $other['data'][0]]); if ($id_module_exists) { returnError('The data module could not be updated. Id_module exists in the new agent.'); return; } } // Check if agent exists $check_id_agent = db_get_value('id_agente', 'tagente', 'id_agente', $other['data'][0]); if (!$check_id_agent) { returnError('The data module could not be updated. Id_agent does not exist.'); return; } } $data_module_fields = [ 'id_agente', 'disabled', 'descripcion', 'id_module_group', 'min', 'max', 'post_process', 'module_interval', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'history_data', 'disabled_types_event', 'module_macros', 'min_ff_event', 'each_ff', 'min_ff_event_normal', 'min_ff_event_warning', 'min_ff_event_critical', 'ff_timeout', 'critical_inverse', 'warning_inverse', 'policy_linked', 'ff_type', ]; $values = []; $cont = 0; foreach ($data_module_fields as $field) { if ($other['data'][$cont] != '') { $values[$field] = $other['data'][$cont]; } $cont++; } $values['policy_linked'] = 0; $result_update = modules_update_agent_module($id_module, $values); if ($result_update < 0) { returnError('The data module could not be updated.'); } else { returnData('string', ['type' => 'string', 'data' => __('Data module updated.')]); } } /** * Create a SNMP module in agent. And return the id_agent_module of new module. * * @param string $id Name of agent to add the module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;;; * ;;;;;;;; * ;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example 1 (snmp v: 3, snmp3_priv_method: AES, passw|authNoPriv|MD5|pepito_user|example_priv_passw) * * api.php?op=set&op2=create_snmp_module&id=pepito&other=prueba|0|15|1|10|15||16|18||15|0|127.0.0.1|60|3|public|.1.3.6.1.2.1.1.1.0|180|0|0|0|0|SNMP%20module%20from%20API|AES|example_priv_passw|authNoPriv|MD5|pepito_user|example_auth_passw&other_mode=url_encode_separator_| * * example 2 (snmp v: 1) * * api.php?op=set&op2=create_snmp_module&id=pepito1&other=prueba2|0|15|1|10|15||16|18||15|0|127.0.0.1|60|1|public|.1.3.6.1.2.1.1.1.0|180|0|0|0|0|SNMP module from API&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_snmp_module($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($other['data'][0] == '') { returnError('The SNMP module could not be created. Module_name cannot be left blank.'); return; } if ($other['data'][2] < 15 or $other['data'][2] > 18) { returnError('The SNMP module could not be created. Invalid id_module_type for a SNMP module.'); return; } $agent_by_alias = false; if ($other['data'][35] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias($id); } else { $idAgent = agents_get_agent_id($id); } if (!$agent_by_alias) { if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } } $name = $other['data'][0]; $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][27]; $disabled_types_event = json_encode($disabled_types_event); // SNMP version 3. if ($other['data'][14] == '3') { if ($other['data'][23] != 'AES' and $other['data'][23] != 'DES') { returnError('The SNMP module could not be created.. snmp3_priv_method does not exist. Set it to \'AES\' or \'DES\'. '); return; } if ($other['data'][25] != 'authNoPriv' and $other['data'][25] != 'authPriv' and $other['data'][25] != 'noAuthNoPriv') { returnError('The SNMP module could not be created. snmp3_sec_level does not exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. '); return; } if ($other['data'][26] != 'MD5' and $other['data'][26] != 'SHA') { returnError('The SNMP module could not be created. snmp3_auth_method does not exist. Set it to \'MD5\' or \'SHA\'. '); return; } $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'ip_target' => $other['data'][12], 'tcp_port' => $other['data'][13], 'tcp_send' => $other['data'][14], 'snmp_community' => $other['data'][15], 'snmp_oid' => $other['data'][16], 'module_interval' => $other['data'][17], 'post_process' => $other['data'][18], 'min' => $other['data'][19], 'max' => $other['data'][20], 'custom_id' => $other['data'][21], 'descripcion' => $other['data'][22], 'id_modulo' => 2, 'custom_string_1' => $other['data'][23], 'custom_string_2' => $other['data'][24], 'custom_string_3' => $other['data'][25], 'plugin_parameter' => $other['data'][26], 'plugin_user' => $other['data'][27], 'plugin_pass' => $other['data'][28], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][30], 'min_ff_event_normal' => $other['data'][31], 'min_ff_event_warning' => $other['data'][32], 'min_ff_event_critical' => $other['data'][33], 'ff_type' => $other['data'][34], ]; } else { $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'ip_target' => $other['data'][12], 'tcp_port' => $other['data'][13], 'tcp_send' => $other['data'][14], 'snmp_community' => $other['data'][15], 'snmp_oid' => $other['data'][16], 'module_interval' => $other['data'][17], 'post_process' => $other['data'][18], 'min' => $other['data'][19], 'max' => $other['data'][20], 'custom_id' => $other['data'][21], 'descripcion' => $other['data'][22], 'id_modulo' => 2, 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][24], 'min_ff_event_normal' => $other['data'][25], 'min_ff_event_warning' => $other['data'][26], 'min_ff_event_critical' => $other['data'][27], 'ff_type' => $other['data'][28], ]; } if (! $values['descripcion']) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null. } if ($agent_by_alias) { $agents_affected = 0; foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { continue; } $idModule = modules_create_agent_module($id['id_agente'], $name, $values, true); if (!is_error($idModule)) { $agents_affected++; } } returnData('string', ['type' => 'string', 'data' => $agents_affected.' agents affected']); return; } else { $idModule = modules_create_agent_module($idAgent, $name, $values, true); } if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('The SNMP module could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $idModule]); } } /** * Update a SNMP module in agent. And return a message with the result of the operation. * * @param string $id Id of module to update. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;;;;; * ;;;;;;;; * ;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example (update snmp v: 3, snmp3_priv_method: AES, passw|authNoPriv|MD5|pepito_user|example_priv_passw) * * api.php?op=set&op2=update_snmp_module&id=example_snmp_module_name&other=44|0|6|20|25||26|30||15|1|127.0.0.1|60|3|public|.1.3.6.1.2.1.1.1.0|180|50.00|10|60|0|SNMP%20module%20modified%20by%20API|AES|example_priv_passw|authNoPriv|MD5|pepito_user|example_auth_passw&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_snmp_module($id_module, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($id_module == '') { returnError('The SNMP module could not be updated. Id_module cannot be left blank.'); return; } if (!util_api_check_agent_and_print_error( modules_get_agentmodule_agent($id_module), 'string', 'AW' ) ) { return; } // If we want to change the module to a new agent if ($other['data'][0] != '') { if (!util_api_check_agent_and_print_error($other['data'][0], 'string', 'AW')) { return; } $id_agent_old = db_get_value('id_agente', 'tagente_modulo', 'id_agente_modulo', $id_module); if ($id_agent_old != $other['data'][0]) { $id_module_exists = db_get_value_filter('id_agente_modulo', 'tagente_modulo', ['nombre' => $module_name, 'id_agente' => $other['data'][0]]); if ($id_module_exists) { returnError('The SNMP module could not be updated. Id_module exists in the new agent.'); return; } } // Check if agent exists $check_id_agent = db_get_value('id_agente', 'tagente', 'id_agente', $other['data'][0]); if (!$check_id_agent) { returnError( 'The SNMP module could not be updated. Id_agent does not exist.' ); return; } } // SNMP version 3 if ($other['data'][13] == '3') { if ($other['data'][22] != 'AES' and $other['data'][22] != 'DES') { returnError( 'The SNMP module could not be updated. snmp3_priv_method does not exist. Set it to \'AES\' or \'DES\'. ' ); return; } if ($other['data'][24] != 'authNoPriv' and $other['data'][24] != 'authPriv' and $other['data'][24] != 'noAuthNoPriv' ) { returnError( 'The SNMP module could not be updated. snmp3_sec_level does not exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ' ); return; } if ($other['data'][25] != 'MD5' and $other['data'][25] != 'SHA') { returnError( 'The SNMP module could not be updated. snmp3_auth_method does not exist. Set it to \'MD5\' or \'SHA\'. ' ); return; } $snmp_module_fields = [ 'id_agente', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'ip_target', 'tcp_port', 'tcp_send', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'descripcion', 'custom_string_1', 'custom_string_2', 'custom_string_3', 'plugin_parameter', 'plugin_user', 'plugin_pass', 'disabled_types_event', 'each_ff', 'min_ff_event_normal', 'min_ff_event_warning', 'min_ff_event_critical', 'policy_linked', 'ff_type', ]; } else { $snmp_module_fields = [ 'id_agente', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'ip_target', 'tcp_port', 'tcp_send', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'descripcion', 'disabled_types_event', 'each_ff', 'min_ff_event_normal', 'min_ff_event_warning', 'min_ff_event_critical', 'policy_linked', 'ff_type', ]; } $values = []; $cont = 0; foreach ($snmp_module_fields as $field) { if ($other['data'][$cont] != '') { $values[$field] = $other['data'][$cont]; } $cont++; } $values['policy_linked'] = 0; $result_update = modules_update_agent_module($id_module, $values); if ($result_update < 0) { returnError('The SNMP module could not be updated.'); } else { returnData('string', ['type' => 'string', 'data' => __('SNMP module updated.')]); } } /** * Create new network component. * * @param $id string Name of the network component. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;; * ;;;;;;; * ;;;;; * ;; in this * order and separator char (after text ; ) and separator (pass in param * othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=new_network_component&id=example_network_component_name&other=7|network%20component%20created%20by%20Api|300|30|10|public|3||1|10|20|str|21|30|str1|10|50.00|12&other_mode=url_encode_separator_| * * @param $thrash2 Don't use. */ function api_set_new_network_component($id, $thrash1, $other, $thrash2) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError('The network component could not be created. Network component name cannot be left blank.'); return; } if ($other['data'][0] < 6 or $other['data'][0] > 18) { returnError('The network component could not be created. Incorrect value for Network component type field.'); return; } if ($other['data'][17] == '') { returnError('The network component could not be created. Network component group cannot be left blank.'); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][18]; $disabled_types_event = json_encode($disabled_types_event); $values = [ 'description' => $other['data'][1], 'module_interval' => $other['data'][2], 'max' => $other['data'][3], 'min' => $other['data'][4], 'snmp_community' => $other['data'][5], 'id_module_group' => $other['data'][6], 'id_modulo' => 2, 'max_timeout' => $other['data'][7], 'history_data' => $other['data'][8], 'min_warning' => $other['data'][9], 'max_warning' => $other['data'][10], 'str_warning' => $other['data'][11], 'min_critical' => $other['data'][12], 'max_critical' => $other['data'][13], 'str_critical' => $other['data'][14], 'min_ff_event' => $other['data'][15], 'post_process' => $other['data'][16], 'id_group' => $other['data'][17], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][19], 'min_ff_event_normal' => $other['data'][20], 'min_ff_event_warning' => $other['data'][21], 'min_ff_event_critical' => $other['data'][22], 'ff_type' => $other['data'][23], ]; $name_check = db_get_value('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('The network component could not be created. This network component already exist.'); return; } $id = network_components_create_network_component($id, $other['data'][0], $other['data'][17], $values); if (!$id) { returnError('The network component could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $id]); } } /** * Create new plugin component. * * @param $id string Name of the plugin component. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;; * ;;;;;;; * ;;;; * ;;; in this * order and separator char (after text ; ) and separator (pass in param * othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=new_plugin_component&id=example_plugin_component_name&other=2|plugin%20component%20created%20by%20Api|300|30|10|66|3|2|example_user|example_pass|-p%20max||1|10|20|str|21|30|str1|10|50.00|12&other_mode=url_encode_separator_| * * @param $thrash2 Don't use. */ function api_set_new_plugin_component($id, $thrash1, $other, $thrash2) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The plugin component could not be created. Plugin component name cannot be left blank.' ); return; } if ($other['data'][7] == '') { returnError( 'The plugin component could not be created. Incorrect value for Id plugin.' ); return; } if ($other['data'][21] == '') { returnError( 'The plugin component could not be created. Plugin component group cannot be left blank.' ); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][12]; $disabled_types_event = json_encode($disabled_types_event); $values = [ 'description' => $other['data'][1], 'module_interval' => $other['data'][2], 'max' => $other['data'][3], 'min' => $other['data'][4], 'tcp_port' => $other['data'][5], 'id_module_group' => $other['data'][6], 'id_modulo' => 4, 'id_plugin' => $other['data'][7], 'plugin_user' => $other['data'][8], 'plugin_pass' => $other['data'][9], 'plugin_parameter' => $other['data'][10], 'max_timeout' => $other['data'][11], 'history_data' => $other['data'][12], 'min_warning' => $other['data'][13], 'max_warning' => $other['data'][14], 'str_warning' => $other['data'][15], 'min_critical' => $other['data'][16], 'max_critical' => $other['data'][17], 'str_critical' => $other['data'][18], 'min_ff_event' => $other['data'][19], 'post_process' => $other['data'][20], 'id_group' => $other['data'][21], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][23], 'min_ff_event_normal' => $other['data'][24], 'min_ff_event_warning' => $other['data'][25], 'min_ff_event_critical' => $other['data'][26], 'ff_type' => $other['data'][27], ]; $name_check = db_get_value('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('The plugin component could not be created. This plugin component already exist.'); return; } $id = network_components_create_network_component($id, $other['data'][0], $other['data'][21], $values); if (!$id) { returnError('The plugin component could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $id]); } } /** * Create new SNMP component. * * @param $id string Name of the SNMP component. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;; * ;;;;;;; * ;;;;; * ;;;;;;;;; * ;;; in this * order and separator char (after text ; ) and separator (pass in param * othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=new_snmp_component&id=example_snmp_component_name&other=16|SNMP%20component%20created%20by%20Api|300|30|10|3||1|10|20|str|21|30|str1|15|50.00|3|.1.3.6.1.2.1.2.2.1.8.2|public|example_auth_user|example_auth_pass|66|AES|example_priv_pass|MD5|authNoPriv|12&other_mode=url_encode_separator_| * * @param $thrash2 Don't use. */ function api_set_new_snmp_component($id, $thrash1, $other, $thrash2) { global $config; if (defined('METACONSOLE')) { return; } if ($id == '') { returnError('The SNMP component could not be created. SNMP component name cannot be left blank.'); return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($other['data'][0] < 15 or $other['data'][0] > 17) { returnError('The SNMP component could not be created. Incorrect value for Snmp component type field.'); return; } if ($other['data'][25] == '') { returnError('The SNMP component could not be created. Snmp component group cannot be left blank.'); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][27]; $disabled_types_event = json_encode($disabled_types_event); // SNMP version 3 if ($other['data'][16] == '3') { if ($other['data'][22] != 'AES' and $other['data'][22] != 'DES') { returnError( 'The SNMP component could not be created. snmp3_priv_method does not exist. Set it to \'AES\' or \'DES\'. ' ); return; } if ($other['data'][25] != 'authNoPriv' and $other['data'][25] != 'authPriv' and $other['data'][25] != 'noAuthNoPriv' ) { returnError( 'The SNMP component could not be created. snmp3_sec_level does not exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ' ); return; } if ($other['data'][24] != 'MD5' and $other['data'][24] != 'SHA') { returnError( 'The SNMP component could not be created. snmp3_auth_method does not exist. Set it to \'MD5\' or \'SHA\'. ' ); return; } $values = [ 'description' => $other['data'][1], 'module_interval' => $other['data'][2], 'max' => $other['data'][3], 'min' => $other['data'][4], 'id_module_group' => $other['data'][5], 'max_timeout' => $other['data'][6], 'history_data' => $other['data'][7], 'min_warning' => $other['data'][8], 'max_warning' => $other['data'][9], 'str_warning' => $other['data'][10], 'min_critical' => $other['data'][11], 'max_critical' => $other['data'][12], 'str_critical' => $other['data'][13], 'min_ff_event' => $other['data'][14], 'post_process' => $other['data'][15], 'tcp_send' => $other['data'][16], 'snmp_oid' => $other['data'][17], 'snmp_community' => $other['data'][18], 'plugin_user' => $other['data'][19], // snmp3_auth_user 'plugin_pass' => $other['data'][20], // snmp3_auth_pass 'tcp_port' => $other['data'][21], 'id_modulo' => 2, 'custom_string_1' => $other['data'][22], // snmp3_privacy_method 'custom_string_2' => $other['data'][23], // snmp3_privacy_pass 'plugin_parameter' => $other['data'][24], // snmp3_auth_method 'custom_string_3' => $other['data'][25], // snmp3_security_level 'id_group' => $other['data'][26], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][28], 'min_ff_event_normal' => $other['data'][29], 'min_ff_event_warning' => $other['data'][30], 'min_ff_event_critical' => $other['data'][31], 'ff_type' => $other['data'][32], ]; } else { $values = [ 'description' => $other['data'][1], 'module_interval' => $other['data'][2], 'max' => $other['data'][3], 'min' => $other['data'][4], 'id_module_group' => $other['data'][5], 'max_timeout' => $other['data'][6], 'history_data' => $other['data'][7], 'min_warning' => $other['data'][8], 'max_warning' => $other['data'][9], 'str_warning' => $other['data'][10], 'min_critical' => $other['data'][11], 'max_critical' => $other['data'][12], 'str_critical' => $other['data'][13], 'min_ff_event' => $other['data'][14], 'post_process' => $other['data'][15], 'tcp_send' => $other['data'][16], 'snmp_oid' => $other['data'][17], 'snmp_community' => $other['data'][18], 'plugin_user' => '', 'plugin_pass' => '', 'tcp_port' => $other['data'][21], 'id_modulo' => 2, 'id_group' => $other['data'][22], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][24], 'min_ff_event_normal' => $other['data'][25], 'min_ff_event_warning' => $other['data'][26], 'min_ff_event_critical' => $other['data'][27], 'ff_type' => $other['data'][28], ]; } $name_check = db_get_value('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('The SNMP component could not be created. This SNMP component already exist.'); return; } $id = network_components_create_network_component($id, $other['data'][0], $other['data'][26], $values); if (!$id) { returnError('The SNMP component could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $id]); } } /** * Create new local (data) component. * * @param $id string Name of the local component. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;; * ;;;; * ; in this order and separator char * (after text ; ) and separator (pass in param othermode as * othermode=url_encode_separator_) * example: * * api.php?op=set&op2=new_local_component&id=example_local_component_name&other=local%20component%20created%20by%20Api~5~12~module_begin%0dmodule_name%20example_local_component_name%0dmodule_type%20generic_data%0dmodule_exec%20ps%20|%20grep%20pid%20|%20wc%20-l%0dmodule_interval%202%0dmodule_end&other_mode=url_encode_separator_~ * * @param $thrash2 Don't use. */ function api_set_new_local_component($id, $thrash1, $other, $thrash2) { global $config; if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The local component could not be created. Local component name cannot be left blank.' ); return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($other['data'][1] == '') { returnError( 'The local component could not be created. Local component group cannot be left blank.' ); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][4]; $disabled_types_event = json_encode($disabled_types_event); $values = [ 'description' => $other['data'][0], 'id_network_component_group' => $other['data'][2], 'disabled_types_event' => $disabled_types_event, 'min_ff_event' => $other['data'][5], 'each_ff' => $other['data'][6], 'min_ff_event_normal' => $other['data'][7], 'min_ff_event_warning' => $other['data'][8], 'min_ff_event_critical' => $other['data'][9], 'ff_timeout' => $other['data'][10], 'ff_type' => $other['data'][11], ]; $name_check = enterprise_hook( 'local_components_get_local_components', [ ['name' => $id], 'name', ] ); if ($name_check === ENTERPRISE_NOT_HOOK) { returnError( 'The local component could not be created.' ); return; } if ($name_check !== false) { returnError( 'The local component could not be created. This local component already exist.' ); return; } $id = enterprise_hook( 'local_components_create_local_component', [ $id, $other['data'][3], $other['data'][1], $values, ] ); if (!$id) { returnError('The local component could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $id]); } } /** * Get module data value from all agents filter by module name. And return id_agents, agent_name and module value. * * @param $id string Name of the module. * @param $thrash1 Don't use. * @param array $other Don't use. * example: * * api.php?op=get&op2=module_value_all_agents&id=example_module_name * * @param $thrash2 Don't use. */ function api_get_module_value_all_agents($id, $thrash1, $other, $thrash2) { global $config; if (defined('METACONSOLE')) { return; } if ($id == '') { returnError( 'Could not get the module value from all agents. Module name cannot be left blank.' ); return; } $id_module = db_get_value('id_agente_modulo', 'tagente_modulo', 'nombre', $id); if ($id_module === false) { returnError( 'Could not get the module value from all agents. Module name does not exist.' ); return; } $groups = '1 = 1'; if (!is_user_admin($config['id_user'])) { $user_groups = implode(',', array_keys(users_get_groups())); $groups = "(id_grupo IN ($user_groups) OR id_group IN ($user_groups))"; } $sql = sprintf( "SELECT agent.id_agente, agent.alias, module_state.datos, agent.nombre FROM tagente agent LEFT JOIN tagent_secondary_group tasg ON agent.id_agente = tasg.id_agent, tagente_modulo module, tagente_estado module_state WHERE agent.id_agente = module.id_agente AND module.id_agente_modulo=module_state.id_agente_modulo AND module.nombre = '%s' AND %s", $id, $groups ); $module_values = db_get_all_rows_sql($sql); if (!$module_values) { returnError('Could not get module values from all agents.'); } else { $data = [ 'type' => 'array', 'data' => $module_values, ]; returnData('csv', $data, ';'); } } /** * Create an alert template. And return the id of new template. * * @param string $id Name of alert template to add. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example 1 (condition: regexp =~ /pp/, action: Mail to XXX, max_alert: 10, min_alert: 0, priority: WARNING, group: databases): * api.php?op=set&op2=create_alert_template&id=pepito&other=regex|template%20based%20in%20regexp|1||||pp|1||||10|0|||||||||||||3&other_mode=url_encode_separator_| * * example 2 (condition: value is not between 5 and 10, max_value: 10.00, min_value: 5.00, time_from: 00:00:00, time_to: 15:00:00, priority: CRITICAL, group: Servers): * api.php?op=set&op2=create_alert_template&id=template_min_max&other=max_min|template%20based%20in%20range|NULL||||||10|5||||00:00:00|15:00:00|||||||||||4|2&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_alert_template($name, $thrash1, $other, $thrash3) { global $config; $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($name == '') { returnError( 'The alert template could not be created. Template name cannot be left blank.' ); return; } $template_name = $name; $type = $other['data'][0]; $id_group = $other['data'][26]; if ($id_group == '') { returnError( 'error_create_alert_template', __('Error creating alert template. Id_group cannot be left blank.') ); return; } if (users_can_manage_group_all('LM')) { $groups = users_get_groups($config['id_user'], 'LM'); } else { $groups = users_get_groups($config['id_user'], 'LM', false); } if ($groups[$id_group] === null) { returnError( 'error_create_alert_template', __('Error creating alert template. Invalid id_group or the user has not enough permission to make this action.') ); return; } for ($i = 29; $i < 54; $i++) { if ($other['data'][$i] === null) { $other['data'][$i] = ''; } } $values = [ 'description' => $other['data'][1], 'field1' => $other['data'][3], 'field2' => $other['data'][4], 'field3' => $other['data'][5], 'value' => $other['data'][6], 'matches_value' => $other['data'][7], 'max_value' => $other['data'][8], 'min_value' => $other['data'][9], 'time_threshold' => $other['data'][10], 'max_alerts' => $other['data'][11], 'min_alerts' => $other['data'][12], 'time_from' => $other['data'][13], 'time_to' => $other['data'][14], 'monday' => $other['data'][15], 'tuesday' => $other['data'][16], 'wednesday' => $other['data'][17], 'thursday' => $other['data'][18], 'friday' => $other['data'][19], 'saturday' => $other['data'][20], 'sunday' => $other['data'][21], 'recovery_notify' => $other['data'][22], 'field2_recovery' => $other['data'][23], 'field3_recovery' => $other['data'][24], 'priority' => $other['data'][25], 'id_group' => $other['data'][26], 'special_day' => $other['data'][27], 'min_alerts_reset_counter' => $other['data'][28], 'field1_recovery' => $other['data'][29], 'field4' => $other['data'][30], 'field5' => $other['data'][31], 'field6' => $other['data'][32], 'field7' => $other['data'][33], 'field8' => $other['data'][34], 'field9' => $other['data'][35], 'field10' => $other['data'][36], 'field11' => $other['data'][37], 'field12' => $other['data'][38], 'field13' => $other['data'][39], 'field14' => $other['data'][40], 'field15' => $other['data'][41], 'field4_recovery' => $other['data'][42], 'field5_recovery' => $other['data'][43], 'field6_recovery' => $other['data'][44], 'field7_recovery' => $other['data'][45], 'field8_recovery' => $other['data'][46], 'field9_recovery' => $other['data'][47], 'field10_recovery' => $other['data'][48], 'field11_recovery' => $other['data'][49], 'field12_recovery' => $other['data'][50], 'field13_recovery' => $other['data'][51], 'field14_recovery' => $other['data'][52], 'field15_recovery' => $other['data'][53], ]; if ($other['data'][2] != '') { $values['id_alert_action'] = $other['data'][2]; } $id_template = alerts_create_alert_template($template_name, $type, $values); if (is_error($id_template)) { // TODO: Improve the error returning more info returnError('The alert template could not be created.'); } else { returnData('string', ['type' => 'string', 'data' => $id_template]); } } /** * Update an alert template. And return a message with the result of the operation. * * @param string $id_template Id of the template to update. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * * example: * * api.php?op=set&op2=update_alert_template&id=38&other=example_template_with_changed_name|onchange|changing%20from%20min_max%20to%20onchange||||||1||||5|1|||1|1|0|1|1|0|0|1|field%20recovery%20example%201|field%20recovery%20example%202|1|8&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_alert_template($id_template, $thrash1, $other, $thrash3) { global $config; if (is_metaconsole() === true) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id_template == '') { returnError( 'The alert template could not be updated. Id_template cannot be left blank.' ); return; } $result_template = alerts_get_alert_template($id_template); if (!$result_template) { returnError( 'The alert template could not be updated. Id_template does not exist.' ); return; } if (users_can_manage_group_all('LM')) { $groups = users_get_groups($config['id_user'], 'LM'); } else { $groups = users_get_groups($config['id_user'], 'LM', false); } $id_group_org = $result_template['id_group']; if ($other['data'][27] === null) { $id_group_new = $id_group_org; } else { $id_group_new = $other['data'][27]; } if ($groups[$id_group_org] === null || $groups[$id_group_new] === null) { returnError( 'error_create_alert_template', __('Error updating alert template. Invalid id_group or the user has not enough permission to make this action.') ); return; } $fields_template = [ 'name', 'type', 'description', 'id_alert_action', 'field1', 'field2', 'field3', 'value', 'matches_value', 'max_value', 'min_value', 'time_threshold', 'max_alerts', 'min_alerts', 'time_from', 'time_to', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'recovery_notify', 'field2_recovery', 'field3_recovery', 'priority', 'id_group', 'special_day', 'min_alerts_reset_counter', 'field1_recovery', 'field4', 'field5', 'field6', 'field7', 'field8', 'field9', 'field10', 'field11', 'field12', 'field13', 'field14', 'field15', 'field4_recovery', 'field5_recovery', 'field6_recovery', 'field7_recovery', 'field8_recovery', 'field9_recovery', 'field10_recovery', 'field11_recovery', 'field12_recovery', 'field13_recovery', 'field14_recovery', 'field15_recovery', ]; $cont = 0; foreach ($fields_template as $field) { if ($other['data'][$cont] != '') { $values[$field] = $other['data'][$cont]; } $cont++; } $id_template = alerts_update_alert_template($id_template, $values); if (is_error($id_template)) { // TODO: Improve the error returning more info returnError( 'The alert template could not be updated.' ); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('Successful update of the alert template'), ] ); } } /** * Delete an alert template. And return a message with the result of the operation. * * @param string $id_template Id of the template to delete. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=set&op2=delete_alert_template&id=38 * * @param $thrash3 Don't use */ function api_set_delete_alert_template($id_template, $thrash1, $other, $thrash3) { global $config; if (is_metaconsole() === true) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id_template == '') { returnError( 'The alert template could not be deleted. Id_template cannot be left blank.' ); return; } $result_template = alerts_get_alert_template($id_template); if (!$result_template) { returnError( 'error_update_alert_template', __('Error deleting alert template. Id_template doesn\'t exist.') ); return; } if (users_can_manage_group_all('LM')) { $groups = users_get_groups($config['id_user'], 'LM'); } else { $groups = users_get_groups($config['id_user'], 'LM', false); } $id_group = $result_template['id_group']; if ($groups[$id_group] === null) { returnError('forbidden', 'string'); return; } $result = alerts_delete_alert_template($id_template); if ($result == 0) { // TODO: Improve the error returning more info returnError( 'The alert template could not be deleted.' ); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('Successful delete of alert template.'), ] ); } } /** * Get all alert tamplates, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, but only is available. * example: * * api.php?op=get&op2=all_alert_templates&return_type=csv&other=; * * @param $thrash3 Don't use. */ function api_get_all_alert_templates($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!isset($other['data'][0])) { $separator = ';'; // by default } else { $separator = $other['data'][0]; } if (!check_acl($config['id_user'], 0, 'LM')) { returnError('forbidden', 'csv'); return; } $filter_templates = false; $template = alerts_get_alert_templates(); if ($template !== false) { $data['type'] = 'array'; $data['data'] = $template; } if (!$template) { returnError( 'Could not get all alert templates' ); } else { returnData('csv', $data, $separator); } } function api_get_all_alert_commands($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!isset($other['data'][0])) { $separator = ';'; // by default } else { $separator = $other['data'][0]; } if (!check_acl($config['id_user'], 0, 'LM')) { returnError('forbidden', 'csv'); return; } $commands = db_get_all_rows_filter( 'talert_commands', ['id_group' => array_keys(users_get_groups(false, 'LM'))] ); if ($commands === false) { $commands = []; } if ($commands !== false) { $data['type'] = 'array'; $data['data'] = $commands; } if (!$commands) { returnError( 'Could not get all alert commands.' ); } else { returnData('csv', $data, $separator); } } /** * Get an alert tamplate, and print the result like a csv. * * @param string $id_template Id of the template to get. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=get&op2=alert_template&id=25 * * @param $thrash3 Don't use */ function api_get_alert_template($id_template, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $filter_templates = false; if ($id_template != '') { $result_template = alerts_get_alert_template_name($id_template); if (!$result_template) { returnError( 'Could not get alert template. Id_template does not exist.' ); return; } $filter_templates = ['id' => $id_template]; } $template = alerts_get_alert_templates( $filter_templates, [ 'id', 'name', 'description', 'id_alert_action', 'type', 'id_group', ] ); if ($template !== false) { $data['type'] = 'array'; $data['data'] = $template; } if (!$template) { returnError( 'Could not get alert template' ); } else { returnData('csv', $data, ';'); } } /** * List of alert actions. * * @param array $other it's array, $other as param is ; and separator (pass in param * othermode as othermode=url_encode_separator_) * @param $returnType (csv, string or json). * * example: * * api.php?op=get&op2=alert_actions&apipass=1234&user=admin&pass=pandora&other=Create|;&other_mode=url_encode_separator_|&return_type=json */ function api_get_alert_actions($thrash1, $thrash2, $other, $returnType) { global $config; if (!check_acl($config['id_user'], 0, 'LM')) { returnError('forbidden', 'string'); return; } if (!isset($other['data'][0])) { $other['data'][1] = ''; } if (!isset($other['data'][1])) { $separator = ';'; // by default } else { $separator = $other['data'][1]; } $action_name = $other['data'][0]; $filter = []; if (!is_user_admin($config['id_user'])) { $filter['talert_actions.id_group'] = array_keys(users_get_groups(false, 'LM')); } $filter['talert_actions.name'] = "%$action_name%"; $actions = db_get_all_rows_filter( 'talert_actions INNER JOIN talert_commands ON talert_actions.id_alert_command = talert_commands.id', $filter, 'talert_actions.id, talert_actions.name' ); if ($actions === false) { $actions = []; } if ($actions !== false) { $data['type'] = 'array'; $data['data'] = $actions; } if (!$actions) { returnError( 'Could not get alert actions.' ); } else { returnData($returnType, $data, $separator); } } /** * Get module groups, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, but only is available. * example: * * api.php?op=get&op2=module_groups&return_type=csv&other=; * * @param $thrash3 Don't use. */ function api_get_module_groups($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'csv'); return; } if (!isset($other['data'][0])) { $separator = ';'; // by default } else { $separator = $other['data'][0]; } $filter = false; $module_groups = @db_get_all_rows_filter('tmodule_group', $filter); if ($module_groups !== false) { $data['type'] = 'array'; $data['data'] = $module_groups; } if (!$module_groups) { returnError('Could not get module groups.'); } else { returnData('csv', $data, $separator); } } /** * Get plugins, and print all the result like a csv. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, but only is available. * example: * * api.php?op=get&op2=plugins&return_type=csv&other=; * * @param $thrash3 Don't use. */ function api_get_plugins($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'csv'); return; } if (!isset($other['data'][0])) { $separator = ';'; // by default } else { $separator = $other['data'][0]; } $filter = false; $field_list = [ 'id', 'name', 'description', 'max_timeout', 'max_retries', 'execute', 'net_dst_opt', 'net_port_opt', 'user_opt', 'pass_opt', 'plugin_type', 'macros', 'parameters', ]; $plugins = @db_get_all_rows_filter('tplugin', $filter, $field_list); if ($plugins !== false) { $data['type'] = 'array'; $data['data'] = $plugins; } if (!$plugins) { returnError('Could not get plugins.'); } else { returnData('csv', $data, $separator); } } /** * Create a network module from a network component. And return the id of new module. * * @param string $agent_name The name of the agent where the module will be created * @param string $component_name The name of the network component * @param $thrash1 Don't use * @param $thrash2 Don't use */ function api_set_create_network_module_from_component($agent_name, $component_name, $other, $thrash2) { if (defined('METACONSOLE')) { return; } $agent_by_alias = false; if ($other['data'][0] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $ids_agents = agents_get_agent_id_by_alias($agent_name); } else { $agent_id = agents_get_agent_id($agent_name); } if ($agent_by_alias) { foreach ($ids_agents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AW')) { return; } } } else { if (!util_api_check_agent_and_print_error($agent_id, 'string', 'AW')) { return; } } if ($agent_by_alias) { foreach ($ids_agents as $id) { if (!$id['id_agente']) { returnError('The network component could not be created. Agent does not exist.'); return; } } } else { if (!$agent_id) { returnError('The network component could not be created. Agent does not exist.'); return; } } $component = db_get_row('tnetwork_component', 'name', $component_name); if (!$component) { returnError('The network component could not be created. Network component does not exist.'); return; } // Adapt fields to module structure unset($component['id_nc']); unset($component['id_group']); $component['id_tipo_modulo'] = $component['type']; unset($component['type']); $component['descripcion'] = $component['description']; unset($component['description']); unset($component['name']); $component['ip_target'] = agents_get_address($agent_id); // Create module if ($agent_by_alias) { $agents_affected = 0; foreach ($ids_agents as $id) { $module_id = modules_create_agent_module($id['id_agente'], $component_name, $component, true); if ($module_id) { $agents_affected++; } } returnData('string', ['type' => 'string', 'data' => __('%d agents affected', $agents_affected)]); return; } else { $module_id = modules_create_agent_module($agent_id, $component_name, $component, true); if (!$module_id) { returnError('The network component could not be created.'); return; } return $module_id; } } /** * Assign a module to an alert template. And return the id of new relationship. * * @param string $id_template Name of alert template to add. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=create_module_template&id=1&other=1|10&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_module_template($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } if ($id == '') { returnError( 'The module template could not be assigned. Id_template cannot be left blank.' ); return; } if ($other['data'][0] == '') { returnError( 'The module template could not be assigned. Id_module cannot be left blank.' ); return; } if ($other['data'][1] == '') { returnError( 'The module template could not be assigned. Id_agent cannot be left blank.' ); return; } $id_module = $other['data'][0]; $id_agent = $other['data'][1]; if (!util_api_check_agent_and_print_error($id_agent, 'string', 'AW')) { return; } $result_template = alerts_get_alert_template($id); if (!$result_template) { returnError( 'The module template could not be assigned. Id_template does not exist.' ); return; } $result_agent = agents_get_name($id_agent); if (!$result_agent) { returnError( 'The module template could not be assigned. Id_agent does not exist.' ); return; } $result_module = db_get_value('nombre', 'tagente_modulo', 'id_agente_modulo', (int) $id_module); if (!$result_module) { returnError( 'The module template could not be assigned. Id_module does not exist.' ); return; } $id_template_module = alerts_create_alert_agent_module($id_module, $id); if (is_error($id_template_module)) { // TODO: Improve the error returning more info returnError( 'The module template could not be assigned.' ); } else { returnData('string', ['type' => 'string', 'data' => $id_template_module]); } } /** * Delete an module assigned to a template. And return a message with the result of the operation. * * @param string $id Id of the relationship between module and template (talert_template_modules) to delete. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=set&op2=delete_module_template&id=38 * * @param $thrash3 Don't use */ function api_set_delete_module_template($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AD')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError('The module template could not deleted. Id_module_template cannot be left blank.'); return; } $result_module_template = alerts_get_alert_agent_module($id); if (!$result_module_template) { returnError('The module template could not deleted. Id_module_template does not exist.'); return; } $result = alerts_delete_alert_agent_module($id); if ($result == 0) { // TODO: Improve the error returning more info returnError('The module template could not deleted.'); } else { returnData('string', ['type' => 'string', 'data' => __('Correct deleting of module template.')]); } } /** * Delete a module assigned to a template and return a message with the result of the operation. * * @param $id Agent Name * @param $id2 Alert Template Name * @param $other [0] : Module Name * @param $trash1 Don't use * * example: * * api.php?op=set&op2=delete_module_template_by_names&id=my_latest_agent&id2=test_template&other=memfree */ function api_set_delete_module_template_by_names($id, $id2, $other, $trash1) { global $config; if (defined('METACONSOLE')) { return; } $result = 0; if (! check_acl($config['id_user'], 0, 'AD') && ! check_acl($config['id_user'], 0, 'LM') ) { returnError('forbidden', 'string'); return; } $agent_by_alias = false; if ($other['data'][1] === '1') { $agent_by_alias = true; } if ($agent_by_alias) { $idsAgents = agents_get_agent_id_by_alias($id); foreach ($idsAgents as $id) { if (!util_api_check_agent_and_print_error($id['id_agente'], 'string', 'AD')) { return; } } } else { $idAgent = agents_get_agent_id($id); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AD')) { return; } } $row = db_get_row_filter('talert_templates', ['name' => $id2]); if ($row === false) { returnError('Parameter error.'); return; } $idTemplate = $row['id']; $idActionTemplate = $row['id_alert_action']; $delete_count = 0; if ($agent_by_alias) { foreach ($idsAgents as $id) { $idAgentModule = db_get_value_filter('id_agente_modulo', 'tagente_modulo', ['id_agente' => $id['id_agente'], 'nombre' => $other['data'][0]]); if ($idAgentModule === false) { continue; } $values = [ 'id_agent_module' => $idAgentModule, 'id_alert_template' => $idTemplate, ]; $result = db_process_sql_delete('talert_template_modules', $values); if ($result != 0) { $delete_count++; } } returnError(sprintf('Module template has been deleted in %d agents.', $delete_count)); } else { $idAgentModule = db_get_value_filter('id_agente_modulo', 'tagente_modulo', ['id_agente' => $idAgent, 'nombre' => $other['data'][0]]); if ($idAgentModule === false) { returnError('Parameter error.'); return; } $values = [ 'id_agent_module' => $idAgentModule, 'id_alert_template' => $idTemplate, ]; $result = db_process_sql_delete('talert_template_modules', $values); if ($result == 0) { // TODO: Improve the error returning more info returnError('The module template could not deleted'); } else { returnData('string', ['type' => 'string', 'data' => __('Successful delete of module template.')]); } } } /** * Validate an alert * * @param string $id1 Alert template name (eg. 'Warning condition') * @param string $trash1 Do nnot use. * @param array $other [1] id/name agent. * [2] id/name module * [3] Use agent/module alias. * @param string $trash2 Do not use * @return void */ function api_set_validate_alert($id1, $trash1, $other, $trash2) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'LW')) { returnError('forbidden'); return; } if ($id1 === '') { returnError( 'error_validate_alert', __('Error validating alert. Id_template cannot be left blank.') ); return; } if ($other['data'][0] == '') { returnError( 'error_validate_alert', __('Error validating alert. Id_agent cannot be left blank.') ); return; } if ($other['data'][1] == '') { returnError( 'error_validate_alert', __('Error validating alert. Id_module cannot be left blank.') ); return; } if ($other['data'][2] == 1) { $use_alias = true; } $values = [ 'alert_name' => $id1, 'id_agent' => $other['data'][0], 'id_agent_module' => $other['data'][1], ]; if ($use_alias === true) { $id_agents = agents_get_agent_id_by_alias($values['id_agent']); foreach ($id_agents as $id) { $values['id_agent'] = $id['id_agente']; $values['id_agent_module'] = db_get_value_filter( 'id_agente_modulo as id_module', 'tagente_modulo', [ 'id_agente' => $values['id_agent'], 'nombre' => $values['id_agent_module'], ] ); $id_template = db_get_value_filter( 'id as id_template', 'talert_templates', [ 'name' => $values['alert_name'], ] ); // Get alert id. $id_alert = db_get_value_filter( 'id as id_alert', 'talert_template_modules', [ 'id_agent_module' => $values['id_agent_module'], 'id_alert_template' => $id_template, ] ); } $result = alerts_validate_alert_agent_module($id_alert); } else { $id_template = db_get_value_filter( 'id as id_template', 'talert_templates', [ 'name' => $values['alert_name'], ] ); // Get alert id. $id_alert = db_get_value_filter( 'id as id_alert', 'talert_template_modules', [ 'id_agent_module' => $values['id_agent_module'], 'id_alert_template' => $id_template, ] ); if ($id_alert === false) { returnError( 'error_validate_alert', __('Error validating alert. Specified alert does not exist.') ); return; } $result = alerts_validate_alert_agent_module($id_alert); } if ($result) { returnData('string', ['type' => 'string', 'data' => 'Alert succesfully validated']); } else { returnData('string', ['type' => 'string', 'data' => __('Error validating alert')]); } } /** * Validate all alerts. And return a message with the result of the operation. * * @param string Don't use. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=set&op2=validate_all_alerts * * @param $thrash3 Don't use */ function api_set_validate_all_alerts($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'LW')) { returnError('forbidden', 'string'); return; } $agents = []; $raw_agents = agents_get_agents(false, 'id_agente'); if ($raw_agents !== false) { foreach ($raw_agents as $agent) { $agents[] = $agent['id_agente']; } } $agents_string = implode(',', $agents); $sql = sprintf( ' SELECT talert_template_modules.id FROM talert_template_modules INNER JOIN tagente_modulo t2 ON talert_template_modules.id_agent_module = t2.id_agente_modulo INNER JOIN tagente t3 ON t2.id_agente = t3.id_agente INNER JOIN talert_templates t4 ON talert_template_modules.id_alert_template = t4.id WHERE t3.id_agente in (%s)', $agents_string ); $alerts = db_get_all_rows_sql($sql); if ($alerts === false) { $alerts = []; } $total_alerts = count($alerts); $count_results = 0; foreach ($alerts as $alert) { $result = alerts_validate_alert_agent_module($alert['id'], false); if ($result) { $count_results++; } } if ($total_alerts > $count_results) { $errors = ($total_alerts - $count_results); returnError(sprintf('Could not validate all alerts. Failed %d', $errors)); } else { returnData('string', ['type' => 'string', 'data' => __('Correct validation of all alerts (total %d).', $count_results)]); } } /** * Validate all policy alerts. And return a message with the result of the operation. * * @param string Don't use. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=set&op2=validate_all_policy_alerts * * @param $thrash3 Don't use */ function api_set_validate_all_policy_alerts($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } // Get all policies $policies = enterprise_hook('policies_get_policies', [false, false, false]); if ($duplicated === ENTERPRISE_NOT_HOOK) { returnError('Could not validate all of alert policies.'); return; } // Count of valid results $total_alerts = 0; $count_results = 0; // Check all policies foreach ($policies as $policy) { $policy_alerts = []; $policy_alerts = enterprise_hook('policies_get_alerts', [$policy['id'], false, false]); // Number of alerts in this policy if ($policy_alerts != false) { $partial_alerts = count($policy_alerts); // Added alerts of this policy to the total $total_alerts = ($total_alerts + $partial_alerts); } $result_pol_alerts = []; foreach ($policy_alerts as $policy_alert) { $result_pol_alerts[] = $policy_alert['id']; } $id_pol_alerts = implode(',', $result_pol_alerts); // If the policy has alerts if (count($result_pol_alerts) != 0) { $sql = sprintf( ' SELECT id FROM talert_template_modules WHERE id_policy_alerts IN (%s)', $id_pol_alerts ); $id_alerts = db_get_all_rows_sql($sql); $result_alerts = []; foreach ($id_alerts as $id_alert) { $result_alerts[] = $id_alert['id']; } // Validate alerts of these modules foreach ($result_alerts as $result_alert) { $result = alerts_validate_alert_agent_module($result_alert, true); if ($result) { $count_results++; } } } } // Check results if ($total_alerts > $count_results) { $errors = ($total_alerts - $count_results); returnError(sprintf('Could not validate all policy alerts. Failed %s', $errors)); } else { returnData('string', ['type' => 'string', 'data' => __('Correct validation of all policy alerts.')]); } } /** * Stop a schedule downtime. And return a message with the result of the operation. * * @param string $id Id of the downtime to stop. * @param $thrash1 Don't use. * @param array $other Don't use * * example: * * api.php?op=set&op2=stop_downtime&id=38 * * @param $thrash3 Don't use */ function api_set_stop_downtime($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AD')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError('Could not stop scheduled downtime. Id_downtime cannot be left blank.'); return; } $date_time_stop = get_system_time(); $sql = sprintf('SELECT date_to, type_execution, executed FROM tplanned_downtime WHERE id=%d', $id); $data = db_get_row_sql($sql); if ($data['type_execution'] == 'periodically' && $data['executed'] == 1) { returnError('error_stop_downtime', __('Error stopping downtime. Periodical and running scheduled downtime cannot be stopped.')); return; } $values = []; $values['date_to'] = $date_time_stop; $result_update = db_process_sql_update('tplanned_downtime', $values, ['id' => $id]); if ($result_update == 0) { returnError('No action has been taken.'); } else if ($result_update < 0) { returnError('Could not stop downtime.'); } else { returnData('string', ['type' => 'string', 'data' => __('Downtime stopped.')]); } } function api_set_add_tag_module($id, $id2, $thrash1, $thrash2) { if (defined('METACONSOLE')) { return; } $id_module = $id; $id_tag = $id2; if (!util_api_check_agent_and_print_error(modules_get_agentmodule_agent($id_module), 'string', 'AW')) { return; } $exists = db_get_row_filter( 'ttag_module', [ 'id_agente_modulo' => $id_module, 'id_tag' => $id_tag, ] ); if (empty($exists)) { db_process_sql_insert( 'ttag_module', [ 'id_agente_modulo' => $id_module, 'id_tag' => $id_tag, ] ); $exists = db_get_row_filter( 'ttag_module', [ 'id_agente_modulo' => $id_module, 'id_tag' => $id_tag, ] ); } if (empty($exists)) { returnError('The tag module could not be setted.'); } else { returnData( 'string', [ 'type' => 'string', 'data' => 1, ] ); } } function api_set_remove_tag_module($id, $id2, $thrash1, $thrash2) { if (defined('METACONSOLE')) { return; } $id_module = $id; $id_tag = $id2; if (!util_api_check_agent_and_print_error(modules_get_agentmodule_agent($id_module), 'string', 'AW')) { return; } $row = db_get_row_filter( 'ttag_module', [ 'id_agente_modulo' => $id_module, 'id_tag' => $id_tag, ] ); $correct = 0; if (!empty($row)) { // Avoid to delete from policies if ($row['id_policy_module'] == 0) { $correct = db_process_sql_delete( 'ttag_module', [ 'id_agente_modulo' => $id_module, 'id_tag' => $id_tag, ] ); } } returnData( 'string', [ 'type' => 'string', 'data' => $correct, ] ); } function api_set_tag($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } $values = []; $values['name'] = $id; $values['description'] = $other['data'][0]; $values['url'] = $other['data'][1]; $values['email'] = $other['data'][2]; $values['phone'] = $other['data'][3]; $id_tag = tags_create_tag($values); if (empty($id_tag)) { returnError('The tag could not be setted.'); } else { returnData( 'string', [ 'type' => 'string', 'data' => $id_tag, ] ); } } /** * Return all planned downtime. * * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=all_planned_downtimes&other=test|0|quiet|periodically|weekly&other_mode=url_encode_separator_|&return_type=json * * @param type of return json or csv. */ function api_get_all_planned_downtimes($thrash1, $thrash2, $other, $returnType='json') { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', $returnType); return; } $values = []; $values = ["name LIKE '%".$other['data'][0]."%'"]; if (isset($other['data'][1]) && ($other['data'][1] != false )) { $values['id_group'] = $other['data'][1]; } if (isset($other['data'][2]) && ($other['data'][2] != false)) { $values['type_downtime'] = $other['data'][2]; } if (isset($other['data'][3]) && ($other['data'][3] != false)) { $values['type_execution'] = $other['data'][3]; } if (isset($other['data'][4]) && ($other['data'][4] != false)) { $values['type_periodicity'] = $other['data'][4]; } $returned = all_planned_downtimes($values); if ($returned === false) { returnError('Planned downtime was not retrieved'); return; } returnData( $returnType, [ 'type' => 'array', 'data' => $returned, ] ); } /** * Return all items of planned downtime. * * @param $id id of planned downtime. * @param array $other it's array, $other as param is ;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * * example: * * api.php?op=get&op2=planned_downtimes_items&other=test|0|quiet|periodically|weekly&other_mode=url_encode_separator_|&return_type=json * * @param type of return json or csv. */ function api_get_planned_downtimes_items($thrash1, $thrash2, $other, $returnType='json') { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AR')) { returnError('forbidden', $returnType); return; } $values = []; $values = ["name LIKE '%".$other['data'][0]."%'"]; if (isset($other['data'][1]) && ($other['data'][1] != false )) { $values['id_group'] = $other['data'][1]; } if (isset($other['data'][2]) && ($other['data'][2] != false)) { $values['type_downtime'] = $other['data'][2]; } if (isset($other['data'][3]) && ($other['data'][3] != false)) { $values['type_execution'] = $other['data'][3]; } if (isset($other['data'][4]) && ($other['data'][4] != false)) { $values['type_periodicity'] = $other['data'][4]; } $returned = all_planned_downtimes($values); $is_quiet = false; $return = [ 'list_index' => [ 'id_agents', 'id_downtime', 'all_modules', ], ]; foreach ($returned as $downtime) { if ($downtime['type_downtime'] === 'quiet') { $is_quiet = true; } $filter['id_downtime'] = $downtime['id']; $items = planned_downtimes_items($filter); if ($items !== false) { $return[] = $items; } } // If the header is the unique element in the array, return an error if (count($return) == 1) { returnError('no_data_to_show', $returnType); return; } if ($is_quiet) { $return['list_index'][] = 'modules'; } if ($returnType == 'json') { unset($return['list_index']); } returnData( $returnType, [ 'type' => 'array', 'data' => $return, ] ); } /** * Delete planned downtime. * * @param $id id of planned downtime. * @param $thrash1 not use. * @param $thrash2 not use. * * api.php?op=set&op2=planned_downtimes_deleted &id=10 * * @param type of return json or csv. */ function api_set_planned_downtimes_deleted($id, $thrash1, $thrash2, $returnType) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AD')) { returnError('forbidden', $returnType); return; } $values = []; $values = ['id_downtime' => $id]; $returned = delete_planned_downtimes($values); returnData( $returnType, [ 'type' => 'string', 'data' => $returned, ] ); } /** * Create a new planned downtime. * e.g.: api.php?op=set&op2=planned_downtimes_created&id=pepito&other=testing|08-22-2015|08-31-2015|0|1|1|1|1|1|1|1|17:06:00|19:06:00|1|31|quiet|periodically|weekly&other_mode=url_encode_separator_| * * @param $id name of planned downtime. * @param $thrash1 Don't use. * @param array $other Contains the following elements (in order): * * * * * * * * * * * * * * * * * * * @param $thrash3 Don't use. */ function api_set_planned_downtimes_created($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AD')) { returnError('forbidden', 'string'); return; } $date_from = strtotime(html_entity_decode($other['data'][1].' '.$other['data'][11])); $date_to = strtotime(html_entity_decode($other['data'][2].' '.$other['data'][12])); $values = []; $values['name'] = $id; $values = [ 'name' => $id, 'description' => $other['data'][0], 'date_from' => $date_from, 'date_to' => $date_to, 'id_group' => $other['data'][3], 'monday' => $other['data'][4], 'tuesday' => $other['data'][5], 'wednesday' => $other['data'][6], 'thursday' => $other['data'][7], 'friday' => $other['data'][8], 'saturday' => $other['data'][9], 'sunday' => $other['data'][10], 'periodically_time_from' => $other['data'][11], 'periodically_time_to' => $other['data'][12], 'periodically_day_from' => $other['data'][13], 'periodically_day_to' => $other['data'][14], 'type_downtime' => $other['data'][15], 'type_execution' => $other['data'][16], 'type_periodicity' => $other['data'][17], 'id_user' => $other['data'][18], ]; $returned = planned_downtimes_created($values); if (!$returned['return']) { returnError($returned['message']); } else { returnData( 'string', [ 'type' => 'string', 'data' => $returned['return'], ] ); } } /** * Add new items to planned Downtime. * e.g.: api.php?op=set&op2=planned_downtimes_additem&id=123&other=1;2;3;4|Status;Unkown_modules&other_mode=url_encode_separator_| * * @param $id id of planned downtime. * @param $thrash1 Don't use. * @param array $other * The first index contains a list of agent Ids. * The second index contains a list of module names. * The list separator is the character ';'. * @param $thrash3 Don't use. */ function api_set_planned_downtimes_additem($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $total_agents = explode(';', $other['data'][0]); $agents = $total_agents; $bad_agents = []; $i = 0; foreach ($total_agents as $agent_id) { $result_agent = agents_check_access_agent($agent_id, 'AR'); if (!$result_agent) { $bad_agents[] = $agent_id; unset($agents[$i]); } $i++; } if (isset($other['data'][1])) { $name_modules = explode(';', io_safe_output($other['data'][1])); } else { $name_modules = false; } if ($name_modules) { $all_modules = false; } else { $all_modules = true; } if (!empty($agents)) { $returned = planned_downtimes_add_items($id, $agents, $all_modules, $name_modules); } if (empty($agents)) { returnError('No agents to create scheduled downtime items'); } else { if (!empty($returned['bad_modules'])) { $bad_modules = __("and this modules are doesn't exists or not applicable a this agents: ").implode(', ', $returned['bad_modules']); } if (!empty($returned['bad_agents'])) { $bad_agent = __('and this agents are generate problems: ').implode(', ', $returned['bad_agents']); } if (!empty($bad_agents)) { $agents_no_exists = __("and this agents with ids are doesn't exists: ").implode(', ', $bad_agents); } returnData( 'string', [ 'type' => 'string', 'data' => 'Successfully created items '.$bad_agent.' '.$bad_modules.' '.$agents_no_exists, ] ); } } /** * Edit planned Downtime. * e.g.: api.php?op=set&op2=planned_downtimes_edit&apipass=1234&user=admin&pass=pandora&id=2&other=testing2|test2|2021/05/10|2021/06/12|19:03:03|19:55:00|0|0|0|0|0|0|0|0|1|31|quiet|once|weekly&other_mode=url_encode_separator_| * * @param $id id of planned downtime. * @param $thrash1 Don't use. * @param array $other * The first index contains a list of agent Ids. * The second index contains a list of module names. * The list separator is the character ';'. * @param $thrash3 Don't use. */ function api_set_planned_downtimes_edit($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError( 'id cannot be left blank.' ); return; } if (db_get_value('id', 'tplanned_downtime', 'id', $id) === false) { returnError( 'id does not exist' ); return; } if ($other['data'] == '') { returnError( 'data cannot be left blank.' ); return; } $values = []; if (!empty($other['data'][0])) { $values['name'] = io_safe_input($other['data'][0]); } if (!empty($other['data'][1])) { $values['description'] = io_safe_input($other['data'][1]); } if (!empty($other['data'][2]) && !empty($other['data'][4])) { $date_from = strtotime(html_entity_decode($other['data'][2].' '.$other['data'][4])); $values['date_from'] = io_safe_input($date_from); } if (!empty($other['data'][4])) { $values['periodically_time_from'] = io_safe_input($other['data'][4]); } if (!empty($other['data'][3]) && !empty($other['data'][5])) { $date_to = strtotime(html_entity_decode($other['data'][3].' '.$other['data'][5])); $values['date_to'] = io_safe_input($date_to); } if (!empty($other['data'][5])) { $values['periodically_time_to'] = io_safe_input($other['data'][5]); } if ($other['data'][6] != '') { $values['id_group'] = io_safe_input($other['data'][6]); } if ($other['data'][7] != '') { $values['monday'] = io_safe_input($other['data'][7]); } if ($other['data'][8] != '') { $values['tuesday'] = io_safe_input($other['data'][8]); } if ($other['data'][9] != '') { $values['wednesday'] = io_safe_input($other['data'][9]); } if ($other['data'][10] != '') { $values['thursday'] = io_safe_input($other['data'][10]); } if ($other['data'][11] != '') { $values['friday'] = io_safe_input($other['data'][11]); } if ($other['data'][12] != '') { $values['saturday'] = io_safe_input($other['data'][12]); } if ($other['data'][13] != '') { $values['sunday'] = io_safe_input($other['data'][13]); } if (!empty($other['data'][14])) { $values['periodically_day_from'] = io_safe_input($other['data'][14]); } if (!empty($other['data'][15])) { $values['periodically_day_to'] = io_safe_input($other['data'][15]); } if (!empty($other['data'][16])) { $values['type_downtime'] = io_safe_input($other['data'][16]); } if (!empty($other['data'][17])) { $values['type_execution'] = io_safe_input($other['data'][17]); } if (!empty($other['data'][18])) { $values['type_periodicity'] = io_safe_input($other['data'][18]); } $res = db_process_sql_update('tplanned_downtime', $values, ['id' => $id]); if ($res === false) { returnError('Planned downtime could not be updated'); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('Planned downtime updated'), ] ); } } /** * Delete agents in planned Downtime. * e.g.: pi.php?op=set&op2=planned_downtimes_delete_agents&apipass=1234&user=admin&pass=pandora&id=4&other=1;2;3&other_mode=url_encode_separator_| * * @param $id id of planned downtime. * @param $thrash1 Don't use. * @param array $other * The first index contains a list of agent Ids. * The list separator is the character ';'. * @param $thrash3 Don't use. */ function api_set_planned_downtimes_delete_agents($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError( 'id cannot be left blank.' ); return; } if (db_get_value('id', 'tplanned_downtime', 'id', $id) === false) { returnError( 'id does not exist' ); return; } if ($other['data'] == '') { returnError( 'data cannot be left blank.' ); return; } if (!empty($other['data'][0])) { $agents = $other['data']; $results = false; foreach ($agents as $agent) { if (db_get_value_sql(sprintf('SELECT id from tplanned_downtime_agents WHERE id_agent = %d AND id_downtime = %d', $agent, $id)) !== false) { $result = db_process_sql_delete('tplanned_downtime_agents', ['id_agent' => $agent]); db_process_sql_delete('tplanned_downtime_modules', ['id_agent' => $agent]); if ($result == false) { returnError(" Agent $agent could not be deleted."); } else { $results = true; } } else { returnError(" Agent $agent is not in planned downtime."); } } if ($results) { returnData( 'string', [ 'type' => 'string', 'data' => __(' Agents deleted'), ] ); } } } /** * Add agents planned Downtime. * e.g.: api.php?op=set&op2=planned_downtimes_add_agents&apipass=1234&user=admin&pass=pandora&id=4&other=1;2;3&other_mode=url_encode_separator_| * * @param $id id of planned downtime. * @param $thrash1 Don't use. * @param array $other * The first index contains a list of agent Ids. * The list separator is the character ';'. * @param $thrash3 Don't use. */ function api_set_planned_downtimes_add_agents($id, $thrash1, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError( 'id cannot be left blank.' ); return; } if (db_get_value('id', 'tplanned_downtime', 'id', $id) === false) { returnError( 'id does not exist' ); return; } if ($other['data'] == '') { returnError( 'data cannot be left blank.' ); return; } if (!empty($other['data'][0])) { $agents = explode(';', $other['data'][0]); $results = false; foreach ($agents as $agent) { if (!empty($agent)) { if (db_get_value_sql(sprintf('SELECT id from tplanned_downtime_agents tpd WHERE tpd.id_agent = %d AND id_downtime = %d', $agent, $id)) === false) { $res = db_process_sql_insert( 'tplanned_downtime_agents', [ 'id_agent' => $agent, 'id_downtime' => $id, 'all_modules' => 0, 'manually_disabled' => 0, ] ); if ($res) { $results = true; } } else { returnError(" Agent $agent is already at the planned downtime."); } } } if ($results) { returnData( 'string', [ 'type' => 'string', 'data' => __(' Agents added'), ] ); } } } /** * Update data module in policy. And return id from new module. * * @param string $id Id of the target policy module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example: * * api.php?op=set&op2=update_data_module_policy&id=1&other=10~data%20module%20updated%20by%20Api~2~0~0~50.00~10~20~180~~21~35~~1~module_begin%0dmodule_name%20pandora_process%0dmodule_type%20generic_data%0dmodule_exec%20ps%20aux%20|%20grep%20pandora%20|%20wc%20-l%0dmodule_end&other_mode=url_encode_separator_~ * * @param $thrash3 Don't use */ function api_set_update_data_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The data module could not be updated in policy. Id_policy cannot be left blank.' ); return; } if (!util_api_check_agent_and_print_error($id, 'string', 'AW')) { return; } if ($other['data'][0] == '') { returnError( 'The data module could not be updated in policy. Id_policy_module cannot be left blank.' ); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', [$id, ['id' => $other['data'][0]], 'id_module']); if ($module_policy === false) { returnError( 'The data module could not be updated in policy. Module does not exist.' ); return; } if ($module_policy[0]['id_module'] != 1) { returnError( 'The data module could not be updated in policy. Module type is not network type.' ); return; } $fields_data_module = [ 'id', 'description', 'id_module_group', 'min', 'max', 'post_process', 'module_interval', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'history_data', 'configuration_data', 'disabled_types_event', 'module_macros', ]; $cont = 0; foreach ($fields_data_module as $field) { if ($other['data'][$cont] != '' and $field != 'id') { $values[$field] = $other['data'][$cont]; } $cont++; } $result_update = enterprise_hook( 'policies_update_module', [ $other['data'][0], $values, false, ] ); if ($result_update < 0) { returnError('The data module could not be updated in policy.'); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('Data policy module updated.'), ] ); } } /** * Add network module to policy. And return a result message. * * @param string $id Id of the target policy. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;; * ;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example: * * api.php?op=set&op2=add_network_module_policy&id=1&other=network_module_policy_example_name|6|network%20module%20created%20by%20Api|2|0|0|50.00|180|10|20||21|35||1|15|0|66|||0&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_add_network_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The network module could not be added to policy. Id_policy cannot be left blank.' ); return; } if (enterprise_hook('policies_check_user_policy', [$id]) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == '') { returnError( 'The network module could not be added to policy. Module_name cannot be left blank.' ); return; } if ($other['data'][1] < 6 or $other['data'][1] > 18) { returnError( 'The network module could not be added to policy. Id_module_type is not correct for network modules.' ); return; } // Check if the module is already in the policy $name_module_policy = enterprise_hook( 'policies_get_modules', [ $id, ['name' => $other['data'][0]], 'name', ] ); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('The network module could not be added to policy.'); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][21]; $disabled_types_event = json_encode($disabled_types_event); $values = []; $values['id_tipo_modulo'] = $other['data'][1]; $values['description'] = $other['data'][2]; $values['id_module_group'] = $other['data'][3]; $values['min'] = $other['data'][4]; $values['max'] = $other['data'][5]; $values['post_process'] = $other['data'][6]; $values['module_interval'] = $other['data'][7]; $values['min_warning'] = $other['data'][8]; $values['max_warning'] = $other['data'][9]; $values['str_warning'] = $other['data'][10]; $values['min_critical'] = $other['data'][11]; $values['max_critical'] = $other['data'][12]; $values['str_critical'] = $other['data'][13]; $values['history_data'] = $other['data'][14]; $values['min_ff_event'] = $other['data'][15]; $values['disabled'] = $other['data'][16]; $values['tcp_port'] = $other['data'][17]; $values['snmp_community'] = $other['data'][18]; $values['snmp_oid'] = $other['data'][19]; $values['custom_id'] = $other['data'][20]; $values['disabled_types_event'] = $disabled_types_event; $values['module_macros'] = $other['data'][22]; $values['each_ff'] = $other['data'][23]; $values['min_ff_event_normal'] = $other['data'][24]; $values['min_ff_event_warning'] = $other['data'][25]; $values['min_ff_event_critical'] = $other['data'][26]; $values['ff_type'] = $other['data'][27]; if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('The network module could not be added to policy. The module is already in the policy.'); return; } } $success = enterprise_hook('policies_create_module', [$other['data'][0], $id, 2, $values, false]); if ($success) { returnData('string', ['type' => 'string', 'data' => $success]); } else { returnError('The network module could not be added to policy.'); } } /** * Update network module in policy. And return a result message. * * @param string $id Id of the target policy module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;;;; * ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example: * * api.php?op=set&op2=update_network_module_policy&id=1&other=14|network%20module%20updated%20by%20Api|2|0|0|150.00|300|10|20||21|35||1|15|0|66|||0&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_network_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The network module could not be updated in policy. Id_policy cannot be left blank.' ); return; } if ($other['data'][0] == '') { returnError( 'The network module could not be updated in policy. Id_policy_module cannot be left blank.' ); return; } // Check if the module exist. $module_policy = enterprise_hook('policies_get_modules', [$id, ['id' => $other['data'][0]], 'id_module']); if ($module_policy === false) { returnError( 'The network module could not be updated in policy. Module does not exist.' ); return; } if ($module_policy[0]['id_module'] != 2) { returnError( 'The network module could not be updated in policy. Module type is not network type.' ); return; } $fields_network_module = [ 'id', 'description', 'id_module_group', 'min', 'max', 'post_process', 'module_interval', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'history_data', 'min_ff_event', 'disabled', 'tcp_port', 'snmp_community', 'snmp_oid', 'custom_id', 'disabled_types_event', 'module_macros', ]; $cont = 0; foreach ($fields_network_module as $field) { if ($other['data'][$cont] != '' and $field != 'id') { $values[$field] = $other['data'][$cont]; } $cont++; } $result_update = enterprise_hook('policies_update_module', [$other['data'][0], $values, false]); if ($result_update < 0) { returnError('The network module could not be updated in policy.'); } else { returnData('string', ['type' => 'string', 'data' => __('Network policy module updated.')]); } } /** * Add plugin module to policy. And return id from new module. * * @param string $id Id of the target policy. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;; * ;;;;;;;; * ;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=add_plugin_module_policy&id=1&other=example%20plugin%20module%20name|0|1|2|0|0||0|0||15|0|66|||300|50.00|0|0|0|plugin%20module%20from%20api|2|admin|pass|-p%20max&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_add_plugin_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError('The plugin module could not be added. Id_policy cannot be left blank.'); return; } if (enterprise_hook('policies_check_user_policy', [$id]) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == '') { returnError('The plugin module could not be added. Module_name cannot be left blank.'); return; } if ($other['data'][21] == '') { returnError('The plugin module could not be added. Id_plugin cannot be left blank.'); return; } // Check if the module is already in the policy. $name_module_policy = enterprise_hook('policies_get_modules', [$id, ['name' => $other['data'][0]], 'name']); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('The plugin module could not be added.'); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][25]; $disabled_types_event = json_encode($disabled_types_event); $values = []; $values['disabled'] = $other['data'][1]; $values['id_tipo_modulo'] = $other['data'][2]; $values['id_module_group'] = $other['data'][3]; $values['min_warning'] = $other['data'][4]; $values['max_warning'] = $other['data'][5]; $values['str_warning'] = $other['data'][6]; $values['min_critical'] = $other['data'][7]; $values['max_critical'] = $other['data'][8]; $values['str_critical'] = $other['data'][9]; $values['min_ff_event'] = $other['data'][10]; $values['history_data'] = $other['data'][11]; $values['tcp_port'] = $other['data'][12]; $values['snmp_community'] = $other['data'][13]; $values['snmp_oid'] = $other['data'][14]; $values['module_interval'] = $other['data'][15]; $values['post_process'] = $other['data'][16]; $values['min'] = $other['data'][17]; $values['max'] = $other['data'][18]; $values['custom_id'] = $other['data'][19]; $values['description'] = $other['data'][20]; $values['id_plugin'] = $other['data'][21]; $values['plugin_user'] = $other['data'][22]; $values['plugin_pass'] = $other['data'][23]; $values['plugin_parameter'] = $other['data'][24]; $values['disabled_types_event'] = $disabled_types_event; $values['macros'] = base64_decode(str_replace(' ', '+', $other['data'][26])); $values['module_macros'] = $other['data'][27]; $values['each_ff'] = $other['data'][28]; $values['min_ff_event_normal'] = $other['data'][29]; $values['min_ff_event_warning'] = $other['data'][30]; $values['min_ff_event_critical'] = $other['data'][31]; $values['ff_type'] = $other['data'][32]; if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('The plugin module could not be added. The module is already in the policy.'); return; } } $plugin = db_get_row('tplugin', 'id', $values['id_plugin']); if (empty($plugin)) { returnError('id_not_found'); return; } $plugin_command_macros = $plugin['macros']; if (!empty($values['macros'])) { $macros = io_safe_input_json($values['macros']); if (empty($macros)) { returnError('JSON string in macros is invalid.'); exit; } $values['macros'] = io_merge_json_value($plugin_command_macros, $macros); } $success = enterprise_hook('policies_create_module', [$other['data'][0], $id, 4, $values, false]); if ($success) { returnData('string', ['type' => 'string', 'data' => $success]); } else { returnError('The plugin module could not be added.'); } } /** * Update plugin module in policy. And return a result message. * * @param string $id Id of the target policy module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;;; * ;;;;;;;; * ;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example: * * api.php?op=set&op2=update_plugin_module_policy&id=1&other=23|0|1|0|0||0|0||15|0|166|||180|150.00|0|0|0|plugin%20module%20updated%20from%20api|2|example_user|pass|-p%20min&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_plugin_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError( 'The plugin module could not be updated in policy. Id_policy cannot be left blank.' ); return; } if ($other['data'][0] == '') { returnError( 'The plugin module could not be updated in policy. Id_policy_module cannot be left blank.' ); return; } // Check if the module exist. $module_policy = enterprise_hook('policies_get_modules', [$id, ['id' => $other['data'][0]], 'id_module']); if ($module_policy === false) { returnError( 'The plugin module could not be updated in policy. Module does not exist.' ); return; } if ($module_policy[0]['id_module'] != 4) { returnError( 'The plugin module could not be updated in policy. Module type is not network type.' ); return; } $fields_plugin_module = [ 'id', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'tcp_port', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'description', 'id_plugin', 'plugin_user', 'plugin_pass', 'plugin_parameter', 'disabled_types_event', 'macros', 'module_macros', ]; $cont = 0; foreach ($fields_plugin_module as $field) { if ($other['data'][$cont] != '' and $field != 'id') { $values[$field] = $other['data'][$cont]; if ($field === 'macros') { $values[$field] = base64_decode($values[$field]); } } $cont++; } $result_update = enterprise_hook( 'policies_update_module', [ $other['data'][0], $values, false, ] ); if ($result_update < 0) { returnError('The plugin module could not be updated in policy.'); } else { returnData('string', ['type' => 'string', 'data' => __('Plugin policy module updated.')]); } } /** * Add module data configuration into agent configuration file * * @param string $id_agent Id of the agent * @param string $module_name * @param array $configuration_data is an array. The data in it is the new configuration data of the module * @param $thrash3 Don't use * * Call example: * * api.php?op=set&op2=add_module_in_conf&user=admin&pass=pandora&id=9043&id2=example_name&other=bW9kdWxlX2JlZ2luCm1vZHVsZV9uYW1lIGV4YW1wbGVfbmFtZQptb2R1bGVfdHlwZSBnZW5lcmljX2RhdGEKbW9kdWxlX2V4ZWMgZWNobyAxOwptb2R1bGVfZW5k * * @return string 0 when success, -1 when error, -2 if already exist */ function api_set_add_module_in_conf($id_agent, $module_name, $configuration_data, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($id_agent, 'string', 'AW')) { return; } $new_configuration_data = io_safe_output(urldecode($configuration_data['data'])); // Check if exist a current module with the same name in the conf file. $old_configuration_data = config_agents_get_module_from_conf($id_agent, io_safe_output($module_name)); // If exists a module with same name, abort. if (!empty($old_configuration_data)) { returnError('-2'); exit; } $result = enterprise_hook('config_agents_add_module_in_conf', [$id_agent, $new_configuration_data]); if ($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', ['type' => 'string', 'data' => '0']); } else { returnError('-1'); } } /** * Get module data configuration from agent configuration file * * @param string $id_agent Id of the agent * @param string $module_name * @param $thrash2 Don't use * @param $thrash3 Don't use * * Call example: * * api.php?op=get&op2=module_from_conf&user=admin&pass=pandora&id=9043&id2=example_name * * @return string Module data when success, empty when error */ function api_get_module_from_conf($id_agent, $module_name, $thrash2, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($id_agent, 'string')) { return; } $module_name = io_safe_output($module_name); $result = enterprise_hook( 'config_agents_get_module_from_conf', [ $id_agent, $module_name, ] ); if ($result !== ENTERPRISE_NOT_HOOK && !empty($result)) { returnData('string', ['type' => 'string', 'data' => $result]); } else { returnError(sprintf('Remote config of module %s is not available', $module_name)); } } /** * Delete module data configuration from agent configuration file * * @param string $id_agent Id of the agent * @param string $module_name * @param $thrash2 Don't use * @param $thrash3 Don't use * * Call example: * * api.php?op=set&op2=delete_module_in_conf&user=admin&pass=pandora&id=9043&id2=example_name * * @return string 0 when success, -1 when error */ function api_set_delete_module_in_conf($id_agent, $module_name, $thrash2, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($id_agent, 'string')) { return; } $result = config_agents_delete_module_in_conf($id_agent, $module_name); $result = enterprise_hook('config_agents_delete_module_in_conf', [$id_agent, $module_name]); if ($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', ['type' => 'string', 'data' => '0']); } else { returnError('-1'); } } /** * Update module data configuration from agent configuration file * * @param string $id_agent Id of the agent * @param string $module_name * @param array $configuration_data is an array. The data in it is the new configuration data of the module * @param $thrash3 Don't use * * Call example: * * api.php?op=set&op2=update_module_in_conf&user=admin&pass=pandora&id=9043&id2=example_name&other=bW9kdWxlX2JlZ2luCm1vZHVsZV9uYW1lIGV4YW1wbGVfbmFtZQptb2R1bGVfdHlwZSBnZW5lcmljX2RhdGEKbW9kdWxlX2V4ZWMgZWNobyAxOwptb2R1bGVfZW5k * * @return string 0 when success, 1 when no changes, -1 when error, -2 if doesnt exist */ function api_set_update_module_in_conf($id_agent, $module_name, $configuration_data_serialized, $thrash3) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error($id_agent, 'string')) { return; } $new_configuration_data = io_safe_output(base64_decode($configuration_data_serialized['data'])); // Get current configuration. $old_configuration_data = config_agents_get_module_from_conf($id_agent, io_safe_output($module_name)); // If not exists if (empty($old_configuration_data)) { returnError('-2'); exit; } // If current configuration and new configuration are equal, abort. if ($new_configuration_data == $old_configuration_data) { returnData('string', ['type' => 'string', 'data' => '1']); exit; } $result = enterprise_hook('config_agents_update_module_in_conf', [$id_agent, $old_configuration_data, $new_configuration_data]); if ($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', ['type' => 'string', 'data' => '0']); } else { returnError('-1'); } } /** * Add SNMP module to policy. And return id from new module. * * @param string $id Id of the target policy. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; * ;;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=add_snmp_module_policy&id=1&other=example%20SNMP%20module%20name|0|15|2|0|0||0|0||15|1|66|3|public|.1.3.6.1.2.1.1.1.0|180|50.00|10|60|0|SNMP%20module%20modified%20by%20API|AES|example_priv_passw|authNoPriv|MD5|pepito_user|example_auth_passw&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_add_snmp_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError('The SNMP module could not be added to policy. Id_policy cannot be left blank.'); return; } if (enterprise_hook('policies_check_user_policy', [$id]) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == '') { returnError('The SNMP module could not be added to policy. Module_name cannot be left blank.'); return; } // Check if the module is already in the policy $name_module_policy = enterprise_hook('policies_get_modules', [$id, ['name' => $other['data'][0]], 'name']); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('The SNMP module could not be added to policy.'); return; } if ($other['data'][2] < 15 or $other['data'][2] > 18) { returnError('The SNMP module could not be added to policy. Id_module_type is not correct for SNMP modules.'); return; } $disabled_types_event = []; $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int) !$other['data'][28]; $disabled_types_event = json_encode($disabled_types_event); // SNMP version 3 if ($other['data'][13] == '3') { if ($other['data'][22] != 'AES' and $other['data'][22] != 'DES') { returnError('The SNMP module could not be added to policy. snmp3_priv_method does not exist. Set it to \'AES\' or \'DES\'. '); return; } if ($other['data'][24] != 'authNoPriv' and $other['data'][24] != 'authPriv' and $other['data'][24] != 'noAuthNoPriv') { returnError('The SNMP module could not be added to policy. snmp3_sec_level does not exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. '); return; } if ($other['data'][25] != 'MD5' and $other['data'][25] != 'SHA') { returnError('The SNMP module could not be added to policy. snmp3_auth_method does not exist. Set it to \'MD5\' or \'SHA\'. '); return; } $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'tcp_port' => $other['data'][12], 'tcp_send' => $other['data'][13], 'snmp_community' => $other['data'][14], 'snmp_oid' => $other['data'][15], 'module_interval' => $other['data'][16], 'post_process' => $other['data'][17], 'min' => $other['data'][18], 'max' => $other['data'][19], 'custom_id' => $other['data'][20], 'description' => $other['data'][21], 'custom_string_1' => $other['data'][22], 'custom_string_2' => $other['data'][23], 'custom_string_3' => $other['data'][24], 'plugin_parameter' => $other['data'][25], 'plugin_user' => $other['data'][26], 'plugin_pass' => $other['data'][27], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][29], 'min_ff_event_normal' => $other['data'][30], 'min_ff_event_warning' => $other['data'][31], 'min_ff_event_critical' => $other['data'][32], 'ff_type' => $other['data'][33], ]; } else { $values = [ 'disabled' => $other['data'][1], 'id_tipo_modulo' => $other['data'][2], 'id_module_group' => $other['data'][3], 'min_warning' => $other['data'][4], 'max_warning' => $other['data'][5], 'str_warning' => $other['data'][6], 'min_critical' => $other['data'][7], 'max_critical' => $other['data'][8], 'str_critical' => $other['data'][9], 'min_ff_event' => $other['data'][10], 'history_data' => $other['data'][11], 'tcp_port' => $other['data'][12], 'tcp_send' => $other['data'][13], 'snmp_community' => $other['data'][14], 'snmp_oid' => $other['data'][15], 'module_interval' => $other['data'][16], 'post_process' => $other['data'][17], 'min' => $other['data'][18], 'max' => $other['data'][19], 'custom_id' => $other['data'][20], 'description' => $other['data'][21], 'disabled_types_event' => $disabled_types_event, 'each_ff' => $other['data'][23], 'min_ff_event_normal' => $other['data'][24], 'min_ff_event_warning' => $other['data'][25], 'min_ff_event_critical' => $other['data'][26], 'ff_type' => $other['data'][27], ]; } if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('The SNMP module could not be added to policy. The module is already in the policy.'); return; } } $success = enterprise_hook('policies_create_module', [$other['data'][0], $id, 2, $values, false]); if ($success) { returnData('string', ['type' => 'string', 'data' => $success]); } else { returnError('The SNMP module could not be added to policy'); } } /** * Update SNMP module in policy. And return a result message. * * @param string $id Id of the target policy module. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; * ;;;;;;;; * ;;;;;;; * ;;;;;;;; * ; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example: * * api.php?op=set&op2=update_snmp_module_policy&id=1&other=14|0|2|0|0||0|0||30|1|66|3|nonpublic|.1.3.6.1.2.1.1.1.0|300|150.00|10|60|0|SNMP%20module%20updated%20by%20API|DES|example_priv_passw|authPriv|MD5|pepito_user|example_auth_passw&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_snmp_module_policy($id, $thrash1, $other, $thrash3) { if (defined('METACONSOLE')) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($id == '') { returnError('The SNMP module could not be updated in policy. Id_policy cannot be left blank.'); return; } if ($other['data'][0] == '') { returnError('The SNMP module could not be updated in policy. Id_policy_module cannot be left blank.'); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', [$id, ['id' => $other['data'][0]], 'id_module']); if ($module_policy === false) { returnError('The SNMP module could not be updated in policy. Module does not exist.'); return; } if ($module_policy[0]['id_module'] != 2) { returnError('The SNMP module could not be updated in policy. Module type is not SNMP type.'); return; } // SNMP version 3 if ($other['data'][12] == '3') { if ($other['data'][21] != 'AES' and $other['data'][21] != 'DES') { returnError( 'The SNMP module could not be updated in policy. snmp3_priv_method does not exist. Set it to \'AES\' or \'DES\'. ' ); return; } if ($other['data'][23] != 'authNoPriv' && $other['data'][23] != 'authPriv' && $other['data'][23] != 'noAuthNoPriv' ) { returnError( 'The SNMP module could not be updated in policy. snmp3_sec_level does not exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ' ); return; } if ($other['data'][24] != 'MD5' and $other['data'][24] != 'SHA') { returnError( 'The SNMP module could not be updated in policy. snmp3_auth_method does not exist. Set it to \'MD5\' or \'SHA\'. ' ); return; } $fields_snmp_module = [ 'id', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'tcp_port', 'tcp_send', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'description', 'custom_string_1', 'custom_string_2', 'custom_string_3', 'plugin_parameter', 'plugin_user', 'plugin_pass', ]; } else { $fields_snmp_module = [ 'id', 'disabled', 'id_module_group', 'min_warning', 'max_warning', 'str_warning', 'min_critical', 'max_critical', 'str_critical', 'min_ff_event', 'history_data', 'tcp_port', 'tcp_send', 'snmp_community', 'snmp_oid', 'module_interval', 'post_process', 'min', 'max', 'custom_id', 'description', ]; } $cont = 0; foreach ($fields_snmp_module as $field) { if ($other['data'][$cont] != '' and $field != 'id') { $values[$field] = $other['data'][$cont]; } $cont++; } $result_update = enterprise_hook( 'policies_update_module', [ $other['data'][0], $values, false, ] ); if ($result_update < 0) { returnError('The SNMP module could not be updated in policy'); } else { returnData( 'string', [ 'type' => 'string', 'data' => __('SNMP policy module updated.'), ] ); } } /** * Remove an agent from a policy by agent id. * * @param $id Id of the policy * @param $thrash1 Don't use. * @param $other * @param $thrash2 Don't use. * * Example: * api.php?op=set&op2=remove_agent_from_policy&apipass=1234&user=admin&pass=pandora&id=11&id2=2 */ function api_set_remove_agent_from_policy_by_id($id, $thrash1, $other, $thrash2) { if ($id == '' || !$id) { returnError('The agent could not be deleted from policy. ID Policy cannot be left blank.'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($other['data'][0] == '' || !$other['data'][0]) { returnError('The agent could not be deleted from policy. Agent cannot be left blank.'); return; } // Require node id if is metaconsole if (is_metaconsole() && $other['data'][1] == '') { returnError('The agent could not be deleted from policy. Node ID cannot be left blank.'); return; } return remove_agent_from_policy($id, false, [$other['data'][0], $other['data'][1]]); } /** * Remove an agent from a policy by agent name. * * @param $id Id of the policy * @param $thrash1 Don't use. * @param $other * @param $thrash2 Don't use. * * Example: * api.php?op=set&op2=remove_agent_from_policy&apipass=1234&user=admin&pass=pandora&id=11&id2=2 */ function api_set_remove_agent_from_policy_by_name($id, $thrash1, $other, $thrash2) { if ($id == '' || !$id) { returnError('The agent could not be deleted from policy. Policy cannot be left blank.'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if ($other['data'][0] == '' || !$other['data'][0]) { returnError('The agent could not be deleted from policy. Agent name cannot be left blank.'); return; } return remove_agent_from_policy($id, true, [$other['data'][0]]); } /** * Create a new group. And return the id_group of the new group. * * @param string $id Name of the new group. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * example 1 (with parent group: Servers) * * api.php?op=set&op2=create_group&id=example_group_name&other=applications|1&other_mode=url_encode_separator_| * * example 2 (without parent group) * * api.php?op=set&op2=create_group&id=example_group_name2&other=computer|&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_group($id, $thrash1, $other, $thrash3) { global $config; if (is_metaconsole()) { return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } $group_name = $id; if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } if ($id == '') { returnError( 'The group could not be created. Group_name cannot be left blank.' ); return; } if ($other['data'][0] == '') { returnError( 'The group could not be created. Icon_name cannot be left blank.' ); return; } $safe_other_data = io_safe_input($other['data']); if ($safe_other_data[1] != '') { $group = groups_get_group_by_id($safe_other_data[1]); if ($group == false) { returnError( 'The group could not be created. Id_parent_group does not exist.' ); return; } } if ($safe_other_data[1] != '') { $values = [ 'icon' => $safe_other_data[0], 'parent' => $safe_other_data[1], 'description' => $safe_other_data[2], ]; } else { $values = [ 'icon' => $safe_other_data[0], 'description' => $safe_other_data[2], ]; } $values['propagate'] = $safe_other_data[3]; $values['disabled'] = $safe_other_data[4]; $values['custom_id'] = $safe_other_data[5]; $values['contact'] = $safe_other_data[6]; $values['other'] = $safe_other_data[7]; $values['max_agents'] = $safe_other_data[8]; $values['password'] = $safe_other_data[9]; $id_group = groups_create_group($group_name, $values); if (is_error($id_group)) { // TODO: Improve the error returning more info returnError('The group could not be created'); } else { if (defined('METACONSOLE')) { $servers = db_get_all_rows_sql( 'SELECT * FROM tmetaconsole_setup WHERE disabled = 0' ); if ($servers === false) { $servers = []; } $result = []; foreach ($servers as $server) { // If connection was good then retrieve all data server if (metaconsole_connect($server) == NOERR) { $values['id_grupo'] = $id_group; $id_group_node = groups_create_group($group_name, $values); } metaconsole_restore_db(); } } returnData('string', ['type' => 'string', 'data' => $id_group]); } } /** * Update a group. * * @param integer $id Group ID * @param $thrash2 Don't use. * @param array $other it's array, $other as param is ;;;;;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=set&op2=update_group&id=example_group_id&other=New%20Name|application|2|new%20description|1|0|custom%20id||&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_update_group($id_group, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } if (db_get_value('id_grupo', 'tgrupo', 'id_grupo', $id_group) === false) { returnError('There is no group with the ID provided'); return; } if (!check_acl($config['id_user'], $id_group, 'PM')) { returnError('forbidden', 'string'); return; } $name = $other['data'][0]; $icon = $other['data'][1]; $parent = $other['data'][2]; $description = $other['data'][3]; $propagate = $other['data'][4]; $disabled = $other['data'][5]; $custom_id = $other['data'][6]; $contact = $other['data'][7]; $otherData = $other['data'][8]; $maxAgents = $other['data'][9]; $return = db_process_sql_update( 'tgrupo', [ 'nombre' => $name, 'icon' => $icon, 'parent' => $parent, 'description' => $description, 'propagate' => $propagate, 'disabled' => $disabled, 'custom_id' => $custom_id, 'contact' => $contact, 'other' => $otherData, 'max_agents' => $maxAgents, ], ['id_grupo' => $id_group] ); returnData( 'string', [ 'type' => 'string', 'data' => (int) ((bool) $return), ] ); } /** * Delete a group * * @param integer $id Group ID * @param $thrash1 Don't use. * @param $thrast2 Don't use. * @param $thrash3 Don't use. */ function api_set_delete_group($id_group, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'PM')) { returnError('forbidden', 'string'); return; } $idk = get_header('idk'); if (is_management_allowed($idk) === false) { returnError('centralized'); exit; } $group = db_get_row_filter('tgrupo', ['id_grupo' => $id_group]); if (!$group) { returnError('The group could not be deleted. ID does not exist.'); return; } if (!check_acl($config['id_user'], $id_group, 'PM')) { returnError('forbidden', 'string'); return; } $usedGroup = groups_check_used($id_group); if ($usedGroup['return']) { returnError( 'The delete action could not be performed. The group is not empty (used in '.implode(', ', $usedGroup['tables']).').' ); return; } db_process_sql_update('tgrupo', ['parent' => $group['parent']], ['parent' => $id_group]); db_process_sql_delete('tgroup_stat', ['id_group' => $id_group]); $result = db_process_sql_delete('tgrupo', ['id_grupo' => $id_group]); if (!$result) { returnError('The delete action could not be performed.'); } else { returnData('string', ['type' => 'string', 'data' => __('Successful deletion')]); } } /** * Create a new netflow filter. And return the id_group of the new group. * * @param $thrash1 Don't use. * @param $thrash2 Don't use. * @param array $other it's array, $other as param is ;;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * * Possible values of 'aggregate_by' field: dstip,dstport,none,proto,srcip,srcport * Possible values of 'output_format' field: kilobytes,kilobytespersecond,megabytes,megabytespersecond * * example: * * api.php?op=set&op2=create_netflow_filter&id=Filter name&other=9|host 192.168.50.3 OR host 192.168.50.4 or HOST 192.168.50.6|dstport|kilobytes&other_mode=url_encode_separator_| * * @param $thrash3 Don't use */ function api_set_create_netflow_filter($thrash1, $thrash2, $other, $thrash3) { global $config; if (defined('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, 'AW')) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == '') { returnError('The netflow filter could not be created. Filter name cannot be left blank.'); return; } if ($other['data'][1] == '') { returnError('The netflow filter could not be created. Group id cannot be left blank.'); return; } else { $group = groups_get_group_by_id($other['data'][1]); if ($group == false) { returnError('The netflow filter could not be created. Id_group does not exist.'); return; } if (!check_acl($config['id_user'], $other['data'][1], 'AW')) { returnError('forbidden', 'string'); return; } } if ($other['data'][2] == '') { returnError('The netflow filter could not be created. Filter cannot be left blank.'); return; } if ($other['data'][3] == '') { returnError('The netflow filter could not be created. Aggregate_by cannot be left blank.'); return; } if ($other['data'][4] == '') { returnError('The netflow filter could not be created. Output_format cannot be left blank.'); return; } $values = [ 'id_name' => $other['data'][0], 'id_group' => $other['data'][1], 'advanced_filter' => $other['data'][2], 'aggregate' => $other['data'][3], 'output' => $other['data'][4], ]; // Save filter args $values['filter_args'] = netflow_get_filter_arguments($values); $id = db_process_sql_insert('tnetflow_filter', $values); if ($id === false) { returnError('The netflow filter could not be created'); } else { returnData('string', ['type' => 'string', 'data' => $id]); } } /** * Get module data in CSV format. * * @param integer $id The ID of module in DB. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;; in this order * and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_) * example: * * api.php?op=get&op2=module_data&id=17&other=;|604800|20161201T13:40|20161215T13:40&other_mode=url_encode_separator_| * * @param $returnType Don't use. */ function api_get_module_data($id, $thrash1, $other, $returnType) { if (defined('METACONSOLE')) { return; } if (!util_api_check_agent_and_print_error(modules_get_agentmodule_agent($id), $returnType)) { return; } $separator = ';'; $tstart = null; $tend = null; $periodSeconds = null; if (is_array($other) === true && is_array($other['data']) === true) { $separator = $other['data'][0]; $periodSeconds = $other['data'][1]; $tstart = $other['data'][2]; $tend = $other['data'][3]; } if (($tstart != '') && ($tend != '')) { try { $dateStart = explode('T', $tstart); $dateYearStart = substr($dateStart[0], 0, 4); $dateMonthStart = substr($dateStart[0], 4, 2); $dateDayStart = substr($dateStart[0], 6, 2); $date_start = $dateYearStart.'-'.$dateMonthStart.'-'.$dateDayStart.' '.$dateStart[1]; $date_start = new DateTime($date_start); $date_start = $date_start->format('U'); $dateEnd = explode('T', $tend); $dateYearEnd = substr($dateEnd[0], 0, 4); $dateMonthEnd = substr($dateEnd[0], 4, 2); $dateDayEnd = substr($dateEnd[0], 6, 2); $date_end = $dateYearEnd.'-'.$dateMonthEnd.'-'.$dateDayEnd.' '.$dateEnd[1]; $date_end = new DateTime($date_end); $date_end = $date_end->format('U'); } catch (Exception $e) { returnError('Wrong date format.'); return; } } else { if ($periodSeconds !== null) { $date_end = get_system_time(); $date_start = (get_system_time() - $periodSeconds); } else { $date_end = get_system_time(); $result = modules_get_first_date($id, $tstart); if ($result !== false) { $date_start = $result['first_utimestamp']; } } } $data['type'] = 'array'; $data['list_index'] = [ 'utimestamp', 'datos', ]; $data['data'] = array_reduce( db_uncompress_module_data($id, $date_start, $date_end), function ($carry, $item) { if (is_array($item['data']) === true) { foreach ($item['data'] as $i => $v) { $carry[] = [ 'utimestamp' => $v['utimestamp'], 'datos' => $v['datos'], ]; } } return $carry; }, [] ); if ($data === false) { returnError('Module data query error.', $returnType); } else if ($data['data'] == '') { returnError('no_data_to_show', $returnType); } else { // returnData('csv_head', $data, $separator); returnData('csv', $data, $separator); } } /** * Return a image file of sparse graph of module data in a period time. * * @param integer $id id of a module data. * @param $thrash1 Don't use. * @param array $other it's array, $other as param is ;;;