'string', 'data' => urldecode($other)); break; default: if (strpos($otherType, 'url_encode_separator_') !== false) { $separator = str_replace('url_encode_separator_', '', $otherType); $returnVar = array('type' => 'array', 'data' => explode($separator, $other)); foreach ($returnVar['data'] as $index => $element) $returnVar['data'][$index] = urldecode($element); } else { $returnVar = array('type' => 'string', 'data' => 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, array('type' => 'string', 'data' => __('No set or get or help operation.'))); break; case 'no_exist_operation': returnData($returnType, array('type' => 'string', 'data' => __('This operation does not exist.'))); break; case 'id_not_found': returnData($returnType, array('type' => 'string', 'data' => __('Id does not exist in BD.'))); break; case 'not_allowed_operation_cluster': returnData($returnType, array('type' => 'string', 'data' => __('This operation can not be used in cluster elements.'))); break; case 'forbidden': returnData($returnType, array('type' => 'string', 'data' => __('The user has not enough permission to make this action.'))); break; case 'no_data_to_show': returnData($returnType, array('type' => 'string', 'data' => __('No data to show.'))); break; case 'centralized': returnData($returnType, array('type' => 'string', 'data' => __('This console is not manager of this environment, please manage this feature from centralized manager console (Metaconsole).'))); break; default: returnData("string", array('type' => 'string', 'data' => __($returnType))); 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') { 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 (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 = array(); $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 = array(); $name = gethostbyname($acl_ip); if (preg_match('/'.$name.'/', $ip)) { 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', array()); if ($status === ENTERPRISE_NOT_HOOK) { echo 'ERR'; return; } echo $status; } // Returs the string OK if a connection to the event replication DB can be established. function api_get_test_event_replication_db() { if (defined ('METACONSOLE')) { return; } $status = enterprise_hook('events_test_replication_db', array()); if ($status === ENTERPRISE_NOT_HOOK) { echo 'ERR'; return; } echo $status; } //-------------------------DEFINED OPERATIONS FUNCTIONS----------------- function api_get_groups($thrash1, $thrash2, $other, $returnType, $user_in_db) { if (defined ('METACONSOLE')) { return; } if ($other['type'] == 'string') { if ($other['data'] != '') { returnError('error_parameter', 'Error in the parameters.'); return; } else {//Default values $separator = ';'; } } else if ($other['type'] == 'array') { $separator = $other['data'][0]; } $groups = users_get_groups ($user_in_db, "IR"); $data_groups = array(); foreach ($groups as $id => $group) { $data_groups[] = array($id, $group); } $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, array('type' => 'string', 'data' => $other['data'][1])); } elseif ($check_access) { returnError('no_data_to_show', $returnType); } else { returnError('id_not_found', $returnType); } return; } $data = array('type' => 'string', 'data' => $value); returnData($returnType, $data); } /*** DB column mapping table used by tree_agents (and get module_properties) ***/ /* agent related field mappings (output field => column designation for 'tagente') */ $agent_field_column_mapping = array( /* agent_id is not in this list (because it is mandatory) */ /* agent_id_group is not in this list */ '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_field_column_mampping = array( /* module_id_agent_modulo is not in this list */ '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_user' => 'plugin_user as module_plugin_user', 'module_plugin_pass' => 'plugin_pass as module_plugin_pass', '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_plugin_macros' => 'macros as module_plugin_macros', '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') */ $estado_fields_to_columns_mapping = array( /* module_id_agent_modulo is not in this list */ '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'); /*** 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 = array( '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_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', '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') */ global $agent_field_column_mapping; /* module related field mappings 1/2 (output field => column for 'tagente_modulo') */ global $module_field_column_mampping; /* module related field mappings 2/2 (output field => column for 'tagente_estado') */ global $estado_fields_to_columns_mapping; /* alert related field mappings (output field => column for 'talert_template_modules', ... ) */ $alert_fields_to_columns_mapping = array( /*** '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_mampping ) ) { $module_additional_columns .= (", " . $module_field_column_mampping[$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 = array(); // 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 = array(); $groups = str_replace('\n', $returnReplace, $groups); foreach ($groups as &$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 = array(); $agents = str_replace('\n', $returnReplace, $agents); foreach ($agents as $index => &$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 **/ } $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 = ' . $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'); if ($modules === false) $modules = array(); $modules = str_replace('\n', $returnReplace, $modules); foreach ($modules as &$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 = array(); $alerts = str_replace('\n', $returnReplace, $alerts); foreach ($alerts as &$alert) { $alert['type_row'] = 'alert'; $returnVar[] = $alert; } } } } $data = array('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('error_get_module_properties_by_name', __('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('error_get_module_properties_by_name', __('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('error_get_module_properties_by_name', __('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 = array( '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') */ global $module_field_column_mampping; /* module related field mappings 2/2 (output field => column for 'tagente_estado') */ global $estado_fields_to_columns_mapping; 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_mampping ) ) { $module_additional_columns .= (", " . $module_field_column_mampping[$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 = array(); $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 = array(); $modules = str_replace('\n', $returnReplace, $modules); foreach ($modules as &$module) { $module['type_row'] = 'module'; if( $module['module_macros'] ) { $module['module_macros'] = base64_decode( $module['module_macros']); } $returnVar[] = $module; } $data = array('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]; 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('parent_agent_not_exist', 'Is not a parent module to do cascade protection.'); } } else { $cascadeProtectionModule = 0; } // Check ACL group if (!check_acl($config['id_user'], $idGroup, "AW")) { returnError('forbidden', 'string'); return; } // Check selected parent if ($idParent != 0) { $parentCheck = agents_check_access_agent($idParent); if ($parentCheck === null) { returnError('parent_agent_not_exist', __('The agent parent don`t exist.')); return; } if ($parentCheck === false) { returnError('parent_agent_forbidden', __('The user cannot access to parent agent.')); return; } } $values_old = db_get_row_filter('tagente', array('id_agente' => $id_agent), array('id_grupo', 'disabled') ); $tpolicy_group_old = db_get_all_rows_sql("SELECT id_policy FROM tpolicy_groups WHERE id_group = ".$values_old['id_grupo']); $return = db_process_sql_update('tagente', array('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), array('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', array($id_agent, 'standby', $disabled) ); } if($tpolicy_group_old){ foreach ($tpolicy_group_old as $key => $value) { $tpolicy_agents_old= db_get_sql("SELECT * FROM tpolicy_agents WHERE id_policy = ".$value['id_policy'] . " AND id_agent = " .$id_agent); if($tpolicy_agents_old){ $result2 = db_process_sql_update ('tpolicy_agents', array('pending_delete' => 1), array ('id_agent' => $id_agent, 'id_policy' => $value['id_policy'])); } } } $tpolicy_group = db_get_all_rows_sql("SELECT id_policy FROM tpolicy_groups WHERE id_group = ".$idGroup); if($tpolicy_group){ foreach ($tpolicy_group as $key => $value) { $tpolicy_agents= db_get_sql("SELECT * FROM tpolicy_agents WHERE id_policy = ".$value['id_policy'] . " AND id_agent =" .$id_agent); if(!$tpolicy_agents){ db_process_sql_insert ('tpolicy_agents', array('id_policy' => $value['id_policy'], 'id_agent' => $id_agent)); } else { $result3 = db_process_sql_update ('tpolicy_agents', array('pending_delete' => 0), array ('id_agent' => $id_agent, 'id_policy' => $value['id_policy'])); } } } } returnData('string', array('type' => 'string', 'data' => (int)((bool)$return))); } /** * Create a new agent, and print the id for new agent. * * @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_) * 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($thrash1, $thrash2, $other, $thrash3) { global $config; if (!check_acl($config['id_user'], 0, "AW")) { returnError('forbidden', 'string'); return; } if (defined ('METACONSOLE')) { 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]; //$idServer = $other['data'][7]; $nameServer = $other['data'][8]; $customId = $other['data'][9]; $learningMode = $other['data'][10]; $disabled = $other['data'][11]; $description = $other['data'][12]; $alias_as_name = $other['data'][13]; if($alias_as_name && !empty($alias)){ $name = $alias; } else { $name = hash("sha256",$alias . "|" .$direccion_agente ."|". time() ."|". sprintf("%04d", rand(0,10000))); if(empty($alias)){ $alias = $name; } } 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('parent_agent_not_exist', 'Is not a parent module to do cascade protection.'); } } else { $cascadeProtectionModule = 0; } switch ($config["dbtype"]) { case "mysql": $sql1 = 'SELECT name FROM tserver WHERE BINARY name LIKE "' . $nameServer . '"'; break; case "postgresql": case "oracle": $sql1 = 'SELECT name FROM tserver WHERE name LIKE \'' . $nameServer . '\''; break; } $nameServer = db_get_value_sql($sql1); // Check ACL group if (!check_acl($config['id_user'], $idGroup, "AW")) { returnError('forbidden', 'string'); return; } // Check selected parent if ($idParent != 0) { $parentCheck = agents_check_access_agent($idParent); if ($parentCheck === null) { returnError('parent_agent_not_exist', __('The agent parent don`t exist.')); return; } if ($parentCheck === false) { returnError('parent_agent_forbidden', __('The user cannot access to parent agent.')); return; } } if (agents_get_agent_id ($name)) { returnError('agent_name_exist', 'The name of agent yet exist in DB.'); } else if (db_get_value_sql('SELECT id_grupo FROM tgrupo WHERE id_grupo = ' . $idGroup) === false) { returnError('id_grupo_not_exist', 'The group don`t exist.'); } else if (db_get_value_sql('SELECT id_os FROM tconfig_os WHERE id_os = ' . $idOS) === false) { returnError('id_os_not_exist', 'The OS don`t exist.'); } else if (db_get_value_sql($sql1) === false) { returnError('server_not_exist', 'The ' . get_product_name() . ' Server don`t exist.'); } else { $idAgente = db_process_sql_insert ('tagente', array ('nombre' => $name, '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)); if (!empty($idAgente) && !empty($ip)) { // register ip for this agent in 'taddress' agents_add_address ($idAgente, $ip); } if($idGroup && !empty($idAgente)){ $tpolicy_group_old = db_get_all_rows_sql("SELECT id_policy FROM tpolicy_groups WHERE id_group = ".$idGroup); if($tpolicy_group_old){ foreach ($tpolicy_group_old as $key => $old_group) { db_process_sql_insert ('tpolicy_agents', array('id_policy' => $old_group['id_policy'], 'id_agent' => $idAgente)); } } } returnData('string', array('type' => 'string', 'data' => $idAgente)); } } function api_set_create_os($thrash1, $thrash2, $other, $thrash3) { global $config; if (!check_acl($config['id_user'], 0, "AW")) { returnError('forbidden', 'string'); return; } $values = array(); $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 __('Error creating 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; } $values = array(); $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, array('id_os' => $id_os))) echo __('Success updating OS'); else echo __('Error updating 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('error_parameter', 'Error in the parameters.'); return; } else if ($other['type'] == 'array') { $name = ""; if ($other['data'][0] != '') { $name = $other['data'][0]; } else { returnError('error_parameter', 'Custom field name required'); return; } $display_front = 0; if ($other['data'][1] != '') { $display_front = $other['data'][1]; } else { returnError('error_parameter', 'Custom field display flag required'); return; } $is_password_type = 0; if ($other['data'][2] != '') { $is_password_type = $other['data'][2]; } else { returnError('error_parameter', 'Custom field is password type required'); return; } $result = db_process_sql_insert('tagent_custom_fields', array('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 a agent with the name pass 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, $thrast2, $thrash3) { global $config; if (is_metaconsole()) { if (!check_acl($config['id_user'], 0, "PM")) { returnError('forbidden', 'string'); return; } $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); foreach($servers as $server) { if (metaconsole_connect($server) == NOERR) { $idAgent[0] = agents_get_agent_id($id,true); if ($idAgent[0]) { $result = agents_delete_agent ($idAgent, true); } } } } else { $idAgent = agents_get_agent_id($id); if (!util_api_check_agent_and_print_error($idAgent, 'string', "AD")) { return; } $result = agents_delete_agent ($idAgent, true); } if (!$result) returnError('error_delete', 'Error in delete operation.'); else returnData('string', array('type' => 'string', 'data' => __('Correct Delete'))); } /** * 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; // 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] != "") { $where .= " AND id_grupo = " . $other['data'][1]; } } 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', array($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 = array(); // Filter by state if (defined ('METACONSOLE')) { $sql = "SELECT id_agente, alias, direccion, comentarios, tconfig_os.name, url_address, nombre FROM tconfig_os, tmetaconsole_agent LEFT JOIN tagent_secondary_group ON tmetaconsole_agent.id_agente = tagent_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"; } $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 = array(); // 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 == 2) { $result_agents[] = $agent; } break; case 'critical': if ($status == 1) { $result_agents[] = $agent; } break; case 'unknown': if ($status == 3) { $result_agents[] = $agent; } break; case 'normal': if ($status == 0) { $result_agents[] = $agent; } break; case 'alert_fired': if ($status == 4) { $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 = array('type' => 'array', 'data' => $result_agents); returnData($returnType, $data, $separator); } else { returnError('error_all_agents', '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 = array('type' => 'array', 'data' => $all_modules); returnData('csv', $data, ';'); } else { returnError('error_agent_modules', '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 = array(); // 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"] = array(); $tmp_data = array(); $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); } } } // unknown events handle } // 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; } elseif ($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 = array('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 = array('type' => 'array', 'data' => $module_id); returnData('csv', $data, ';'); } else { returnError('error_module_id', 'does not exist module or agent'); } } /** * 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 = array('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 =array(); if (is_metaconsole()) { $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); 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 = array('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_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 =array(); if (is_metaconsole()) { $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); 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 = array('type' => 'array', 'data' => $group_names); returnData('csv', $data, ';'); } else { returnError('error_group_agent', '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 = array(); 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 = array('type' => 'array', 'data' => $group_servers); returnData('csv', $data, ';'); } else { returnError('error_locate_agents', '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 =array(); if (is_metaconsole()) { $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); 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 = array('type' => 'array', 'data' => $group_names); returnData('csv', $data); } else { returnError('error_group_agent', '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 =array(); if (is_metaconsole()) { $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); 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 = array('type' => 'array', 'data' => $group_names); returnData('csv', $data); } else { returnError('error_group_agent', '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 = array('type' => 'array', 'data' => $policies); returnData('csv', $data, ';'); } else { returnError('error_get_policies', '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('error_policy_modules', 'Error retrieving policy modules. Id_policy cannot be left blank.'); return; } $policies = enterprise_hook('policies_get_modules_api', array($other['data'][0], $other['data'][1])); if ($policies === ENTERPRISE_NOT_HOOK) { returnError('error_policy_modules', 'Error retrieving policy modules.'); return; } if (count($policies) > 0 and $policies !== false) { $data = array('type' => 'array', 'data' => $policies); returnData('csv', $data, ';'); } else { returnError('error_policy_modules', '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 $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_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_| * * * @param $thrash3 Don't use */ function api_set_create_network_module($id, $thrash1, $other, $thrash3) { if (defined ('METACONSOLE')) { return; } $agentName = $id; $idAgent = agents_get_agent_id($agentName); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } if ($other['data'][2] < 6 or $other['data'][2] > 18) { returnError('error_create_network_module', __('Error in creation network module. Id_module_type is not correct for network modules.')); return; } $name = $other['data'][0]; $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][22]; $disabled_types_event = json_encode($disabled_types_event); $values = array( 'id_agente' => $idAgent, '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] ); if ( ! $values['descripcion'] ) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null } if ( ! $values['module_macros'] ) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null } $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('error_create_network_module', __('Error in creation network module.')); } else { returnData('string', array('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('error_update_network_module', __('Error updating network module. 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('error_update_network_module', __('Error updating network module. Id_module doesn\'t 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', array('nombre' => $module_name, 'id_agente' => $other['data'][0])); if ($id_module_exists) { returnError('error_update_network_module', __('Error updating network module. Id_module exists in the new agent.')); return; } } } $network_module_fields = array('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'); $values = array(); $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('error_update_network_module', 'Error updating network module.'); else returnData('string', array('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; } $agentName = $id; if ($other['data'][22] == "") { returnError('error_create_plugin_module', __('Error in creation plugin module. Id_plugin cannot be left blank.')); return; } $idAgent = agents_get_agent_id($agentName); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][26]; $disabled_types_event = json_encode($disabled_types_event); $name = $other['data'][0]; $values = array( 'id_agente' => $idAgent, '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 ($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] ); if ( ! $values['descripcion'] ) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null } if ( ! $values['module_macros'] ) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null } $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('error_create_plugin_module', __('Error in creation plugin module.')); } else { returnData('string', array('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('error_update_plugin_module', __('Error updating plugin module. 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', array('nombre' => $module_name, 'id_agente' => $other['data'][0])); if ($id_module_exists) { returnError('error_update_plugin_module', __('Error updating plugin module. 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('error_update_data_module', __('Error updating plugin module. Id_agent doesn\'t exist.')); return; } } $plugin_module_fields = array('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'); $values = array(); $cont = 0; foreach ($plugin_module_fields as $field) { if ($other['data'][$cont] != "") { $values[$field] = $other['data'][$cont]; if( $field === 'macros' ) { $values[$field] = base64_decode($values[$field]); } } $cont++; } $values['policy_linked']= 0; $result_update = modules_update_agent_module($id_module, $values); if ($result_update < 0) returnError('error_update_plugin_module', 'Error updating plugin module.'); else returnData('string', array('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; } $agentName = $id; if ($other['data'][0] == "") { returnError('error_create_data_module', __('Error in creation data module. Module_name cannot be left blank.')); return; } $idAgent = agents_get_agent_id($agentName); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } $name = $other['data'][0]; $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][16]; $disabled_types_event = json_encode($disabled_types_event); $values = array( 'id_agente' => $idAgent, '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] ); if ( ! $values['descripcion'] ) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null } if ( ! $values['module_macros'] ) { $values['module_macros'] = ''; // Column 'module_macros' cannot be null } $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('error_create_data_module', __('Error in creation data module.')); } else { returnData('string', array('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, $thrash1, $other, $thrash3) { if (defined ('METACONSOLE')) { return; } global $config; $agentName = $id; io_safe_input_array($other); if ($other['data'][0] == "") { returnError('error_create_data_module', __('Error in creation synthetic module. Module_name cannot be left blank.')); return; } $idAgent = agents_get_agent_id(io_safe_output($agentName),true); if (!util_api_check_agent_and_print_error($idAgent, 'string', "AW")) return; if (!$idAgent) { returnError('error_create_data_module', __('Error in creation synthetic module. Agent name doesn\'t 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 = array( 'id_agente' => $idAgent, '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 } $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('error_create_data_module', __('Error in creation data module.')); } else { $synthetic_type = $other['data'][1]; unset($other['data'][0]); unset($other['data'][1]); $filterdata = array(); foreach ($other['data'] as $data) { $data = str_replace(array('ADD','SUB','MUL','DIV'),array('+','-','*','/'),$data); $split_data = explode(';',$data); if ( preg_match("/[x\/+*-]/",$split_data[0]) && strlen($split_data[0]) == 1 ) { if ( preg_match("/[\/|+|*|-]/",$split_data[0]) && $synthetic_type === 'average' ) { returnError("","[ERROR] With this type: $synthetic_type only be allow use this operator: 'x' \n\n"); } $operator = strtolower($split_data[0]); $data_module = array("",$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(io_safe_output($split_data[0]),true); $data_module = array($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("","[ERROR] You can only use +, -, *, / or x, and you use this: @split_data[1] \n\n"); return; } if ( preg_match("/[\/|+|*|-]/",$split_data[1]) && $synthetic_type === 'average' ) { returnError("","[ERROR] With this type: $synthetic_type only be allow use this operator: 'x' \n\n"); return; } $idAgent = agents_get_agent_id(io_safe_output($split_data[0]),true); $operator = strtolower($split_data[1]); $data_module = array($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', array($idModule, $serialize_ops)); if ($synthetic === ENTERPRISE_NOT_HOOK) { returnError('error_synthetic_modules', 'Error Synthetic modules.'); db_process_sql_delete ('tagente_modulo', array ('id_agente_modulo' => $idModule)); return; } else { $status = AGENT_MODULE_STATUS_NO_DATA; switch ($config["dbtype"]) { case "mysql": $result = db_process_sql_insert ('tagente_estado', array ('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', array ('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', array ('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', array ('id_agente_modulo' => $idModule)); returnError('error_synthetic_modules', 'Error Synthetic modules.'); } else { db_process_sql ('UPDATE tagente SET total_count=total_count+1, notinit_count=notinit_count+1 WHERE id_agente=' . (int)$idAgent); returnData('string', array('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('error_update_data_module', __('Error updating data module. 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', array('nombre' => $module_name, 'id_agente' => $other['data'][0])); if ($id_module_exists) { returnError('error_update_data_module', __('Error updating data module. 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('error_update_data_module', __('Error updating data module. Id_agent doesn\'t exist.')); return; } } $data_module_fields = array('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'); $values = array(); $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('error_update_data_module', 'Error updating data module.'); else returnData('string', array('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; } $agentName = $id; if ($other['data'][0] == "") { returnError('error_create_snmp_module', __('Error in creation SNMP module. Module_name cannot be left blank.')); return; } if ($other['data'][2] < 15 or $other['data'][2] > 18) { returnError('error_create_snmp_module', __('Error in creation SNMP module. Invalid id_module_type for a SNMP module.')); return; } $idAgent = agents_get_agent_id($agentName); if (!util_api_check_agent_and_print_error($idAgent, 'string', 'AW')) { return; } $name = $other['data'][0]; $disabled_types_event = array(); $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('error_create_snmp_module', __('Error in creation SNMP module. snmp3_priv_method doesn\'t exist. Set it to \'AES\' or \'DES\'. ')); return; } if ($other['data'][25] != "authNoPriv" and $other['data'][25] != "authPriv" and $other['data'][25] != "noAuthNoPriv") { returnError('error_create_snmp_module', __('Error in creation SNMP module. snmp3_sec_level doesn\'t exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ')); return; } if ($other['data'][26] != "MD5" and $other['data'][26] != "SHA") { returnError('error_create_snmp_module', __('Error in creation SNMP module. snmp3_auth_method doesn\'t exist. Set it to \'MD5\' or \'SHA\'. ')); return; } $values = array( 'id_agente' => $idAgent, '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] ); } else { $values = array( 'id_agente' => $idAgent, '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] ); } if ( ! $values['descripcion'] ) { $values['descripcion'] = ''; // Column 'descripcion' cannot be null } $idModule = modules_create_agent_module($idAgent, $name, $values, true); if (is_error($idModule)) { // TODO: Improve the error returning more info returnError('error_create_snmp_module', __('Error in creation SNMP module.')); } else { returnData('string', array('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('error_update_snmp_module', __('Error updating SNMP module. 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', array('nombre' => $module_name, 'id_agente' => $other['data'][0])); if ($id_module_exists) { returnError('error_update_snmp_module', __('Error updating SNMP module. 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('error_update_data_module', __('Error updating snmp module. Id_agent doesn\'t exist.')); return; } } # SNMP version 3 if ($other['data'][13] == "3") { if ($other['data'][22] != "AES" and $other['data'][22] != "DES") { returnError('error_create_snmp_module', __('Error in creation SNMP module. snmp3_priv_method doesn\'t exist. Set it to \'AES\' or \'DES\'. ')); return; } if ($other['data'][24] != "authNoPriv" and $other['data'][24] != "authPriv" and $other['data'][24] != "noAuthNoPriv") { returnError('error_create_snmp_module', __('Error in creation SNMP module. snmp3_sec_level doesn\'t exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ')); return; } if ($other['data'][25] != "MD5" and $other['data'][25] != "SHA") { returnError('error_create_snmp_module', __('Error in creation SNMP module. snmp3_auth_method doesn\'t exist. Set it to \'MD5\' or \'SHA\'. ')); return; } $snmp_module_fields = array( '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'); } else { $snmp_module_fields = array( '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'); } $values = array(); $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('error_update_snmp_module', 'Error updating SNMP module.'); else returnData('string', array('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; } if ($id == "") { returnError('error_set_new_network_component', __('Error creating network component. Network component name cannot be left blank.')); return; } if ($other['data'][0] < 6 or $other['data'][0] > 18) { returnError('error_set_new_network_component', __('Error creating network component. Incorrect value for Network component type field.')); return; } if ($other['data'][17] == "") { returnError('error_set_new_network_component', __('Error creating network component. Network component group cannot be left blank.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][18]; $disabled_types_event = json_encode($disabled_types_event); $values = array ( '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]); $name_check = db_get_value ('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('error_set_new_network_component', __('Error creating network component. This network component already exists.')); return; } $id = network_components_create_network_component ($id, $other['data'][0], $other['data'][17], $values); if (!$id) returnError('error_set_new_network_component', 'Error creating network component.'); else returnData('string', array('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; } if ($id == "") { returnError('error_set_new_plugin_component', __('Error creating plugin component. Plugin component name cannot be left blank.')); return; } if ($other['data'][7] == "") { returnError('error_set_new_plugin_component', __('Error creating plugin component. Incorrect value for Id plugin.')); return; } if ($other['data'][21] == "") { returnError('error_set_new_plugin_component', __('Error creating plugin component. Plugin component group cannot be left blank.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][12]; $disabled_types_event = json_encode($disabled_types_event); $values = array ( '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]); $name_check = db_get_value ('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('error_set_new_plugin_component', __('Error creating plugin component. This plugin component already exists.')); return; } $id = network_components_create_network_component ($id, $other['data'][0], $other['data'][21], $values); if (!$id) returnError('error_set_new_plugin_component', 'Error creating plugin component.'); else returnData('string', array('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('error_set_new_snmp_component', __('Error creating SNMP component. 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('error_set_new_snmp_component', __('Error creating SNMP component. Incorrect value for Snmp component type field.')); return; } if ($other['data'][25] == "") { returnError('error_set_new_snmp_component', __('Error creating SNMP component. Snmp component group cannot be left blank.')); return; } $disabled_types_event = array(); $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('error_set_new_snmp_component', __('Error creating SNMP component. snmp3_priv_method doesn\'t exist. Set it to \'AES\' or \'DES\'. ')); return; } if ($other['data'][25] != "authNoPriv" and $other['data'][25] != "authPriv" and $other['data'][25] != "noAuthNoPriv") { returnError('error_set_new_snmp_component', __('Error creating SNMP component. snmp3_sec_level doesn\'t exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ')); return; } if ($other['data'][24] != "MD5" and $other['data'][24] != "SHA") { returnError('error_set_new_snmp_component', __('Error creating SNMP component. snmp3_auth_method doesn\'t exist. Set it to \'MD5\' or \'SHA\'. ')); return; } $values = array ( '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] ); } else { $values = array ( '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] ); } $name_check = db_get_value ('name', 'tnetwork_component', 'name', $id); if ($name_check !== false) { returnError('error_set_new_snmp_component', __('Error creating SNMP component. This SNMP component already exists.')); return; } $id = network_components_create_network_component ($id, $other['data'][0], $other['data'][25], $values); if (!$id) returnError('error_set_new_snmp_component', 'Error creating SNMP component.'); else returnData('string', array('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; } if ($id == "") { returnError('error_set_new_local_component', __('Error creating local component. 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('error_set_new_local_component', __('Error creating local component. Local component group cannot be left blank.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][4]; $disabled_types_event = json_encode($disabled_types_event); $values = array ( '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]); $name_check = enterprise_hook('local_components_get_local_components', array(array('name' => $id), 'name')); if ($name_check === ENTERPRISE_NOT_HOOK) { returnError('error_set_new_local_component', __('Error creating local component.')); return; } if ($name_check !== false) { returnError('error_set_new_local_component', __('Error creating local component. This local component already exists.')); return; } $id = enterprise_hook('local_components_create_local_component', array($id, $other['data'][3], $other['data'][1], $values)); if (!$id) returnError('error_set_new_local_component', 'Error creating local component.'); else returnData('string', array('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('error_get_module_value_all_agents', __('Error getting 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('error_get_module_value_all_agents', __('Error getting module value from all agents. Module name doesn\'t 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('error_get_module_value_all_agents', 'Error getting module values from all agents.'); } else { $data = array('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) { if (defined ('METACONSOLE')) { return; } if ($name == "") { returnError('error_create_alert_template', __('Error creating alert template. Template name cannot be left blank.')); return; } $template_name = $name; $type = $other['data'][0]; if ($other['data'][2] != "") { $values = array( 'description' => $other['data'][1], 'id_alert_action' => $other['data'][2], '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] ); } else { $values = array( '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] ); } $id_template = alerts_create_alert_template($template_name, $type, $values); if (is_error($id_template)) { // TODO: Improve the error returning more info returnError('error_create_alert_template', __('Error creating alert template.')); } else { returnData('string', array('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 (defined ('METACONSOLE')) { return; } if (!check_acl($config['id_user'], 0, "LM")) { returnError('forbidden', 'string'); return; } if ($id_template == "") { returnError('error_update_alert_template', __('Error updating alert template. Id_template cannot be left blank.')); return; } $result_template = alerts_get_alert_template_name($id_template); if (!$result_template) { returnError('error_update_alert_template', __('Error updating alert template. Id_template doesn\'t exist.')); return; } $fields_template = array('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'); $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('error_create_alert_template', __('Error updating alert template.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct updating of 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) { if (defined ('METACONSOLE')) { return; } if ($id_template == "") { returnError('error_delete_alert_template', __('Error deleting alert template. Id_template cannot be left blank.')); return; } $result = alerts_delete_alert_template($id_template); if ($result == 0) { // TODO: Improve the error returning more info returnError('error_create_alert_template', __('Error deleting alert template.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct deleting 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('error_get_all_alert_templates', __('Error getting all alert templates.')); } 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('error_get_alert_template', __('Error getting alert template. Id_template doesn\'t exist.')); return; } $filter_templates = array('id' => $id_template); } $template = alerts_get_alert_templates($filter_templates, array('id', 'name', 'description', 'id_alert_action', 'type', 'id_group')); if ($template !== false) { $data['type'] = 'array'; $data['data'] = $template; } if (!$template) { returnError('error_get_alert_template', __('Error getting alert template.')); } else { returnData('csv', $data, ';'); } } /** * 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('error_get_module_groups', __('Error getting 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 = array( '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('error_get_plugins', __('Error getting 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, $thrash1, $thrash2) { if (defined ('METACONSOLE')) { return; } $agent_id = agents_get_agent_id($agent_name); if (!util_api_check_agent_and_print_error($agent_id, 'string', 'AW')) { return; } if (!$agent_id) { returnError('error_network_module_from_component', __('Error creating module from network component. Agent doesn\'t exist.')); return; } $component= db_get_row ('tnetwork_component', 'name', $component_name); if (!$component) { returnError('error_network_module_from_component', __('Error creating module from network component. Network component doesn\'t 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 $module_id = modules_create_agent_module ($agent_id, $component_name, $component, true); if (!$module_id) { returnError('error_network_module_from_component', __('Error creating module from network component. Error creating module.')); 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('error_module_to_template', __('Error assigning module to template. Id_template cannot be left blank.')); return; } if ($other['data'][0] == "") { returnError('error_module_to_template', __('Error assigning module to template. Id_module cannot be left blank.')); return; } if ($other['data'][1] == "") { returnError('error_module_to_template', __('Error assigning module to template. 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('error_module_to_template', __('Error assigning module to template. Id_template doensn\'t exists.')); return; } $result_agent = agents_get_name($id_agent); if (!$result_agent) { returnError('error_module_to_template', __('Error assigning module to template. Id_agent doesn\'t exist.')); return; } $result_module = db_get_value ('nombre', 'tagente_modulo', 'id_agente_modulo', (int) $id_module); if (!$result_module) { returnError('error_module_to_template', __('Error assigning module to template. Id_module doesn\'t 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('error_module_to_template', __('Error assigning module to template.')); } else { returnData('string', array('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('error_delete_module_template', __('Error deleting module template. Id_module_template cannot be left blank.')); return; } $result_module_template = alerts_get_alert_agent_module($id); if (!$result_module_template) { returnError('error_delete_module_template', __('Error deleting module template. Id_module_template doesn\'t exist.')); return; } $result = alerts_delete_alert_agent_module($id); if ($result == 0) { // TODO: Improve the error returning more info returnError('error_delete_module_template', __('Error deleting module template.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct deleting of module template.'))); } } /** * Delete an 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 ($other['type'] != 'string') { returnError('error_parameter', 'Error in the parameters.'); return; } if (! check_acl ($config['id_user'], 0, "AD") && ! check_acl ($config['id_user'], 0, "LM") ) { returnError('forbidden', 'string'); return; } $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', array('name' => $id2)); if ($row === false) { returnError('error_parameter', 'Error in the parameters.'); return; } $idTemplate = $row['id']; $idActionTemplate = $row['id_alert_action']; $idAgentModule = db_get_value_filter('id_agente_modulo', 'tagente_modulo', array('id_agente' => $idAgent, 'nombre' => $other['data'])); if ($idAgentModule === false) { returnError('error_parameter', 'Error in the parameters.'); return; } $values = array( '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('error_delete_module_template_by_name', __('Error deleting module template.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct deleting of module template.'))); } } /** * 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 = array(); $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 = array(); $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('error_validate_all_alerts', __('Error validate all alerts. Failed ' . $errors . '.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct validating 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', array(false, false, false)); if ($duplicated === ENTERPRISE_NOT_HOOK) { returnError('error_validate_all_policy_alerts', __('Error validating all alert policies.')); return; } // Count of valid results $total_alerts = 0; $count_results = 0; // Check all policies foreach ($policies as $policy) { $policy_alerts = array(); $policy_alerts = enterprise_hook('policies_get_alerts', array($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 = array(); 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 = array(); 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('error_validate_all_alerts', __('Error validate all policy alerts. Failed ' . $errors . '.')); } else { returnData('string', array('type' => 'string', 'data' => __('Correct validating 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('error_stop_downtime', __('Error stopping downtime. Id_downtime cannot be left blank.')); return; } $date_time_stop = get_system_time(); $values = array(); $values['date_to'] = $date_time_stop; $result_update = db_process_sql_update('tplanned_downtime', $values, array ('id' => $id)); if ($result_update == 0) { returnError('error_stop_downtime', __('No action has been taken.')); } elseif ($result_update < 0) { returnError('error_stop_downtime', __('Error stopping downtime.')); } else { returnData('string', array('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', array('id_agente_modulo' => $id_module, 'id_tag' => $id_tag)); if (empty($exists)) { db_process_sql_insert('ttag_module', array('id_agente_modulo' => $id_module, 'id_tag' => $id_tag)); $exists = db_get_row_filter('ttag_module', array('id_agente_modulo' => $id_module, 'id_tag' => $id_tag)); } if (empty($exists)) returnError('error_set_tag_module', 'Error set tag module.'); else returnData('string', array('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', array('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', array('id_agente_modulo' => $id_module, 'id_tag' => $id_tag)); } } returnData('string', array('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; } $values = array(); $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('error_set_tag', __('Error set tag.')); else returnData('string', array('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 = array(); $values = array( "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("error_get_all_planned_downtimes", __('No planned downtime retrieved')); return; } returnData($returnType, array('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 = array(); $values = array( "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 = array('list_index'=>array('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, array('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 = array(); $values = array( 'id_downtime' => $id ); $returned = delete_planned_downtimes($values); returnData($returnType, array('type' => 'string', 'data' => $returned)); } /** * Create a new planned downtime. * * @param $id name of 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=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 $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])); $date_to = strtotime(html_entity_decode($other['data'][2])); $values = array(); $values['name'] = $id; $values = array( '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('error_set_planned_downtime', $returned['message'] ); else returnData('string', array('type' => 'string', 'data' => $returned['return'])); } /** * Add new items to planned Downtime. * * @param $id id of 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=set&op2=planned_downtimes_additem&id=123&other=1;2;3;4|Status;Unkown_modules&other_mode=url_encode_separator_| * * @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 = array(); $i = 0; foreach ($total_agents as $agent_id) { $result_agent = agents_check_access_agent($agent_id, "AD"); 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('error_set_planned_downtime_additem', "No agents to create planned 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', array('type' => 'string', 'data' => "Successfully created items " . $bad_agent . " " . $bad_modules . " " . $agents_no_exists)); } } /** * Add data 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: * * example: * * api.php?op=set&op2=add_data_module_policy&id=1&other=data_module_policy_example_name~2~data%20module%20created%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_add_data_module_policy($id, $thrash1, $other, $thrash3) { if (defined ('METACONSOLE')) { return; } if ($id == "") { returnError('error_add_data_module_policy', __('Error adding data module to policy. Id_policy cannot be left blank.')); return; } if (enterprise_hook('policies_check_user_policy', array($id)) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == "") { returnError('error_add_data_module_policy', __('Error adding data module 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', array($id, array('name'=>$other['data'][0]), 'name')); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('error_add_data_module_policy', __('Error adding data module to policy.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][16]; $disabled_types_event = json_encode($disabled_types_event); $values = array(); $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['configuration_data'] = $other['data'][15]; $values['disabled_types_event'] = $disabled_types_event; $values['module_macros'] = $other['data'][17]; $values['min_ff_event'] = $other['data'][18]; $values['each_ff'] = $other['data'][19]; $values['min_ff_event_normal'] = $other['data'][20]; $values['min_ff_event_warning'] = $other['data'][21]; $values['min_ff_event_critical'] = $other['data'][22]; $values['ff_timeout'] = $other['data'][23]; if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('error_add_data_module_policy', __('Error adding data module to policy. The module is already in the policy.')); return; } } $success = enterprise_hook('policies_create_module', array($other['data'][0], $id, 1, $values, false)); if ($success) //returnData('string', array('type' => 'string', 'data' => __('Data module added to policy. Is necessary to apply the policy in order to changes take effect.'))); returnData('string', array('type' => 'string', 'data' => $success)); else returnError('error_add_data_module_policy', 'Error adding data module to policy.'); } /** * 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; } if ($id == "") { returnError('error_update_data_module_policy', __('Error updating data module 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('error_update_data_module_policy', __('Error updating data module in policy. Id_policy_module cannot be left blank.')); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', array($id, array('id' => $other['data'][0]), 'id_module')); if ($module_policy === false) { returnError('error_update_data_module_policy', __('Error updating data module in policy. Module doesn\'t exist.')); return; } if ($module_policy[0]['id_module'] != 1) { returnError('error_update_data_module_policy', __('Error updating data module in policy. Module type is not network type.')); return; } $fields_data_module = array( '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', array($other['data'][0], $values, false)); if ($result_update < 0) returnError('error_update_data_module_policy', 'Error updating policy module.'); else returnData('string', array('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; } if ($id == "") { returnError('error_network_data_module_policy', __('Error adding network module to policy. Id_policy cannot be left blank.')); return; } if (enterprise_hook('policies_check_user_policy', array($id)) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == "") { returnError('error_network_data_module_policy', __('Error adding network module to policy. Module_name cannot be left blank.')); return; } if ($other['data'][1] < 6 or $other['data'][1] > 18) { returnError('error_network_data_module_policy', __('Error adding network module 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', array($id, array('name'=>$other['data'][0]), 'name')); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('error_network_data_module_policy', __('Error adding network module to policy.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][21]; $disabled_types_event = json_encode($disabled_types_event); $values = array(); $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]; if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('error_network_data_module_policy', __('Error adding network module to policy. The module is already in the policy.')); return; } } $success = enterprise_hook('policies_create_module', array($other['data'][0], $id, 2, $values, false)); if ($success) returnData('string', array('type' => 'string', 'data' => $success)); else returnError('error_add_network_module_policy', 'Error adding network module 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; } if ($id == "") { returnError('error_update_network_module_policy', __('Error updating network module in policy. Id_policy cannot be left blank.')); return; } if ($other['data'][0] == "") { returnError('error_update_network_module_policy', __('Error updating network module in policy. Id_policy_module cannot be left blank.')); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', array($id, array('id' => $other['data'][0]), 'id_module')); if ($module_policy === false) { returnError('error_update_network_module_policy', __('Error updating network module in policy. Module doesn\'t exist.')); return; } if ($module_policy[0]['id_module'] != 2) { returnError('error_update_network_module_policy', __('Error updating network module in policy. Module type is not network type.')); return; } $fields_network_module = array('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', array($other['data'][0], $values, false)); if ($result_update < 0) returnError('error_update_network_module_policy', 'Error updating policy module.'); else returnData('string', array('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; } if ($id == "") { returnError('error_add_plugin_module_policy', __('Error adding plugin module to policy. Id_policy cannot be left blank.')); return; } if (enterprise_hook('policies_check_user_policy', array($id)) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == "") { returnError('error_add_plugin_module_policy', __('Error adding plugin module to policy. Module_name cannot be left blank.')); return; } if ($other['data'][22] == "") { returnError('error_add_plugin_module_policy', __('Error adding plugin module to policy. Id_plugin cannot be left blank.')); return; } // Check if the module is already in the policy $name_module_policy = enterprise_hook('policies_get_modules', array($id, array('name'=>$other['data'][0]), 'name')); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('error_add_plugin_module_policy', __('Error adding plugin module to policy.')); return; } $disabled_types_event = array(); $disabled_types_event[EVENTS_GOING_UNKNOWN] = (int)!$other['data'][25]; $disabled_types_event = json_encode($disabled_types_event); $values = array(); $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 ($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]; if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('error_add_plugin_module_policy', __('Error adding plugin module to policy. The module is already in the policy.')); return; } } $success = enterprise_hook('policies_create_module', array($other['data'][0], $id, 4, $values, false)); if ($success) returnData('string', array('type' => 'string', 'data' => $success)); else returnError('error_add_plugin_module_policy', 'Error adding plugin module to policy.'); } /** * 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; } if ($id == "") { returnError('error_update_plugin_module_policy', __('Error updating plugin module in policy. Id_policy cannot be left blank.')); return; } if ($other['data'][0] == "") { returnError('error_update_plugin_module_policy', __('Error updating plugin module in policy. Id_policy_module cannot be left blank.')); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', array($id, array('id' => $other['data'][0]), 'id_module')); if ($module_policy === false) { returnError('error_updating_plugin_module_policy', __('Error updating plugin module in policy. Module doesn\'t exist.')); return; } if ($module_policy[0]['id_module'] != 4) { returnError('error_updating_plugin_module_policy', __('Error updating plugin module in policy. Module type is not network type.')); return; } $fields_plugin_module = array('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', array($other['data'][0], $values, false)); if ($result_update < 0) returnError('error_update_plugin_module_policy', 'Error updating policy module.'); else returnData('string', array('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('error_adding_module_conf', '-2'); exit; } $result = enterprise_hook('config_agents_add_module_in_conf', array($id_agent, $new_configuration_data)); if($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', array('type' => 'string', 'data' => '0')); } else { returnError('error_adding_module_conf', '-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', array($id_agent, $module_name)); if ($result !== ENTERPRISE_NOT_HOOK && !empty($result)) { returnData('string', array('type' => 'string', 'data' => $result)); } else { returnError('error_adding_module_conf', __('Remote config of module %s 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', array($id_agent, $module_name)); if($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', array('type' => 'string', 'data' => '0')); } else { returnError('error_deleting_module_conf', '-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(urldecode($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('error_editing_module_conf', '-2'); exit; } // If current configuration and new configuration are equal, abort if ($new_configuration_data == $old_configuration_data) { returnData('string', array('type' => 'string', 'data' => '1')); exit; } $result = enterprise_hook('config_agents_update_module_in_conf', array($id_agent, $old_configuration_data, $new_configuration_data)); if($result && $result !== ENTERPRISE_NOT_HOOK) { returnData('string', array('type' => 'string', 'data' => '0')); } else { returnError('error_editing_module_conf', '-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; } if ($id == "") { returnError('error_add_snmp_module_policy', __('Error adding SNMP module to policy. Id_policy cannot be left blank.')); return; } if (enterprise_hook('policies_check_user_policy', array($id)) === false) { returnError('forbidden', 'string'); return; } if ($other['data'][0] == "") { returnError('error_add_snmp_module_policy', __('Error adding SNMP module 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', array($id, array('name'=>$other['data'][0]), 'name')); if ($name_module_policy === ENTERPRISE_NOT_HOOK) { returnError('error_add_snmp_module_policy', __('Error adding SNMP module to policy.')); return; } if ($other['data'][2] < 15 or $other['data'][2] > 18) { returnError('error_add_snmp_module_policy', __('Error adding SNMP module to policy. Id_module_type is not correct for SNMP modules.')); return; } $disabled_types_event = array(); $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('error_add_snmp_module_policy', __('Error in creation SNMP module. snmp3_priv_method doesn\'t exist. Set it to \'AES\' or \'DES\'. ')); return; } if ($other['data'][24] != "authNoPriv" and $other['data'][24] != "authPriv" and $other['data'][24] != "noAuthNoPriv") { returnError('error_add_snmp_module_policy', __('Error in creation SNMP module. snmp3_sec_level doesn\'t exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ')); return; } if ($other['data'][25] != "MD5" and $other['data'][25] != "SHA") { returnError('error_add_snmp_module_policy', __('Error in creation SNMP module. snmp3_auth_method doesn\'t exist. Set it to \'MD5\' or \'SHA\'. ')); return; } $values = array( '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] ); } else { $values = array( '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] ); } if ($name_module_policy !== false) { if ($name_module_policy[0]['name'] == $other['data'][0]) { returnError('error_add_snmp_module_policy', __('Error adding SNMP module to policy. The module is already in the policy.')); return; } } $success = enterprise_hook('policies_create_module', array($other['data'][0], $id, 2, $values, false)); if ($success) returnData('string', array('type' => 'string', 'data' => $success)); else returnError('error_add_snmp_module_policy', 'Error adding SNMP module 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; } if ($id == "") { returnError('error_update_snmp_module_policy', __('Error updating SNMP module in policy. Id_policy cannot be left blank.')); return; } if ($other['data'][0] == "") { returnError('error_update_snmp_module_policy', __('Error updating SNMP module in policy. Id_policy_module cannot be left blank.')); return; } // Check if the module exists $module_policy = enterprise_hook('policies_get_modules', array($id, array('id' => $other['data'][0]), 'id_module')); if ($module_policy === false) { returnError('error_update_snmp_module_policy', __('Error updating SNMP module in policy. Module doesn\'t exist.')); return; } if ($module_policy[0]['id_module'] != 2) { returnError('error_update_snmp_module_policy', __('Error updating SNMP module 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('error_update_snmp_module_policy', __('Error updating SNMP module. snmp3_priv_method doesn\'t exist. Set it to \'AES\' or \'DES\'. ')); return; } if ($other['data'][23] != "authNoPriv" and $other['data'][23] != "authPriv" and $other['data'][23] != "noAuthNoPriv") { returnError('error_update_snmp_module_policy', __('Error updating SNMP module. snmp3_sec_level doesn\'t exist. Set it to \'authNoPriv\' or \'authPriv\' or \'noAuthNoPriv\'. ')); return; } if ($other['data'][24] != "MD5" and $other['data'][24] != "SHA") { returnError('error_update_snmp_module_policy', __('Error updating SNMP module. snmp3_auth_method doesn\'t exist. Set it to \'MD5\' or \'SHA\'. ')); return; } $fields_snmp_module = array('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 = array('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', array($other['data'][0], $values, false)); if ($result_update < 0) returnError('error_update_snmp_module_policy', 'Error updating policy module.'); else returnData('string', array('type' => 'string', 'data' => __('SNMP policy module updated.'))); } /** * Remove an agent from a policy. * @param $id Id of the policy * @param $id2 Id of the agent policy * @param $trash1 * @param $trash2 * * 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 ($id, $id2, $thrash2, $thrash3) { global $config; if (!check_acl($config['id_user'], 0, "AW")){ returnError('forbidden', 'string'); return; } if ($id == '' || !$id) { returnError('error_parameter', __('Error deleting agent from policy. Policy cannot be left blank.')); return; } if ($id2 == '' || !$id2) { returnError('error_parameter', __('Error deleting agent from policy. Agent cannot be left blank.')); return; } $policy = policies_get_policy ($id, false, false); $agent = db_get_row_filter('tagente', array('id_agente' => $id2)); $policy_agent = db_get_row_filter('tpolicy_agents', array('id_policy' => $id ,'id_agent' => $id2)); if (empty ($policy)){ returnError('error_policy', __('This policy does not exist.')); return; } if (empty ($agent)){ returnError('error_agent', __('This agent does not exist.')); return; } if (empty ($policy_agent)){ returnError('error_policy_agent', __('This agent does not exist in this policy.')); return; } $return = policies_change_delete_pending_agent($policy_agent['id']); $data = __('Successfully added to delete pending id agent %d to id policy %d.', $id2, $id); if ($return === false) returnError('error_delete_policy_agent', 'Could not be deleted id agent %d from id policy %d', $id2, $id); else returnData('string', array('type' => 'string', 'data' => $data)); } /** * 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; $group_name = $id; if (!check_acl($config['id_user'], 0, "PM")){ returnError('forbidden', 'string'); return; } if ($id == "") { returnError('error_create_group', __('Error in group creation. Group_name cannot be left blank.')); return; } if ($other['data'][0] == "") { returnError('error_create_group', __('Error in group creation. 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('error_create_group', __('Error in group creation. Id_parent_group doesn\'t exist.')); return; } } if ($safe_other_data[1] != "") { $values = array( 'icon' => $safe_other_data[0], 'parent' => $safe_other_data[1], 'description' => $safe_other_data[2] ); } else { $values = array( '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]; $id_group = groups_create_group($group_name, $values); if (is_error($id_group)) { // TODO: Improve the error returning more info returnError('error_create_group', __('Error in group creation.')); } else { if (defined("METACONSOLE")) { $servers = db_get_all_rows_sql ("SELECT * FROM tmetaconsole_setup WHERE disabled = 0"); if ($servers === false) $servers = array(); $result = array(); 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', array('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; } if (db_get_value('id_grupo', 'tgrupo', 'id_grupo', $id_group) === false) { returnError('error_set_update_group', __('There is not any 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]; $other = $other['data'][8]; $return = db_process_sql_update('tgrupo', array('nombre' => $name, 'icon' => $icon, 'parent' => $parent, 'description' => $description, 'propagate' => $propagate, 'disabled' => $disabled, 'custom_id' => $custom_id, 'contact' => $contact, 'other' => $other), array('id_grupo' => $id_group)); returnData('string', array('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; } $group = db_get_row_filter('tgrupo', array('id_grupo' => $id_group)); if (!$group) { returnError('error_delete', 'Error in delete operation. 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('error_delete', 'Error in delete operation. The group is not empty (used in ' . implode(', ', $usedGroup['tables']) . ').' ); return; } db_process_sql_update('tgrupo', array('parent' => $group['parent']), array('parent' => $id_group)); db_process_sql_delete('tgroup_stat', array('id_group' => $id_group)); $result = db_process_sql_delete('tgrupo', array('id_grupo' => $id_group)); if (!$result) returnError('error_delete', 'Error in delete operation.'); else returnData('string', array('type' => 'string', 'data' => __('Correct Delete'))); } /** * 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('error_create_netflow_filter', __('Error in netflow filter creation. Filter name cannot be left blank.')); return; } if ($other['data'][1] == "") { returnError('error_create_netflow_filter', __('Error in netflow filter creation. Group id cannot be left blank.')); return; } else { $group = groups_get_group_by_id($other['data'][1]); if ($group == false) { returnError('error_create_group', __('Error in netflow filter creation. Id_group doesn\'t exist.')); return; } if (!check_acl($config['id_user'], $other['data'][1], "AW")) { returnError('forbidden', 'string'); return; } } if ($other['data'][2] == "") { returnError('error_create_netflow_filter', __('Error in netflow filter creation. Filter cannot be left blank.')); return; } if ($other['data'][3] == "") { returnError('error_create_netflow_filter', __('Error in netflow filter creation. Aggregate_by cannot be left blank.')); return; } if ($other['data'][4] == "") { returnError('error_create_netflow_filter', __('Error in netflow filter creation. Output_format cannot be left blank.')); return; } $values = array ( '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('error_create_netflow_filter', __('Error in netflow filter creation.')); } else { returnData('string', array('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 = $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('error_query_module_data', 'Error in date format. '); } $sql = sprintf ("SELECT utimestamp, datos FROM tagente_datos WHERE id_agente_modulo = %d AND utimestamp > %d AND utimestamp < %d ORDER BY utimestamp DESC", $id, $date_start, $date_end); } else { if ($periodSeconds == null) { $sql = sprintf ("SELECT utimestamp, datos FROM tagente_datos WHERE id_agente_modulo = %d ORDER BY utimestamp DESC", $id); } else { $sql = sprintf ("SELECT utimestamp, datos FROM tagente_datos WHERE id_agente_modulo = %d AND utimestamp > %d ORDER BY utimestamp DESC", $id, get_system_time () - $periodSeconds); } } $data['type'] = 'array'; $data['list_index'] = array('utimestamp', 'datos'); $data['data'] = db_get_all_rows_sql($sql); if ($data === false) { returnError('error_query_module_data', 'Error in the query of module data.'); } else if ($data['data'] == "") { returnError('error_query_module_data', 'No data to show.'); } else { 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 ;;;