/** * After rules import device * * @param integer $items_id id of the device in GLPI DB (0 = created, other = merge) * @param varchar $itemtype itemtype of the device * * @return type */ function rulepassed($items_id, $itemtype) { PluginFusioninventoryLogger::logIfExtradebug("pluginFusioninventory-rules", "Rule passed : " . $items_id . ", " . $itemtype . "\n"); PluginFusioninventoryLogger::logIfExtradebugAndDebugMode('fusioninventorycommunication', 'Function PluginFusinvsnmpCommunicationSNMPQuery->rulepassed().'); $_SESSION["plugin_fusioninventory_entity"] = 0; PluginFusioninventoryConfig::logIfExtradebug("pluginFusioninventory-rules", "Rule passed : " . $items_id . ", " . $itemtype . "\n"); PluginFusioninventoryCommunication::addLog('Function PluginFusioninventoryCommunicationNetworkInventory->rulepassed().'); $a_inventory = $_SESSION['SOURCE_XMLDEVICE']; $errors = ''; $class = new $itemtype(); if ($items_id == "0") { $input = array(); $input['date_mod'] = date("Y-m-d H:i:s"); if ($class->getFromDB($a_inventory[$a_inventory['itemtype']]['id'])) { $input['entities_id'] = $class->fields['entities_id']; } else { $input['entities_id'] = 0; } if (!isset($_SESSION['glpiactiveentities_string'])) { $_SESSION['glpiactiveentities_string'] = "'" . $input['entities_id'] . "'"; } $_SESSION["plugin_fusioninventory_entity"] = $input['entities_id']; $items_id = $class->add($input); if (isset($_SESSION['plugin_fusioninventory_rules_id'])) { $pfRulematchedlog = new PluginFusioninventoryRulematchedlog(); $inputrulelog = array(); $inputrulelog['date'] = date('Y-m-d H:i:s'); $inputrulelog['rules_id'] = $_SESSION['plugin_fusioninventory_rules_id']; if (isset($_SESSION['plugin_fusioninventory_agents_id'])) { $inputrulelog['plugin_fusioninventory_agents_id'] = $_SESSION['plugin_fusioninventory_agents_id']; } $inputrulelog['items_id'] = $items_id; $inputrulelog['itemtype'] = $itemtype; $inputrulelog['method'] = 'snmpinventory'; $pfRulematchedlog->add($inputrulelog); $pfRulematchedlog->cleanOlddata($items_id, $itemtype); unset($_SESSION['plugin_fusioninventory_rules_id']); } } if ($itemtype == "PluginFusioninventoryUnmanaged") { $class->getFromDB($items_id); $input = array(); $input['id'] = $class->fields['id']; if (!empty($a_inventory[$a_inventory['itemtype']]['name'])) { $input['name'] = $a_inventory[$a_inventory['itemtype']]['name']; } if (!empty($a_inventory[$a_inventory['itemtype']]['serial'])) { $input['serial'] = $a_inventory[$a_inventory['itemtype']]['serial']; } if (!empty($a_inventory['itemtype'])) { $input['itemtype'] = $a_inventory['itemtype']; } // TODO : add import ports PluginFusioninventoryToolbox::writeXML($items_id, serialize($_SESSION['SOURCE_XMLDEVICE']), 'PluginFusioninventoryUnmanaged'); $class->update($input); $_SESSION['plugin_fusinvsnmp_taskjoblog']['comment'] = '[==detail==] ==updatetheitem== Update ' . PluginFusioninventoryUnmanaged::getTypeName() . ' [[PluginFusioninventoryUnmanaged::' . $items_id . ']]'; $this->addtaskjoblog(); } else { $_SESSION['plugin_fusinvsnmp_taskjoblog']['comment'] = '[==detail==] Update ' . $class->getTypeName() . ' [[' . $itemtype . '::' . $items_id . ']]'; $this->addtaskjoblog(); $errors .= $this->importDevice($itemtype, $items_id, $a_inventory); } return $errors; }
/** * Prepare data and send them to rule engine * * @param type $p_xml simpleXML object */ function sendCriteria($arrayinventory) { PluginFusioninventoryCommunication::addLog('Function PluginFusioninventoryCommunicationNetworkDiscovery->sendCriteria().'); if (isset($arrayinventory['MAC']) && $arrayinventory['MAC'] == "00:00:00:00:00:00") { unset($arrayinventory['MAC']); } $_SESSION['SOURCE_XMLDEVICE'] = $arrayinventory; $input = array(); // Global criterias if (isset($arrayinventory['SERIAL']) && !empty($arrayinventory['SERIAL'])) { $input['serial'] = $arrayinventory['SERIAL']; } if (isset($arrayinventory['MAC']) && !empty($arrayinventory['MAC'])) { $input['mac'][] = $arrayinventory['MAC']; } if (isset($arrayinventory['IP']) && !empty($arrayinventory['IP'])) { $input['ip'][] = $arrayinventory['IP']; } if (isset($arrayinventory['MODELSNMP']) && !empty($arrayinventory['MODELSNMP'])) { $input['model'] = $arrayinventory['MODELSNMP']; } if (isset($arrayinventory['SNMPHOSTNAME']) && !empty($arrayinventory['SNMPHOSTNAME'])) { $input['name'] = $arrayinventory['SNMPHOSTNAME']; } else { if (isset($arrayinventory['NETBIOSNAME']) && !empty($arrayinventory['NETBIOSNAME'])) { $input['name'] = $arrayinventory['NETBIOSNAME']; } else { if (isset($arrayinventory['DNSHOSTNAME']) && !empty($arrayinventory['DNSHOSTNAME'])) { if (strpos($arrayinventory['DNSHOSTNAME'], '.') !== false) { $splitname = explode('.', $arrayinventory['DNSHOSTNAME']); $input['name'] = $splitname[0]; if (!isset($arrayinventory['WORKGROUP'])) { unset($splitname[0]); $arrayinventory['WORKGROUP'] = implode('.', $splitname); $_SESSION['SOURCE_XMLDEVICE'] = $arrayinventory; } } else { $input['name'] = $arrayinventory['DNSHOSTNAME']; } } } } if (!isset($arrayinventory['ENTITY'])) { $arrayinventory['ENTITY'] = 0; } $input['entities_id'] = $arrayinventory['ENTITY']; if (isset($arrayinventory['TYPE'])) { switch ($arrayinventory['TYPE']) { case '1': case 'COMPUTER': $input['itemtype'] = "Computer"; // Computer break; case '2': case 'NETWORKING': $input['itemtype'] = "NetworkEquipment"; break; case '3': case 'PRINTER': $input['itemtype'] = "Printer"; break; } } $_SESSION['plugin_fusinvsnmp_datacriteria'] = serialize($input); $_SESSION['plugin_fusioninventory_classrulepassed'] = "PluginFusioninventoryCommunicationNetworkDiscovery"; $rule = new PluginFusioninventoryInventoryRuleImportCollection(); $data = $rule->processAllRules($input, array()); PluginFusioninventoryConfig::logIfExtradebug("pluginFusioninventory-rules", $data); if (isset($data['action']) && $data['action'] == PluginFusioninventoryInventoryRuleImport::LINK_RESULT_DENIED) { $a_text = ''; foreach ($input as $key => $data) { if (is_array($data)) { $a_text[] = "[" . $key . "]:" . implode(", ", $data); } else { $a_text[] = "[" . $key . "]:" . $data; } } $_SESSION['plugin_fusinvsnmp_taskjoblog']['comment'] = '==importdenied== ' . implode(", ", $a_text); $this->addtaskjoblog(); $pfIgnoredimport = new PluginFusioninventoryIgnoredimportdevice(); $inputdb = array(); if (isset($input['name'])) { $inputdb['name'] = $input['name']; } $inputdb['date'] = date("Y-m-d H:i:s"); if (isset($input['itemtype'])) { $inputdb['itemtype'] = $input['itemtype']; } if (isset($input['serial'])) { $input['serial'] = $input['serial']; } if (isset($input['ip'])) { $inputdb['ip'] = exportArrayToDB($input['ip']); } if (isset($input['mac'])) { $inputdb['mac'] = exportArrayToDB($input['mac']); } if (isset($input['uuid'])) { $inputdb['uuid'] = $input['uuid']; } $inputdb['rules_id'] = $_SESSION['plugin_fusioninventory_rules_id']; $inputdb['method'] = 'netdiscovery'; $pfIgnoredimport->add($inputdb); unset($_SESSION['plugin_fusioninventory_rules_id']); } if (isset($data['_no_rule_matches']) and $data['_no_rule_matches'] == '1') { if (!isset($_SESSION['glpiactiveentities_string'])) { $_SESSION['glpiactiveentities_string'] = "'" . $input['entities_id'] . "'"; } if (isset($input['itemtype']) && isset($data['action']) && $data['action'] == PluginFusioninventoryInventoryRuleImport::LINK_RESULT_CREATE) { $this->rulepassed(0, $input['itemtype'], $input['entities_id']); } else { if (isset($input['itemtype']) and !isset($data['action'])) { $this->rulepassed(0, $input['itemtype'], $input['entities_id']); } else { $this->rulepassed(0, "PluginFusioninventoryUnmanaged", $input['entities_id']); } } } }
/** * Manage communication with old protocol (XML over POST) * **/ function handleOCSCommunication($rawdata, $xml = '', $output = 'ext') { // ***** For debug only ***** // //$rawdata = gzcompress(''); // ********** End ********** // $config = new PluginFusioninventoryConfig(); $user = new User(); // ob_start(); if (!isset($_SESSION['glpiID'])) { $users_id = $config->getValue('users_id'); $_SESSION['glpiID'] = $users_id; $user->getFromDB($users_id); Session::changeActiveEntities(); $_SESSION["glpiname"] = $user->getField('name'); $_SESSION['glpiactiveprofile'] = array(); $_SESSION['glpiactiveprofile']['interface'] = 'central'; $_SESSION['glpiactiveprofile']['internet'] = 'w'; $_SESSION['glpiactiveprofile']['computer'] = 'w'; $_SESSION['glpiactiveprofile']['monitor'] = 'w'; $_SESSION['glpiactiveprofile']['printer'] = 'w'; $_SESSION['glpiactiveprofile']['peripheral'] = 'w'; $_SESSION['glpiactiveprofile']['networking'] = 'w'; $_SESSION["glpi_plugin_fusioninventory_profile"]['unmanaged'] = 'w'; } $communication = new PluginFusioninventoryCommunication(); $pfToolbox = new PluginFusioninventoryToolbox(); // identify message compression algorithm $agent = new PluginFusioninventoryAgent(); $agent->disableDebug(); $compressmode = ''; if (!empty($xml)) { $compressmode = 'none'; } else { if ($_SERVER['CONTENT_TYPE'] == "application/x-compress-zlib") { $xml = gzuncompress($rawdata); $compressmode = "zlib"; } else { if ($_SERVER['CONTENT_TYPE'] == "application/x-compress-gzip") { $xml = $pfToolbox->gzdecode($rawdata); $compressmode = "gzip"; } else { if ($_SERVER['CONTENT_TYPE'] == "application/xml") { $xml = $rawdata; $compressmode = 'none'; } else { # try each algorithm successively if ($xml = gzuncompress($rawdata)) { $compressmode = "zlib"; } else { if ($xml = $pfToolbox->gzdecode($rawdata)) { $compressmode = "gzip"; } else { if ($xml = gzinflate(substr($rawdata, 2))) { // accept deflate for OCS agent 2.0 compatibility, // but use zlib for answer if (strstr($xml, "<QUERY>PROLOG</QUERY>") and !strstr($xml, "<TOKEN>")) { $compressmode = "zlib"; } else { $compressmode = "deflate"; } } else { $xml = $rawdata; $compressmode = 'none'; } } } } } } } $agent->restoreDebug(); // check if we are in ssl only mode $ssl = $config->getValue('ssl_only'); if ($ssl == "1" and (!isset($_SERVER["HTTPS"]) or $_SERVER["HTTPS"] != "on")) { if ($output == 'glpi') { Session::addMessageAfterRedirect('SSL REQUIRED BY SERVER', false, ERROR); } else { $communication->setMessage("<?xml version='1.0' encoding='UTF-8'?>\n<REPLY>\n <ERROR>SSL REQUIRED BY SERVER</ERROR>\n</REPLY>"); $communication->sendMessage($compressmode); } return; } PluginFusioninventoryConfig::logIfExtradebug('pluginFusioninventory-dial' . uniqid(), $xml); // Check XML integrity $pxml = ''; if ($pxml = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)) { } else { if ($pxml = @simplexml_load_string(utf8_encode($xml), 'SimpleXMLElement', LIBXML_NOCDATA)) { $xml = utf8_encode($xml); } else { $xml = preg_replace('/<FOLDER>.*?<\\/SOURCE>/', '', $xml); $pxml = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); if (!$pxml) { if ($output == 'glpi') { Session::addMessageAfterRedirect('XML not well formed!', false, ERROR); } else { $communication->setMessage("<?xml version='1.0' encoding='UTF-8'?>\n<REPLY>\n <ERROR>XML not well formed!</ERROR>\n</REPLY>"); $communication->sendMessage($compressmode); } return; } } } $_SESSION['plugin_fusioninventory_compressmode'] = $compressmode; // Convert XML into PHP array $arrayinventory = PluginFusioninventoryFormatconvert::XMLtoArray($pxml); unset($pxml); $deviceid = ''; if (isset($arrayinventory['DEVICEID'])) { $deviceid = $arrayinventory['DEVICEID']; } $agent = new PluginFusioninventoryAgent(); $agents_id = $agent->importToken($arrayinventory); $_SESSION['plugin_fusioninventory_agents_id'] = $agents_id; if (!$communication->import($arrayinventory)) { if ($deviceid != '') { $communication->setMessage("<?xml version='1.0' encoding='UTF-8'?>\n<REPLY>\n</REPLY>"); $a_agent = $agent->InfosByKey($deviceid); // Get taskjob in waiting $communication->getTaskAgent($a_agent['id']); // ******** Send XML $communication->addInventory($a_agent['id']); $communication->addProlog(); $communication->sendMessage($compressmode); } } else { if ($output == 'glpi') { Session::addMessageAfterRedirect('XML has been imported succesfully!'); } else { $communication->setMessage("<?xml version='1.0' encoding='UTF-8'?>\n<REPLY>\n</REPLY>"); $communication->sendMessage($compressmode); } } }