$file], $current_parsed_ini); } } } if (enterprise_installed() === false) { unset($parsed_ini['services']); } $total_agents_to_create = (int) get_parameter('agents_num', 30); $total_items_count = count($parsed_ini); if ($total_agents_to_create > 0) { $agents_to_create = 0; $agents_created_count = []; $agents_last_ip = []; // First loop over agents to get the total agents to be created and init agent created count for each agent. foreach ($parsed_ini['agents'] as $ini_agent_data) { if (isset($ini_agent_data['agent_data']['agents_number']) === true && $ini_agent_data['agent_data']['agents_number'] > 0 ) { $agents_to_create += (int) $ini_agent_data['agent_data']['agents_number']; $agents_created_count[$ini_agent_data['agent_data']['agent_alias']] = 0; $agents_last_ip[$ini_agent_data['agent_data']['agent_alias']] = null; } } $agent_created_total = 0; $agent_data_values_buffer = []; // TRAPS HISTORY: Removed due to performance issues // $agent_traps_values_buffer = []; if ($total_agents_to_create > 0 && $agents_to_create > 0) { while ($agent_created_total < ($total_agents_to_create - 1)) { if (count($parsed_ini['agents']) === 0) { register_error(DEMO_AGENT, __('No configuration files found or failed to parse files')); break; } // Get first server: general value for all created modules. . $server_name = db_get_value('name', 'tserver', 'id_server', 1); // Traverse agent ini files and create agents. foreach ($parsed_ini['agents'] as $ini_agent_data) { $filename = $ini_agent_data['filename']; $agent_data = $ini_agent_data['agent_data']; if (isset($agent_data['agents_number']) === true && !((int) $agent_data['agents_number'] > 0) ) { // No agents are specified to be created for this agent. continue; } if (isset($agent_data['agent_name']) === false || is_string($agent_data['agent_name']) === false || isset($agent_data['agent_alias']) === false || is_string($agent_data['agent_alias']) === false ) { register_error( DEMO_AGENT, __('Error in %s: name and/or alias is not specified or does not have a valid format. Skipping agent creation', $filename), true ); continue; } $iter_agents_to_create = $agent_data['agents_number']; if (($agent_created_total + $iter_agents_to_create) >= $total_agents_to_create) { // Total agents limit specified by user has been reached. break; } else { // Calculate max number of agents that can be created in this iteration until max number specified by user is reached. $max_agents_to_limit = ($total_agents_to_create - ($agent_created_total + $iter_agents_to_create)); } $modules_data = $ini_agent_data['modules']; $inventory = $ini_agent_data['inventory']; $inventory_values = $ini_agent_data['inventory_values']; $traps = $ini_agent_data['traps']; $address_network = $agent_data['address_network']; if (isset($agent_data['mac']) === true && is_string($agent_data['mac']) === true) { $mac = $agent_data['mac']; if ($agent_data['mac'] === '__randomMAC__') { $mac = generateRandomMacAddress(); } } if (isset($address_network) === false || is_string($address_network) === false) { // Agent address is not specified or not valid. register_error( DEMO_AGENT, __('Error in %s: address is not specified or does not have a valid format. Skipping agent creation', $filename), true ); continue; } $os_versions = $agent_data['os_versions']; $os_name = $agent_data['os_name']; $group_name = $agent_data['group']; // Get OS id given OS name. $id_os = db_get_value_filter('id_os', 'tconfig_os', ['name' => $os_name]); if ($id_os === false) { // Create OS if does not exist. $values = ['name' => $os_name]; $id_os = db_process_sql_insert('tconfig_os', $values); if ($id_os === false) { // Could not create OS. Skip agent creation. register_error( DEMO_AGENT, __('Error in %s: failed to create the specified operating system. Skipping agent creation', $filename), true ); continue; } if ($id_os > 0) { // Register created OS in tdemo_data. $values = [ 'item_id' => $id_os, 'table_name' => 'tconfig_os', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback OS creation if could not be registered in tdemo_data. db_process_sql_delete('tconfig_os', ['id_os' => $id_os]); continue; } } } $group_id = get_group_or_create_demo_group($group_name); $agent_interval = ($adv_options_is_enabled === true) ? $interval : 300; $iter_agents_created = 0; // Create agents (remaining number of agents to reach number specified by user). for ($i = 0; $i < min($iter_agents_to_create, $max_agents_to_limit); $i++) { $curr_ip_address = ($agents_last_ip[$agent_data['agent_alias']] !== null) ? $agents_last_ip[$agent_data['agent_alias']] : $address_network; $next_ip_address = calculateNextHostAddress($curr_ip_address); $host_address = explode('/', $next_ip_address)[0]; $agents_last_ip[$agent_data['agent_alias']] = $next_ip_address; $os_version = current($os_versions); next($os_versions); if (current($os_versions) === false) { reset($os_versions); } $latitude = 0; $longitude = 0; $altitude = 0; if (isset($agent_data['latitude']) === true) { $gis_parsed = explode(';', $agent_data['latitude']); if ((string) $gis_parsed[0] === 'RANDOM') { $latitude = rand($gis_parsed[1], $gis_parsed[2]); } else { $latitude = $agent_data['latitude']; } } if (isset($agent_data['longitude']) === true) { $gis_parsed = explode(';', $agent_data['longitude']); if ((string) $gis_parsed[0] === 'RANDOM') { $longitude = rand($gis_parsed[1], $gis_parsed[2]); } else { $longitude = $agent_data['longitude']; } } if (isset($agent_data['altitude']) === true) { $gis_parsed = explode(';', $agent_data['altitude']); if ((string) $gis_parsed[0] === 'RANDOM') { $altitude = rand($gis_parsed[1], $gis_parsed[2]); } else { $altitude = $agent_data['altitude']; } } $date_time = new DateTime(); $current_date_time = $date_time->format('Y-m-d H:i:s'); $values = [ 'server_name' => $server_name, 'id_os' => $id_os, 'os_version' => $os_version, 'ultimo_contacto' => $current_date_time, 'ultimo_contacto_remoto' => $current_date_time, ]; $create_alias = $agent_data['agent_alias'].'-'.($agents_created_count[$agent_data['agent_alias']] + 1); $created_agent_id = agents_create_agent( $create_alias, $group_id, $agent_interval, $host_address, $values, true ); if ($created_agent_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_agent_id, 'table_name' => 'tagente', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback agent creation if could not be registered in tdemo_data. db_process_sql_delete('tagente', ['id_agente' => $created_agent_id]); register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create agent %s', $filename, $create_alias), true ); continue; } } else { // Could not create agent. Skip. register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create agent %s', $filename, $create_alias), true ); continue; } // Register GIS data $values = [ 'tagente_id_agente' => $created_agent_id, 'current_longitude' => $longitude, 'current_latitude' => $latitude, 'current_altitude' => $altitude, 'stored_longitude' => $longitude, 'stored_latitude' => $latitude, 'stored_altitude' => $altitude, 'number_of_packages' => 1, 'manual_placement' => 1, ]; $result = db_process_sql_insert('tgis_data_status', $values); if ($result !== false) { $values = [ 'item_id' => $created_agent_id, 'table_name' => 'tgis_data_status', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback GIS data creation if could not be registered in tdemo_data. db_process_sql_delete('tgis_data_status', ['tagente_id_agente' => $created_agent_id]); } } $agents_created_count[$agent_data['agent_alias']]++; $iter_agents_created++; // Create agent modules. $module_access_idx = 1; while (1) { $modules_array = []; foreach ($modules_data as $key => $value) { $modules_array[$key] = ($value[$module_access_idx] ?? null); } $module_access_idx++; $test_empty_array = array_filter($modules_array); if (empty($test_empty_array) === true) { break; } if (isset($modules_array['name']) === false || is_string($modules_array['name']) === false ) { register_error( DEMO_AGENT, __('Error in %s: all modules must have a name. Skipping creation of item with index %d', $filename, ($module_access_idx - 1)), true ); continue; } if (isset($modules_array['type']) === false || is_string($modules_array['type']) === false ) { // Module type not defined. register_error( DEMO_AGENT, __('Error in %s: module type is not specified or does not have a valid format (%s). Skipping creation of item with index %d', $filename, ($module_access_idx - 1)), true ); continue; } $id_tipo = db_get_value_filter('id_tipo', 'ttipo_modulo', ['nombre' => $modules_array['type']]); if (!($id_tipo > 0)) { register_error( DEMO_AGENT, __('Error in %s: the specified module type is not defined in the system (%s). Skipping creation of item with index %d', $filename, $modules_array['name'], ($module_access_idx - 1)), true ); continue; } $module_description = ''; if (isset($modules_array['description']) === true && is_string($modules_array['description']) === true) { $module_description = str_replace('_mac_', $mac, $modules_array['description']); } $values = [ 'unit' => $modules_array['unit'], 'descripcion' => $module_description, 'id_tipo_modulo' => $id_tipo, 'id_module_group' => ($modules_array['group'] ?? 0), 'id_modulo' => 1, ]; $created_mod_id = modules_create_agent_module( $created_agent_id, io_safe_input($modules_array['name']), $values ); if ($created_mod_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_mod_id, 'table_name' => 'tagente_modulo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback agent module creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_modulo', ['id_agente_modulo' => $created_mod_id]); register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create module with index %d', $filename, ($module_access_idx - 1)), true ); continue; } // Insert module data. $parsed = explode(';', $modules_array['values']); $date_time = new DateTime(); $current_date_time = $date_time->format('Y-m-d H:i:s'); $back_periods = 1; if ($adv_options_is_enabled === false || ($adv_options_is_enabled === true && $history_is_enabled === true) ) { $back_periods = round(($days_hist_data * SECONDS_1DAY) / $interval); } $utimestamp = time(); // Generate back_periods amounts of tagente_datos rows each period_mins minutes back in time. for ($p = 0; $p < $back_periods; $p++) { $new_status = 0; if ((string) $parsed[0] === 'RANDOM') { $data = rand($parsed[1], $parsed[2]); } else if ((string) $parsed[0] === 'PROC') { $probability = (int) $parsed[1]; $data = 1; if ($probability > 0) { $randomNumber = rand(1, 100); if ($randomNumber <= $probability) { // Set to 0 with a certain probability. $data = 0; // Set to critical status if 0. $new_status = 1; } } } $agent_data_values = [ 'id_agente_modulo' => $created_mod_id, 'datos' => $data, 'utimestamp' => $utimestamp, ]; if ($p === 0) { // Insert current module data right away so module status is initialized with such value. $created_data_res = db_process_sql_insert('tagente_datos', $agent_data_values); if ($created_data_res === false) { continue; } // Proceed to update module status. $status_values = [ 'datos' => $data, 'estado' => $new_status, 'known_status' => 0, 'timestamp' => $current_date_time, 'utimestamp' => $utimestamp, 'last_status' => 0, 'last_known_status' => 0, 'current_interval' => $agent_interval, ]; $status_id = db_get_value( 'id_agente_estado', 'tagente_estado', 'id_agente_modulo', $created_mod_id ); $update_status_res = db_process_sql_update( 'tagente_estado', $status_values, ['id_agente_estado' => $status_id] ); if ($update_status_res !== false) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $status_id, 'table_name' => 'tagente_estado', ]; $result = db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_estado', ['id_agente_estado' => $status_id]); } } } else { // Buffer history data for later bulk insertion (performance reasons). $agent_data_values_buffer[] = $agent_data_values; } if ($adv_options_is_enabled === false || ($adv_options_is_enabled === true && $history_is_enabled === true) ) { $utimestamp -= $interval; } } } else { // Could not create module. register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create module with index %d', $filename, ($module_access_idx - 1)), true ); continue; } } // Create inventory modules. $module_access_idx = 1; $date_time = new DateTime(); $current_date_time = $date_time->format('Y-m-d H:i:s'); while (1) { // Insert in tmodule_inventory. $modules_array = []; foreach ($inventory as $key => $value) { $modules_array[$key] = ($value[$module_access_idx] ?? null); } $module_access_idx++; $test_empty_array = array_filter($modules_array); if (empty($test_empty_array) === true) { break; } if (isset($modules_array['name']) === false || is_string($modules_array['name']) === false ) { register_error( DEMO_AGENT, __('Error in %s: all inventory modules must have a name. Skipping creation of item with index %d', $filename, ($module_access_idx - 1)), true ); } if (isset($modules_array['format']) === false || is_string($modules_array['format']) === false || isset($modules_array['values']) === false || is_string($modules_array['values']) === false ) { register_error( DEMO_AGENT, __('Error in %s: one or more required fields (format, values) were not found for inventory module %s. Skipping creation of item with index %d', $filename, $modules_array['name'], ($module_access_idx - 1)), true ); continue; } $values = [ 'name' => $modules_array['name'], 'data_format' => $modules_array['format'], 'id_os' => $id_os, ]; $created_inventory_mod_id = inventory_create_inventory_module($values); if ($created_inventory_mod_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_inventory_mod_id, 'table_name' => 'tmodule_inventory', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback inventory module if could not be registered in tdemo_data. db_process_sql_delete('tmodule_inventory', ['id_module_inventory' => $created_inventory_mod_id]); register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create inventory module with index %d', $filename, ($module_access_idx - 1)), true ); continue; } } else { register_error( DEMO_AGENT, __('Uncaught error (source %s): could not create inventory module with index %d', $filename, ($module_access_idx - 1)), true ); continue; } // Insert in tagent_module_inventory and tagente_datos_inventory. $field_idx = 1; $values_array = explode(';', $modules_array['values']); $selected_inventory_values = array_filter( $inventory_values, function ($key) use ($values_array) { return in_array($key, $values_array); }, ARRAY_FILTER_USE_KEY ); $data_lines = []; while (1) { $line_values = array_column($selected_inventory_values, $field_idx); if (empty(array_filter($line_values)) === true) { break; } $data_lines[] = implode(';', $line_values); $field_idx++; } $data_str = implode('\n', $data_lines); $values = [ 'id_agente' => $created_agent_id, 'id_module_inventory' => $created_inventory_mod_id, 'interval' => 300, 'utimestamp' => time(), 'timestamp' => $current_date_time, 'data' => $data_str, ]; $created_module_inventory_id = db_process_sql_insert('tagent_module_inventory', $values); if ($created_module_inventory_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_module_inventory_id, 'table_name' => 'tagent_module_inventory', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback inventory module if could not be registered in tdemo_data. db_process_sql_delete('tagent_module_inventory', ['id_agent_module_inventory' => $created_module_inventory_id]); continue; } } $inventory_data_values = [ 'id_agent_module_inventory' => $created_module_inventory_id, 'data' => $data_str, 'utimestamp' => time(), 'timestamp' => $current_date_time, ]; db_process_sql_insert('tagente_datos_inventory', $inventory_data_values); } // Create traps. $date_time = new DateTime(); $current_date_time = $date_time->format('Y-m-d H:i:s'); $back_periods = 1; if ($adv_options_is_enabled === false || ($adv_options_is_enabled === true && $history_is_enabled === true) ) { $back_periods = round(($days_hist_data * SECONDS_1DAY) / $interval); } $utimestamp = time(); // TRAPS HISTORY: Removed due to performance issues /* for ($p = 0; $p < $back_periods; $p++) { $trap_access_idx = 1; while (1) { $traps_array = []; foreach ($traps as $key => $value) { $traps_array[$key] = ($value[$trap_access_idx] ?? null); } $trap_access_idx++; $test_empty_array = array_filter($traps_array); if (empty($test_empty_array) === true) { break; } if (isset($traps_array['oid']) === false || is_string($traps_array['oid']) === false || isset($traps_array['value']) === false || is_string($traps_array['value']) === false || isset($traps_array['snmp_type']) === false || is_string($traps_array['snmp_type']) === false || isset($traps_array['chance_percent']) === false || is_string($traps_array['chance_percent']) === false ) { register_error( DEMO_AGENT, __('Error in %s: all traps must have the following required fields: oid, value, snmp_type, chance_percent. Skipping creation of item with index %d', $filename, ($trap_access_idx - 1)), true ); continue; } $create_trap = false; $trap_creation_prob = (int) $traps_array['chance_percent']; if ($trap_creation_prob > 0) { $randomNumber = rand(1, 100); if ($randomNumber <= $trap_creation_prob) { $create_trap = true; } } if ($create_trap === false) { continue; } $parsed = explode(';', $traps_array['value']); $data = ''; if ((string) $parsed[0] === 'RANDOM') { $data = rand($parsed[1], $parsed[2]); } $values = [ 'oid' => $traps_array['oid'], 'source' => $host_address, 'value' => $data, 'type' => $traps_array['snmp_type'], 'timestamp' => $current_date_time, 'utimestamp' => $utimestamp, ]; // Buffer history traps for later bulk insertion (performance reasons). $agent_traps_values_buffer[] = $values; } if ($adv_options_is_enabled === false || ($adv_options_is_enabled === true && $history_is_enabled === true) ) { $date_time->sub(new DateInterval("PT{$interval}S")); $current_date_time = $date_time->format('Y-m-d H:i:s'); $utimestamp -= $interval; } } */ } update_progress($total_items_count, $total_agents_to_create, $iter_agents_created); } $agent_created_total = array_sum($agents_created_count); if ($agent_created_total === 0) { // Stop traversing agent files if no agent could be created after first round. break; } } $agent_data_values_buffer_chunks = array_chunk($agent_data_values_buffer, 100000); // TRAPS HISTORY: Removed due to performance issues // $agent_traps_values_buffer_chunks = array_chunk($agent_traps_values_buffer, 100000); foreach ($agent_data_values_buffer_chunks as $chunk) { // Bulk inserts (insert batches of up to 100,000 as a performance limit). mysql_db_process_sql_insert_multiple( 'tagente_datos', $chunk, false ); } // Get last trap in database. /* $id_trap_begin = db_get_value( 'MAX(id_trap)', 'ttrap', 1, 1, false, false ); if ($id_trap_begin === false) { $id_trap_begin = 0; } // TRAPS HISTORY: Removed due to performance issues /* foreach ($agent_traps_values_buffer_chunks as $chunk) { // Bulk inserts (insert batches of up to 100,000 as a performance limit). mysql_db_process_sql_insert_multiple( 'ttrap', $chunk, false ); } // Get last trap in database after insertion. $id_trap_end = db_get_value( 'MAX(id_trap)', 'ttrap', 1, 1, false, false ); if ($id_trap_end === false) { $id_trap_end = 0; } $agent_traps_demo_registry_buffer = []; for ($i = ($id_trap_begin + 1); $i <= $id_trap_end; $i++) { // Get batches to be stored in tdemo_data. $agent_traps_demo_registry_buffer[] = [ 'item_id' => $i, 'table_name' => 'ttrap', ]; } $agent_traps_demo_registry_buffer_chunks = array_chunk($agent_traps_demo_registry_buffer, 100000); foreach ($agent_traps_demo_registry_buffer_chunks as $chunk) { // Bulk inserts (insert batches of up to 100,000 as a performance limit). mysql_db_process_sql_insert_multiple( 'tdemo_data', $chunk, false ); }*/ update_item_checked(DEMO_AGENT); } } $services_count = count(($parsed_ini['services'] ?? [])); if ($services_count > 0) { // Create services. foreach ($parsed_ini['services'] as $ini_service_data) { $filename = $ini_service_data['filename']; $service_data = $ini_service_data['service_data']; $service_items = $ini_service_data['service_items']; // Check for mandatory fields. if (isset($service_data['name']) === false || is_string($service_data['name']) === false || isset($service_data['group']) === false || is_string($service_data['group']) === false ) { register_error( DEMO_SERVICE, __('Error in %s: name and/or group is not specified or does not have a valid format. Skipping service creation', $filename) ); continue; } // Check whether services default agent exists in the system. Try to get default agent if not. $matched_agents = agents_get_agents( ['nombre' => $service_agent_name], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $matched_agent = $matched_agents[0]['id_agente']; if (isset($matched_agent) === true && $matched_agent > 0) { $service_agent_id = $matched_agent; } else { // Skip element creation if agent does not exist. register_error( DEMO_SERVICE, __('Error in %s: the specified services agent does not exist in the system: %s. Skipping service creation', $filename, $service_agent_name) ); continue; } $id_group = get_group_or_create_demo_group($service_data['group']); if ($id_group === false) { // Group could not be created. Skip service creation. register_error( DEMO_SERVICE, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping service creation', $filename) ); continue; } $service_values = []; $service_values['name'] = io_safe_input($service_data['name']); $service_values['description'] = io_safe_input($service_data['description']); $service_values['id_group'] = $id_group; $service_values['critical'] = $service_data['critical']; $service_values['warning'] = $service_data['warning']; $service_values['auto_calculate'] = (isset($service_data['mode']) === true && (string) $service_data['mode'] === 'smart') ? 1 : 0; if (isset($service_data['show_sunburst']) === true && $service_data['show_sunburst'] === true) { $service_values['enable_sunburst'] = 1; } $created_service_id = db_process_sql_insert('tservice', $service_values); $service_module_values = []; $service_module_values['flag'] = 0; $service_module_values['module_interval'] = 300; $service_module_values['custom_integer_1'] = $created_service_id; $service_module_values['prediction_module'] = 2; $service_module_values['id_modulo'] = 5; $service_module_values['id_module_group'] = 1; if ($created_service_id > 0) { // Register created service in tdemo_data. $values = [ 'item_id' => $created_service_id, 'table_name' => 'tservice', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback service creation if could not be registered in tdemo_data. db_process_sql_delete('tservice', ['id' => $created_service_id]); register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service %s', $filename, $service_values['name']) ); continue; } $service_module_values['id_tipo_modulo'] = 22; $service_module_values['min_warning'] = $service_data['warning']; $service_module_values['min_critical'] = $service_data['critical']; $created_service_module_id = modules_create_agent_module( $service_agent_id, io_safe_input($service_data['name'].'_service'), $service_module_values ); if ($created_service_module_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_service_module_id, 'table_name' => 'tagente_modulo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_modulo', ['id_agente_modulo' => $created_service_module_id]); register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service module %s', $filename, $service_module_values['nombre']) ); continue; } $service_module_values['id_tipo_modulo'] = 21; $created_sla_service_module_id = modules_create_agent_module( $service_agent_id, io_safe_input($service_data['name'].'_SLA_service'), $service_module_values ); if ($created_sla_service_module_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_sla_service_module_id, 'table_name' => 'tagente_modulo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_modulo', ['id_agente_modulo' => $created_sla_service_module_id]); register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service SLA module %s', $filename, $service_module_values['nombre']) ); continue; } $service_module_values['id_tipo_modulo'] = 22; $created_sla_val_service_module_id = modules_create_agent_module( $service_agent_id, io_safe_input($service_data['name'].'_SLA_Value_service'), $service_module_values ); if ($created_sla_val_service_module_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_sla_val_service_module_id, 'table_name' => 'tagente_modulo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_modulo', ['id_agente_modulo' => $created_sla_val_service_module_id]); register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service SLA value module %s', $filename, $service_module_values['nombre']) ); continue; } } else { register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service SLA value module %s', $filename, $service_module_values['nombre']) ); continue; } } else { register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service SLA module %s', $filename, $service_module_values['nombre']) ); continue; } $update_service_module_ids = db_process_sql_update( 'tservice', [ 'id_agent_module' => $created_service_module_id, 'sla_id_module' => $created_sla_service_module_id, 'sla_value_id_module' => $created_sla_val_service_module_id, ], ['id' => $created_service_id] ); if ($update_service_module_ids === false) { continue; } } else { register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service module %s', $filename, $service_module_values['nombre']) ); continue; } } else { // Service could not be created. Skip creation of map. register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service %s', $filename, $service_values['name']) ); continue; } if (count($service_items) > 0) { $item_access_idx = 1; while (1) { $items_array = []; foreach ($service_items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } if (isset($items_array['type']) === false) { // Service element type must be specified. register_error( DEMO_SERVICE, __('Error in %s: all service items must have the following required fields: type. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $element_values = []; $element_values = ['id_service' => $created_service_id]; $element_type = (string) $items_array['type']; if (in_array($element_type, ['agent', 'module', 'dynamic', 'service']) === false) { // Skip element creation if type not valid. register_error( DEMO_SERVICE, __('Error in %s: the specified type of service item is not valid. All service items must have one of the following types: agent, module, dynamic, service. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } if (in_array($element_type, ['agent', 'module']) === true) { // Get agent ID and module ID. $matched_agents = agents_get_agents( ['nombre' => io_safe_input($items_array['agent_name'])], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $matched_agent = $matched_agents[0]['id_agente']; if (isset($matched_agent) === true && $matched_agent > 0) { $element_values['id_agent'] = $matched_agent; } else { // Skip element creation if agent does not exist. register_error( DEMO_SERVICE, __('Error in %s: the specified agent does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['agent_name'], ($item_access_idx - 1)) ); continue; } } if (in_array($element_type, ['module']) === true) { if ($element_values['id_agent'] > 0) { $module_id = db_get_value_sql('SELECT id_agente_modulo FROM tagente_modulo WHERE nombre = "'.io_safe_input($items_array['module']).'" AND id_agente = '.$element_values['id_agent']); if ($module_id > 0) { $element_values['id_agente_modulo'] = $module_id; } else { // Skip element creation if agent module does not exist. register_error( DEMO_SERVICE, __('Error in %s: the specified agent module does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['module'], ($item_access_idx - 1)) ); continue; } } else { continue; } } if ($element_type === 'dynamic') { if ($service_values['auto_calculate'] === 1) { if (isset($items_array['match']) === false || ($items_array['match'] !== 'agent' && $items_array['match'] !== 'module') ) { // If failed to provide match value, 'agent' is assigned by default. $match_value = 'agent'; } else { $match_value = $items_array['match']; } if (isset($items_array['group']) === true) { $group_id_value = get_group_or_create_demo_group($items_array['group']); if ($group_id_value === false) { $group_id_value = -1; } } else { $group_id_value = -1; } $element_values['id_agent'] = 0; $element_values['id_agente_modulo'] = 0; $rules_arr = [ 'dynamic_type' => $match_value, 'group' => $group_id_value, 'agent_name' => (isset($items_array['agent_name']) === true) ? $items_array['agent_name'] : '', 'module_name' => (isset($items_array['module']) === true) ? $items_array['module'] : '', 'regex_mode' => (isset($items_array['regex']) === true) ? $items_array['regex'] : false, 'custom_fields' => [], ]; $element_values['rules'] = base64_encode(json_encode($rules_arr)); } } if ($element_type === 'service') { if (isset($items_array['service_name']) === true && is_string($items_array['service_name']) === true ) { $services = services_get_services(['name' => io_safe_input($items_array['service_name'])]); $service_id = $services[0]['id']; if ($service_id > 0) { $element_values['id_service_child'] = $service_id; } else { // Skip element creation if specified service does not exist. register_error( DEMO_SERVICE, __('Error in %s: the specified service does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['service_name'], ($item_access_idx - 1)) ); continue; } } else { // Skip element creation if service name was not provided. continue; } } $id = db_process_sql_insert('tservice_element', $element_values); if ($id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $id, 'table_name' => 'tservice_element', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback service element if could not be registered in tdemo_data. db_process_sql_delete('tservice_element', ['id' => $id]); register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_SERVICE, __('Uncaught error (source %s): could not create service item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $services_count, $services_count); update_item_checked(DEMO_SERVICE); } else { register_error(DEMO_SERVICE, __('No configuration files found or failed to parse files')); } $nm_count = count(($parsed_ini['network_maps'] ?? [])); if ($nm_count > 0) { // Create network maps. foreach ($parsed_ini['network_maps'] as $ini_nm_data) { $filename = $ini_nm_data['filename']; $map_data = $ini_nm_data['map_data']; $map_items = $ini_nm_data['map_items']; if (isset($map_data['name']) === false || is_string($map_data['name']) === false || isset($map_data['group']) === false || is_string($map_data['group']) === false ) { register_error( DEMO_NETWORK_MAP, __('Error in %s: name and/or group is not specified or does not have a valid format. Skipping network map creation', $filename) ); continue; } $map_types = [ 'circular' => 0, 'radial_dynamic' => 6, ]; $nm_name = $map_data['name']; $nm_group = $map_data['group']; $nm_description = (isset($map_data['description']) === true) ? $map_data['description'] : ''; $nm_node_radius = (isset($map_data['node_radius']) === true) ? $map_data['node_radius'] : '40'; $nm_generation_method = (isset($map_data['generation_method']) === true && isset($map_types[$map_data['generation_method']]) === true) ? $map_types[$map_data['generation_method']] : '0'; $nm_id_group = get_group_or_create_demo_group($nm_group); if ($nm_id_group === false) { // Group could not be created. Skip network map creation. register_error( DEMO_NETWORK_MAP, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping service creation', $filename) ); continue; } $values = []; $new_map_filter = []; $new_map_filter['dont_show_subgroups'] = 0; $new_map_filter['node_radius'] = $nm_node_radius; $new_map_filter['x_offs'] = 0; $new_map_filter['y_offs'] = 0; $new_map_filter['z_dash'] = '0.5'; $new_map_filter['node_sep'] = '0.25'; $new_map_filter['rank_sep'] = '0.25'; $new_map_filter['mindist'] = 1; $new_map_filter['kval'] = '0.3'; $values['filter'] = json_encode($new_map_filter); $values['description'] = io_safe_input($nm_description); $values['id_group'] = $nm_id_group; $values['id_group_map'] = $nm_id_group; $values['source_data'] = $nm_id_group; $values['name'] = io_safe_input($nm_name); $values['refresh_time'] = 300; $values['generation_method'] = $nm_generation_method; $id_map = db_process_sql_insert('tmap', $values); if ($id_map > 0) { // Register created map in tdemo_data. $values = [ 'item_id' => $id_map, 'table_name' => 'tmap', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tmap', ['id' => $id_map]); register_error( DEMO_NETWORK_MAP, __('Uncaught error (source %s): could not create network map %s', $filename, $nm_name) ); continue; } } else { // Network map group could not be created. Skip creation of map. register_error( DEMO_NETWORK_MAP, __('Uncaught error (source %s): could not create network map %s', $filename, $nm_name) ); continue; } if (count($map_items) > 0) { $item_access_idx = 1; $map_id_index = []; while (1) { $items_array = []; foreach ($map_items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } $item_values = []; $item_values['id_map'] = $id_map; if (isset($items_array['agent_name']) === true || is_string($items_array['agent_name']) === false) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], [ 'id_agente', 'id_os', 'alias', ], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $matched_agent = $matched_agents[0]['id_agente']; $alias = $matched_agents[0]['alias']; if (isset($matched_agent) === true && $matched_agent > 0) { $item_values['source_data'] = $matched_agent; if (isset($matched_agents[0]['id_agente']) === true && $matched_agents[0]['id_os']) { $agent_os_id = $matched_agents[0]['id_os']; $icon_name = db_get_value('icon_name', 'tconfig_os', 'id_os', $agent_os_id); } } else { // Skip report item creation if agent does not exist. register_error( DEMO_NETWORK_MAP, __('Error in %s: the specified agent does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['agent_name'], ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_NETWORK_MAP, __('Error in %s: all network map items must have the following required fields: agent_name. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $style_values = [ 'shape' => 'circle', 'image' => 'images/networkmap/'.$icon_name, 'width' => null, 'height' => null, 'label' => $alias, ]; $item_values['style'] = json_encode($style_values); $item_values['x'] = (isset($items_array['x']) === true) ? $items_array['x'] : '0'; $item_values['y'] = (isset($items_array['y']) === true) ? $items_array['y'] : '0'; $created_nm_item_id = db_process_sql_insert('titem', $item_values); if ($created_nm_item_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_nm_item_id, 'table_name' => 'titem', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('titem', ['id' => $created_nm_item_id]); register_error( DEMO_NETWORK_MAP, __('Uncaught error (source %s): could not create network map item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $map_id_index[($item_access_idx - 1)] = $created_nm_item_id; if (isset($items_array['parent']) === true && (int) $items_array['parent'] > 0) { $parent_nm_id = $map_id_index[(int) $items_array['parent']]; $parent_nm_source_data = db_get_value('source_data', 'titem', 'id', $parent_nm_id); $rel_values = [ 'id_parent' => $parent_nm_id, 'id_child' => $created_nm_item_id, 'id_map' => $id_map, 'id_parent_source_data' => $parent_nm_source_data, 'id_child_source_data' => $item_values['source_data'], ]; $created_nm_rel_item_id = db_process_sql_insert('trel_item', $rel_values); if ($created_nm_rel_item_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_nm_rel_item_id, 'table_name' => 'trel_item', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('trel_item', ['id' => $created_nm_rel_item_id]); register_error( DEMO_NETWORK_MAP, __('Uncaught error (source %s): could not create network map item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } } } else { register_error( DEMO_NETWORK_MAP, __('Uncaught error (source %s): could not create network map item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $nm_count, $nm_count); update_item_checked(DEMO_NETWORK_MAP); } else { register_error(DEMO_NETWORK_MAP, __('No configuration files found or failed to parse files')); } $gis_count = count(($parsed_ini['gis_maps'] ?? [])); if ($gis_count > 0) { // Enable GIS features $token = 'activate_gis'; $activate_gis = db_get_value_filter('value', 'tconfig', ['token' => $token]); if ($activate_gis === false) { config_create_value($token, 1); } else { config_update_value($token, 1); } // Create GIS maps. foreach ($parsed_ini['gis_maps'] as $ini_gis_data) { $filename = $ini_gis_data['filename']; $gis_data = $ini_gis_data['gis_data']; $gis_layers = $ini_gis_data['gis_layers']; if (isset($gis_data['name']) === false || is_string($gis_data['name']) === false || isset($gis_data['group']) === false || is_string($gis_data['group']) === false ) { register_error( DEMO_GIS_MAP, __('Error in %s: name and/or group is not specified or does not have a valid format. Skipping GIS map creation', $filename) ); continue; } $gis_name = $gis_data['name']; $gis_group = $gis_data['group']; $gis_zoom_level = (isset($gis_data['zoom_level']) === true) ? $gis_data['zoom_level'] : '6'; $gis_initial_latitude = (isset($gis_data['initial_latitude']) === true) ? $gis_data['initial_latitude'] : '0'; $gis_initial_longitude = (isset($gis_data['initial_longitude']) === true) ? $gis_data['initial_longitude'] : '0'; $gis_initial_altitude = (isset($gis_data['initial_altitude']) === true) ? $gis_data['initial_altitude'] : '0'; $gis_default_latitude = (isset($gis_data['default_latitude']) === true) ? $gis_data['default_latitude'] : '0'; $gis_default_longitude = (isset($gis_data['default_longitude']) === true) ? $gis_data['default_longitude'] : '0'; $gis_default_altitude = (isset($gis_data['default_altitude']) === true) ? $gis_data['default_altitude'] : '0'; $gis_id_group = get_group_or_create_demo_group($gis_group); if ($gis_id_group === false) { // Group could not be created. Skip GIS map creation. register_error( DEMO_GIS_MAP, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping GIS map creation', $filename) ); continue; } $values = []; $values['map_name'] = io_safe_input($gis_name); $values['group_id'] = $gis_id_group; $values['zoom_level'] = $gis_zoom_level; $values['initial_latitude'] = $gis_initial_latitude; $values['initial_longitude'] = $gis_initial_longitude; $values['initial_altitude'] = $gis_initial_altitude; $values['default_latitude'] = $gis_default_latitude; $values['default_longitude'] = $gis_default_longitude; $values['default_altitude'] = $gis_default_altitude; $id_map = db_process_sql_insert('tgis_map', $values); if ($id_map > 0) { // Register created map in tdemo_data. $values = [ 'item_id' => $id_map, 'table_name' => 'tgis_map', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tgis_map', ['id_tgis_map' => $id_map]); register_error( DEMO_GIS_MAP, __('Uncaught error (source %s): could not create GIS map %s', $filename, $gis_name) ); continue; } } else { // Network map group could not be created. Skip creation of map. register_error( DEMO_GIS_MAP, __('Uncaught error (source %s): could not create GIS map %s', $filename, $gis_name) ); continue; } $values = []; $values['tgis_map_id_tgis_map'] = $id_map; $values['tgis_map_con_id_tmap_con'] = 1; db_process_sql_insert('tgis_map_has_tgis_map_con', $values); if (count($gis_layers) > 0) { $item_access_idx = 1; while (1) { $items_array = []; foreach ($gis_layers as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } $item_values = []; $layer_order = ($item_access_idx - 2); $item_values['tgis_map_id_tgis_map'] = $id_map; $item_values['layer_stack_order'] = $layer_order; $item_values['tgrupo_id_grupo'] = -1; $item_values['view_layer'] = 1; $item_values['layer_name'] = io_safe_input((isset($items_array['name']) === true) ? $items_array['name'] : ('layer-' - $layer_order)); if (isset($items_array['group']) === true) { $layer_id_group = get_group_or_create_demo_group($items_array['group']); if ($layer_id_group !== false) { $item_values['tgrupo_id_grupo'] = $layer_id_group; } } $created_gis_layer_id = db_process_sql_insert('tgis_map_layer', $item_values); if ($created_gis_layer_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_gis_layer_id, 'table_name' => 'tgis_map_layer', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('tgis_map_layer', ['id_tmap_layer' => $created_gis_layer_id]); register_error( DEMO_GIS_MAP, __('Uncaught error (source %s): could not create GIS map item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_GIS_MAP, __('Uncaught error (source %s): could not create GIS map item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $gis_count, $gis_count); update_item_checked(DEMO_GIS_MAP); } else { register_error(DEMO_GIS_MAP, __('No configuration files found or failed to parse files')); } $cg_count = count(($parsed_ini['graphs'] ?? [])); if ($cg_count > 0) { // Create graphs. foreach ($parsed_ini['graphs'] as $ini_graph_data) { // Constant graph types. $graph_types = [ 'line' => 2, 'area' => 0, 's_line' => 3, 's_area' => 1, 'h_bars' => 6, 'v_bars' => 7, 'gauge' => 5, 'pie' => 8, ]; $filename = $ini_graph_data['filename']; $graph_data = $ini_graph_data['graph_data']; $graph_items = $ini_graph_data['graph_items']; $graph_name = $graph_data['name']; $graph_group = $graph_data['group']; $graph_description = $graph_data['description']; $graph_type = (isset($graph_types[$graph_data['type']]) === true) ? $graph_types[$graph_data['type']] : 0; $graph_periodicity = $graph_data['periodicity']; $graph_id_group = get_group_or_create_demo_group($graph_group); if ($graph_id_group === false) { // Group could not be created. Skip graph creation. register_error( DEMO_CUSTOM_GRAPH, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping service creation', $filename) ); continue; } $values = []; $values['description'] = io_safe_input($graph_description); $values['id_group'] = $graph_id_group; $values['name'] = io_safe_input($graph_name); $values['period'] = $graph_periodicity; $values['stacked'] = $graph_type; $id_graph = db_process_sql_insert('tgraph', $values); if ($id_graph > 0) { // Register created graph in tdemo_data. $values = [ 'item_id' => $id_graph, 'table_name' => 'tgraph', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback graph creation if could not be registered in tdemo_data. db_process_sql_delete('tgraph', ['id_graph' => $id_graph]); register_error( DEMO_CUSTOM_GRAPH, __('Uncaught error (source %s): could not create custom graph %s', $filename, $graph_name) ); continue; } } else { // Graph could not be created. Skip creation of graph. register_error( DEMO_CUSTOM_GRAPH, __('Uncaught error (source %s): could not create custom graph %s', $filename, $graph_name) ); continue; } if (count($graph_items) > 0) { $item_access_idx = 1; while (1) { $items_array = []; foreach ($graph_items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } $item_values = []; if (isset($items_array['agent_name']) === false || is_string($items_array['agent_name']) === false || isset($items_array['module']) === false || is_string($items_array['module']) === false ) { // Agent and module must be defined. Skip graph item creation. register_error( DEMO_CUSTOM_GRAPH, __('Error in %s: one or more required fields (agent_name, module) were not found for custom graph item with index %d. Skipping creation of item with index %d', $filename, $item_access_idx, ($item_access_idx - 1)) ); continue; } $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { register_error( DEMO_CUSTOM_GRAPH, __('Error in %s: the specified agent does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['agent_name'], ($item_access_idx - 1)) ); continue; } $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { register_error( DEMO_CUSTOM_GRAPH, __('Error in %s: the specified agent module does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['module'], ($item_access_idx - 1)) ); continue; } $item_values = [ 'id_graph' => $id_graph, 'id_agent_module' => $module_id, 'weight' => 1, ]; $created_graph_item_id = db_process_sql_insert('tgraph_source', $item_values); if ($created_graph_item_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_graph_item_id, 'table_name' => 'tgraph_source', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('tgraph_source', ['id_gs' => $created_graph_item_id]); register_error( DEMO_CUSTOM_GRAPH, __('Uncaught error (source %s): could not create custom graph item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_CUSTOM_GRAPH, __('Uncaught error (source %s): could not create custom graph item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $cg_count, $cg_count); update_item_checked(DEMO_CUSTOM_GRAPH); } else { register_error(DEMO_CUSTOM_GRAPH, __('No configuration files found or failed to parse files')); } $rep_count = count(($parsed_ini['reports'] ?? [])); if ($rep_count > 0) { // Create reports. foreach ($parsed_ini['reports'] as $ini_report_data) { $filename = $ini_report_data['filename']; $report_data = $ini_report_data['report_data']; $report_items = $ini_report_data['report_items']; // Check for mandatory fields. if (isset($report_data['name']) === false || is_string($report_data['name']) === false || isset($report_data['group']) === false || is_string($report_data['group']) === false ) { register_error( DEMO_REPORT, __('Error in %s: name and/or group is not specified or does not have a valid format. Skipping custom report creation', $filename) ); } $group_id = get_group_or_create_demo_group($report_data['group']); if ($group_id === false) { // Could not create group. Skip report creation. register_error( DEMO_REPORT, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping service creation', $filename) ); continue; } $report_values = []; $report_values['id_group'] = $group_id; $report_values['name'] = io_safe_input($report_data['name']); $report_values['description'] = io_safe_input($report_data['description']); $created_report_id = db_process_sql_insert('treport', $report_values); if ($created_report_id > 0) { // Register created graph in tdemo_data. $values = [ 'item_id' => $created_report_id, 'table_name' => 'treport', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback report creation if could not be registered in tdemo_data. db_process_sql_delete('treport', ['id_report' => $created_report_id]); register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report %s', $filename, $report_data['name']) ); continue; } } else { // Report could not be created. Skip creation of map. register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report %s', $filename, $report_data['name']) ); continue; } if (count($report_items) > 0) { $item_access_idx = 1; while (1) { $items_array = []; foreach ($report_items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } if (isset($items_array['name']) === false || is_string($items_array['name']) === false || isset($items_array['type']) === false || is_string($items_array['type']) === false ) { // All report items must have a type. register_error( DEMO_REPORT, __('Error in %s: all custom report items must have the following required fields: name, type. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $item_values = []; $item_values['id_report'] = $created_report_id; $item_values['name'] = io_safe_input($items_array['name']); $item_values['type'] = $items_array['type']; if (isset($items_array['agent_name']) === true) { if (isset($items_array['module']) === false || is_string($items_array['module']) === false ) { continue; } $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $matched_agent = $matched_agents[0]['id_agente']; if (isset($matched_agent) === true && $matched_agent > 0) { $item_values['id_agent'] = $matched_agent; } else { // Skip report item creation if agent does not exist. register_error( DEMO_REPORT, __('Error in %s: the specified agent does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['agent_name'], ($item_access_idx - 1)) ); continue; } } if (isset($items_array['module']) === true) { if (is_string($items_array['module']) === false) { // Module wrong data type read. Skip. continue; } if ($item_values['id_agent'] > 0) { $module_id = db_get_value_sql('SELECT id_agente_modulo FROM tagente_modulo WHERE nombre = "'.io_safe_input($items_array['module']).'" AND id_agente = '.$item_values['id_agent']); if ($module_id > 0) { $item_values['id_agent_module'] = $module_id; } else { // Skip report item creation if agent module does not exist. register_error( DEMO_REPORT, __('Error in %s: the specified agent module does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['module'], ($item_access_idx - 1)) ); continue; } } else { continue; } } if (isset($items_array['graph_name']) === true && is_string($items_array['graph_name']) === true) { $id_custom_graph = reset(custom_graphs_search('', $items_array['graph_name']))['id_graph']; if ($id_custom_graph > 0) { $item_values['id_gs'] = $id_custom_graph; } else { // Skip report item creation if specified custom graph does not exist. register_error( DEMO_REPORT, __('Error in %s: the specified custom graph does not exist in the system: %s. Skipping creation of item with index %d', $filename, $items_array['graph_name'], ($item_access_idx - 1)) ); continue; } } if ($items_array['type'] === 'simple_graph') { $item_values['style'] = '{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":1,"dyn_height":"250","percentil":0,"fullscale":0,"image_threshold":0,"label":""}'; } if ($items_array['type'] === 'custom_graph') { $item_values['style'] = '{"show_in_same_row":0,"hide_notinit_agents":0,"priority_mode":"1","dyn_height":"250"}'; } $item_values['period'] = (isset($items_array['periodicity']) === true) ? $items_array['periodicity'] : 300; $created_report_item_id = db_process_sql_insert('treport_content', $item_values); if ($created_report_item_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_report_item_id, 'table_name' => 'treport_content', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback report item if could not be registered in tdemo_data. db_process_sql_delete('treport_content', ['id_rc' => $created_report_item_id]); register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report item with index %d', $filename, ($item_access_idx - 1)) ); continue; } if ($items_array['type'] === 'SLA') { $sla_values = [ 'id_report_content' => $created_report_item_id, 'id_agent_module' => $item_values['id_agent_module'], 'sla_limit' => 95, ]; $created_report_content_sla_id = db_process_sql_insert('treport_content_sla_combined', $sla_values); if ($created_report_content_sla_id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $created_report_content_sla_id, 'table_name' => 'treport_content_sla_combined', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback report item if could not be registered in tdemo_data. db_process_sql_delete('treport_content_sla_combined', ['id' => $created_report_content_sla_id]); register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } } else { register_error( DEMO_REPORT, __('Uncaught error (source %s): could not create custom report item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $rep_count, $rep_count); update_item_checked(DEMO_REPORT); } else { register_error(DEMO_REPORT, __('No configuration files found or failed to parse files')); } $vc_count = count(($parsed_ini['visual_consoles'] ?? [])); if ($vc_count > 0) { // Create visual consoles. foreach ($parsed_ini['visual_consoles'] as $ini_data) { $filename = $ini_data['filename']; $data = $ini_data['visual_console_data']; $items = $ini_data['visual_console_items']; // Check for mandatory fields. if (isset($data['name']) === false || isset($data['group']) === false ) { // Name and group fields must be specified for vc. register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: name and/or group is not specified or does not have a valid format. Skipping visual console creation', $filename) ); continue; } $id_group = get_group_or_create_demo_group($data['group']); if ($id_group === false) { // Group could not be created. Skip dashboard creation. register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: the specified group does not exist in the system and could not be created. Skipping visual console creation', $filename) ); continue; } $insert_values = []; $insert_values['name'] = io_safe_input($data['name']); $insert_values['id_group'] = $id_group; $insert_values['background'] = (isset($data['background']) === true) ? $data['background'] : 'None.png'; $insert_values['background_color'] = (isset($data['background_color']) === true) ? $data['background_color'] : '#ffffff'; $insert_values['width'] = (isset($data['width']) === true) ? $data['width'] : 1024; $insert_values['height'] = (isset($data['height']) === true) ? $data['height'] : 768; $created_id = db_process_sql_insert('tlayout', $insert_values); if ($created_id > 0) { // Register created item in tdemo_data. $values = [ 'item_id' => $created_id, 'table_name' => 'tlayout', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tlayout', ['id' => $created_id]); register_error( DEMO_VISUAL_CONSOLE, __('Uncaught error (source %s): could not create visual console %s', $filename, $insert_values['name']) ); continue; } } else { // VC could not be created. Skip creation of item. register_error( DEMO_VISUAL_CONSOLE, __('Uncaught error (source %s): could not create visual console %s', $filename, $insert_values['name']) ); continue; } if (count($items) > 0) { $item_access_idx = 1; while (1) { $items_array = []; foreach ($items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } if (isset($items_array['type']) === false) { // All visual console items must have a type. register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: all visual console items must have the following required fields: type. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } // Map used types. $types = [ 'static_image' => 0, 'module_graph' => 1, 'custom_graph' => 1, 'value' => 2, 'percentile' => 3, 'label' => 4, 'icon' => 5, 'bubble' => 9, 'box' => 12, 'event_history' => 14, 'circular_progress_bar' => 15, 'circular_progress_bar_int' => 16, 'color_cloud' => 20, 'odometer' => 22, 'basic_chart' => 23, ]; $value_process_types = [ 'max' => 6, 'min' => 7, 'avg' => 8, ]; // Get ID of item type. Skip if it does not exist. if (isset($types[$items_array['type']]) === false) { register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: the specified type is not a valid one. It must be one of the following values: static_image, module_graph, custom_graph, value, label, icon. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $element_values = []; $element_values['type'] = $types[$items_array['type']]; if ($items_array['type'] == 'value') { if (isset($items_array['process']) === true && isset($value_process_types[$items_array['process']])) { $element_values['type'] = $value_process_types[$items_array['process']]; if (isset($items_array['interval']) === true) { $element_values['period'] = $items_array['interval']; } } } $element_values['id_layout'] = $created_id; if ($items_array['type'] === 'static_image') { if (isset($items_array['image']) === false || is_string($items_array['image']) === false ) { // The above fields are required for this item. register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: image field must be specified for static image item type. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $element_values['image'] = $items_array['image']; if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } if (isset($items_array['visual_console']) === true) { $id_vc = db_get_value('id', 'tlayout', 'name', $items_array['visual_console']); if (!($id_vc > 0)) { continue; } $element_values['id_layout_linked'] = $id_vc; } } if ($items_array['type'] === 'module_graph') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } if (isset($items_array['interval']) === true) { $element_values['period'] = $items_array['interval']; } if (isset($items_array['graph_type']) === true) { $element_values['type_graph'] = $items_array['graph_type']; } if (isset($items_array['image']) === true) { $element_values['image'] = $items_array['image']; } } if ($items_array['type'] === 'custom_graph') { if (isset($items_array['graph_name']) === true && is_string($items_array['graph_name']) === true ) { $id_custom_graph = reset(custom_graphs_search('', $items_array['graph_name']))['id_graph']; if ($id_custom_graph > 0) { $element_values['id_custom_graph'] = $id_custom_graph; } else { continue; } } if (isset($items_array['interval']) === true) { $element_values['period'] = $items_array['interval']; } if (isset($items_array['image']) === true) { $element_values['image'] = $items_array['image']; } } if ($items_array['type'] === 'basic_chart') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } if (isset($items_array['interval']) === true) { $element_values['period'] = $items_array['interval']; } } if ($items_array['type'] === 'event_history') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } if (isset($items_array['interval']) === true) { $element_values['period'] = $items_array['interval']; } } if ($items_array['type'] === 'odometer') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } } if ($items_array['type'] === 'color_cloud') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } } if ($items_array['type'] === 'box') { if (isset($items_array['border_color']) === true) { $element_values['border_color'] = $items_array['border_color']; } if (isset($items_array['fill_color']) === true) { $element_values['fill_color'] = $items_array['fill_color']; } } if ($items_array['type'] === 'icon') { if (isset($items_array['image']) === false || is_string($items_array['image']) === false ) { // The above fields are required for this item. register_error( DEMO_VISUAL_CONSOLE, __('Error in %s: image field must be specified for icon item type. Skipping creation of item with index %d', $filename, ($item_access_idx - 1)) ); continue; } $element_values['image'] = $items_array['image']; if (isset($items_array['visual_console']) === true) { $id_vc = db_get_value('id', 'tlayout', 'name', $items_array['visual_console']); if (!($id_vc > 0)) { continue; } $element_values['id_layout_linked'] = $id_vc; } } if ($items_array['type'] === 'value') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } } if (isset($items_array['label']) === true) { $element_values['label'] = io_safe_input($items_array['label']); } if (isset($items_array['label_position']) === true) { $element_values['label_position'] = $items_array['label_position']; } if (isset($items_array['x']) === true) { $element_values['pos_x'] = $items_array['x']; } if (isset($items_array['y']) === true) { $element_values['pos_y'] = $items_array['y']; } if (isset($items_array['width']) === true) { $element_values['width'] = $items_array['width']; } if (isset($items_array['height']) === true) { $element_values['height'] = $items_array['height']; } $element_values['show_on_top'] = (isset($items_array['show_on_top']) === true && $items_array['show_on_top'] === true) ? 1 : 0; // Check here percentile items as height is used for max value if ($items_array['type'] === 'percentile' || $items_array['type'] === 'bubble' || $items_array['type'] === 'circular_progress_bar' || $items_array['type'] === 'circular_progress_bar_int') { if (isset($items_array['agent_name']) === true) { $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $element_values['id_agent'] = $agent_id; if (isset($items_array['module']) === true) { $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $element_values['id_agente_modulo'] = $module_id; } } $element_values['border_width'] = 0; if (isset($items_array['min']) === true) { $element_values['border_width'] = $items_array['min']; } $element_values['height'] = 100; if (isset($items_array['max']) === true) { $element_values['height'] = $items_array['max']; } $element_values['image'] = 'percent'; } $id = db_process_sql_insert('tlayout_data', $element_values); if ($id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $id, 'table_name' => 'tlayout_data', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('tlayout_data', ['id' => $id]); register_error( DEMO_VISUAL_CONSOLE, __('Uncaught error (source %s): could not create visual console item with index %d', $filename, ($item_access_idx - 1)) ); continue; } } else { register_error( DEMO_VISUAL_CONSOLE, __('Uncaught error (source %s): could not create visual console item with index %d', $filename, ($item_access_idx - 1)) ); } } } } update_progress($total_items_count, $vc_count, $vc_count); update_item_checked(DEMO_VISUAL_CONSOLE); } else { register_error(DEMO_VISUAL_CONSOLE, __('No configuration files found or failed to parse files')); } $dashboards_count = count(($parsed_ini['dashboards'] ?? [])); if ($dashboards_count > 0) { // Create dashboards. foreach ($parsed_ini['dashboards'] as $ini_data) { $data = $ini_data['dashboard_data']; $items = $ini_data['dashboard_items']; // Check for mandatory fields. if (isset($data['name']) === false || isset($data['group']) === false ) { // Name and group fields must be specified for dashbaord. continue; } $id_group = get_group_or_create_demo_group($data['group']); if ($id_group === false) { // Group could not be created. Skip dashboard creation. continue; } $insert_values = []; $insert_values['name'] = io_safe_input($data['name']); $insert_values['id_group'] = $id_group; $created_id = db_process_sql_insert('tdashboard', $insert_values); if ($created_id > 0) { // Register created item in tdemo_data. $values = [ 'item_id' => $created_id, 'table_name' => 'tdashboard', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tdashboard', ['id' => $created_id]); continue; } } else { // Dashboard could not be created. Skip creation of item. continue; } if (count($items) > 0) { $item_access_idx = 1; $order = -1; while (1) { $items_array = []; foreach ($items as $key => $value) { $items_array[$key] = ($value[$item_access_idx] ?? null); } $item_access_idx++; $test_empty_array = array_filter($items_array); if (empty($test_empty_array) === true) { break; } if (isset($items_array['type']) === false || isset($items_array['title']) === false) { // All dashboard widgets must have a type and a title. continue; } // Get ID of widget type. Skip if it does not exist. $type_id = db_get_value('id', 'twidget', 'unique_name', $items_array['type']); if (!($type_id > 0)) { continue; } $title = io_safe_input($items_array['title']); $element_values = []; if ($items_array['type'] === 'single_graph') { if (isset($items_array['agent_name']) === false || isset($items_array['module']) === false ) { // The above fields are required for this item. continue; } $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'agentId' => "$agent_id", 'metaconsoleId' => 0, 'moduleId' => "$module_id", 'period' => (isset($items_array['interval']) === true) ? $items_array['interval'] : '86400', 'showLegend' => 1, 'projection_switch' => false, 'period_projection' => '300', ]; $order++; } if ($items_array['type'] === 'custom_graph') { if (isset($items_array['graph_name']) === false || isset($items_array['graph_type']) === false ) { // The above fields are required for this item. continue; } // Try to get graph and skip if not exists. $id_graph = db_get_value('id_graph', 'tgraph', 'name', io_safe_input($items_array['graph_name'])); if (!($id_graph > 0)) { continue; } $graph_types = [ 'line' => 2, 'area' => 0, 's_line' => 3, 's_area' => 1, 'h_bars' => 6, 'v_bars' => 7, 'gauge' => 5, 'pie' => 8, ]; if (isset($graph_types[$items_array['graph_type']]) === true) { $graph_type_id = $items_array['graph_type']; } else { // Specified graph type is not a valid one. continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'id_graph' => $id_graph, 'type' => $graph_type_id, 'period' => (isset($items_array['interval']) === true) ? $items_array['interval'] : 86400, 'showLegend' => 1, ]; $order++; } if ($items_array['type'] === 'reports') { if (isset($items_array['report_name']) === false) { // The above fields are required for this item. continue; } $id_report = reports_get_reports(['name' => io_safe_input($items_array['report_name'])], ['id_report'])[0]['id_report']; if (!($id_report > 0)) { continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'reportId' => $id_report, ]; $order++; } if ($items_array['type'] === 'network_map') { if (isset($items_array['map_name']) === false) { // The above fields are required for this item. continue; } $id_map = db_get_value('id', 'tmap', 'name', io_safe_input($items_array['map_name'])); if (!($id_map > 0)) { continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'networkmapId' => "$id_map", 'xOffset' => '0', 'yOffset' => '0', 'zoomLevel' => 0.5, ]; $order++; } if ($items_array['type'] === 'service_map') { if (isset($items_array['service_name']) === false) { // The above fields are required for this item. continue; } $services = services_get_services(['name' => io_safe_input($items_array['service_name'])]); $service_id = $services[0]['id']; if (!($service_id > 0)) { continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'serviceId' => "$service_id", 'sunburst' => (isset($items_array['show_sunburst']) === true && $items_array['show_sunburst'] === true) ? 1 : 0, ]; $order++; } if ($items_array['type'] === 'system_group_status') { $options_data = [ 'title' => $title, 'background' => '#ffffff', 'groupId' => ['0'], 'status' => ['4,1,0,2'], 'sunburst' => false, ]; $order++; } if ($items_array['type'] === 'graph_module_histogram') { if (isset($items_array['agent_name']) === false || isset($items_array['module']) === false ) { // The above fields are required for this item. continue; } $matched_agents = agents_get_agents( ['nombre' => $items_array['agent_name']], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $agent_id = $matched_agents[0]['id_agente']; if (!($agent_id > 0)) { continue; } $module_row = modules_get_agentmodule_id(io_safe_input($items_array['module']), $agent_id); $module_id = $module_row['id_agente_modulo']; if (!($module_id > 0)) { continue; } $options_data = [ 'title' => $title, 'background' => '#ffffff', 'agentId' => "$agent_id", 'metaconsoleId' => 0, 'moduleId' => "$module_id", 'period' => (isset($items_array['interval']) === true) ? $items_array['interval'] : '86400', 'sizeLabel' => 30, ]; $order++; } if ($items_array['type'] === 'events_list') { $options_data = [ 'title' => $title, 'background' => '#ffffff', 'eventType' => 0, 'maxHours' => 8, 'limit' => 20, 'eventStatus' => -1, 'severity' => -1, 'groupId' => [''], 'tagsId' => [''], 'groupRecursion' => 0, 'customFilter' => -1, 'columns_events_widget' => [ 'mini_severity,evento,estado,agent_name,timestamp', '', ], ]; $order++; } if ($items_array['type'] === 'top_n_events_by_group') { $options_data = [ 'title' => $title, 'background' => '#ffffff', 'amountShow' => 10, 'maxHours' => 8, 'groupId' => ['0'], 'legendPosition' => 'bottom', 'show_total_data' => 0, ]; $order++; } if ($items_array['type'] === 'top_n') { $options_data = [ 'title' => $title, 'background' => '#ffffff', 'agent' => (isset($items_array['agent_name']) === true) ? $items_array['agent_name'] : '.*', 'module' => (isset($items_array['module']) === true) ? $items_array['module'] : '.*', 'period' => (isset($items_array['interval']) === true) ? $items_array['interval'] : '86400', 'quantity' => '10', 'order' => '2', 'display' => '0', 'type_graph' => 'bar_vertical', 'legend' => 'agent_module', ]; $order++; } $item_x = $items_array['x']; $item_y = $items_array['y']; $item_width = $items_array['width']; $item_height = $items_array['height']; $position_data = [ 'x' => (isset($items_array['x']) === true) ? "$item_x" : '0', 'y' => (isset($items_array['y']) === true) ? "$item_y" : '0', 'width' => (isset($items_array['width']) === true) ? "$item_width" : '4', 'height' => (isset($items_array['height']) === true) ? "$item_height" : '4', ]; $element_values = [ 'position' => json_encode($position_data), 'options' => json_encode($options_data), 'order' => $order, 'id_dashboard' => $created_id, 'id_widget' => $type_id, 'prop_width' => $items_array['width'], 'prop_height' => $items_array['height'], ]; $id = db_process_sql_insert('twidget_dashboard', $element_values); if ($id > 0) { // Register created demo item in tdemo_data. $values = [ 'item_id' => $id, 'table_name' => 'twidget_dashboard', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item if could not be registered in tdemo_data. db_process_sql_delete('twidget_dashboard', ['id' => $id]); continue; } } } } } update_progress($total_items_count, $dashboards_count, $dashboards_count); update_item_checked(DEMO_DASHBOARD); } else { register_error(DEMO_DASHBOARD, __('No configuration files found or failed to parse files')); } // Register plugin. $quit = false; // Check whether plugin agent exists in the system. Try to get default agent if not. $matched_agents = agents_get_agents( ['nombre' => $plugin_agent_name], ['id_agente'], 'AR', [ 'field' => 'nombre', 'order' => 'ASC', ], false, 0, false, false, false ); $matched_agent = $matched_agents[0]['id_agente']; if (isset($matched_agent) === true && $matched_agent > 0) { $plugin_agent_id = $matched_agent; } else { // Skip element creation if agent does not exist. register_error( DEMO_PLUGIN, __('Error in plugin creation: the specified agent for the plugin does not exist in the system: %s. Skipping plugin creation', $filename, $plugin_agent_name) ); $quit = true; } if ($quit === false) { $values = [ 'name' => io_safe_input('Pandora demo agents'), 'description' => io_safe_input('Generate XML and traps for demo agents based on agents definition files.'), 'max_timeout' => 300, 'max_retries' => 0, 'execute' => io_safe_input('perl /usr/share/pandora_server/util/plugin/pandora_demo_agents.pl'), 'net_dst_opt' => '', 'net_port_opt' => '', 'user_opt' => '', 'pass_opt' => '', 'plugin_type' => 0, 'macros' => '{\"1\":{\"macro\":\"_field1_\",\"desc\":\"Agents files folder path\",\"help\":\"\",\"value\":\"/usr/share/pandora_server/util/plugin/demodata_agents\",\"hide\":\"\"},\"2\":{\"macro\":\"_field2_\",\"desc\":\"Number of agents\",\"help\":\"\",\"value\":\"10\",\"hide\":\"\"},\"3\":{\"macro\":\"_field3_\",\"desc\":\"Traps target IP\",\"help\":\"\",\"value\":\"127.0.0.1\",\"hide\":\"\"},\"4\":{\"macro\":\"_field4_\",\"desc\":\"Traps community\",\"help\":\"\",\"value\":\"public\",\"hide\":\"\"},\"5\":{\"macro\":\"_field5_\",\"desc\":\"Tentacle target IP\",\"help\":\"\",\"value\":\"127.0.0.1\",\"hide\":\"\"},\"6\":{\"macro\":\"_field6_\",\"desc\":\"Tentacle port\",\"help\":\"\",\"value\":\"41121\",\"hide\":\"\"},\"7\":{\"macro\":\"_field7_\",\"desc\":\"Tentacle extra options\",\"help\":\"\",\"value\":\"\",\"hide\":\"\"}}', 'parameters' => ''_field1_' '_field2_' '_interval_' '_field3_' '_field4_' '_field5_' '_field6_' '_field7_'', 'no_delete' => 1, ]; $created_plugin_id = db_process_sql_insert('tplugin', $values); if ($created_plugin_id > 0) { // Register created item in tdemo_data. $values = [ 'item_id' => $created_plugin_id, 'table_name' => 'tplugin', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tplugin', ['id' => $created_plugin_id]); register_error( DEMO_PLUGIN, __('Error in plugin creation: the plugin could not be registered. Skipping creation of plugin module') ); } else { // Create plugin module. $module_values = []; $module_values['id_tipo_modulo'] = db_get_value('id_tipo', 'ttipo_modulo', 'nombre', 'generic_proc'); if ($module_values['id_tipo_modulo'] === false) { register_error( DEMO_PLUGIN, __('Error in plugin creation: module type "generic_proc" does not exist in the system. Skipping creation of plugin module') ); } else { $module_values['module_interval'] = $interval; $module_values['id_modulo'] = 4; $module_values['id_plugin'] = $created_plugin_id; $module_values['macros'] = '{"1":{"macro":"_field1_","desc":"Agents files folder path","help":"","value":"/usr/share/pandora_server/util/plugin/demodata_agents","hide":""},"2":{"macro":"_field2_","desc":"Number of agents","help":"","value":"'.$total_agents_to_create.'","hide":""},"3":{"macro":"_field3_","desc":"Traps target IP","help":"","value":"'.$traps_target_ip.'","hide":""},"4":{"macro":"_field4_","desc":"Traps community","help":"","value":"'.$traps_community.'","hide":""},"5":{"macro":"_field5_","desc":"Tentacle target IP","help":"","value":"'.$tentacle_target_ip.'","hide":""},"6":{"macro":"_field6_","desc":"Tentacle port","help":"","value":"'.$tentacle_port.'","hide":""},"7":{"macro":"_field7_","desc":"Tentacle extra options","help":"","value":"'.$tentacle_extra_options.'","hide":""}}'; $id_plugin_module = modules_create_agent_module( $plugin_agent_id, io_safe_input('Pandora demo data'), $module_values ); if ($id_plugin_module > 0) { // Register created item in tdemo_data. $values = [ 'item_id' => $id_plugin_module, 'table_name' => 'tagente_modulo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo item creation if could not be registered in tdemo_data. db_process_sql_delete('tagente_modulo', ['id_agente_modulo' => $id_plugin_module]); } } } } } else { register_error( DEMO_PLUGIN, __('Error in plugin creation: the plugin could not be registered. Skipping creation of plugin module') ); } } update_item_checked(DEMO_PLUGIN); $demo_agents_count = db_get_value('count(*)', 'tdemo_data', 'table_name', 'tagente'); echo json_encode(['agents_count' => $demo_agents_count]); return; } if ($action === 'cleanup_demo_data') { config_update_value('demo_data_load_progress', 0); $demo_items = db_get_all_rows_in_table('tdemo_data'); $module_items = array_filter( $demo_items, function ($item) { return ($item['table_name'] === 'tagente_modulo'); } ); $inventory_module_items = array_filter( $demo_items, function ($item) { return ($item['table_name'] === 'tagent_module_inventory'); } ); $items_delete_id_buffer = []; foreach ($inventory_module_items as $item) { $items_delete_id_buffer[] = $item['item_id']; } $in_clause = implode(',', $items_delete_id_buffer); // Delete from tagente_datos_inventory. db_process_sql('DELETE FROM tagente_datos_inventory where id_agent_module_inventory IN ('.$in_clause.')'); $items_delete_id_buffer = []; foreach ($module_items as $item) { $items_delete_id_buffer[] = $item['item_id']; } $in_clause = implode(',', $items_delete_id_buffer); // Delete from tagente_datos. db_process_sql('DELETE FROM tagente_datos where id_agente_modulo IN ('.$in_clause.')'); $items_delete_id_buffer = []; $table_id_field_dict = [ 'tconfig_os' => 'id_os', 'tagente' => 'id_agente', 'tgrupo' => 'id_grupo', 'tagente_modulo' => 'id_agente_modulo', 'tmodule_inventory' => 'id_module_inventory', 'tagent_module_inventory' => 'id_agent_module_inventory', 'tgraph' => 'id_graph', 'tmap' => 'id', 'treport' => 'id_report', 'treport_content' => 'id_rc', 'treport_content_sla_combined' => 'id', 'tservice' => 'id', 'tservice_element' => 'id', 'ttrap' => 'id_trap', 'titem' => 'id', 'tgraph_source' => 'id_gs', 'twidget_dashboard' => 'id', 'tdashboard' => 'id', 'tlayout' => 'id', 'tlayout_data' => 'id', 'tagente_estado' => 'id_agente_estado', 'trel_item' => 'id', 'tplugin' => 'id', 'tgis_data_status' => 'tagente_id_agente', 'tgis_map' => 'id_tgis_map', 'tgis_map_layer' => 'id_tmap_layer', ]; foreach ($demo_items as $item) { $items_delete_id_buffer[$item['table_name']][] = $item['item_id']; } foreach ($items_delete_id_buffer as $table_name => $ids_array) { $all_success = true; $in_clause = implode(',', $ids_array); $table_id_field = $table_id_field_dict[$table_name]; $all_success = db_process_sql('DELETE FROM '.$table_name.' WHERE '.$table_id_field.' IN ('.$in_clause.')'); if ($all_success !== false) { // Delete tdemo_data registers if there were no errors when deleting the environment demo items. db_process_sql('DELETE FROM tdemo_data WHERE table_name="'.$table_name.'" AND item_id IN ('.$in_clause.')'); } } echo 1; return; } if ($action === 'get_progress_bar') { $operation = (string) get_parameter('operation'); if ($operation === 'create') { $current_progress_val = db_get_value_filter('value', 'tconfig', ['token' => 'demo_data_load_progress']); $demo_data_load_status = db_get_value_filter('value', 'tconfig', ['token' => 'demo_data_load_status']); if ($current_progress_val === false) { $current_progress_val = 0; } $ret = [ 'current_progress_val' => $current_progress_val, 'demo_data_load_status' => json_decode(io_safe_output($demo_data_load_status), true), ]; } else if ($operation === 'cleanup') { $demo_items_to_cleanup = (int) get_parameter('demo_items_to_cleanup'); $count_current_demo_items = db_get_value('count(*)', 'tdemo_data'); $current_progress_val = ((($demo_items_to_cleanup - $count_current_demo_items) * 100) / $demo_items_to_cleanup); config_update_value('demo_data_delete_progress', $current_progress_val); $ret = ['current_progress_val' => $current_progress_val]; } echo json_encode($ret); return; } /** * AUXILIARY FUNCTION: Calculate and return next host address within subnet given a CIDR-formatted address. * * @param string $ip CIDR IP address. * * @return string Next host address. */ function calculateNextHostAddress($ip) { list($network, $subnet) = explode('/', $ip); // Convert the network address to an array of octets. $octets = explode('.', $network); // Convert the last octet to an integer. $lastOctet = (int) $octets[3]; // Increment the last octet, and wrap around if it exceeds 255. $lastOctet = (($lastOctet + 1) % 256); // Assemble the next host address. $nextHost = implode('.', [$octets[0], $octets[1], $octets[2], $lastOctet]); return $nextHost.'/'.$subnet; } /** * AUXILIARY FUNCTION: Try to return the group ID of a group given its name or create * and return its ID if it does not exist. * * @param string $name Group name. * * @return mixed group ID or false if group not found and could not be created. */ function get_group_or_create_demo_group($name) { if (is_string($name) === false) { return false; } $id_group = db_get_value('id_grupo', 'tgrupo', 'nombre', io_safe_input($name)); if ($id_group > 0) { return $id_group; } else { $id_group = groups_create_group( io_safe_input($name), [ 'icon' => 'applications.png', 'description' => '', 'contact' => '', 'other' => '', ] ); if ($id_group > 0) { // Register created group in tdemo_data. $values = [ 'item_id' => $id_group, 'table_name' => 'tgrupo', ]; $result = (bool) db_process_sql_insert('tdemo_data', $values); if ($result === false) { // Rollback demo group creation if could not be registered in tdemo_data. db_process_sql_delete('tgrupo', ['id_grupo' => $id_group]); return false; } return $id_group; } else { // Network map group could not be created. Skip creation of map. return false; } } } /** * AUXILIARY FUNCTION: Generate and return a randomly generated MAC address. * * @return string Random MAC address string. */ function generateRandomMacAddress() { $macAddress = []; // Generate the remaining five octets. for ($i = 0; $i < 6; $i++) { $macAddress[] = str_pad(dechex(mt_rand(0, 255)), 2, '0', STR_PAD_LEFT); } // Join the octets with colons to form the MAC address. $randomMacAddress = implode(':', $macAddress); return $randomMacAddress; } /** * AUXILIARY FUNCTION: Update percentage progress. * * @param integer $total_items_count Global number of items to be created. * @param integer $total_type_items_count Number of items of a specific type to be created. * @param integer $created_num Number of items added to progress computation. * * @return void */ function update_progress($total_items_count, $total_type_items_count, $created_num=1) { // Calculate progress. $percentage_inc = (($created_num * 100) / ($total_type_items_count * $total_items_count)); $current_progress_val = db_get_value_filter( 'value', 'tconfig', ['token' => 'demo_data_load_progress'], 'AND', false, false ); if ($current_progress_val === false) { $current_progress_val = 0; } $new_val = ($current_progress_val + $percentage_inc); if ((int) round($new_val) === 100) { $new_val = 100; } config_update_value('demo_data_load_progress', $new_val); } /** * AUXILIARY FUNCTION: Mark item as checked in the load process. * * @param integer $item_id Item id. * * @return void */ function update_item_checked($item_id) { $current_load_status_data = db_get_value_filter( 'value', 'tconfig', ['token' => 'demo_data_load_status'], 'AND', false, false ); if ($current_load_status_data === false || $current_load_status_data === '{}') { $current_load_data_arr = []; } else { $current_load_data_arr = json_decode(io_safe_output($current_load_status_data), true); } $current_load_data_arr['checked_items'][] = $item_id; config_update_value('demo_data_load_status', json_encode($current_load_data_arr)); } /** * AUXILIARY FUNCTION: Register error in database config info. * * @param integer $item_id Item id. * @param string $error_msg Error text. * @param boolean $search_for_repeated_msgs Increases the count of messages already stored if true. * * @return void */ function register_error( $item_id, $error_msg, $search_for_repeated_msgs=false ) { $current_load_status_data = db_get_value_filter( 'value', 'tconfig', ['token' => 'demo_data_load_status'], 'AND', false, false ); if ($current_load_status_data === false || $current_load_status_data === '{}') { $current_load_data_arr = []; } else { $current_load_data_arr = json_decode(io_safe_output($current_load_status_data), true); } if ($search_for_repeated_msgs === true && isset($current_load_data_arr['errors'][$item_id]) === true) { $matching_string = null; $msg_key = array_search($error_msg, $current_load_data_arr['errors'][$item_id]); if ($msg_key === false) { foreach ($current_load_data_arr['errors'][$item_id] as $key => $string) { // Use regular expression to check if the part after "(...) " matches the error string. if (preg_match('/\s*\((.*?)\)\s*(.*)/', $string, $matches)) { $rest_of_string = $matches[2]; if ($rest_of_string === $error_msg) { $matching_string = $string; $msg_key = $key; break; } } } if ($matching_string === null) { // String not found. $current_load_data_arr['errors'][$item_id][] = $error_msg; } else { // Count parentheses string was found, then replace number. $new_error_msg = preg_replace_callback( '/\((\d+)\)/', function ($matches) { $currentNumber = $matches[1]; $newNumber = ($currentNumber + 1); return "($newNumber)"; }, $matching_string ); $current_load_data_arr['errors'][$item_id][$msg_key] = $new_error_msg; } } else { // String without count found. $new_error_msg = '(2) '.$error_msg; $current_load_data_arr['errors'][$item_id][$msg_key] = $new_error_msg; } } else { $current_load_data_arr['errors'][$item_id][] = $error_msg; } config_update_value('demo_data_load_status', json_encode($current_load_data_arr)); }