function prepareRun($taskjobs_id)
 {
     $pfTask = new PluginFusioninventoryTask();
     $pfTaskjob = new PluginFusioninventoryTaskjob();
     $pfTaskjoblog = new PluginFusioninventoryTaskjoblog();
     $pfTaskjobstate = new PluginFusioninventoryTaskjobstate();
     $pfAgentmodule = new PluginFusioninventoryAgentmodule();
     $pfIPRange = new PluginFusioninventoryIPRange();
     $pfAgent = new PluginFusioninventoryAgent();
     $uniqid = uniqid();
     $pfTaskjob->getFromDB($taskjobs_id);
     $pfTask->getFromDB($pfTaskjob->fields['plugin_fusioninventory_tasks_id']);
     $communication = $pfTask->fields['communication'];
     //list all iprange
     $a_iprange = importArrayFromDB($pfTaskjob->fields['definition']);
     $count_ip = 0;
     $a_iprangelist = array();
     $a_subnet_nbip = array();
     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 = array();
     foreach ($a_agent as $agent) {
         $agent_id = current($agent);
         if ($agent_id == '.1') {
             $dynagent = 1;
         } else {
             if ($agent_id == '.2') {
                 $dynagent = 2;
             } else {
                 // Detect if agent exists
                 if ($pfAgent->getFromDB($agent_id)) {
                     if ($pfTask->fields['communication'] == 'pull') {
                         $a_agentlist[$agent_id] = 1;
                     } else {
                         if ($pfTaskjob->isAgentAlive('1', $agent_id)) {
                             $a_agentlist[$agent_id] = 1;
                         }
                     }
                 }
             }
         }
     }
     if ($dynagent == '1') {
         $a_agents = $pfAgentmodule->getAgentsCanDo('NETWORKDISCOVERY');
         foreach ($a_agents as $data) {
             if ($count_ip / 10 >= count($a_agentlist)) {
                 $pfAgent->getFromDB($data['id']);
                 $a_ip = $pfAgent->getIPs();
                 foreach ($a_ip as $ip) {
                     if ($pfTask->fields['communication'] == 'push') {
                         if ($pfTaskjob->isAgentAlive('1', $data['id'])) {
                             $a_agentlist[$data['id']] = 1;
                         }
                     } else {
                         if ($pfTask->fields['communication'] == 'pull') {
                             $a_agentlist[$data['id']] = 1;
                         }
                     }
                 }
             }
         }
     }
     if ($dynagent == '2') {
         // Dynamic with subnet
         $pfSnmpinventory = new PluginFusioninventoryNetworkinventory();
         $taskvalid = 0;
         foreach ($a_subnet_nbip as $iprange_id => $nbips) {
             //$maxagentpossible = $nbips/10;
             $pfIPRange->getFromDB($iprange_id);
             $a_agentListComplete = array();
             $a_agentList = $pfSnmpinventory->getAgentsSubnet($nbips, "push", "", $pfIPRange->fields['ip_start'], $pfIPRange->fields['ip_end']);
             if (isset($a_agentList)) {
                 $a_agentListComplete = array_merge($a_agentListComplete, $a_agentList);
             }
             if (!isset($a_agentListComplete) or empty($a_agentListComplete)) {
                 $a_input = array();
                 $a_input['plugin_fusioninventory_taskjobs_id'] = $taskjobs_id;
                 $a_input['plugin_fusioninventory_agents_id'] = 0;
                 $a_input['state'] = 1;
                 $a_input['itemtype'] = 'PluginFusioninventoryIPRange';
                 $a_input['items_id'] = $iprange_id;
                 $a_input['uniqid'] = $uniqid;
                 $a_input['execution_id'] = $task->fields['execution_id'];
                 $Taskjobstates_id = $pfTaskjobstate->add($a_input);
                 //Add log of taskjob
                 $a_input['plugin_fusioninventory_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, 'PluginFusioninventoryIPRange', 1, "Unable to find agent to run this job");
                 $input_taskjob = array();
                 $input_taskjob['id'] = $pfTaskjob->fields['id'];
                 //$input_taskjob['status'] = 1;
                 $pfTaskjob->update($input_taskjob);
             } else {
                 $s = $pfIPRange->getIp2long($pfIPRange->fields['ip_start']);
                 $e = $pfIPRange->getIp2long($pfIPRange->fields['ip_end']);
                 $nbIpAgent = ceil(($e - $s) / count($a_agentListComplete));
                 $iptimes = 0;
                 foreach ($a_agentListComplete as $agent_id) {
                     $_SESSION['glpi_plugin_fusioninventory']['agents'][$agent_id] = 1;
                     //Add jobstate and put status (waiting on server = 0)
                     $a_input = array();
                     $a_input['plugin_fusioninventory_taskjobs_id'] = $taskjobs_id;
                     $a_input['state'] = 0;
                     $a_input['plugin_fusioninventory_agents_id'] = $agent_id;
                     $a_input['itemtype'] = 'PluginFusioninventoryIPRange';
                     $a_input['uniqid'] = $uniqid;
                     $a_input['execution_id'] = $task->fields['execution_id'];
                     $a_input['items_id'] = $iprange_id;
                     if ($iptimes + $nbIpAgent > $e - $s) {
                         $a_input['specificity'] = $iptimes . "-" . ($e - $s);
                     } else {
                         $a_input['specificity'] = $iptimes . "-" . ($iptimes + $nbIpAgent);
                     }
                     $taskvalid++;
                     $Taskjobstates_id = $pfTaskjobstate->add($a_input);
                     //Add log of taskjob
                     $a_input['plugin_fusioninventory_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']);
                     $iptimes += $nbIpAgent + 1;
                     if ($iptimes >= $e - $s + 1) {
                         break;
                     }
                     $input_taskjob = array();
                     $input_taskjob['id'] = $pfTaskjob->fields['id'];
                     $input_taskjob['status'] = 1;
                     $pfTaskjob->update($input_taskjob);
                 }
             }
         }
         if ($taskvalid == "0") {
             $pfTaskjob->reinitializeTaskjobs($pfTaskjob->fields['plugin_fusioninventory_tasks_id']);
         }
         // *** Add jobstate
     } else {
         if (count($a_agentlist) == 0) {
             $a_input = array();
             $a_input['plugin_fusioninventory_taskjobs_id'] = $taskjobs_id;
             $a_input['state'] = 1;
             $a_input['plugin_fusioninventory_agents_id'] = 0;
             $a_input['itemtype'] = 'PluginFusioninventoryIPRange';
             $a_input['items_id'] = 0;
             $a_input['uniqid'] = $uniqid;
             $a_input['execution_id'] = $task->fields['execution_id'];
             $Taskjobstates_id = $pfTaskjobstate->add($a_input);
             //Add log of taskjob
             $a_input['plugin_fusioninventory_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, 'PluginFusioninventoryIPRange', 1, "Unable to find agent to run this job");
             $input_taskjob = array();
             $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 = array();
                 $a_input['plugin_fusioninventory_taskjobs_id'] = $taskjobs_id;
                 $a_input['state'] = 0;
                 $a_input['plugin_fusioninventory_agents_id'] = $agent_id;
                 $a_input['itemtype'] = 'PluginFusioninventoryIPRange';
                 $a_input['uniqid'] = $uniqid;
                 $a_input['execution_id'] = $task->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']);
                         if ($communication == "push") {
                             $_SESSION['glpi_plugin_fusioninventory']['agents'][$agent_id] = 1;
                         }
                         $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_fusioninventory_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 = array();
                 $input_taskjob['id'] = $pfTaskjob->fields['id'];
                 $input_taskjob['status'] = 1;
                 $pfTaskjob->update($input_taskjob);
             }
         }
     }
     return $uniqid;
 }
 function getAgentsSubnet($nb_computers, $communication, $subnet = '', $ipstart = '', $ipend = '')
 {
     global $DB;
     $pfTaskjob = new PluginFusioninventoryTaskjob();
     $pfAgentmodule = new PluginFusioninventoryAgentmodule();
     // Number of computers min by agent
     $nb_computerByAgentMin = 20;
     $nb_agentsMax = ceil($nb_computers / $nb_computerByAgentMin);
     $a_agentList = array();
     if ($subnet != '') {
         $subnet = " AND `glpi_ipaddresses`.`name` LIKE '" . $subnet . "%' ";
     } else {
         if ($ipstart != '' and $ipend != '') {
             $subnet = " AND ( INET_ATON(`glpi_ipaddresses`.`name`) > INET_ATON('" . $ipstart . "')\n            AND  INET_ATON(`glpi_ipaddresses`.`name`) < INET_ATON('" . $ipend . "') ) ";
         }
     }
     $a_agents = $pfAgentmodule->getAgentsCanDo('NETWORKINVENTORY');
     $a_agentsid = array();
     foreach ($a_agents as $a_agent) {
         $a_agentsid[] = $a_agent['id'];
     }
     if (count($a_agentsid) == '0') {
         return $a_agentList;
     }
     $where = " AND `glpi_plugin_fusioninventory_agents`.`ID` IN (";
     $where .= implode(', ', $a_agentsid);
     $where .= ")\n         AND `glpi_ipaddresses`.`name` != '127.0.0.1' ";
     $query = "SELECT `glpi_plugin_fusioninventory_agents`.`id` as `a_id`,\n         `glpi_ipaddresses`.`name` as ip, token\n         FROM `glpi_plugin_fusioninventory_agents`\n         LEFT JOIN `glpi_networkports`\n            ON `glpi_networkports`.`items_id` = `glpi_plugin_fusioninventory_agents`.`computers_id`\n         LEFT JOIN `glpi_networknames`\n              ON `glpi_networknames`.`items_id`=`glpi_networkports`.`id`\n                 AND `glpi_networknames`.`itemtype`='NetworkPort'\n         LEFT JOIN `glpi_ipaddresses`\n              ON `glpi_ipaddresses`.`items_id`=`glpi_networknames`.`id`\n                 AND `glpi_ipaddresses`.`itemtype`='NetworkName'\n         LEFT JOIN `glpi_computers`\n            ON `glpi_computers`.`id` = `glpi_plugin_fusioninventory_agents`.`computers_id`\n         WHERE `glpi_networkports`.`itemtype`='Computer'\n            " . $subnet . "\n            " . $where . " ";
     Toolbox::logInFile('NET', $query);
     $result = $DB->query($query);
     if ($result) {
         while ($data = $DB->fetch_array($result)) {
             if ($communication == 'push') {
                 if ($pfTaskjob->isAgentAlive("1", $data['a_id'])) {
                     if (!in_array($a_agentList, $data['a_id'])) {
                         $a_agentList[] = $data['a_id'];
                         if (count($a_agentList) >= $nb_agentsMax) {
                             return $a_agentList;
                         }
                     }
                 }
             } else {
                 if ($communication == 'pull') {
                     if (!in_array($data['a_id'], $a_agentList)) {
                         $a_agentList[] = $data['a_id'];
                         if (count($a_agentList) > $nb_agentsMax) {
                             return $a_agentList;
                         }
                     }
                 }
             }
         }
     }
     return $a_agentList;
 }
 function getAgentsSubnet($nb_computers, $communication, $subnet = '')
 {
     global $DB;
     $pfTaskjob = new PluginFusioninventoryTaskjob();
     $pfAgentmodule = new PluginFusioninventoryAgentmodule();
     $OperatingSystem = new OperatingSystem();
     // Number of computers min by agent
     $nb_computerByAgentMin = 20;
     $nb_agentsMax = ceil($nb_computers / $nb_computerByAgentMin);
     // Get ids of operating systems which can make real wakeonlan
     $a_os = $OperatingSystem->find(" `name` LIKE '%Linux%' ");
     $osfind = '(';
     $i = 0;
     foreach ($a_os as $os_id => $data) {
         $comma = '';
         if ($i > 0) {
             $comma = ', ';
         }
         $osfind .= $comma . $os_id;
         $i++;
     }
     $osfind .= ')';
     $pass_count = 1;
     if ($osfind == '()') {
         $osfind = '';
     } else {
         $pass_count++;
         $osfind = 'AND operatingsystems_id IN ' . $osfind;
     }
     $a_agentList = array();
     for ($pass = 0; $pass < $pass_count; $pass++) {
         if ($pass == "1") {
             // It's not linux
             $osfind = str_replace('AND operatingsystems_id IN ', 'AND operatingsystems_id NOT IN ', $osfind);
         }
         if ($subnet != '') {
             $subnet = " AND subnet='" . $subnet . "' ";
         }
         $a_agents = $pfAgentmodule->getAgentsCanDo('WAKEONLAN');
         $a_agentsid = array();
         foreach ($a_agents as $a_agent) {
             $a_agentsid[] = $a_agent['id'];
         }
         if (count($a_agentsid) == '0') {
             return $a_agentList;
         }
         $where = " AND `glpi_plugin_fusioninventory_agents`.`ID` IN (";
         $where .= implode(', ', $a_agentsid);
         $where .= ")\n            AND `ip` != '127.0.0.1' ";
         $query = "SELECT `glpi_plugin_fusioninventory_agents`.`id` as `a_id`, ip, subnet, token\n            FROM `glpi_plugin_fusioninventory_agents`\n            LEFT JOIN `glpi_networkports` ON `glpi_networkports`.`items_id` =\n               `glpi_plugin_fusioninventory_agents`.`items_id`\n            LEFT JOIN `glpi_computers` ON `glpi_computers`.`id` =\n               `glpi_plugin_fusioninventory_agents`.`items_id`\n            WHERE `glpi_networkports`.`itemtype`='Computer'\n               " . $subnet . "\n               " . $osfind . "\n               " . $where . " ";
         if ($result = $DB->query($query)) {
             while ($data = $DB->fetch_array($result)) {
                 if ($communication == 'push') {
                     if ($pfTaskjob->isAgentAlive(1, $data['a_id'])) {
                         if (!in_array($a_agentList, $data['a_id'])) {
                             $a_agentList[] = $data['a_id'];
                             if (count($a_agentList) >= $nb_agentsMax) {
                                 return $a_agentList;
                             }
                         }
                     }
                 } else {
                     if ($communication == 'pull') {
                         if (!in_array($a_agentList, $data['a_id'])) {
                             $a_agentList[] = $data['a_id'];
                             if (count($a_agentList) > $nb_agentsMax) {
                                 return $a_agentList;
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 /**
  * Get all agents allowed to a module (task method)
  *
  * @param $module value name of dropdown
  *
  * @return array [id integed agent id] => $name value agent name
  *
  **/
 function get_agents($module)
 {
     $array = array();
     $array[".1"] = " " . __('Auto managenement dynamic of agents', 'fusioninventory');
     $array[".2"] = " " . __('Auto managenement dynamic of agents (same subnet)', 'fusioninventory');
     $pfAgentmodule = new PluginFusioninventoryAgentmodule();
     $array1 = $pfAgentmodule->getAgentsCanDo(strtoupper($module));
     foreach ($array1 as $id => $data) {
         $array[$id] = $data['name'];
     }
     asort($array);
     return $array;
 }
 static function task_networkdiscovery_agents()
 {
     $array = array();
     $array["-.1"] = __('Auto managenement dynamic of agents', 'fusioninventory');
     $pfAgentmodule = new PluginFusioninventoryAgentmodule();
     $array1 = $pfAgentmodule->getAgentsCanDo('NETWORKDISCOVERY');
     foreach ($array1 as $id => $data) {
         $array["PluginFusioninventoryAgent-" . $id] = __('Auto managenement dynamic of agents', 'fusioninventory') . " - " . $data['name'];
     }
     return $array;
 }