%PDF- %PDF-
| Direktori : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/ |
| Current File : /var/www/projetos/suporte.iigd.com.br/plugins/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
];
}
}