[ * operstatus * adminstatus * ] * * @var array */ private $interfacesData; /** * X64 Interfaces * * @var boolean */ private $interfacesx64; /** * Protocol * * @var string */ private $protocol; /** * WMI Command * * @var string */ private $wmiCommand; /** * Results for SNMP or WMI queries * * @var mixed */ private $moduleBlocks; /** * Extra arguments for SNMP call. * * @var string */ private $extraArguments = ''; /** * Binary of wmic. * * @var string */ private $wmiBinary = ''; /** * Constructor * * @param string $ajax_controller Path. */ public function __construct(string $ajax_controller) { global $config; // Check access. check_login(); if ((bool) check_acl($config['id_user'], 0, 'AR') === false) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access event viewer' ); if (is_ajax() === true) { echo json_encode(['error' => 'noaccess']); } include 'general/noaccess.php'; exit; } // Capture all parameters before start. $this->ajaxController = $ajax_controller; $this->wizardSection = get_parameter('wizard_section', 'snmp_explorer'); $this->idAgent = get_parameter('id_agente', ''); $this->idPolicy = get_parameter('id', ''); $this->targetIp = get_parameter('targetIp', ''); $this->wmiBinary = $config['wmiBinary']; if (empty($this->idAgent) === false) { $array_aux = db_get_all_rows_sql( sprintf( 'SELECT ip FROM taddress ta INNER JOIN taddress_agent taa ON taa.id_a = ta.id_a WHERE taa.id_agent = %d', $this->idAgent ) ); if (!empty($array_aux)) { $this->datalist = []; foreach ($array_aux as $key => $value) { $this->datalist[] = $value['ip']; } } if (empty($this->datalist) === false && count($this->datalist) === 1 && $this->targetIp === '') { $this->targetIp = $this->datalist[0]; } } $this->server = (int) get_parameter('server', '1'); if ($this->server !== 0) { $this->serverType = (int) db_get_value( 'server_type', 'tserver', 'id_server', $this->server ); } // Capture the parameters. $this->protocol = get_parameter('protocol'); $this->targetPort = get_parameter('targetPort', '161'); if ($this->protocol === 'snmp') { $this->community = get_parameter('community', 'public'); $this->version = get_parameter('version', '1'); // Only for SNMPv3. Catch only if is neccesary. if ($this->version === '3') { $this->authUserV3 = get_parameter( 'authUserV3', '' ); $this->authPassV3 = get_parameter( 'authPassV3', '' ); $this->authMethodV3 = get_parameter( 'authMethodV3', '' ); $this->securityLevelV3 = get_parameter('securityLevelV3', ''); $this->privacyMethodV3 = get_parameter('privacyMethodV3', ''); $this->privacyPassV3 = get_parameter('privacyPassV3', ''); } } else if ($this->protocol === 'wmi') { $this->namespaceWMI = get_parameter('namespaceWMI', ''); $this->usernameWMI = get_parameter('usernameWMI', ''); $this->passwordWMI = get_parameter('passwordWMI', ''); } // Set baseUrl for use it in several locations in this class. if (empty($this->idPolicy) === true) { $this->baseUrl = ui_get_full_url( 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=agent_wizard&id_agente='.$this->idAgent ); } else { if (is_metaconsole() === true) { $this->baseUrl = ui_get_full_url( 'index.php?sec=gmodules&sec2=advanced/policymanager&tab=agent_wizard&id='.$this->idPolicy ); } else { $this->baseUrl = ui_get_full_url( 'index.php?sec=gmodules&sec2=enterprise/godmode/policies/policies&tab=agent_wizard&id='.$this->idPolicy ); } } $this->sectionUrl = $this->baseUrl.'&wizard_section='.$this->wizardSection; $this->message['type'] = []; $this->message['message'] = []; $this->showMessage = false; return $this; } /** * Run main page. * * @return void */ public function run() { // CSS. ui_require_css_file('wizard'); ui_require_css_file('discovery'); // Javascript. $createModules = (bool) get_parameter('create-modules-action', false); if ($createModules === true) { $this->processModules(); } else { if ($this->protocol === 'snmp') { $this->performSNMP(); } else if ($this->protocol === 'wmi') { $this->performWMI(); } } // Load main form. $this->loadMainForm(); // Generate the box that allow messages // (and show messages if needed). $this->showMessage(); if ($this->showMessage === false) { if ($createModules === false) { // Show results if we perform any action. if (empty($this->protocol) === false) { if ($this->wizardSection === 'snmp_interfaces_explorer') { if (empty($this->interfacesFound) === false) { $this->resultsInterfaceWizard(); } } else { $this->moduleBlocks = $this->getModuleBlocks(); if ($this->moduleBlocks === false) { $this->message['type'][] = 'info'; $this->message['message'][] = __( 'There are not defined Remote components for this performance.' ); $this->showMessage(); } else { if ($this->wizardSection === 'snmp_explorer') { $this->resultsSNMPExplorerWizard(); } else if ($this->wizardSection === 'wmi_explorer') { $this->resultsWMIExplorerWizard(); } } } } } } // Lodaing div. echo '
'; // Modal Div. echo ''; echo ''; // Load integrated JS. $this->loadJS(); } /** * Generate the message if needed * * @return void */ private function showMessage() { if (empty($this->message['type']) === false) { $message_error = ''; $message_success = ''; foreach ($this->message['type'] as $keyMsg => $typeError) { switch ($typeError) { case 'error': $message_error .= ($this->message['message'][$keyMsg] ?? 'Unknown error. Please, review the logs.'); $message_error .= '

'; break; case 'success': $message_success .= ($this->message['message'][$keyMsg] ?? 'The action has did successfull'); $message_success .= '

'; break; case 'warning': echo ui_print_warning_message( $this->message['message'][$keyMsg] ); break; case 'info': echo ui_print_info_message( $this->message['message'][$keyMsg] ); break; default: // Nothing to do. break; } } if (empty($message_error) === false) { echo ui_print_error_message($message_error); } if (empty($message_success) === false) { echo ui_print_success_message($message_success); } $this->showMessage = true; } // Clear the message info. $this->message['type'] = []; $this->message['message'] = []; } /** * Common Main Wizard form * * @return void */ private function loadMainForm() { // Fill with servers to perform the discover. $fieldsServers = []; $fieldsServers[0] = __('Local console'); if (enterprise_installed()) { enterprise_include_once('include/functions_satellite.php'); // Get the servers. $rows = get_proxy_servers(); // Generate a list with allowed servers. if (isset($rows) === true && is_array($rows) === true) { foreach ($rows as $row) { if ($row['server_type'] == 13) { $id_satellite = $row['id_server']; $serverType = ' (Satellite)'; } else { $serverType = ' (Standard)'; } $fieldsServers[$row['id_server']] = $row['name'].$serverType; } } } // Set the labels and types. switch ($this->wizardSection) { case 'snmp_explorer': case 'snmp_interfaces_explorer': $this->actionType = 'snmp'; $this->actionLabel = __('SNMP Walk'); break; case 'wmi_explorer': $this->actionType = 'wmi'; $this->actionLabel = __('WMI Explorer'); break; default: // Something goes wrong. exit; } // Main form. $this->sectionUrl = $this->baseUrl.'&wizard_section='.$this->wizardSection; $form = [ 'action' => $this->sectionUrl, 'id' => 'form-main-wizard', 'method' => 'POST', ]; // Inputs. $inputs = []; $inputs[] = [ 'id' => 'protocol', 'arguments' => [ 'name' => 'protocol', 'type' => 'hidden', 'value' => $this->actionType, 'return' => true, ], ]; if (!empty($this->datalist)) { $inputs[] = [ 'id' => 'li_address_list', 'arguments' => [ 'name' => 'address_list', 'type' => 'datalist', 'value' => $this->datalist, 'return' => true, ], ]; } $inputs[] = [ 'label' => __('Target IP'), 'id' => 'txt-targetIp', 'arguments' => [ 'name' => 'targetIp', 'input_class' => 'flex-row', 'type' => 'text', 'class' => '', 'value' => $this->targetIp, 'return' => true, 'list' => 'address_list', ], ]; if ($this->actionType === 'snmp') { $inputs[] = [ 'label' => __('Port'), 'id' => 'txt-targetPort', 'arguments' => [ 'name' => 'targetPort', 'input_class' => 'flex-row', 'type' => 'text', 'size' => '20', 'class' => '', 'value' => $this->targetPort, 'return' => true, ], ]; } if ($this->actionType === 'wmi') { $inputs[] = [ 'label' => __('namespace'), 'id' => 'txt-namespaceWMI', 'arguments' => [ 'name' => 'namespaceWMI', 'input_class' => 'flex-row', 'type' => 'text', 'class' => '', 'value' => $this->namespaceWMI, 'return' => true, ], ]; $inputs[] = [ 'label' => __('Username'), 'id' => 'txt-usernameWMI', 'arguments' => [ 'name' => 'usernameWMI', 'input_class' => 'flex-row', 'type' => 'text', 'class' => '', 'value' => $this->usernameWMI, 'return' => true, ], ]; $inputs[] = [ 'label' => __('Password'), 'id' => 'txt-passwordWMI', 'arguments' => [ 'name' => 'passwordWMI', 'input_class' => 'flex-row', 'type' => 'password', 'class' => '', 'value' => $this->passwordWMI, 'return' => true, ], ]; } $hint_server = ' '; $hint_server .= ui_print_help_icon('agent_snmp_explorer_tab', true); $inputs[] = [ 'label' => __('Server to execute command').$hint_server, 'id' => 'slc-server', 'arguments' => [ 'name' => 'server', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $fieldsServers, 'class' => '', 'selected' => $this->server, 'return' => true, 'sort' => false, ], ]; if ($this->actionType === 'snmp') { $inputs[] = [ 'label' => __('SNMP community'), 'id' => 'txt-community', 'arguments' => [ 'name' => 'community', 'input_class' => 'flex-row', 'type' => 'text', 'size' => '20', 'class' => '', 'value' => $this->community, 'return' => true, ], ]; // Fill with SNMP versions allowed. $fieldsVersions = [ '1' => '1', '2' => '2', '2c' => '2c', '3' => '3', ]; $inputs[] = [ 'label' => __('SNMP version'), 'id' => 'txt-version', 'arguments' => [ 'name' => 'version', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $fieldsVersions, 'script' => 'showV3Form();', 'class' => '', 'selected' => $this->version, 'return' => true, ], ]; } $inputs[] = [ 'arguments' => [ 'label' => $this->actionLabel, 'name' => 'sub-protocol', 'type' => 'submit', 'attributes' => 'class="sub next" onclick="$(\'#form-main-wizard\').submit();"', 'return' => true, ], ]; // Prints main form. html_print_div( [ 'class' => 'white_box', 'content' => $this->printForm( [ 'form' => $form, 'inputs' => $inputs, 'rawInputs' => '', ], true ), ] ); } /** * This form appears when activate SNMP v3 * * @return mixed */ public function snmpAuthenticationForm() { // Privacy method. $privacyMethod = [ 'AES' => 'AES', 'DES' => 'DES', ]; // Authentication method. $authenticationMethod = [ 'MD5' => 'MD5', 'SHA' => 'SHA', ]; // Security level. $securityLevel = [ 'authNoPriv' => 'Authenticated and non-private method', 'authPriv' => 'Authenticated and private method', 'noAuthNoPriv' => 'Non-authenticated and non-private method', ]; // Main form. $form = [ 'action' => '', 'id' => 'form-snmp-authentication', 'method' => 'POST', ]; // Inputs. $inputs = []; $inputs[] = [ 'label' => __('Security level'), 'id' => 'slc-securityLevelV3', 'arguments' => [ 'name' => 'securityLevelV3', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $securityLevel, 'class' => '', 'script' => 'showSecurityLevelForm();', 'selected' => $this->securityLevelV3, 'return' => true, ], ]; $inputs[] = [ 'label' => __('User authentication'), 'id' => 'txt-authUserV3', 'arguments' => [ 'name' => 'authUserV3', 'input_class' => 'flex-row', 'type' => 'text', 'size' => '20', 'class' => '', 'value' => $this->authUserV3, 'return' => true, 'form' => 'form-main-wizard', ], ]; $inputs[] = [ 'label' => __('Authentication method'), 'id' => 'txt-authMethodV3', 'arguments' => [ 'name' => 'authMethodV3', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $authenticationMethod, 'class' => '', 'selected' => $this->authMethodV3, 'return' => true, ], ]; $inputs[] = [ 'label' => __('Password authentication'), 'id' => 'txt-authPassV3', 'arguments' => [ 'name' => 'authPassV3', 'input_class' => 'flex-row', 'type' => 'password', 'size' => '20', 'class' => '', 'value' => $this->authPassV3, 'return' => true, 'form' => 'form-main-wizard', ], ]; $inputs[] = [ 'label' => __('Privacy method'), 'id' => 'txt-privacyMethodV3', 'arguments' => [ 'name' => 'privacyMethodV3', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $privacyMethod, 'class' => '', 'selected' => $this->privacyMethodV3, 'return' => true, ], ]; $inputs[] = [ 'label' => __('Privacy pass'), 'id' => 'txt-privacyPassV3', 'arguments' => [ 'name' => 'privacyPassV3', 'type' => 'password', 'size' => '20', 'class' => '', 'value' => $this->privacyPassV3, 'return' => true, 'form' => 'form-main-wizard', ], ]; // Output the form. return html_print_div( [ 'id' => 'form-snmp-authentication-box', 'class' => 'invisible', 'style' => 'margin-top: 10px;', 'content' => $this->printForm( [ 'form' => $form, 'inputs' => $inputs, ], true ), ], true ); } /** * Perform a Interfaces SNMP Walk * * @param array $receivedOid Array with the raw oid info. * * @return void */ public function performSNMPInterfaces($receivedOid) { // Path for get the IPs (ipv4). $snmpIpDiscover = '.1.3.6.1.2.1.4.34.1.4.1.4'; $snmpIpIndexes = '.1.3.6.1.2.1.4.34.1.3.1.4'; $ipsResult = []; // In this case we need the full information provided by snmpwalk. $ipsResult = $this->snmpWalkValues($snmpIpDiscover, false, true); $indexes = $this->snmpWalkValues($snmpIpIndexes, false, true); $unicastIpReferences = []; foreach ($indexes as $k => $v) { $key = str_replace($snmpIpIndexes.'.', '', $k); // Only catch the unicast records. if ((preg_match('/unicast/', $ipsResult[$snmpIpDiscover.'.'.$key]) === 1)) { $value = explode(': ', $v)[1]; $unicastIpReferences[$value] = $key; } } // Create a list with the interfaces. $interfaces = []; foreach ($receivedOid as $indexKey => $name) { if ($indexKey[0] === '.') { $indexKey = substr($indexKey, 1, strlen($indexKey)); } // Set the name of interface. $interfaces[$indexKey]['name'] = $name; // Get the description. $interfaces[$indexKey]['descr'] = $this->snmpGetValue( '.1.3.6.1.2.1.2.2.1.2.'.$indexKey ); // Get the MAC address. $interfaces[$indexKey]['mac'] = $this->snmpGetValue( '.1.3.6.1.2.1.2.2.1.6.'.$indexKey ); // Get unicast IP address. $interfaces[$indexKey]['ip'] = ''; if (isset($unicastIpReferences[$indexKey]) === true) { $interfaces[$indexKey]['ip'] = ''; } // Get interface alias. $interfaces[$indexKey]['alias'] = $this->snmpGetValue( '.1.3.6.1.2.1.31.1.1.1.18.'.$indexKey ); // Get interface speed. $interfaces[$indexKey]['speed'] = $this->snmpGetValue( '.1.3.6.1.2.1.2.2.1.5.'.$indexKey ); } // Save the interfaces found for process later. $this->interfacesFound = $interfaces; } /** * Perform a General SNMP Walk * * @param array $receivedOid Array with the raw oid info. * * @return void */ public function performSNMPGeneral($receivedOid) { // Getting the Symbolic Name of the OID. if (is_array($receivedOid) === false) { // No PEN. return; } // The PEN is hosted in the seventh position. $tmpPEN = explode('.', array_shift($receivedOid)); $pen = $tmpPEN[7]; // Then look in DB if the PEN is registered. $penFound = db_get_value('manufacturer', 'tpen', 'pen', $pen); if ($penFound === false) { // This PEN is not registered. Let's finish. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'The PEN (%s) is not registered.', $pen ); return; } else { // Save the PEN for process later. $this->penName = $penFound; } } /** * Let's do a SNMP Walk * * @return void */ public function performSNMP() { // If the target IP is empty, get it form the agent. if (empty($this->targetIp) === true) { $this->targetIp = db_get_value( 'direccion', 'tagente', 'id_agente', $this->idAgent ); } if ($this->wizardSection === 'snmp_interfaces_explorer') { // Check if thereis x64 counters. $snmp_tmp = '.1.3.6.1.2.1.31.1.1.1.6'; $check_x64 = $this->snmpWalkValues( $snmp_tmp, false, true ); if ($check_x64) { $this->interfacesx64 = true; $oidExplore = '.1.3.6.1.2.1.31.1.1.1.1'; } else { $this->interfacesx64 = false; $oidExplore = '.1.3.6.1.2.1.2.2.1.2'; } } else { // Get the device PEN. $oidExplore = '.1.3.6.1.2.1.1.2.0'; } // Explore general or interfaces. $receivedOid = $this->snmpWalkValues( $oidExplore, false, false ); // The snmpwalk return information. if (empty($receivedOid) === false) { if ($this->wizardSection === 'snmp_interfaces_explorer') { $this->performSNMPInterfaces($receivedOid); } else { $this->performSNMPGeneral($receivedOid); } } else { // If the snmpwalk returns nothing, finish the execution. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'The SNMP Walk does not return anything with the received arguments.' ); } } /** * Let's do a WMI Exploration * * @return void */ public function performWMI() { // DOC: Handling WMI Errors --> // https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-error-constants // Capture the parameters. // Call WMI Explorer function. $this->wmiCommand = wmi_compose_query( $this->wmiBinary, $this->usernameWMI, $this->passwordWMI, $this->targetIp, $this->namespaceWMI ); // Send basic query to target for check if // the host is Windows (and allow WMI). $commandQuery = $this->wmiCommand; $commandQuery .= ' "SELECT Caption FROM Win32_ComputerSystem"'; // Declare the vars. $result = []; $returnVar = 0; $tmpError = ''; $execCorrect = true; // Execute the command. exec($commandQuery, $result, $returnVar); // Only is valid if return code is 0. if ($returnVar === 0) { // Look for the response if we have ERROR messages. foreach ($result as $info) { if (preg_match('/ERROR:/', $info) !== 0) { $execCorrect = false; $tmpError = strrchr($info, 'ERROR:'); break; } } } else { $tmpError = sprintf('Return Code %s', $returnVar); $execCorrect = false; } // FOUND ERRORS: TIMEOUT. // [0] => [librpc/rpc/dcerpc_connect.c:790:dcerpc_pipe_connect_b_recv()] // failed NT status (c00000b5) in dcerpc_pipe_connect_b_recv. // [1] => [wmi/wmic.c:196:main()] ERROR: Login to remote object. // If execution gone fine. if ($execCorrect === true) { $this->moduleBlocks = $this->getModuleBlocks(); } else { $this->message['type'][] = 'error'; $this->message['message'][] = sprintf( __('The target host response with an error: %s'), $tmpError ); } } /** * Show list with info modules at create. * * @return void */ public function listModulesToCreate() { $data = get_parameter('data', ''); $data = json_decode(io_safe_output($data), true); $candidateModules = $this->candidateModuleToCreate($data); $this->sectionUrl = $this->baseUrl.'&wizard_section='.$this->wizardSection; $form = [ 'action' => $this->sectionUrl, 'id' => 'reviewed-modules', 'method' => 'POST', 'class' => '', 'extra' => '', ]; $inputs = [ [ 'arguments' => [ 'type' => 'hidden', 'value' => htmlspecialchars(json_encode($candidateModules)), 'return' => true, 'name' => 'modules-definition', ], ], ]; $inputs = array_merge($inputs, $this->getCommonDataInputs()); $content = HTML::printForm( [ 'form' => $form, 'inputs' => $inputs, ], true ); if (empty($candidateModules) === true) { echo ui_print_error_message(__('No selected modules')); return; } $table = new StdClass(); $table->data = []; $table->width = '100%'; $table->class = 'info_table'; // Header section. $table->head = []; $table->head[0] = ''.__('Module Name').''; $table->head[1] = ''.__('Server').''; $table->head[2] = ''.__('Type').''; $table->head[3] = ''.__('Description').''; $table->head[4] = ''.__('Threshold').''; $table->data = []; $namesArray = []; $data = []; $i = 0; foreach ($candidateModules as $key => $module) { if (isset($namesArray[$module['name']]) === false) { $namesArray[$module['name']] = $module['name']; if (empty($this->idPolicy) === false) { $sql = sprintf( "SELECT id FROM tpolicy_modules WHERE id_policy = %d AND `name` = '%s'", $this->idPolicy, io_safe_input($module['name']) ); $msgError = __('Module exists in policy'); } else { $sql = sprintf( "SELECT id_agente_modulo FROM tagente_modulo WHERE id_agente = %d AND nombre = '%s'", $this->idAgent, io_safe_input($module['name']) ); $msgError = __('Module exists in agent'); } $existInDb = db_get_value_sql($sql); } else { $existInDb = true; $msgError = __( 'Module with the same name in the module creation list' ); } $data[0] = $module['name']; if ($existInDb !== false) { $table->rowstyle[$i] = 'color:#ccc;'; $data[0] .= ' '; $data[0] .= html_print_image( 'images/error.png', true, ['title' => $msgError] ); } if ($this->server !== 0) { $this->serverType = (int) db_get_value( 'server_type', 'tserver', 'id_server', $this->server ); } // Img Server. if ($this->serverType == SERVER_TYPE_ENTERPRISE_SATELLITE) { $img_server = html_print_image( 'images/satellite.png', true, [ 'title' => __('Enterprise Satellite server'), 'class' => 'invert_filter', ] ); } else { if ($module['execution_type'] == EXECUTION_TYPE_PLUGIN) { $img_server = html_print_image( 'images/plugin.png', true, [ 'title' => __('Plugin server'), 'class' => 'invert_filter', ] ); } else { if ($this->protocol === 'wmi') { $img_server = html_print_image( 'images/wmi.png', true, [ 'title' => __('WMI server'), 'class' => 'invert_filter', ] ); } else { $img_server = html_print_image( 'images/op_network.png', true, [ 'title' => __('Network server'), 'class' => 'invert_filter', ] ); } } } $data[1] = $img_server; $data[2] = \ui_print_moduletype_icon($module['moduleType'], true); $data[3] = mb_strimwidth( io_safe_output($module['description']), 0, 150, '...' ); $data[4] = __('Warning').' '; $data[4] .= $module['warningMin'].' / '.$module['warningMax']; $data[4] .= '
'; $data[4] .= __('Critical').' '; $data[4] .= $module['criticalMin'].' / '.$module['criticalMax']; array_push($table->data, $data); $i++; } $content .= html_print_table($table, true); echo $content; } /** * Prepare data module to create. * * @param array $data Array Info module. * * @return array */ public function candidateModuleToCreate(array $data): array { $modulesActivated = []; $generalInterface = false; // Lets catch all values. foreach ($data as $key => $value) { if (empty(preg_match('/module-active-(.*)/m', $key, $tmpModules)) === false && (int) $value === 1 ) { $keyData = $tmpModules[1]; $modulesActivated[] = $keyData; } else if (empty(preg_match('/interfaz_select_/', $key)) === false) { $tmpInterfaces = explode('interfaz_select_', $key); $interfaces[$tmpInterfaces[1]] = $tmpInterfaces[1]; } else if (empty(preg_match('/box_enable_toggle/', $key)) === false) { $generalInterface = true; } else { if (property_exists($this, $key) === true) { // Reinitialize received values. $this->{$key} = $value; } } } $this->wizardSection = $data['wizard_section']; $result = []; // Only section snmp interfaces explorer. if ($data['wizard_section'] === 'snmp_interfaces_explorer') { if (isset($interfaces) === true && is_array($interfaces) === true && empty($interfaces) === false && isset($modulesActivated) === true && is_array($modulesActivated) === true && empty($modulesActivated) === false ) { foreach ($interfaces as $key => $value) { $valueStr = preg_replace('/\//', '\/', $value); foreach ($modulesActivated as $k => $v) { if (preg_match('/^'.$valueStr.'_\d+-\d+$/', $v) == true) { $tmp[$v] = $v; } else if ($generalInterface === true && preg_match('/^0_\d+-\d+$/', $v) == true ) { $id = preg_replace( '/^0_/', $value.'_', $v ); $tmp[$id] = $id; } } } } else { return $result; } $modulesActivated = $tmp; } /* * Before changing anything inside those loops take in mind, if you * change the module definition at interface level, those are the * values wich will be applied to final module. * * There is no 'parse first default then specific' or similar. * * $modulesActivated has the modules to be created with the information * retrieved from those specific modules. * * Only inherites from 'default' if you made no changes on module * definition (at javascript level before calling this function). */ foreach ($modulesActivated as $key => $value) { foreach (array_keys($data) as $k) { if (isset($data[$k]) === false || $data[$k] === '') { continue; } $valueStr = preg_replace('/\//', '\/', $value); if (empty(preg_match('/-'.$valueStr.'$/', $k)) === false || empty(preg_match('/-'.$valueStr.'_sent$/', $k)) === false ) { if (empty(preg_match('/module-name-set/', $k)) === false) { $result[$value]['name'] = $data[$k]; } else if (empty(preg_match('/module-description-set/', $k)) === false) { $result[$value]['description'] = $data[$k]; } if ($data['wizard_section'] === 'snmp_interfaces_explorer') { if (isset($data['module-active-'.$key]) === false || (bool) $data['module-active-'.$key] === false ) { if (preg_match('/module-name-set/', $k) > 0) { $result[$value]['name'] = $data['module-default_name-'.$key]; continue; } if (preg_match('/module-description-set/', $k) > 0) { $result[$value]['description'] = $data['module-description-set-'.$key]; continue; } if (preg_match('/module-value/', $k) > 0) { $result[$value]['value'] = $data['module-value-'.$key]; continue; } if (preg_match('/module-macros/', $k) > 0) { $result[$value]['macros'] = $data['module-macros-'.$key]; continue; } if (preg_match('/module-id_plugin/', $k) > 0) { $result[$value]['id_plugin'] = $data['module-id_plugin-'.$key]; continue; } if (preg_match('/module-id_modulo/', $k) > 0) { $result[$value]['id_modulo'] = $data['module-id_modulo-'.$key]; continue; } if (preg_match('/module-unit/', $k) > 0) { $result[$value]['unit'] = $data['module-unit-'.$key]; continue; } if (preg_match('/module-warning-min/', $k) > 0 && '' !== $data['module-warning-min-'.$key] ) { $result[$value]['warningMin'] = $data['module-warning-min-'.$key]; continue; } if (preg_match('/module-warning-max/', $k) > 0 && '' !== $data['module-warning-max-'.$key] ) { $result[$value]['warningMax'] = $data['module-warning-max-'.$key]; continue; } if (preg_match('/module-critical-min/', $k) > 0 && '' !== $data['module-critical-min-'.$key] ) { $result[$value]['criticalMin'] = $data['module-critical-min-'.$key]; continue; } if (preg_match('/module-critical-max/', $k) > 0 && '' !== $data['module-critical-max-'.$key] ) { $result[$value]['criticalMax'] = $data['module-critical-max-'.$key]; continue; } if (preg_match('/module-critical-inv/', $k) > 0 && isset($data['module-critical-inv-'.$key]) === true ) { $result[$value]['criticalInv'] = $data['module-critical-inv-'.$key.'_sent']; continue; } if (preg_match('/module-warning-inv/', $k) > 0 && isset($data['module-warning-inv-'.$key]) === true ) { $result[$value]['warningInv'] = $data['module-warning-inv-'.$key.'_sent']; continue; } if (preg_match('/module-warning-perc/', $k) > 0 && isset($data['module-warning-perc-'.$key]) === true ) { $result[$value]['warningPerc'] = $data['module-warning-perc-'.$key.'_sent']; continue; } if (preg_match('/module-critical-perc/', $k) > 0 && isset($data['module-critical-perc-'.$key]) === true ) { $result[$value]['criticalPerc'] = $data['module-critical-perc-'.$key.'_sent']; continue; } if (preg_match('/^(.*).*?_(\d+)-+(\d+)$/', $k, $matches) > 0) { $k = $matches[1].'_'.$matches[2].'-'.$matches[3]; } } else { if (preg_match('/module-value/', $k) > 0 && empty($data[$k]) === false ) { $result[$value]['value'] = $data[$k]; } } } // Specific customization only if switch is active. if (preg_match('/module-warning-min/', $k) > 0) { $result[$value]['warningMin'] = $data[$k]; } else if (preg_match('/module-warning-max/', $k) > 0) { $result[$value]['warningMax'] = $data[$k]; } else if (preg_match('/module-critical-min/', $k) > 0) { $result[$value]['criticalMin'] = $data[$k]; } else if (preg_match('/module-critical-max/', $k) > 0) { $result[$value]['criticalMax'] = $data[$k]; } else if (preg_match('/module-critical-inv/', $k) > 0) { $result[$value]['criticalInv'] = $data[$k.'_sent']; } else if (preg_match('/module-warning-inv/', $k) > 0) { $result[$value]['warningInv'] = $data[$k.'_sent']; } else if (preg_match('/module-warning-perc/', $k) > 0) { $result[$value]['warningPerc'] = $data[$k.'_sent']; } else if (preg_match('/module-critical-perc/', $k) > 0) { $result[$value]['criticalPerc'] = $data[$k.'_sent']; } else if (preg_match('/module-type/', $k) > 0) { $result[$value]['moduleType'] = $data[$k]; } else if (preg_match('/module-unit/', $k) > 0) { $result[$value]['unit'] = $data[$k]; } else if (preg_match('/module-scan_type/', $k) > 0) { $result[$value]['scan_type'] = (int) $data[$k]; } else if (preg_match('/module-execution_type/', $k) > 0) { $result[$value]['execution_type'] = (int) $data[$k]; } else if (($data['wizard_section'] !== 'snmp_interfaces_explorer') && preg_match('/module-value/', $k) > 0 ) { $result[$value]['value'] = $data[$k]; } else if (preg_match('/module-macros/', $k) > 0) { $result[$value]['macros'] = $data[$k]; } else if (preg_match('/module-name-oid/', $k) > 0) { $result[$value]['nameOid'] = $data[$k]; } else if (preg_match('/module-query_class/', $k) > 0) { $result[$value]['queryClass'] = $data[$k]; } else if (preg_match('/module-query_key_field/', $k) > 0) { $result[$value]['queryKeyField'] = $data[$k]; } else if (preg_match('/module-scan_filters/', $k) > 0) { $result[$value]['scanFilters'] = $data[$k]; } else if (preg_match('/module-query_filters/', $k) > 0) { $result[$value]['queryFilters'] = $data[$k]; } else { $result[$value][$k] = $data[$k]; } } } } return $result; } /** * Process the information received for modules creation * * @return void */ public function processModules() { $modulesCandidates = json_decode( io_safe_output(get_parameter('modules-definition', [])), true ); if (json_last_error() !== JSON_ERROR_NONE) { $this->message['type'][] = 'error'; $this->message['message'][] = json_last_error_msg(); return; } if (empty($this->idPolicy) === false) { $this->processModulesPolicy($modulesCandidates); } else { $this->processModulesAgents($modulesCandidates); } } /** * Process the information received for modules creation in this policy. * * @param array $modulesCandidates Modules for create. * * @return void */ public function processModulesPolicy(array $modulesCandidates) { $errorflag = false; foreach ($modulesCandidates as $candidate) { $sql = sprintf( "SELECT id FROM tpolicy_modules WHERE id_policy = %d AND `name` = '%s'", $this->idPolicy, io_safe_input($candidate['name']) ); $existInDb = db_get_value_sql($sql); if ($existInDb !== false) { $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module "%s" exits in this policy', $candidate['name'] ); $errorflag = true; continue; } $value = []; $values['name'] = io_safe_input($candidate['name']); $values['description'] = io_safe_input($candidate['description']); $values['unit'] = $candidate['unit']; $values['id_tipo_modulo'] = $candidate['moduleType']; $values['id_policy'] = $this->idPolicy; $values['module_interval'] = 300; $nameTypeModule = modules_get_moduletype_name( $candidate['moduleType'] ); if ($this->protocol === 'snmp') { if ($candidate['execution_type'] === 0 || $candidate['execution_type'] === EXECUTION_TYPE_NETWORK ) { if (substr($candidate['value'], 0, 1) !== '.') { $candidate['value'] = '.'.$candidate['value']; } if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $values['id_module'] = MODULE_DATA; $values['module_interval'] = 1; $cf = "module_begin\n"; $cf .= 'module_name '.$candidate['name']."\n"; $cf .= 'module_type '.$nameTypeModule."\n"; $cf .= "module_snmp\n"; $cf .= 'module_version '.$this->version."\n"; $cf .= 'module_oid '.$candidate['value']."\n"; $cf .= 'module_community '.$this->community."\n"; if ($this->version === '3') { $cf .= 'module_seclevel '.$this->securityLevelV3."\n"; $cf .= 'module_secname '.$this->authUserV3."\n"; if ($this->securityLevelV3 === 'authNoPriv' || $this->securityLevelV3 === 'authPriv' ) { $cf .= 'module_authproto '.$this->authMethodV3."\n"; $cf .= 'module_authpass '.$this->authPassV3."\n"; if ($this->securityLevelV3 === 'authPriv') { $cf .= 'module_privproto '.$this->privacyMethodV3."\n"; $cf .= 'module_privpass '.$this->privacyPassV3."\n"; } } } $cf .= 'module_end'; $values['configuration_data'] = io_safe_input($cf); } else { $values['id_module'] = MODULE_NETWORK; } $values['snmp_community'] = $this->community; $values['tcp_send'] = $this->version; $values['snmp_oid'] = $candidate['value']; $values['tcp_port'] = $this->targetPort; if ($this->version === '3') { $values['custom_string_3'] = $this->securityLevelV3; $values['plugin_user'] = $this->authUserV3; if ($this->securityLevelV3 === 'authNoPriv' || $this->securityLevelV3 === 'authPriv' ) { $values['plugin_parameter'] = $this->authMethodV3; $values['plugin_pass'] = $this->authPassV3; if ($this->securityLevelV3 === 'authPriv') { $values['custom_string_1'] = $this->privacyMethodV3; $values['custom_string_2'] = $this->privacyPassV3; } } } } else if ($candidate['execution_type'] === EXECUTION_TYPE_PLUGIN) { $infoMacros = json_decode( base64_decode($candidate['macros']), true ); if (isset($infoMacros['macros']) === false || is_array($infoMacros['macros']) === false ) { $infoMacros['macros'] = []; } if (isset($candidate['nameOid']) === true && empty($candidate['nameOid']) === false ) { $infoMacros['macros']['_nameOID_'] = $candidate['nameOid']; } if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $values['module_interval'] = 1; if (empty($infoMacros['satellite_execution']) === true) { // Already defined. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module %s module_exec not configuration', $candidate['name'] ); $errorflag = true; continue; } $moduleExec = $this->replacementMacrosPlugin( $infoMacros['satellite_execution'], $infoMacros['macros'] ); $values['id_module'] = MODULE_DATA; $cfData = "module_begin\n"; $cfData .= 'module_name '.$candidate['name']."\n"; $cfData .= 'module_type '.$nameTypeModule."\n"; $cfData .= 'module_exec '.io_safe_output($moduleExec)."\n"; $cfData .= 'module_end'; $values['configuration_data'] = io_safe_input($cfData); } else { $values['ip_target'] = '_address_'; $values['id_module'] = MODULE_PLUGIN; $fieldsPlugin = db_get_value_sql( sprintf( 'SELECT macros FROM tplugin WHERE id=%d', (int) $infoMacros['server_plugin'] ) ); if ($this->wizardSection === 'snmp_interfaces_explorer' && empty($candidate['macros']) === false ) { // Use definition provided. $values['id_plugin'] = $candidate['id_plugin']; $values['macros'] = base64_decode($candidate['macros']); } else { $fieldsPlugin = db_get_value_sql( sprintf( 'SELECT macros FROM tplugin WHERE id=%d', (int) $infoMacros['server_plugin'] ) ); if ($fieldsPlugin !== false) { $fieldsPlugin = json_decode($fieldsPlugin, true); $i = 1; foreach ($infoMacros as $key => $value) { if (empty(preg_match('/_snmp_field/', $key)) === false) { $new_macros = []; foreach ($fieldsPlugin as $k => $v) { if ($v['macro'] === preg_replace('/_snmp_field/', '', $key)) { $fieldsPlugin[$k]['value'] = $this->replacementMacrosPlugin( $value, $infoMacros['macros'] ); $i++; continue; } } } } } $values['id_plugin'] = $infoMacros['server_plugin']; $values['macros'] = json_encode($fieldsPlugin); } } } } else if ($this->protocol === 'wmi') { if ($candidate['execution_type'] === EXECUTION_TYPE_NETWORK) { // Generals fields. $values['plugin_user'] = io_safe_input($this->usernameWMI); $values['plugin_pass'] = io_safe_input($this->passwordWMI); $values['tcp_send'] = io_safe_input($this->namespaceWMI); // Build query WMI. $dataWMI = [ 'query_class' => $candidate['queryClass'], 'query_filters' => io_safe_output( base64_decode( $candidate['queryFilters'] ) ), 'macros' => base64_decode( $candidate['macros'] ), 'query_key_field' => $candidate['queryKeyField'], ]; $candidate['wmi_query'] = $this->wmiQuery( $dataWMI, 'execution', true ); $queryFilters = json_decode( base64_decode( $candidate['queryFilters'] ), true ); if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $values['module_interval'] = 1; $values['id_module'] = MODULE_DATA; $cfData = "module_begin\n"; $cfData .= 'module_name '.$candidate['name']."\n"; $cfData .= 'module_type '.$nameTypeModule."\n"; $cfData .= "module_wmi\n"; $cfData .= 'module_wmiquery '.$candidate['wmi_query']."\n"; $cfData .= 'module_wmicolumn '.(isset($queryFilters['field']) === true) ? $queryFilters['field'] : (0)."\n"; $cfData .= 'module_wmiauth '.$this->usernameWMI.'%'.$this->passwordWMI."\n"; $cfData .= 'module_end'; $values['configuration_data'] = io_safe_input($cfData); } else { $values['id_module'] = MODULE_WMI; } $values['snmp_oid'] = io_safe_input( $candidate['wmi_query'] ); $values['tcp_port'] = (isset($queryFilters['field']) === true) ? $queryFilters['field'] : 0; $values['snmp_community'] = (isset($queryFilters['key_string']) === true) ? $queryFilters['key_string'] : ''; } else if ($candidate['execution_type'] === EXECUTION_TYPE_PLUGIN) { $infoMacros = json_decode( base64_decode($candidate['macros']), true ); if (isset($infoMacros['macros']) === false || is_array($infoMacros['macros']) === false ) { $infoMacros['macros'] = []; } if (isset($candidate['queryClass']) === true && empty($candidate['queryClass']) === false ) { $infoMacros['macros']['_class_wmi_'] = $candidate['queryClass']; } if (isset($candidate['queryKeyField']) === true && empty($candidate['queryKeyField']) === false ) { $infoMacros['macros']['_field_wmi_0_'] = $candidate['queryKeyField']; } if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $values['module_interval'] = 1; if (empty($infoMacros['satellite_execution']) === true) { // Already defined. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module %s satellite execution not configuration', $candidate['name'] ); $errorflag = true; continue; } $moduleExec = $this->replacementMacrosPlugin( $infoMacros['satellite_execution'], $infoMacros['macros'] ); $values['id_module'] = MODULE_DATA; $cfData = "module_begin\n"; $cfData .= 'module_name '.$candidate['name']."\n"; $cfData .= 'module_type '.$nameTypeModule."\n"; $cfData .= 'module_exec '.io_safe_output($moduleExec)."\n"; $cfData .= 'module_end'; $values['configuration_data'] = io_safe_input($cfData); } else { $values['id_module'] = MODULE_PLUGIN; $fieldsPlugin = db_get_value_sql( sprintf( 'SELECT macros FROM tplugin WHERE id=%d', (int) $infoMacros['server_plugin'] ) ); if ($fieldsPlugin !== false) { $fieldsPlugin = json_decode($fieldsPlugin, true); $i = 1; foreach ($infoMacros as $key => $value) { if (empty(preg_match('/_wmi_field/', $key)) === false) { $new_macros = []; foreach ($fieldsPlugin as $k => $v) { if ($v['macro'] === preg_replace('/_wmi_field/', '', $key)) { $fieldsPlugin[$k]['value'] = $this->replacementMacrosPlugin( $value, $infoMacros['macros'] ); $i++; continue; } } } } } $values['id_plugin'] = $infoMacros['server_plugin']; $values['macros'] = json_encode($fieldsPlugin); } $values['ip_target'] = '_address_'; $values['snmp_oid'] = io_safe_input( $candidate['wmi_query'] ); } } if (preg_match('/string/', $nameTypeModule) === true) { // String module. $values['str_warning'] = io_safe_input( $candidate['warningMax'] ); $values['str_critical'] = io_safe_input( $candidate['criticalMax'] ); } else { // Numeric module. $values['min_warning'] = $candidate['warningMin']; $values['max_warning'] = $candidate['warningMax']; $values['min_critical'] = $candidate['criticalMin']; $values['max_critical'] = $candidate['criticalMax']; $values['percentage_warning'] = $candidate['warningPerc']; $values['percentage_critical'] = $candidate['criticalPerc']; } $values['warning_inverse'] = $candidate['warningInv']; $values['critical_inverse'] = $candidate['criticalInv']; // Insert modules. $result = policies_create_module( $values['name'], $this->idPolicy, $values['id_module'], $values ); if ($result === false) { $errorflag = true; $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module "%s" problems insert in bbdd', $candidate['name'] ); } } if ($errorflag === false) { $this->message['type'][] = 'success'; $this->message['message'][] = __('Modules created'); } } /** * Process the information received for modules creation in this agent. * * @param array $modulesCandidates Modules for create. * * @return void */ public function processModulesAgents(array $modulesCandidates) { $modules = []; $errorflag = false; foreach ($modulesCandidates as $candidate) { $tmp = Module::search( [ 'nombre' => io_safe_input($candidate['name']), 'id_agente' => $this->idAgent, ], 1 ); if ($tmp !== null) { // Already defined. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module "%s" exists in this agent', $candidate['name'] ); $errorflag = true; continue; } // Not found, it is new. $tmp = new Module(); $tmp->nombre(io_safe_input($candidate['name'])); $tmp->descripcion(io_safe_input($candidate['description'])); $tmp->unit($candidate['unit']); $tmp->id_tipo_modulo($candidate['moduleType']); $tmp->id_agente($this->idAgent); $tmp->module_interval(agents_get_interval($this->idAgent)); if ($this->protocol === 'snmp') { if ($candidate['execution_type'] === 0 || $candidate['execution_type'] === EXECUTION_TYPE_NETWORK ) { if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { if (substr($candidate['value'], 0, 1) !== '.') { $candidate['value'] = '.'.$candidate['value']; } $tmp->module_interval(300); $tmp->id_modulo(MODULE_DATA); $tmp->updateConfigurationData( 'module_name', $candidate['name'] ); $tmp->updateConfigurationData( 'module_type', $tmp->moduleType()->nombre() ); $tmp->updateConfigurationData( 'module_snmp', $this->targetIp ); $tmp->updateConfigurationData( 'module_version', $this->version ); $tmp->updateConfigurationData( 'module_oid', $candidate['value'] ); $tmp->updateConfigurationData( 'module_community', $this->community ); if ($this->version === '3') { $tmp->updateConfigurationData( 'module_seclevel', $this->securityLevelV3 ); $tmp->updateConfigurationData( 'module_secname', $this->authUserV3 ); if ($this->securityLevelV3 === 'authNoPriv' || $this->securityLevelV3 === 'authPriv' ) { $tmp->updateConfigurationData( 'module_authproto', $this->authMethodV3 ); $tmp->updateConfigurationData( 'module_authpass', $this->authPassV3 ); if ($this->securityLevelV3 === 'authPriv') { $tmp->updateConfigurationData( 'module_privproto', $this->privacyMethodV3 ); $tmp->updateConfigurationData( 'module_privpass', $this->privacyPassV3 ); } } } } else { $tmp->id_modulo(MODULE_NETWORK); } $tmp->ip_target($this->targetIp); $tmp->snmp_community($this->community); $tmp->tcp_send($this->version); $tmp->snmp_oid($candidate['value']); $tmp->tcp_port($this->targetPort); if ($this->version === '3') { $tmp->custom_string_3($this->securityLevelV3); $tmp->plugin_user($this->authUserV3); if ($this->securityLevelV3 === 'authNoPriv' || $this->securityLevelV3 === 'authPriv' ) { $tmp->plugin_parameter($this->authMethodV3); $tmp->plugin_pass($this->authPassV3); if ($this->securityLevelV3 === 'authPriv') { $tmp->custom_string_1($this->privacyMethodV3); $tmp->custom_string_2($this->privacyPassV3); } } } } else if ($candidate['execution_type'] === EXECUTION_TYPE_PLUGIN) { $infoMacros = json_decode( base64_decode($candidate['macros']), true ); if (isset($infoMacros['macros']) === false || is_array($infoMacros['macros']) === false ) { $infoMacros['macros'] = []; } if (isset($candidate['nameOid']) === true && empty($candidate['nameOid']) === false ) { $infoMacros['macros']['_nameOID_'] = $candidate['nameOid']; } if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $tmp->module_interval(300); $tmp->id_modulo(MODULE_DATA); $tmp->updateConfigurationData( 'module_name', $candidate['name'] ); $tmp->updateConfigurationData( 'module_type', $tmp->moduleType()->nombre() ); if (empty($infoMacros['satellite_execution']) === true) { // Already defined. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module %s module_exec not configuration', $candidate['name'] ); $errorflag = true; continue; } $tmp->updateConfigurationData( 'module_exec', io_safe_output( $this->replacementMacrosPlugin( $infoMacros['satellite_execution'], $infoMacros['macros'] ) ) ); } else { $tmp->ip_target($this->targetIp); $tmp->id_modulo(MODULE_PLUGIN); if ($this->wizardSection === 'snmp_interfaces_explorer' && empty($candidate['macros']) === false ) { // Use definition provided. $tmp->id_plugin($candidate['id_plugin']); $tmp->macros(base64_decode($candidate['macros'])); } else { $fieldsPlugin = db_get_value_sql( sprintf( 'SELECT macros FROM tplugin WHERE id=%d', (int) $infoMacros['server_plugin'] ) ); if ($fieldsPlugin !== false) { $fieldsPlugin = json_decode($fieldsPlugin, true); $i = 1; foreach ($infoMacros as $key => $value) { if (empty(preg_match('/_snmp_field/', $key)) === false) { $new_macros = []; foreach ($fieldsPlugin as $k => $v) { if ($v['macro'] === preg_replace('/_snmp_field/', '', $key)) { $fieldsPlugin[$k]['value'] = $this->replacementMacrosPlugin( $value, $infoMacros['macros'] ); $i++; continue; } } } } } $tmp->id_plugin($infoMacros['server_plugin']); $tmp->macros(json_encode($fieldsPlugin)); } } } } else if ($this->protocol === 'wmi') { if ($candidate['execution_type'] === EXECUTION_TYPE_NETWORK) { // Generals fields. $tmp->plugin_user(io_safe_input($this->usernameWMI)); $tmp->plugin_pass(io_safe_input($this->passwordWMI)); $tmp->tcp_send(io_safe_input($this->namespaceWMI)); $tmp->ip_target(io_safe_input($this->targetIp)); // Build query WMI. $dataWMI = [ 'query_class' => $candidate['queryClass'], 'query_filters' => io_safe_output( base64_decode( $candidate['queryFilters'] ) ), 'macros' => base64_decode( $candidate['macros'] ), 'query_key_field' => $candidate['queryKeyField'], ]; $candidate['wmi_query'] = $this->wmiQuery( $dataWMI, 'execution', true ); $queryFilters = json_decode( base64_decode( $candidate['queryFilters'] ), true ); if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $tmp->module_interval(300); $tmp->id_modulo(MODULE_DATA); $tmp->updateConfigurationData( 'module_name', $candidate['name'] ); $tmp->updateConfigurationData( 'module_type', $tmp->moduleType()->nombre() ); $tmp->updateConfigurationData( 'module_wmi', $this->targetIp ); $tmp->updateConfigurationData( 'module_wmiquery', $candidate['wmi_query'] ); $tmp->updateConfigurationData( 'module_wmiauth', $this->usernameWMI.'%'.$this->passwordWMI ); $tmp->updateConfigurationData( 'module_wmicolumn', (isset($queryFilters['field']) === true) ? $queryFilters['field'] : 0 ); } else { $tmp->id_modulo(MODULE_WMI); } $tmp->snmp_oid(io_safe_input($candidate['wmi_query'])); $tmp->tcp_port( (isset($queryFilters['field']) === true) ? $queryFilters['field'] : 0 ); $tmp->snmp_community( (isset($queryFilters['key_string']) === true) ? $queryFilters['key_string'] : '' ); } else if ($candidate['execution_type'] === EXECUTION_TYPE_PLUGIN) { $infoMacros = json_decode( base64_decode($candidate['macros']), true ); if (isset($infoMacros['macros']) === false || is_array($infoMacros['macros']) === false ) { $infoMacros['macros'] = []; } if (isset($candidate['queryClass']) === true && empty($candidate['queryClass']) === false ) { $infoMacros['macros']['_class_wmi_'] = $candidate['queryClass']; } if (isset($candidate['queryKeyField']) === true && empty($candidate['queryKeyField']) === false ) { $infoMacros['macros']['_field_wmi_0_'] = $candidate['queryKeyField']; } if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { $tmp->module_interval(300); $tmp->id_modulo(MODULE_DATA); $tmp->updateConfigurationData( 'module_name', $candidate['name'] ); $tmp->updateConfigurationData( 'module_type', $tmp->moduleType()->nombre() ); if (empty($infoMacros['satellite_execution']) === true) { // Already defined. $this->message['type'][] = 'error'; $this->message['message'][] = __( 'Module %s satellite execution not configuration', $candidate['name'] ); $errorflag = true; continue; } $tmp->updateConfigurationData( 'module_exec', io_safe_output( $this->replacementMacrosPlugin( $infoMacros['satellite_execution'], $infoMacros['macros'] ) ) ); } else { $tmp->id_modulo(MODULE_PLUGIN); $fieldsPlugin = db_get_value_sql( sprintf( 'SELECT macros FROM tplugin WHERE id=%d', (int) $infoMacros['server_plugin'] ) ); if ($fieldsPlugin !== false) { $fieldsPlugin = json_decode($fieldsPlugin, true); $i = 1; foreach ($infoMacros as $key => $value) { if (empty(preg_match('/_wmi_field/', $key)) === false) { $new_macros = []; foreach ($fieldsPlugin as $k => $v) { if ($v['macro'] === preg_replace('/_wmi_field/', '', $key)) { $fieldsPlugin[$k]['value'] = $this->replacementMacrosPlugin( $value, $infoMacros['macros'] ); $i++; continue; } } } } } $tmp->id_plugin($infoMacros['server_plugin']); $tmp->macros(json_encode($fieldsPlugin)); } $tmp->ip_target(io_safe_input($this->targetIp)); $tmp->snmp_oid(io_safe_input($candidate['wmi_query'])); } } if (preg_match('/string/', $tmp->moduleType()->nombre()) === true) { // String module. $tmp->str_warning(io_safe_input($candidate['warningMax'])); $tmp->str_critical(io_safe_input($candidate['criticalMax'])); } else { // Numeric module. $tmp->min_warning($candidate['warningMin']); $tmp->max_warning($candidate['warningMax']); $tmp->min_critical($candidate['criticalMin']); $tmp->max_critical($candidate['criticalMax']); $tmp->percentage_warning($candidate['warningPerc']); $tmp->percentage_critical($candidate['criticalPerc']); } $tmp->warning_inverse($candidate['warningInv']); $tmp->critical_inverse($candidate['criticalInv']); // Insert modules. try { $res = $tmp->save(); } catch (\Exception $e) { $errorflag = true; $this->message['type'][] = 'error'; $this->message['message'][] = $e->getMessage(); } } if ($errorflag === false) { $this->message['type'][] = 'success'; $this->message['message'][] = __('Modules created'); } } /** * Replacement macros. * * @param string $text String. * @param array $macros Macros for replacement. * * @return string Retun string to replacement. */ private function replacementMacrosPlugin( string $text, array $macros ): string { // Only agents. if (empty($this->idPolicy) === true) { // Common. $text = preg_replace('/_address_/', $this->targetIp, $text); } // WMI. $text = preg_replace('/_user_wmi_/', $this->usernameWMI, $text); $text = preg_replace('/_namespace_wmi_/', $this->namespaceWMI, $text); $text = preg_replace('/_pass_wmi_/', $this->passwordWMI, $text); // SNMP. $text = preg_replace('/_port_/', $this->targetPort, $text); $text = preg_replace('/_version_/', $this->version, $text); $text = preg_replace('/_community_/', $this->community, $text); $text = preg_replace('/_auth_user_/', $this->authUserV3, $text); $text = preg_replace('/_auth_pass_/', $this->authPassV3, $text); $text = preg_replace('/_auth_method_/', $this->authMethodV3, $text); $text = preg_replace('/_priv_method_/', $this->privacyMethodV3, $text); $text = preg_replace('/_priv_pass_/', $this->privacyPassV3, $text); $text = preg_replace('/_sec_level_/', $this->securityLevelV3, $text); // Dinamic. if (empty($macros) === false) { foreach ($macros as $key => $value) { $text = preg_replace('/'.$key.'/', $value, $text); } } return $text; } /** * Value with unit. * * @param string|null $value Value. * @param string|null $unit Type unit. * @param integer|null $moduleType Type Module. * * @return string */ private function replacementUnit( ?string $value, ?string $unit='', ?int $moduleType=0 ): string { if ($moduleType !== MODULE_TYPE_REMOTE_SNMP_INC && $moduleType !== MODULE_TYPE_GENERIC_DATA_INC && $moduleType !== MODULE_TYPE_REMOTE_TCP_INC && $moduleType !== MODULE_TYPE_REMOTE_CMD_INC ) { if ($unit === '_timeticks_') { preg_match('/\((\d+?)\)/', $value, $match); if (isset($match[1]) === true) { $value = human_milliseconds_to_string($match[1]); } else { $value = human_milliseconds_to_string($value); } } else if (empty($unit) === false && $unit !== 'none') { $value .= ' '.$unit; } } // If value comes empty, must return a "Empty" value for view it in console. $value = (empty($value) === true) ? ''.__('Empty').'' : $value; return $value; } /** * Perform Interface Wizard and show a table with results. * * @return void */ private function resultsInterfaceWizard() { $generalInterfaceModules = $this->getInterfacesModules(); $generalInterfaceTables = []; $generalInterfaceModulesUpdated = []; $component_id_number = 0; foreach ($generalInterfaceModules as $moduleIndex => $moduleData) { if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_PROC) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_PROC; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_INC) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA_INC; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_STRING) { // MODULE_TYPE_REMOTE_SNMP_STRING. $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA_STRING; } } // Get current value. if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE || in_array( $moduleData['module_type'], [ MODULE_TYPE_REMOTE_SNMP, MODULE_TYPE_REMOTE_SNMP_INC, MODULE_TYPE_REMOTE_SNMP_STRING, MODULE_TYPE_REMOTE_SNMP_PROC, ] ) === true ) { if (isset($moduleData['value']) === true) { $currentValue = $this->snmpGetValue($moduleData['value']); } } // It unit of measure have data, attach to current value. if (empty($moduleData['module_unit']) === false) { $currentValue .= ' '.$moduleData['module_unit']; } // Stablish the data for show. $generalInterfaceModulesUpdated[] = [ 'component_id' => $component_id_number++, 'execution_type' => $moduleData['execution_type'], 'name' => $moduleData['module_name'], 'type' => $moduleData['module_type'], 'description' => $moduleData['module_info'], 'min_warning' => $moduleData['module_thresholds']['min_warning'], 'max_warning' => $moduleData['module_thresholds']['max_warning'], 'inv_warning' => $moduleData['module_thresholds']['inv_warning'], 'min_critical' => $moduleData['module_thresholds']['min_critical'], 'max_critical' => $moduleData['module_thresholds']['max_critical'], 'inv_critical' => $moduleData['module_thresholds']['inv_critical'], 'perc_warning' => $moduleData['module_thresholds']['perc_warning'], 'perc_critical' => $moduleData['module_thresholds']['perc_critical'], 'module_enabled' => $moduleData['default_enabled'], 'name_oid' => $moduleData['value'], 'value' => $moduleData['value'], 'id_plugin' => $moduleData['id_plugin'], 'macros' => $moduleData['macros'], 'id_modulo' => $moduleData['id_modulo'], ]; } $generalInterfaceTables[0]['data'] = $generalInterfaceModulesUpdated; // General Default monitoring. html_print_div( [ 'class' => 'wizard wizard-result', 'style' => 'margin-top: 20px;', 'content' => $this->toggleTableModules( $generalInterfaceTables, false, true, true ), ] ); // Interface filter. $form = [ 'action' => $this->sectionUrl, 'id' => 'form-filter-interfaces', 'method' => 'POST', 'class' => 'modal flex flex-row searchbox', 'extra' => '', ]; // Inputs. $inputs = [ [ 'direct' => 1, 'class' => 'select-interfaces', 'block_content' => [ [ 'label' => __('Select all filtered interfaces'), 'arguments' => [ 'name' => 'select-all-interfaces', 'type' => 'switch', 'class' => '', 'return' => true, 'value' => 1, 'onclick' => 'switchBlockControlInterfaces(this);', ], ], ], ], [ 'label' => __('Search'), 'id' => 'txt-filter-search', 'class' => 'textbox', 'arguments' => [ 'name' => 'filter-search', 'type' => 'text', 'return' => true, ], ], [ 'label' => __('OperStatus UP'), 'arguments' => [ 'name' => 'search-oper', 'type' => 'switch', 'id' => 'search-oper', 'onchange' => 'filterInterfaces()', 'value' => 0, 'return' => true, ], ], [ 'label' => __('AdminStatus UP'), 'arguments' => [ 'name' => 'search-admin', 'type' => 'switch', 'id' => 'search-admin', 'onchange' => 'filterInterfaces()', 'value' => 0, 'return' => true, ], ], ]; // Print the filter form. $filterForm = $this->printForm( [ 'form' => $form, 'inputs' => $inputs, true ], true ); html_print_div( [ 'class' => 'white_box', 'style' => 'margin-top: 20px;', 'content' => $filterForm, ] ); $interfaceTables = []; // Build the information of the blocks. foreach ($this->interfacesFound as $index => $interface) { // Add the index position of this interface. $interface['index'] = $index; if (key_exists($interface['name'], $interfaceTables) === false) { $interfaceTables[$interface['name']] = [ 'name' => $interface['name'], 'data' => [], ]; } $thisInterfaceModules = $this->getInterfacesModules($interface); $interfaceModulesUpdated = []; $component_id_number = 0; foreach ($thisInterfaceModules as $moduleIndex => $moduleData) { if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_PROC) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_PROC; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_INC) { $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA_INC; } else if ($moduleData['module_type'] == MODULE_TYPE_REMOTE_SNMP_STRING) { // MODULE_TYPE_REMOTE_SNMP_STRING. $moduleData['module_type'] = MODULE_TYPE_GENERIC_DATA_STRING; } } // Get current value. $currentValue = ''; if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE || in_array( $moduleData['module_type'], [ MODULE_TYPE_REMOTE_SNMP, MODULE_TYPE_REMOTE_SNMP_INC, MODULE_TYPE_REMOTE_SNMP_STRING, MODULE_TYPE_REMOTE_SNMP_PROC, ] ) === true ) { if (isset($moduleData['value']) === true) { $currentValue = $this->snmpGetValue($moduleData['value']); } } // Format current value with thousands and decimals. if (is_numeric($currentValue) === true) { $decimals = (is_float($currentValue) === true) ? 2 : 0; $currentValue = number_format($currentValue, $decimals); } // It unit of measure have data, attach to current value. if (empty($moduleData['module_unit']) === false) { $currentValue .= ' '.$moduleData['module_unit']; } // Stablish the data for show. $interfaceModulesUpdated[] = [ 'component_id' => $component_id_number++, 'execution_type' => $moduleData['execution_type'], 'name' => $moduleData['module_name'], 'type' => $moduleData['module_type'], 'description' => $moduleData['module_description'], 'min_warning' => $moduleData['module_thresholds']['min_warning'], 'max_warning' => $moduleData['module_thresholds']['max_warning'], 'inv_warning' => $moduleData['module_thresholds']['inv_warning'], 'min_critical' => $moduleData['module_thresholds']['min_critical'], 'max_critical' => $moduleData['module_thresholds']['max_critical'], 'inv_critical' => $moduleData['module_thresholds']['inv_critical'], 'perc_warning' => $moduleData['module_thresholds']['perc_warning'], 'perc_critical' => $moduleData['module_thresholds']['perc_critical'], 'module_enabled' => $moduleData['module_enabled'], 'current_value' => $currentValue, 'name_oid' => $moduleData['value'], 'value' => $moduleData['value'], 'id_plugin' => $moduleData['id_plugin'], 'macros' => $moduleData['macros'], 'id_modulo' => $moduleData['id_modulo'], 'unit' => ($moduleData['unit'] ?? $moduleData['module_unit']), ]; } $interfaceTables[$interface['name']]['data'] = $interfaceModulesUpdated; } html_print_div( [ 'class' => 'wizard wizard-result', 'style' => 'margin-top: 20px;', 'content' => $this->toggleTableModules( $interfaceTables, true, true ), ] ); // Add Create Modules form. $this->createModulesForm(); } /** * Perform WMI Module Wizard and show a table with results. * * @return void */ private function resultsWMIExplorerWizard() { $moduleBlocks = $this->moduleBlocks; $blockTables = []; foreach ($moduleBlocks as $k => $module) { // Construction of the WMI query. $execCommand = $this->wmiQuery($module, 'scan'); // Execution of the WMI Query. $outputCommand = $this->wmiExecution(io_safe_output($execCommand)); // Unpack the extra fields // and include with key field in a field set. $macros = json_decode($module['macros'], true); $fieldSet = ['0' => $module['query_key_field']]; foreach ($macros as $fieldKey => $fieldMacro) { if (preg_match('/extra_field_/', $fieldKey) !== 0) { $tmpKey = explode('_', $fieldKey); $macros['macros']['_field_wmi_'.$tmpKey[2].'_'] = $fieldMacro; $fieldSet[(string) $tmpKey[2]] = $fieldMacro; } } // Value operation. $valueOperation = io_safe_output($macros['value_operation']); // Unpack the query filters. $queryFilters = json_decode($module['query_filters'], true); // Name of query filter field. $fieldValueName = (empty($fieldSet[$queryFilters['field']]) === false) ? $fieldSet[$queryFilters['field']] : '1'; // Evaluate type of scan and execution. if ($module['scan_type'] == SCAN_TYPE_FIXED) { // Common actions for FIXED scan type. $columnsList = []; $rowList = []; foreach ($outputCommand as $rowLine => $rowContent) { if (($rowLine == 0) && (preg_match( '/CLASS: '.$module['query_class'].'/', $rowContent ) === 0) ) { // Erase this module because give us an error. unset($moduleBlocks[$k]); // Do not continue with this module. continue 2; // The second row has the columns list. } else if ($rowLine == 1) { $columnsList = explode('|', $rowContent); $columnFieldIndex = array_search( $fieldValueName, $columnsList, true ); // The rest of the lines have results. } else if ($rowLine == 2) { $rowList = explode('|', $rowContent); } } // If name of the module have a macro. $moduleBlocks[$k]['name'] = $this->macroFilter( io_safe_output($module['name']), $columnsList, $rowList ); // Description can have macros too. $moduleBlocks[$k]['description'] = $this->macroFilter( io_safe_output($module['description']), $columnsList, $rowList ); // Query filters can have macros too. $moduleBlocks[$k]['query_filters'] = $this->macroFilter( $module['query_filters'], $columnsList, $rowList ); foreach ($columnsList as $columnKey => $columnValue) { $macros['macros']['_'.trim($columnValue).'_'] = $rowList[trim($columnKey)]; } $moduleBlocks[$k]['macros'] = json_encode($macros); if ($module['execution_type'] == EXECUTION_TYPE_NETWORK) { // Construction of the WMI query. // $execCommand = $this->wmiQuery($module, 'execution'); // Execution of the WMI Query. // $outputCommand = $this->wmiExecution($execCommand); // Setting of value of this module (field query filter). if ($queryFilters['field'] != '') { if (empty($queryFilters['key_string']) === false) { // Evaluate if the value is equal than key string. $moduleBlocks[$k]['current_value'] = (io_safe_output($queryFilters['key_string']) == io_safe_output($rowList[$columnFieldIndex])) ? 1 : 0; } else { // Set the value getted. $moduleBlocks[$k]['current_value'] = $rowList[$columnFieldIndex]; } $moduleBlocks[$k]['current_value'] = $this->replacementUnit( $moduleBlocks[$k]['current_value'], $module['unit'], $module['type'] ); } else { $moduleBlocks[$k]['current_value'] = 0; } } else if ($module['execution_type'] == EXECUTION_TYPE_PLUGIN) { // Combine both data list. $dataCombined = array_combine($columnsList, $rowList); // Change the macros for values. foreach ($dataCombined as $macroKey => $macroValue) { $macroKey = trim($macroKey); if (preg_match('/_'.$macroKey.'_/', $valueOperation) !== 0) { $valueOperation = preg_replace( '/_'.$macroKey.'_/', $macroValue, $valueOperation ); } } // Evaluate the operation and set the current value. $moduleBlocks[$k]['current_value'] = $this->evalOperation( $valueOperation, $module['unit'], $module['type'] ); } } else if ($module['scan_type'] == SCAN_TYPE_DYNAMIC) { $columnsList = []; $columnFieldIndex = '0'; foreach ($outputCommand as $rowLine => $rowContent) { // The first result must be the class name. if (($rowLine == 0) && (preg_match( '/CLASS: '.$module['query_class'].'/', $rowContent ) === 0) ) { // Erase this module because give us an error. unset($moduleBlocks[$k]); // Do not continue with this module. continue 2; // The second row has the columns list. } else if ($rowLine == 1) { $columnsList = explode('|', $rowContent); $columnFieldIndex = array_search( $fieldValueName, $columnsList, true ); // The rest of the lines have results. } else if ($rowLine > 1) { $newModule = $module; $rowList = explode('|', $rowContent); // If name of the module have a macro. $newModule['name'] = $this->macroFilter( io_safe_output($module['name']), $columnsList, $rowList ); // Description can have macros too. $newModule['description'] = $this->macroFilter( io_safe_output($module['description']), $columnsList, $rowList ); $newModule['query_filters'] = $this->macroFilter( io_safe_output($module['query_filters']), $columnsList, $rowList ); $keyString = $this->macroFilter( io_safe_output($queryFilters['key_string']), $columnsList, $rowList ); foreach ($columnsList as $columnKey => $columnValue) { $macros['macros']['_'.$columnValue.'_'] = $rowList[$columnKey]; } $newModule['macros'] = json_encode($macros); // Setting of value of this module (field query filter). if ($module['execution_type'] == EXECUTION_TYPE_NETWORK) { if ($queryFilters['field'] != '') { // If key string filter filled. if (empty($keyString) === false) { // Evaluate if the value // is equal than key string. $newModule['current_value'] = ($keyString == io_safe_output($rowList[$columnFieldIndex])) ? 1 : 0; } else { // Set the value getted. $newModule['current_value'] = $rowList[$columnFieldIndex]; } $newModule['current_value'] = $this->replacementUnit( $newModule['current_value'], $module['unit'], $module['type'] ); } else { $newModule['current_value'] = 0; } } else if ($module['execution_type'] == EXECUTION_TYPE_PLUGIN) { // Combine both data list. $dataCombined = array_combine( $columnsList, $rowList ); // Change the macros for values. foreach ($dataCombined as $macroKey => $macroValue) { $macroKey = trim($macroKey); if (preg_match('/_'.$macroKey.'_/', $valueOperation) !== 0) { $valueOperation = preg_replace( '/_'.$macroKey.'_/', $macroValue, $valueOperation ); } } // Evaluate the operation and set the result. $newModule['current_value'] = $this->evalOperation( $valueOperation, $module['unit'], $module['type'] ); } // Adding new module to the block. $moduleBlocks[] = $newModule; } } // Clear the original module. unset($moduleBlocks[$k]); } } // If we not retrieve information (P.E. connection refused). if (empty($moduleBlocks) === true) { $this->message['type'][] = 'warning'; $this->message['message'][] = __( 'No information could be retrieved.' ); $this->showMessage(); } else { // Create the final table with all of data received. foreach ($moduleBlocks as $module) { // Prepare the blocks. If its new, create a new index. if (key_exists($module['group'], $blockTables) === false) { $blockTables[$module['group']] = [ 'name' => $module['group_name'], 'data' => [], ]; } // Add the module info in the block. $blockTables[$module['group']]['data'][] = $module; if (isset($blockTables[$module['group']]['activeModules']) === false && (int) $module['module_enabled'] === 1 ) { $blockTables[$module['group']]['activeModules'] = 2; } else if (isset($blockTables[$module['group']]['activeModules']) === true && (int) $module['module_enabled'] === 0 ) { $blockTables[$module['group']]['activeModules'] = 1; } } // General Default monitoring. html_print_div( [ 'class' => 'wizard wizard-result', 'style' => 'margin-top: 20px;', 'content' => $this->toggleTableModules($blockTables), ] ); // Add Create Modules form. $this->createModulesForm(); } } /** * Perform SNMP Module Wizard and show a table with results. * * @return void */ private function resultsSNMPExplorerWizard() { $moduleBlocks = $this->moduleBlocks; $blockTables = []; // Lets work with the modules. foreach ($moduleBlocks as $k => $module) { if ($this->serverType === SERVER_TYPE_ENTERPRISE_SATELLITE) { if ($module['type'] == MODULE_TYPE_REMOTE_SNMP) { $module['type'] = MODULE_TYPE_GENERIC_DATA; $moduleBlocks[$k]['type'] = $module['type']; } else if ($module['type'] == MODULE_TYPE_REMOTE_SNMP_PROC) { $module['type'] = MODULE_TYPE_GENERIC_PROC; $moduleBlocks[$k]['type'] = $module['type']; } else if ($module['type'] == MODULE_TYPE_REMOTE_SNMP_INC) { $module['type'] = MODULE_TYPE_GENERIC_DATA_INC; $moduleBlocks[$k]['type'] = $module['type']; } else if ($module['type'] == MODULE_TYPE_REMOTE_SNMP_STRING) { // MODULE_TYPE_REMOTE_SNMP_STRING. $module['type'] = MODULE_TYPE_GENERIC_DATA_STRING; $moduleBlocks[$k]['type'] = $module['type']; } } if ($module['scan_type'] == SCAN_TYPE_FIXED) { // Common for FIXED Scan types. // If _nameOID_ macro exists, stablish the name getted. if (empty($module['name_oid']) === false) { $nameValue = $this->snmpGetValue($module['name_oid']); $moduleBlocks[$k]['name'] = str_replace( '_nameOID_', $nameValue, $module['name'] ); } if ($module['execution_type'] == EXECUTION_TYPE_NETWORK) { // Set the current value to this module. if (empty($module['value']) === true) { $module['value'] = 0; } $value = $this->snmpGetValue($module['value']); // If the value is missing, we must not show this module. if (empty($value) === true) { unset($moduleBlocks[$k]); } else { $moduleBlocks[$k]['current_value'] = $this->replacementUnit( $value, $module['unit'], $module['type'] ); } $moduleBlocks[$k]['macros'] = ''; } else { // Three steps for FIXED PLUGIN wizard modules. // Break up macros. $macros = json_decode($module['macros'], true); $operation = io_safe_output($macros['value_operation']); // Loop through the macros for get the // OIDs and get his values. foreach ($macros as $key => $oid) { if (preg_match('/extra_field_/', $key) !== 0) { $value = (float) $this->snmpGetValue($oid); // If the value not exists, // we must not create a module. if (empty($value) === true) { unset($moduleBlocks[$k]); continue 2; } else { $tmp = explode('_', $key); $newKey = str_replace( $key, '_oid_'.$tmp[2].'_', $key ); $macros['macros']['_oid_'.$tmp[2].'_'] = $oid; $operation = preg_replace( '/'.$newKey.'/', $value, $operation ); } } } $moduleBlocks[$k]['macros'] = json_encode($macros); // Get the result of the operation and set it. $moduleBlocks[$k]['current_value'] = $this->evalOperation( $operation, $module['unit'], $module['type'] ); } } else { if ($module['execution_type'] == EXECUTION_TYPE_NETWORK) { // Get the values of snmpwalk. $snmpwalkNames = $this->snmpWalkValues($module['name_oid']); $snmpWalkValues = $this->snmpWalkValues($module['value']); $snmpwalkCombined = []; foreach ($snmpwalkNames as $index => $name) { if (isset($name) !== true || isset($snmpWalkValues[$index]) !== true ) { continue; } $snmpwalkCombined[$index] = [ 'name' => $name, 'value' => $snmpWalkValues[$index], ]; } foreach ($snmpwalkCombined as $index => $r) { $name = $r['name']; $value = $r['value']; $newModule = $module; // Setting the new values. $newModule['name'] = str_replace( '_nameOID_', io_safe_input($name), $module['name'] ); // Save complete OID reference + index. $newModule['value'] = $module['value'].$index; $newModule['current_value'] = $this->replacementUnit( $value, $module['unit'], $module['type'] ); $newModule['macros'] = ''; // Add this new module to the module list. $moduleBlocks[] = $newModule; } // Erase the main module. unset($moduleBlocks[$k]); } else { // Break up macros. $macros = (array) json_decode($module['macros']); $operation = io_safe_output($macros['value_operation']); $oids = []; foreach ($macros as $key => $oid) { if (preg_match('/extra_field_/', $key) !== 0) { $tmp = explode('_', $key); $newKey = str_replace( $key, '_oid_'.$tmp[2].'_', $key ); $oids[$newKey] = $oid; } } $snmpwalkNamesTmp = []; // Is needed the index and the values of snmpwalk. $snmpwalkNamesTmp = $this->snmpWalkValues( $module['name_oid'], true ); $snmpwalkNames = []; foreach ($snmpwalkNamesTmp as $value) { // Generate a new module based // in the first for every name found. $newModule = $module; // Split the values got to obtain the name. $tmpFirst = explode('.', $value); $tmpSecond = explode(' ', $tmpFirst[(count($tmpFirst) - 1)]); // Position 0 is the index, Position 3 is the MIB name. $snmpwalkNames[$tmpSecond[0]] = $tmpSecond[3]; // Perform the operations for get the values. $thisOperation = $operation; foreach ($oids as $oidName => $oid) { $currentOid = $oid.'.'.$tmpSecond[0]; $macros['macros'][$oidName] = $currentOid; $currentOidValue = $this->snmpGetValue($currentOid); // If for any reason the value comes empty, add 1. if ($currentOidValue == '') { $currentOidValue = 1; } $thisOperation = preg_replace( '/'.$oidName.'/', $currentOidValue, $thisOperation ); } $newModule['macros'] = json_encode($macros); // Get the result of the operation and set it. $newModule['current_value'] = $this->evalOperation( $thisOperation, $module['unit'], $module['type'] ); // Add the name to this module. $newModule['name'] = str_replace( '_nameOID_', io_safe_input($tmpSecond[3]), $module['name'] ); $newModule['name_oid'] = str_replace('"', '', $tmpSecond[3]); // Add this new module to the module list. $moduleBlocks[] = $newModule; } // Erase the main module. unset($moduleBlocks[$k]); } } } // Create the final table with all of data received. foreach ($moduleBlocks as $module) { if (is_array($module) === true && count($module) <= 1 && empty($module['macros']) === true ) { // Invalid module. continue; } // Prepare the blocks. If its new, create a new index. if (key_exists($module['group'], $blockTables) === false) { $blockTables[$module['group']] = [ 'name' => $module['group_name'], 'data' => [], ]; } // Add the module info in the block. $blockTables[$module['group']]['data'][] = $module; if (isset($blockTables[$module['group']]['activeModules']) === false && (int) $module['module_enabled'] === 1 ) { $blockTables[$module['group']]['activeModules'] = 2; } else if (isset($blockTables[$module['group']]['activeModules']) === true && (int) $module['module_enabled'] === 0 ) { $blockTables[$module['group']]['activeModules'] = 1; } } if (empty($blockTables) === true) { $this->message['type'][] = 'warning'; $this->message['message'][] = __( 'No information could be retrieved.' ); } else { // General Default monitoring. html_print_div( [ 'class' => 'wizard wizard-result', 'style' => 'margin-top: 20px;', 'content' => $this->toggleTableModules($blockTables), ] ); // Add Create Modules form. $this->createModulesForm(); } } /** * Get the data from the module blocks * * @return array Return an array with the module blocks needed. */ private function getModuleBlocks() { // Definition of filters. $whereString = sprintf( 'nc.id_modulo = %d AND nc.protocol = "%s"', MODULE_WIZARD, $this->protocol ); // Special considerations for both protocols. if ($this->protocol === 'snmp') { if (empty($this->penName) === true) { return false; } $whereString .= sprintf( ' AND ( nc.manufacturer_id = "all" OR nc.manufacturer_id = "%s" )', $this->penName ); $fields = 'nc.name_oid'; } else if ($this->protocol === 'wmi') { $fields = 'nc.query_class, nc.query_key_field,'; $fields .= 'nc.scan_filters, nc.query_filters'; } else { $fields = ''; } $sql = sprintf( 'SELECT nc.id_nc AS component_id, nc.name, nc.type, nc.description, nc.id_group AS `group`, ncg.name AS `group_name`, nc.min_warning, nc.max_warning, nc.warning_inverse AS `inv_warning`, nc.min_critical, nc.max_critical, nc.critical_inverse AS `inv_critical`, nc.percentage_warning AS `perc_warning`, nc.percentage_critical AS `perc_critical`, nc.module_enabled, %s, nc.scan_type, nc.execution_type, nc.value, nc.macros, nc.unit FROM tnetwork_component AS nc LEFT JOIN tnetwork_component_group AS ncg ON nc.id_group = ncg.id_sg WHERE %s AND nc.enabled=1', $fields, $whereString ); return db_get_all_rows_sql($sql); } /** * Returns associated PEN code of this device. * * @return integer|null PEN oid or null if not found. */ private function getPEN() { $oid = '.1.3.6.1.2.1.1.2.0'; $output = $this->snmpWalkValues($oid, false, true, true); static $pen; if (isset($pen) === true) { return $pen; } if (is_array($output) === true && isset($output[$oid]) === true ) { // Output should be an array with only 1 element. $pen = (int) explode('.', $output[$oid])[7]; } if ($pen === 0) { return null; } return $pen; } /** * Returns the index oid matching selected expected value. * * @param string $oidTree Tree to search in. * @param string $expectedValue Expected value. * * @return string|false Index where expected value is stored or false if not * found. */ private function snmpGetValueInverse($oidTree, $expectedValue) { $oidTree = $this->snmpWalkValues($oidTree); if (is_array($oidTree) === false) { return false; } return array_search($expectedValue, $oidTree); } /** * Perform a snmpget for get a value from provided oid. * * @param string $oid Oid for get the value. * @param boolean $full_output Array with full output.. * * @return mixed String when response, null if error. */ private function snmpGetValue(string $oid, ?bool $full_output=false) { if ($oid[0] !== '.') { $oid = '.'.$oid; } $output = $this->snmpWalkValues($oid, false, true, true); if (is_array($output) === true) { foreach ($output as $k => $v) { if ($k[0] !== '.') { $k = '.'.$k; } if ($k == $oid) { if ($full_output === true) { return $k.' = '.$v; } $value = explode(': ', $v, 2); return $value[1]; } } } return false; } /** * Perform a snmpwalk for get the values from the provided oid. * * @param string $oid Oid for get the values. * @param boolean $full_output Array with full output. * @param boolean $pure Return results as received by get_snmwalk. * @param boolean $get If get operation, adjust key. * * @return array */ private function snmpWalkValues( string $oid, bool $full_output=false, bool $pure=false, bool $get=false ) { static $__cached_walks; if ($__cached_walks === null) { $__cached_walks = []; } if ($oid[0] !== '.') { $oid = '.'.$oid; } if ($get === true) { // Request from snmpget. Cache is in tree. $tree_oid = strrev($oid); $tree_oid = strrev( substr( $tree_oid, (strpos($tree_oid, '.') + 1), strlen($tree_oid) ) ); $key = $tree_oid.'-'.((int) $full_output).'-'.((int) $pure); // Request entire sub-tree. $oid = $tree_oid; } else { $key = $oid.'-'.((int) $full_output).'-'.((int) $pure); } if (isset($__cached_walks[$key]) === true) { return $__cached_walks[$key]; } $output = []; $temporal = get_snmpwalk( $this->targetIp, $this->version, $this->community, $this->authUserV3, $this->securityLevelV3, $this->authMethodV3, $this->authPassV3, $this->privacyMethodV3, $this->privacyPassV3, 0, $oid, $this->targetPort, $this->server, $this->extraArguments, (($full_output === false) ? '-On' : '-Oa'), '' ); if ($pure === true) { $__cached_walks[$key] = $temporal; return $temporal; } if (empty($temporal) === false) { foreach ($temporal as $key => $oid_unit) { if ($full_output === true) { $output[] = $key.' = '.$oid_unit; } else { $index = []; $index[] = preg_replace('/^'.$oid.'/', '', $key); if (empty($index) === true) { preg_match('/\.\d+$/', $key, $index); } $tmp = explode(': ', $oid_unit); $output[$index[0]] = str_replace('"', '', ($tmp[1] ?? '')); } } } $__cached_walks[$key] = $output; return $output; } /** * Add a button for Create the modules selected. * * @return void */ private function createModulesForm() { // Create modules form. $form = [ 'action' => $this->sectionUrl, 'id' => 'form-create-modules', 'method' => 'POST', 'class' => 'modal', 'extra' => '', ]; // Inputs. $inputs = []; // Submit button. $inputs[] = [ 'arguments' => [ 'label' => __('Create modules'), 'name' => 'create-modules-action', 'type' => 'button', 'attributes' => 'class="sub cog float-right"', 'script' => 'processListModules();', 'return' => true, ], ]; $inputs = array_merge($inputs, $this->getCommonDataInputs()); // Print the the submit button for create modules. $this->printForm( [ 'form' => $form, 'inputs' => $inputs, true ] ); } /** * Inputs. * * @return array Inputs for common data. */ private function getCommonDataInputs(): array { $inputs[] = [ 'id' => 'create-modules-action', 'arguments' => [ 'name' => 'create-modules-action', 'type' => 'hidden', 'value' => 1, 'return' => true, ], ]; $inputs[] = [ 'id' => 'protocol', 'arguments' => [ 'name' => 'protocol', 'id' => 'protocol_data', 'type' => 'hidden', 'value' => $this->protocol, 'return' => true, ], ]; $inputs[] = [ 'id' => 'targetIp', 'arguments' => [ 'name' => 'targetIp', 'type' => 'hidden', 'value' => $this->targetIp, 'return' => true, ], ]; $inputs[] = [ 'id' => 'targetPort', 'arguments' => [ 'name' => 'targetPort', 'type' => 'hidden', 'value' => $this->targetPort, 'return' => true, ], ]; $inputs[] = [ 'id' => 'community', 'arguments' => [ 'name' => 'community', 'type' => 'hidden', 'value' => $this->community, 'return' => true, ], ]; $inputs[] = [ 'id' => 'version', 'arguments' => [ 'name' => 'version', 'type' => 'hidden', 'value' => $this->version, 'return' => true, ], ]; $inputs[] = [ 'id' => 'server', 'arguments' => [ 'name' => 'server', 'type' => 'hidden', 'value' => $this->server, 'return' => true, ], ]; $inputs[] = [ 'id' => 'authUserV3', 'arguments' => [ 'name' => 'authUserV3', 'type' => 'hidden', 'value' => $this->authUserV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'authPassV3', 'arguments' => [ 'name' => 'authPassV3', 'type' => 'hidden', 'value' => $this->authPassV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'authMethodV3', 'arguments' => [ 'name' => 'authMethodV3', 'type' => 'hidden', 'value' => $this->authMethodV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'securityLevelV3', 'arguments' => [ 'name' => 'securityLevelV3', 'type' => 'hidden', 'value' => $this->securityLevelV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'privacyMethodV3', 'arguments' => [ 'name' => 'privacyMethodV3', 'type' => 'hidden', 'value' => $this->privacyMethodV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'privacyPassV3', 'arguments' => [ 'name' => 'privacyPassV3', 'type' => 'hidden', 'value' => $this->privacyPassV3, 'return' => true, ], ]; $inputs[] = [ 'id' => 'namespaceWMI', 'arguments' => [ 'name' => 'namespaceWMI', 'type' => 'hidden', 'value' => $this->namespaceWMI, 'return' => true, ], ]; $inputs[] = [ 'id' => 'usernameWMI', 'arguments' => [ 'name' => 'usernameWMI', 'type' => 'hidden', 'value' => $this->usernameWMI, 'return' => true, ], ]; $inputs[] = [ 'id' => 'passwordWMI', 'arguments' => [ 'name' => 'passwordWMI', 'type' => 'hidden', 'value' => $this->passwordWMI, 'return' => true, ], ]; $inputs[] = [ 'id' => 'idAgent', 'arguments' => [ 'name' => 'idAgent', 'type' => 'hidden', 'value' => $this->idAgent, 'return' => true, ], ]; $inputs[] = [ 'id' => 'idPolicy', 'arguments' => [ 'name' => 'id', 'type' => 'hidden', 'value' => $this->idPolicy, 'return' => true, ], ]; $inputs[] = [ 'id' => 'wizardSection', 'arguments' => [ 'name' => 'wizard_section', 'type' => 'hidden', 'value' => $this->wizardSection, 'return' => true, ], ]; return $inputs; } /** * Retrieve operstatus for given interface. * * @param string $interface_name Interface name. * * @return integer OperStatus. */ private function getOperStatus(string $interface_name) { if (is_array($this->interfacesData[$interface_name]) === true) { return (int) $this->interfacesData[$interface_name]['operstatus']; } return 0; } /** * Retrieve adminstatus for given interface. * * @param string $interface_name Interface name. * * @return integer AdminStatus. */ private function getAdminStatus(string $interface_name) { if (is_array($this->interfacesData[$interface_name]) === true) { return (int) $this->interfacesData[$interface_name]['adminstatus']; } return 0; } /** * Create the tables with toggle interface for show the modules availables. * * @param mixed $blocks Info getted. * @param boolean $showCurrentValue If true, show the * column of current values. * @param boolean $isInterface If true, the form is * displayed for interface purposes. * @param boolean $isPrincipal If true, the form is * displayed for first interface module list. * * @return mixed String with the tables formed. */ private function toggleTableModules( $blocks, bool $showCurrentValue=true, bool $isInterface=false, bool $isPrincipal=false ) { $output = ''; foreach ($blocks as $idBlock => $block) { $md5IdBlock = hash('md5', $idBlock); // Data with all components. $blockData = $block['data']; // Active modules. $activeModules = 0; if (isset($block['activeModules']) === true) { $activeModules = $block['activeModules']; } // Creation of list of all components. $blockComponentList = ''; foreach ($blockData as $component) { $blockComponentList .= $component['component_id'].','; } $is_up = false; if ($this->getOperStatus($idBlock) === 1 && $this->getAdminSTatus($idBlock) === 1 ) { $is_up = true; } $blockComponentList = chop($blockComponentList, ','); // Title of Block. if ($isInterface === true) { if ($isPrincipal === true) { $blockTitle = ''; $blockTitle .= __( 'Add general monitoring for all selected interfaces' ); $blockTitle .= ''; } else { $blockTitle = html_print_input( [ 'type' => 'switch', 'name' => 'interfaz_select_'.$idBlock, 'value' => $is_up, 'disabled' => false, 'attributes' => 'form="form-create-modules" class="interfaz_select" ', 'return' => true, 'id' => $md5IdBlock, ] ); $blockTitle .= ''.$block['name']; $blockTitle .= '  '; $blockTitle .= html_print_image( 'images/tip_help.png', true, [ 'title' => __('Modules selected'), 'alt' => __('Modules selected'), 'id' => 'image-info-modules-'.$idBlock, 'class' => 'hidden', ] ); $blockTitle .= ''; } } else { $blockTitle = ''.$block['name']; $classImg = ''; if ($activeModules === 0) { $classImg = 'hidden'; } $blockTitle .= '  '; $blockTitle .= html_print_image( 'images/tip_help.png', true, [ 'title' => __('Modules selected'), 'alt' => __('Modules selected'), 'id' => 'image-info-modules-'.$idBlock, 'class' => $classImg, ] ); $blockTitle .= ''; } $table = new StdClass(); $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;'; $table->rowid = []; $table->data = []; $table->cellpadding = 0; $table->cellspacing = 0; $table->width = '100%'; $table->class = 'info_table'; // Subheaders for Warning and Critical columns. $subheaders = 'Min.'; $subheaders .= 'Max.'; $subheaders .= 'Inv.'; $subheaders .= '%.'; // Warning header. $warning_header = html_print_div( [ 'style' => 'font-weight:700;text-align:center;', 'content' => html_print_div( [ 'style' => 'width: 100%; text-align:center;', 'content' => __('Warning'), ], true ), ], true ); // Critical header. $critical_header = html_print_div( [ 'style' => 'font-weight:700;text-align:center;', 'content' => html_print_div( [ 'style' => 'width: 100%; text-align:center;', 'content' => __('Critical'), ], true ), ], true ); // Header section. $table->head = []; $table->head[0] = html_print_div( [ 'style' => 'font-weight:700;', 'content' => __('Module Name'), ], true ); $table->head[1] = html_print_div( [ 'style' => 'font-weight:700;', 'content' => __('Type'), ], true ); if ($isPrincipal === true) { $headerInfo = __('Module info'); } else { $headerInfo = __('Description'); } $table->head[2] = html_print_div( [ 'style' => 'font-weight:700;', 'content' => $headerInfo, ], true ); $table->head[3] = $warning_header.$subheaders; $table->head[4] = $critical_header.$subheaders; // Size. $table->size = []; $table->size[0] = '15%'; $table->size[1] = '3%'; $table->size[3] = '140px'; $table->size[4] = '140px'; $table->size[5] = '3%'; // If is needed show current value, we must correct the table. if ($showCurrentValue === true) { // Correct headers. $table->head[5] = html_print_div( [ 'style' => 'font-weight:700;text-align:center;', 'content' => __('Current value'), ], true ); $class = ''; if ($activeModules === 1) { $class = 'alpha50 pdd_0px'; } $table->head[6] = html_print_checkbox_switch_extended( 'sel_block_'.$idBlock, 1, $activeModules, false, 'switchBlockControl(event)', '', true, '', $class ); // Correct size. $table->size[5] = '5%'; $table->size[6] = '3%'; } else { // Correct size. $table->size[5] = '1%'; $table->size[6] = '3%'; $table->head[5] = ''; $table->head[6] = html_print_checkbox_switch_extended( 'sel_block_'.$idBlock, 1, true, false, 'switchBlockControl(event)', '', true, '', 'alpha50 pdd_0px' ); } $table->data = []; foreach ($blockData as $kId => $module) { $uniqueId = $idBlock.'_'.$module['component_id'].'-'.$kId; // Module Name column. if ($isPrincipal === true) { $data[0] = $module['name']; } else { $data[0] = html_print_input_text( 'module-name-set-'.$uniqueId, $module['name'], '', 25, 255, true, false, false, '', $md5IdBlock, '', '', false, '', 'form-create-modules' ); } // Module Type column. $data[1] = ui_print_moduletype_icon($module['type'], true); // Module info column. if ($isPrincipal === true) { $data[2] = io_safe_output($module['description']); } else { $data[2] = html_print_textarea( 'module-description-set-'.$uniqueId, 1, 20, $module['description'], 'form=\'form-create-modules\' class=\'min-height-50px\'', true ); } // Warning column. $data_warning = ''; $data_warning = html_print_div( [ 'class' => 'wizard-column-levels', 'content' => html_print_input_text( 'module-warning-min-'.$uniqueId, $module['min_warning'], '', 3, 4, true, false, false, '', $md5IdBlock, '', '', false, '', 'form-create-modules' ).' ', ], true ); $data_warning .= html_print_div( [ 'class' => 'wizard-column-levels', 'content' => html_print_input_text( 'module-warning-max-'.$uniqueId, $module['max_warning'], '', 3, 4, true, false, false, '', $md5IdBlock, '', '', false, '', 'form-create-modules' ), ], true ); $data_warning .= html_print_div( [ 'class' => 'wizard-column-levels-check', 'style' => 'margin-top: 0.3em;', 'content' => html_print_checkbox( 'module-warning-inv-'.$uniqueId, $module['inv_warning'], $module['inv_warning'], true, false, 'change_control(this, \''.$uniqueId.'\')', false, 'form="form-create-modules"' ), ], true ); $data_warning .= html_print_div( [ 'class' => 'wizard-column-levels-check', 'style' => 'margin-top: 0.3em;', 'content' => html_print_checkbox( 'module-warning-perc-'.$uniqueId, $module['perc_warning'], $module['perc_warning'], true, false, 'change_control(this, \''.$uniqueId.'\')', false, 'form="form-create-modules"' ), ], true ); $data[3] = $data_warning; // Critical column. $data[4] = ''; $data[4] .= html_print_div( [ 'class' => 'wizard-column-levels', 'content' => html_print_input_text( 'module-critical-min-'.$uniqueId, $module['min_critical'], '', 3, 4, true, false, false, '', $md5IdBlock, '', '', false, '', 'form-create-modules' ).' ', ], true ); $data[4] .= html_print_div( [ 'class' => 'wizard-column-levels', 'content' => html_print_input_text( 'module-critical-max-'.$uniqueId, $module['max_critical'], '', 3, 4, true, false, false, '', $md5IdBlock, '', '', false, '', 'form-create-modules' ), ], true ); $data[4] .= html_print_div( [ 'class' => 'wizard-column-levels-check', 'style' => 'margin-top: 0.3em;', 'content' => html_print_checkbox( 'module-critical-inv-'.$uniqueId, $module['inv_critical'], $module['inv_critical'], true, false, 'change_control(this, \''.$uniqueId.'\')', false, 'form="form-create-modules"' ), ], true ); $data[4] .= html_print_div( [ 'class' => 'wizard-column-levels-check', 'style' => 'margin-top: 0.3em;', 'content' => html_print_checkbox( 'module-critical-perc-'.$uniqueId, $module['perc_critical'], $module['perc_critical'], true, false, 'change_control(this,\''.$uniqueId.'\')', false, 'form="form-create-modules"' ), ], true ); if (is_string($module['module_enabled']) === true) { if ($module['module_enabled'] === false || $module['module_enabled'] === '0') { $module['module_enabled'] = false; } else { $module['module_enabled'] = true; } } if ($isPrincipal === true) { // Activation column. $data[5] = ''; $data[6] = html_print_checkbox_switch_extended( 'sel_module_'.$uniqueId, $module['module_enabled'], $module['module_enabled'], false, 'switchBlockControl(event)', '', true, '', 'pdd_0px' ); } else { // WIP. Current value of this module. if (isset($module['current_value']) === false) { $module['current_value'] = 'NO DATA'; } $data[5] = ui_print_truncate_text( io_safe_output($module['current_value']), 20, false, true, true, '…', false ); // Activation column. $data[6] = html_print_checkbox_switch_extended( 'sel_module_'.$uniqueId, $module['module_enabled'], $module['module_enabled'], false, 'switchBlockControl(event)', 'form="form-create-modules"', true, '', 'pdd_0px' ); } // Input info for activate (active: 1 true 0 false). $data[6] .= html_print_input_hidden( 'module-active-'.$uniqueId, $module['module_enabled'], true, $md5IdBlock, 'form="form-create-modules"' ); // Type module. $data[6] .= html_print_input_hidden( 'module-type-'.$uniqueId, $module['type'], true, $md5IdBlock, 'form="form-create-modules"' ); // Unit module. $data[6] .= html_print_input_hidden( 'module-unit-'.$uniqueId, ($module['unit'] ?? $module['module_unit']), true, $md5IdBlock, 'form="form-create-modules"' ); // Value module OID. $data[6] .= html_print_input_hidden( 'module-value-'.$uniqueId, $module['value'], true, $md5IdBlock, 'form="form-create-modules"' ); if (empty($module['macros']) === false) { // Macro module. $data[6] .= html_print_input_hidden( 'module-macros-'.$uniqueId, base64_encode($module['macros']), true, $md5IdBlock, 'form="form-create-modules"' ); } if (empty($module['execution_type']) === false) { // Id plugin. $data[6] .= html_print_input_hidden( 'module-execution_type-'.$uniqueId, $module['execution_type'], true, $md5IdBlock, 'form="form-create-modules"' ); } if (empty($module['id_modulo']) === false) { // Id module. $data[6] .= html_print_input_hidden( 'module-id_modulo-'.$uniqueId, $module['id_modulo'], true, $md5IdBlock, 'form="form-create-modules"' ); } if (empty($module['id_plugin']) === false) { // Id plugin. $data[6] .= html_print_input_hidden( 'module-id_plugin-'.$uniqueId, $module['id_plugin'], true, $md5IdBlock, 'form="form-create-modules"' ); } // Macro module. $data[6] .= html_print_input_hidden( 'module-name-oid-'.$uniqueId, $module['name_oid'], true, $md5IdBlock, 'form="form-create-modules"' ); // Scan type module. $data[6] .= html_print_input_hidden( 'module-scan_type-'.$uniqueId, $module['scan_type'], true, $md5IdBlock, 'form="form-create-modules"' ); // WMI Query class. $data[6] .= html_print_input_hidden( 'module-query_class-'.$uniqueId, $module['query_class'], true, $md5IdBlock, 'form="form-create-modules"' ); // WMI Query key. $data[6] .= html_print_input_hidden( 'module-query_key_field-'.$uniqueId, $module['query_key_field'], true, $md5IdBlock, 'form="form-create-modules"' ); // WMI scan filters. $data[6] .= html_print_input_hidden( 'module-scan_filters-'.$uniqueId, $module['scan_filters'], true, $md5IdBlock, 'form="form-create-modules"' ); // WMI query filters. $data[6] .= html_print_input_hidden( 'module-query_filters-'.$uniqueId, base64_encode($module['query_filters']), true, $md5IdBlock, 'form="form-create-modules"' ); if ($isInterface === true) { // Is neccesary for default // module name and description uin general monitoring. $data[6] .= html_print_input_hidden( 'module-default_name-'.$uniqueId, $module['name'], true, $md5IdBlock, 'form="form-create-modules"' ); $data[6] .= html_print_input_hidden( 'module-default_description-'.$uniqueId, $module['description'], true, $md5IdBlock, 'form="form-create-modules"' ); } array_push($table->data, $data); } $content = html_print_table($table, true); $open = true; $buttonSwitch = false; $attr = 'operstatus="'.$this->getOperStatus($idBlock).'" '; $attr .= 'adminstatus="'; $attr .= $this->getAdminStatus($idBlock).'" '; $class = 'box-shadow white_table_graph interfaces_search'; $reverseImg = true; if ($isPrincipal === true) { $open = false; $buttonSwitch = true; $class = 'box-shadow white_table_graph'; $reverseImg = false; } $output .= ui_print_toggle( [ 'content' => $content, 'name' => $blockTitle, 'title' => '', 'id' => $idBlock, 'hidden_default' => $open, 'return' => true, 'toggle_class' => '', 'container_class' => 'white-box-content', 'main_class' => $class, 'img_a' => 'images/arrow_down_green.png', 'img_b' => 'images/arrow_right_green.png', 'clean' => false, 'reverseImg' => $reverseImg, 'switch' => $buttonSwitch, 'attributes_switch' => 'form="form-create-modules"', 'toggl_attr' => $attr, ] ); } return $output; } /** * This function return the definition of modules for SNMP Interfaces * * @param array $data Data. * * @return array Return modules for defect. */ private function getInterfacesModules(array $data=[]) { $moduleDescription = ''; $name = ''; $value = '_generic_'; // Unpack the array with data. if (empty($data) === false) { if (empty($data['mac']) === false) { $moduleDescription .= 'MAC: '.$data['mac'].' - '; } else { $moduleDescription .= ''; } if (empty($data['ip']) === false) { $moduleDescription .= 'IP: '.$data['ip'].' - '; } else { $moduleDescription .= ''; } if (empty($data['alias']) === false) { $moduleDescription .= 'Alias: '.$data['alias'].' - '; } else { $moduleDescription .= ''; } $name = $data['name'].'_'; $value = $data['index']; } // Definition object. $definition = []; // Fulfill extra info. $this->interfacesData[$data['name']] = []; // IfOperStatus. $adminStatusValue = 1; $speed = 0; if (empty($data) === false) { $adminStatusValue = $this->snmpGetValue( '1.3.6.1.2.1.2.2.1.7.'.$value ); $speed = $this->snmpGetValue( '.1.3.6.1.2.1.2.2.1.5.'.$value ); preg_match('/\((\d+?)\)/', $adminStatusValue, $match); $adminStatusValue = (int) $match[1]; } // IfOperStatus. $operStatusValue = 1; if (empty($data) === false) { $operStatusValue = $this->snmpGetValue( '1.3.6.1.2.1.2.2.1.8.'.$value ); preg_match('/\((\d+?)\)/', $operStatusValue, $match); $operStatusValue = (int) $match[1]; } // Store aux data. $this->interfacesData[$data['name']]['adminstatus'] = $adminStatusValue; $this->interfacesData[$data['name']]['operstatus'] = $operStatusValue; if ($adminStatusValue === 3) { $min_warning = 3; $max_warning = 4; $min_critical = 2; $max_critical = 3; $inv_warning = true; $inv_critical = false; } else if ($adminStatusValue === 2) { $min_warning = 3; $max_warning = 0; $min_critical = 1; $max_critical = 2; $inv_warning = false; $inv_critical = false; } else { $min_warning = 3; $max_warning = 0; $min_critical = 2; $max_critical = 3; $inv_warning = false; $inv_critical = false; } $moduleName = $name.'ifOperStatus'; $definition['ifOperStatus'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The current operational state of the interface: up(1), down(2), testing(3), unknown(4), dormant(5), notPresent(6), lowerLayerDown(7)', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.8.'.$value, 'module_unit' => '', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => $min_warning, 'max_warning' => $max_warning, 'inv_warning' => $inv_warning, 'min_critical' => $min_critical, 'max_critical' => $max_critical, 'inv_critical' => $inv_critical, 'perc_warning' => false, 'perc_critical' => false, ], ]; // Get x86 or x64 modules. if ($this->interfacesx64 === true) { $definition_temp = $this->getInterfacesModulesx64($data); } else { $definition_temp = $this->getInterfacesModulesx86($data); } // General monitoring names. $general_module_names = [ 'ifInOctets / ifHCInOctets', 'ifOutOctets / ifHCOutOctets', 'ifInUcastPkts / ifHCInUcastPkts', 'ifOutUcastPkts / ifHCOutUcastPkts', 'ifInNUcastPkts / ifHCInNUcastPkts', 'ifOutNUcastPkts / ifHCOutNUcastPkts', ]; if ($name === '') { foreach ($definition_temp as $module => $module_def) { $definition_temp[$module]['module_name'] = array_shift( $general_module_names ); } } if (empty($definition_temp) === false) { $definition = array_merge($definition, $definition_temp); } // LocIfInCRC. $moduleName = $name.'locIfInCRC'; $definition['locIfInCRC'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'Number of input packets which had cyclic redundancy checksum errors.', 'execution_type' => 'network', 'value' => '1.3.6.1.4.1.9.2.2.1.1.12.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // Manufacturer specific modules. $pen = $this->getPEN(); switch ($pen) { case 9: // CISCO. $valueTranslated = $this->snmpGetValueInverse( '.1.3.6.1.4.1.9.5.1.4.1.1.11.1', $value ); if ($valueTranslated === false && $value !== '_generic_') { $duplexMismatchOID = null; } else { $duplexMismatchOID = '.1.3.6.1.4.1.9.5.1.4.1.1.10.1'; $duplexMismatchOID .= $valueTranslated; $minc = 2.5; $maxc = 3.5; } break; // TODO: Add here extra manufacturers. default: // Unknown. $duplexMismatchOID = null; break; } if (isset($duplexMismatchOID) === true) { // Duplex mismatch. $moduleName = $name.'DuplexMismatch'; $definition['DuplexMismatch'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'Indicates whether the port is operating in half-duplex, full-duplex, disagree or auto negotiation mode. If the port could not agree with the far end on port duplex, the port will be in disagree(3) mode.', 'execution_type' => 'network', 'value' => $duplexMismatchOID, 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => $minc, 'max_critical' => $maxc, 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; } // Bandwidth plugin. static $plugin; if ($plugin === null) { $plugin = \db_get_row_filter( 'tplugin', [ 'name' => 'Network bandwidth SNMP' ] ); } if ($plugin !== false) { // Network Bandwidth is installed. $plugin_id = $plugin['id']; $macros = json_decode($plugin['macros'], 1); if (json_last_error() === JSON_ERROR_NONE) { // SNMP Version. $macros[1]['value'] = $this->version; // Community. $macros[2]['value'] = $this->community; // Host. $macros[3]['value'] = $this->targetIp; // Port. $macros[4]['value'] = $this->targetPort; // Interface index filter. $macros[5]['value'] = $value; // SecurityName. $macros[6]['value'] = $this->authUserV3; // SecurityContext. Empty by default. $macros[7]['value'] = ''; // SecurityLevel. $macros[8]['value'] = $this->securityLevelV3; // AuthProtocol. $macros[9]['value'] = $this->authMethodV3; // AuthKey. $macros[10]['value'] = $this->authPassV3; // PrivProtocol. $macros[11]['value'] = $this->privacyMethodV3; // PrivKey. $macros[12]['value'] = $this->privacyPassV3; // Hash identifier. $macros[13]['value'] = uniqid(); // Get input usage. $macros[14]['value'] = 0; // Get output usage. $macros[15]['value'] = 0; $moduleName = $name.'Bandwidth'; $definition['Bandwidth'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_NUMERIC, 'module_description' => sprintf( '(%s%s - Speed:%d)', $moduleDescription, $moduleName, $speed ), 'module_info' => 'Amount of digital information sent and received from this interface over a particular time (see interval).', 'execution_type' => EXECUTION_TYPE_PLUGIN, 'id_plugin' => $plugin_id, 'id_modulo' => MODULE_PLUGIN, 'macros' => json_encode($macros), 'default_enabled' => true, 'module_enabled' => false, 'module_unit' => '%', 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '85', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // Hash identifier. $macros[13]['value'] = uniqid(); // Get input usage. $macros[14]['value'] = 1; // Get output usage. $macros[15]['value'] = 0; $moduleName = $name.'inUsage'; $definition['inUsage'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_NUMERIC, 'module_description' => sprintf( '(%s%s - Speed:%d)', $moduleDescription, $moduleName, $speed ), 'module_info' => 'Bandwidth usage received into this interface over a particular time (see interval).', 'execution_type' => EXECUTION_TYPE_PLUGIN, 'id_plugin' => $plugin_id, 'id_modulo' => MODULE_PLUGIN, 'macros' => json_encode($macros), 'default_enabled' => true, 'module_enabled' => false, 'module_unit' => '%', 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // Hash identifier. $macros[13]['value'] = uniqid(); // Get input usage. $macros[14]['value'] = 0; // Get output usage. $macros[15]['value'] = 1; $moduleName = $name.'outUsage'; $definition['outUsage'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_NUMERIC, 'module_description' => sprintf( '(%s%s - Speed:%d)', $moduleDescription, $moduleName, $speed ), 'module_info' => 'Bandwidth usage sent from this interface over a particular time (see interval).', 'execution_type' => EXECUTION_TYPE_PLUGIN, 'id_plugin' => $plugin_id, 'id_modulo' => MODULE_PLUGIN, 'macros' => json_encode($macros), 'default_enabled' => true, 'module_enabled' => false, 'module_unit' => '%', 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; } } // Continue with common x86 and x84 modules. // IfAdminStatus. $moduleName = $name.'ifAdminStatus'; $definition['ifAdminStatus'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The desired state of the interface: up(1), down(2), testing(3)', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.7.'.$value, 'module_unit' => '', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfInDiscards. $moduleName = $name.'ifInDiscards'; $definition['ifInDiscards'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of inbound packets which were chosen to be discarded even though no errors had been detected to prevent their being deliverable to a higher-layer protocol', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.13.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutDiscards. $moduleName = $name.'ifOutDiscards'; $definition['ifOutDiscards'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of outbound packets which were chosen to be discarded even though no errors had been detected to prevent their being transmitted', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.19.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfInErrors. $moduleName = $name.'ifInErrors'; $definition['ifInErrors'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'For packet-oriented interfaces, the number of inbound packets that contained errors preventing them from being deliverable to a higher-layer protocol. For character- oriented or fixed-length interfaces, the number of inbound transmission units that contained errors preventing them from being deliverable to a higher-layer protocol', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.14.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutErrors. $moduleName = $name.'ifOutErrors'; $definition['ifOutErrors'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'For packet-oriented interfaces, the number of outbound packets that could not be transmitted because of errors. For character-oriented or fixed-length interfaces, the number of outbound transmission units that could not be transmitted because of errors', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.20.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; return $definition; } /** * This function return the definition of modules for x86 SNMP Interfaces * * @param array $data Data. * * @return array Return modules for defect. */ private function getInterfacesModulesx86(array $data=[]) { $moduleDescription = ''; $name = ''; $value = '1'; // Unpack the array with data. if (empty($data) === false) { if (empty($data['mac']) === false) { $moduleDescription .= 'MAC: '.$data['mac'].' - '; } else { $moduleDescription .= ''; } if (empty($data['ip']) === false) { $moduleDescription .= 'IP: '.$data['ip'].' - '; } else { $moduleDescription .= ''; } if (empty($data['alias']) === false) { $moduleDescription .= 'Alias: '.$data['alias'].' - '; } else { $moduleDescription .= ''; } $name = $data['name'].'_'; $value = $data['index']; } // Definition object. $definition = []; // IfInOctets. $moduleName = $name.'ifInOctets'; $definition['ifInOctets'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of octets received on the interface, including framing characters', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.10.'.$value, 'module_unit' => 'bytes/s', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutOctets. $moduleName = $name.'ifOutOctets'; $definition['ifOutOctets'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of octets transmitted out of the interface, including framing characters', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.16.'.$value, 'module_unit' => 'bytes/s', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfInUcastPkts. $moduleName = $name.'ifInUcastPkts'; $definition['ifInUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were not addressed to a multicast or broadcast address at this sub-layer', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.11.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutUcastPkts. $moduleName = $name.'ifOutUcastPkts'; $definition['ifOutUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of packets that higher-level protocols requested be transmitted, and which were not addressed to a multicast or broadcast address at this sub-layer, including those that were discarded or not sent', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.17.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfInNUcastPkts. $moduleName = $name.'ifInNUcastPkts'; $definition['ifInNUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were addressed to a multicast or broadcast address at this sub-layer', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.12.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutNUcastPkts. $moduleName = $name.'ifOutNUcastPkts'; $definition['ifOutNUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of packets that higher-level protocols requested be transmitted, and which were addressed to a multicast or broadcast address at this sub-layer, including those that were discarded or not sent', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.2.2.1.18.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; return $definition; } /** * This function return the definition of modules for x64 SNMP Interfaces * * @param array $data Data. * * @return array Return modules for defect. */ private function getInterfacesModulesx64(array $data=[]) { $moduleDescription = ''; $name = ''; $value = '1'; // Unpack the array with data. if (empty($data) === false) { if (empty($data['mac']) === false) { $moduleDescription .= 'MAC: '.$data['mac'].' - '; } else { $moduleDescription .= ''; } if (empty($data['ip']) === false) { $moduleDescription .= 'IP: '.$data['ip'].' - '; } else { $moduleDescription .= ''; } if (empty($data['alias']) === false) { $moduleDescription .= 'Alias: '.$data['alias'].' - '; } else { $moduleDescription .= ''; } $name = $data['name'].'_'; $value = $data['index']; } // Definition object. $definition = []; // IfHCInOctets. $moduleName = $name.'ifHCInOctets'; $definition['ifHCInOctets'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of octets received on the interface, including framing characters', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.6.'.$value, 'module_unit' => 'bytes/s', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfHCOutOctets. $moduleName = $name.'ifHCOutOctets'; $definition['ifHCOutOctets'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of octets transmitted out of the interface, including framing characters', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.10.'.$value, 'module_unit' => 'bytes/s', 'default_enabled' => true, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfHCInUcastPkts. $moduleName = $name.'ifHCInUcastPkts'; $definition['ifHCInUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were not addressed to a multicast or broadcast address at this sub-layer', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.7.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfHCOutUcastPkts. $moduleName = $name.'ifHCOutUcastPkts'; $definition['ifHCOutUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of packets that higher-level protocols requested be transmitted, and which were not addressed to a multicast or broadcast address at this sub-layer, including those that were discarded or not sent', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.11.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfHCInNUcastPkts. $moduleName = $name.'ifHCInNUcastPkts'; $definition['ifHCInNUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were addressed to a multicast or broadcast address at this sub-layer', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.7.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; // IfOutNUcastPkts. $moduleName = $name.'ifHCOutNUcastPkts'; $definition['ifHCOutNUcastPkts'] = [ 'module_name' => $moduleName, 'module_type' => MODULE_TYPE_REMOTE_SNMP_INC, 'module_description' => sprintf( '(%s%s)', $moduleDescription, $moduleName ), 'module_info' => 'The total number of packets that higher-level protocols requested be transmitted, and which were addressed to a multicast or broadcast address at this sub-layer, including those that were discarded or not sent', 'execution_type' => 'network', 'value' => '1.3.6.1.2.1.31.1.1.1.11.'.$value, 'module_unit' => 'packets/s', 'default_enabled' => false, 'module_enabled' => false, 'module_thresholds' => [ 'min_warning' => '0', 'max_warning' => '0', 'inv_warning' => false, 'min_critical' => '0', 'max_critical' => '0', 'inv_critical' => false, 'perc_warning' => false, 'perc_critical' => false, ], ]; return $definition; } /** * Watch if is a arithmetic operation and perform it. * * @param string $operation Operation for perform. * @param string $unit If filled, * add unit of measure to the output. * @param integer|null $type Module type. * * @return string * @throws Exception Handle of unwanted operations. */ private function evalOperation( string $operation, string $unit='', ?int $type=0 ) { $output = ''; try { // Avoid non-numeric or arithmetic chars for security reasons. if (preg_match('/(([^0-9\s\+\-\*\/\(\).,])+)/', $operation) === 1) { throw new Exception(sprintf(__("The operation '%s' is not permitted. Review for remote components."), $operation)); } else { // Get the result of the operation and set it. eval('$output = '.$operation.';'); // If this module has unit, attach to current value. $output = $this->replacementUnit( round($output, 2), $unit, $type ); } } catch (Exception $e) { $this->message['type'][] = 'error'; $this->message['message'][] = $e->getMessage(); $this->showMessage(); } return $output; } /** * Filters macros in attributes * * @param string $attribute String for manage. * @param array $columnsList List of the columns. * @param array $rowList List of the values of current row. * * @return string Returns the value filtered. */ private function macroFilter( string $attribute, array $columnsList, array $rowList ) { // By default, the output is the raw input of attribute. $output = $attribute; // If the attribute has a macro, here is filled with the info. if (preg_match('/_(.*?)_/', $attribute, $macro) !== 0) { $indexColumn = array_search($macro[1], $columnsList, true); if ($indexColumn !== false) { $output = str_replace( $macro[0], $rowList[$indexColumn], $attribute ); } } return $output; } /** * WMI query execution. * * @param string $execution Entire string with the execution command. * * @return mixed Result of the operation. */ private function wmiExecution(string $execution) { $output = []; try { exec($execution, $output); } catch (Exception $ex) { $output = ['0' => 'ERROR: Failed execution: '.(string) $ex]; } return $output; } /** * WMI query constructor. * * @param array $moduleAttr Array with attributes of modules. * @param string $filterType If filled, what query filter to use. * @param boolean $onlyQuery Return only query, no command. * * @return string A string with the complete query to perform */ private function wmiQuery( array $moduleAttr, string $filterType='', ?bool $onlyQuery=false ) { // Definition of vars. $queryClass = $moduleAttr['query_class']; $queryFilters = json_decode( $moduleAttr['query_filters'], true ); $macros = json_decode($moduleAttr['macros'], true); $queryFields = []; // If query key field is filled, add to the query fields. if (empty($moduleAttr['query_key_field']) === false) { $queryFields[] = $moduleAttr['query_key_field']; } // Unpack the macros. foreach ($macros as $key => $macro) { // Only attach extra field macros and with data inside. if (preg_match('/extra_field_/', $key) !== 0) { if (empty($macro) === false) { $queryFields[] = $macro; } } } // Generate the string with fields to perform the query. $queryFieldsStr = implode(',', $queryFields); // Where statement. if (($filterType === 'scan' || $filterType === 'execution') && empty($queryFilters[$filterType]) === false ) { $queryWhere = ' WHERE '; $queryWhere .= $queryFilters[$filterType]; } else { $queryWhere = ' '; } if ($onlyQuery === true) { // Set up the execute command. $executeCommand = sprintf( 'SELECT %s FROM %s%s', $queryFieldsStr, $queryClass, $queryWhere ); } else { // Set up the execute command. $executeCommand = sprintf( '%s \'SELECT %s FROM %s%s\'', $this->wmiCommand, $queryFieldsStr, $queryClass, $queryWhere ); } return $executeCommand; } /** * Generate the JS needed for use inside * * @return mixed */ private function loadJS() { $str = ''; ob_start(); ?>