%PDF- %PDF-
Direktori : /proc/3163975/root/home/infra/glpiinventory/inc/ |
Current File : //proc/3163975/root/home/infra/glpiinventory/inc/networkdiscovery.class.php |
<?php /** * --------------------------------------------------------------------- * GLPI Inventory Plugin * Copyright (C) 2021 Teclib' and contributors. * * http://glpi-project.org * * based on FusionInventory for GLPI * Copyright (C) 2010-2021 by the FusionInventory Development Team. * * --------------------------------------------------------------------- * * LICENSE * * This file is part of GLPI Inventory Plugin. * * GLPI Inventory Plugin is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GLPI Inventory Plugin is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with GLPI Inventory Plugin. If not, see <https://www.gnu.org/licenses/>. * --------------------------------------------------------------------- */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * Manage network discovery prepare the task and give the configuration to the * agent. */ class PluginGlpiinventoryNetworkdiscovery extends PluginGlpiinventoryCommunication { /** * Prepare network discovery. * Get all devices and put in taskjobstat each task for each device for each * agent * * @param integer $taskjobs_id * @return string */ public function prepareRun($taskjobs_id) { $pfTask = new PluginGlpiinventoryTask(); $pfTaskjob = new PluginGlpiinventoryTaskjob(); $pfTaskjoblog = new PluginGlpiinventoryTaskjoblog(); $pfTaskjobstate = new PluginGlpiinventoryTaskjobstate(); $pfAgentmodule = new PluginGlpiinventoryAgentmodule(); $pfIPRange = new PluginGlpiinventoryIPRange(); $agent = new Agent(); $uniqid = uniqid(); $pfTaskjob->getFromDB($taskjobs_id); $pfTask->getFromDB($pfTaskjob->fields['plugin_glpiinventory_tasks_id']); //list all iprange $a_iprange = importArrayFromDB($pfTaskjob->fields['definition']); $count_ip = 0; $a_iprangelist = []; $a_subnet_nbip = []; foreach ($a_iprange as $iprange) { $iprange_id = current($iprange); $a_iprangelist[] = $iprange_id; $pfIPRange->getFromDB($iprange_id); $s = $pfIPRange->getIp2long($pfIPRange->fields['ip_start']); $e = $pfIPRange->getIp2long($pfIPRange->fields['ip_end']); $a_subnet_nbip[$iprange_id] = $e - $s; $count_ip += $e - $s; } //list all agents $a_agent = importArrayFromDB($pfTaskjob->fields['action']); $dynagent = 0; $a_agentlist = []; foreach ($a_agent as $agent) { $agent_id = current($agent); if ($agent_id == '.1') { $dynagent = 1; } elseif ($agent_id == '.2') { $dynagent = 2; } } if ($dynagent == '2') { // Dynamic with subnet $taskvalid = 0; foreach ($a_subnet_nbip as $iprange_id => $nbips) { //$maxagentpossible = $nbips/10; $pfIPRange->getFromDB($iprange_id); $a_input = []; $a_input['plugin_glpiinventory_taskjobs_id'] = $taskjobs_id; $a_input['agents_id'] = 0; $a_input['state'] = 1; $a_input['itemtype'] = 'PluginGlpiinventoryIPRange'; $a_input['items_id'] = $iprange_id; $a_input['uniqid'] = $uniqid; $a_input['execution_id'] = $pfTask->fields['execution_id']; $Taskjobstates_id = $pfTaskjobstate->add($a_input); //Add log of taskjob $a_input['plugin_glpiinventory_taskjobstates_id'] = $Taskjobstates_id; $a_input['state'] = 7; $a_input['date'] = date("Y-m-d H:i:s"); $pfTaskjoblog->add($a_input); $pfTaskjobstate->changeStatusFinish( $Taskjobstates_id, 0, 'PluginGlpiinventoryIPRange', 1, "Unable to find agent to run this job" ); $input_taskjob = []; $input_taskjob['id'] = $pfTaskjob->fields['id']; //$input_taskjob['status'] = 1; $pfTaskjob->update($input_taskjob); } if ($taskvalid == "0") { $pfTaskjob->reinitializeTaskjobs($pfTaskjob->fields['plugin_glpiinventory_tasks_id']); } // *** Add jobstate } elseif (count($a_agentlist) == 0) { $a_input = []; $a_input['plugin_glpiinventory_taskjobs_id'] = $taskjobs_id; $a_input['state'] = 1; $a_input['agents_id'] = 0; $a_input['itemtype'] = 'PluginGlpiinventoryIPRange'; $a_input['items_id'] = 0; $a_input['uniqid'] = $uniqid; $a_input['execution_id'] = $pfTask->fields['execution_id']; $Taskjobstates_id = $pfTaskjobstate->add($a_input); //Add log of taskjob $a_input['plugin_glpiinventory_taskjobstates_id'] = $Taskjobstates_id; $a_input['state'] = 7; $a_input['date'] = date("Y-m-d H:i:s"); $pfTaskjoblog->add($a_input); $pfTaskjobstate->changeStatusFinish( $Taskjobstates_id, 0, 'PluginGlpiinventoryIPRange', 1, "Unable to find agent to run this job" ); $input_taskjob = []; $input_taskjob['id'] = $pfTaskjob->fields['id']; //$input_taskjob['status'] = 1; $pfTaskjob->update($input_taskjob); } else { $iptimes = 0; $nbIpadded = 0; $break = 0; $numberIpByAgent = ceil($count_ip / (count($a_agentlist))); $a_iprangelistTmp = $a_iprangelist; $ip_id = array_shift($a_iprangelistTmp); foreach ($a_agentlist as $agent_id => $ip) { //Add jobstate and put status (waiting on server = 0) $a_input = []; $a_input['plugin_glpiinventory_taskjobs_id'] = $taskjobs_id; $a_input['state'] = 0; $a_input['agents_id'] = $agent_id; $a_input['itemtype'] = 'PluginGlpiinventoryIPRange'; $a_input['uniqid'] = $uniqid; $a_input['execution_id'] = $pfTask->fields['execution_id']; // $nbIpAgent = $numberIpByAgent; $nbIpadded = 0; foreach ($a_iprangelist as $iprange_id) { if ($ip_id == $iprange_id) { $pfIPRange->getFromDB($iprange_id); $s = $pfIPRange->getIp2long($pfIPRange->fields['ip_start']); $e = $pfIPRange->getIp2long($pfIPRange->fields['ip_end']); $a_input['items_id'] = $iprange_id; $nbIpAgent = $numberIpByAgent - $nbIpadded; if (($iptimes + $nbIpAgent) > ($e - $s)) { $a_input['specificity'] = $iptimes . "-" . ($e - $s); $nbIpadded = ($e - $s) - $iptimes; $ip_id = array_shift($a_iprangelistTmp); $iptimes = 0; } else { $a_input['specificity'] = $iptimes . "-" . ($iptimes + $nbIpAgent); $iptimes += $nbIpAgent + 1; $nbIpadded = 0; $break = 1; } $Taskjobstates_id = $pfTaskjobstate->add($a_input); //Add log of taskjob $a_input['plugin_glpiinventory_taskjobstates_id'] = $Taskjobstates_id; $a_input['state'] = 7; $a_input['date'] = date("Y-m-d H:i:s"); $pfTaskjoblog->add($a_input); unset($a_input['state']); } } $input_taskjob = []; $input_taskjob['id'] = $pfTaskjob->fields['id']; $input_taskjob['status'] = 1; $pfTaskjob->update($input_taskjob); } } return $uniqid; } /** * When agent contact server, this function send job data to agent * * @param object $jobstate PluginGlpiinventoryTaskjobstate instance * @return array */ public function run($jobstate) { $agent = new Agent(); $pfTaskjobstate = new PluginGlpiinventoryTaskjobstate(); $pfTaskjob = new PluginGlpiinventoryTaskjob(); $pfTaskjoblog = new PluginGlpiinventoryTaskjoblog(); $pfIPRange = new PluginGlpiinventoryIPRange(); $pfToolbox = new PluginGlpiinventoryToolbox(); $pfConfig = new PluginGlpiinventoryConfig(); $agent->getFromDB($jobstate->fields['agents_id']); $param_attrs = []; // Use general config when threads number is set to 0 on the agent $param_attrs['THREADS_DISCOVERY'] = $agent->fields["threads_networkdiscovery"] == 0 ? $pfConfig->getValue('threads_networkdiscovery') : $agent->fields["threads_networkdiscovery"]; // Use general config when timeout is set to 0 on the agent $param_attrs['TIMEOUT'] = $agent->fields["timeout_networkdiscovery"] == 0 ? $pfConfig->getValue('timeout_networkdiscovery') : $agent->fields["timeout_networkdiscovery"]; $param_attrs['PID'] = $jobstate->fields['id']; $iprange_attrs = []; $changestate = 0; $taskjobstatedatas = $jobstate->fields; $pfTaskjob->getFromDB($taskjobstatedatas['plugin_glpiinventory_taskjobs_id']); $pfTaskjobstate->getFromDB($taskjobstatedatas['id']); $pfIPRange->getFromDB($taskjobstatedatas['items_id']); $iprange_attrs['ID'] = $pfIPRange->fields['id']; if (!is_null($pfTaskjobstate->fields['specificity'])) { $a_split = explode("-", $pfTaskjobstate->fields['specificity']); $first_ip = $pfIPRange->getIp2long($pfIPRange->fields["ip_start"]); $last_ip = long2ip($first_ip + (int)$a_split[1]); $first_ip = long2ip($first_ip + (int)$a_split[0]); if ($first_ip != '0.0.0.0' && $last_ip != '0.0.0.0') { $iprange_attrs['IPSTART'] = $first_ip; $iprange_attrs['IPEND'] = $last_ip; } } else { $iprange_attrs['IPSTART'] = $pfIPRange->fields["ip_start"]; $iprange_attrs['IPEND'] = $pfIPRange->fields["ip_end"]; } $iprange_attrs['ENTITY'] = $pfIPRange->fields["entities_id"]; if ($changestate == '0') { $pfTaskjobstate->changeStatus($pfTaskjobstate->fields['id'], 1); $pfTaskjoblog->addTaskjoblog( $pfTaskjobstate->fields['id'], '0', 'Agent', '1', $agent->fields["threads_networkdiscovery"] . ' threads ' . $agent->fields["timeout_networkdiscovery"] . ' timeout' ); $changestate = $pfTaskjobstate->fields['id']; } else { $pfTaskjobstate->changeStatusFinish( $pfTaskjobstate->fields['id'], $taskjobstatedatas['items_id'], $taskjobstatedatas['itemtype'], 0, "Merged with " . $changestate ); } $iprange_credentials = new PluginGlpiinventoryIPRange_SNMPCredential(); $a_auths = $iprange_credentials->find( ['plugin_glpiinventory_ipranges_id' => $pfIPRange->fields['id']], ['rank'] ); $auth_nodes = []; foreach ($a_auths as $dataAuth) { $auth_node = $pfToolbox->addAuth($dataAuth['snmpcredentials_id']); if (count($auth_node)) { $auth_nodes[] = $auth_node; } } return [ 'OPTION' => [ 'NAME' => 'NETDISCOVERY', 'PARAM' => [ 'content' => '', 'attributes' => $param_attrs ], 'RANGEIP' => [ 'content' => '', 'attributes' => $iprange_attrs ] ] + $auth_nodes ]; } }