/** * Get port OID list for the SNMP model && create ports in DB if they don't exists * * @param $ID_Device : ID of device * @param $type : type of device (NETWORKING_TYPE, PRINTER_TYPE ...) * @param $oidsModel : oid list from model SNMP * @param $oidvalues : list of values from agent query * @param $ArrayPort_LogicalNum_SNMPNum : array logical port number => SNMP port number (ifindex) * @param $ArrayPort_LogicalNum_SNMPName : array logical port number => SNMP Port name * * @return $oidList : array with logic number => portsID from snmp * **/ static function getOIDPorts($ID_Device, $type, $oidsModel, $oidvalues, $ArrayPort_LogicalNum_SNMPName, $ArrayPort_LogicalNum_SNMPNum) { global $DB, $LANG; if ($_SESSION['fusioninventory_logs'] == "1") { $logs = new PluginFusioninventoryLogs(); } $manufCisco = new PluginFusioninventoryManufacturerCisco(); $netwire = new Netwire(); $np = new Netport(); $ptp = new PluginFusioninventoryPort(); if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", ">>>>>>>>>> Get OID ports list (SNMP model) and create ports in DB if not exists <<<<<<<<<<", $type, $ID_Device, 1); } $portcounter = $oidvalues[$oidsModel[1][0][""]][""]; if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", "oid port counter : " . $oidsModel[1][0][""] . " = " . $portcounter, $type, $ID_Device, 1); } $oid_ifType = $oidsModel[0][1]['ifType']; if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", "type of port : " . $oid_ifType, $type, $ID_Device, 1); } asort($ArrayPort_LogicalNum_SNMPNum); // Reorder ports with good logic number $query = "SELECT `last_PID_update`\n FROM `glpi_plugin_fusioninventory_networking`\n WHERE `FK_networking`='" . $ID_Device . "'\n AND `last_PID_update`='0';"; $result = $DB->query($query); if ($DB->numrows($result) == 1) { foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) { $query_update = "UPDATE `glpi_networking_ports`\n SET `logical_number`='" . $ifIndex . "'\n WHERE `on_device`='" . $ID_Device . "'\n AND `device_type`='" . $type . "'\n AND `name`='" . $ArrayPort_LogicalNum_SNMPName[$num] . "';"; $DB->query($query_update); } } // Get query SNMP to have number of ports if (isset($portcounter) and !empty($portcounter)) { // ** Add ports in DataBase if they don't exists $logicalnumberlist = "("; foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) { //$i is the logical number $logicalnumberlist .= $ifIndex . ","; //for ($i=0 ; $i < $portcounter ; $i++) { // Get type of port $ifType = $oidvalues[$oid_ifType . "." . $ArrayPort_LogicalNum_SNMPNum[$num]][""]; $oidList[$i] = $ArrayPort_LogicalNum_SNMPNum[$num]; if (strstr($ifType, "ethernetCsmacd") or $ifType == "6" or $ifType == "ethernet-csmacd(6)" or strstr($ifType, "iso88023Csmacd") or $ifType == "7") { $goodname = 1; if ($manufCisco->ListVirtualPorts($oidvalues[".1.3.6.1.2.1.1.1.0"][""], $ArrayPort_LogicalNum_SNMPName[$num]) == true) { $goodname = 0; $deleteportname[] = $ifIndex; unset($oidList[$ifIndex]); } if ($goodname == 1) { $query = "SELECT `ID`, `name`\n FROM `glpi_networking_ports`\n WHERE `on_device`='" . $ID_Device . "'\n AND `device_type`='" . $type . "'\n AND `logical_number`='" . $ifIndex . "';"; $result = $DB->query($query); if ($DB->numrows($result) == 0) { unset($array); $array["logical_number"] = $ifIndex; $array["name"] = $ArrayPort_LogicalNum_SNMPName[$num]; $array["on_device"] = $ID_Device; $array["device_type"] = $type; $IDport = $np->add($array); Event::log(0, "networking", 5, "inventory", "FusionInventory " . $LANG["log"][70]); if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", "Add port in DB (glpi_networking_ports) : " . $ArrayPort_LogicalNum_SNMPName[$i], $type, $ID_Device, 1); } } else { $IDport = $DB->result($result, 0, "ID"); if ($DB->result($result, 0, "name") != $ArrayPort_LogicalNum_SNMPName[$num]) { unset($array); $array["name"] = $ArrayPort_LogicalNum_SNMPName[$num]; $array["ID"] = $DB->result($result, 0, "ID"); $np->update($array); if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", "Update port in DB (glpi_networking_ports) : ID" . $DB->result($result, 0, "ID") . " & name " . $ArrayPort_LogicalNum_SNMPName[$i], $type, $ID_Device, 1); } } } if ($type == NETWORKING_TYPE) { $queryFusionInventoryPort = "SELECT `ID`\n FROM `glpi_plugin_fusioninventory_networking_ports`\n WHERE `FK_networking_ports`='" . $IDport . "';"; $resultFusionInventoryPort = $DB->query($queryFusionInventoryPort); if ($DB->numrows($resultFusionInventoryPort) == 0) { $queryInsert = "INSERT INTO `glpi_plugin_fusioninventory_networking_ports`\n (`FK_networking_ports`)\n VALUES ('" . $IDport . "');"; $DB->query($queryInsert); if ($_SESSION['fusioninventory_logs'] == "1") { $logs->write("fusioninventory_fullsync", "Add port in DB (glpi_plugin_fusioninventory_networking_ports) : ID " . $IDport, $type, $ID_Device, 1); } } } } } } $logicalnumberlist .= ")"; } // Delete all ports that will be not here $nn = new NetworkPort_NetworkPort(); foreach ($deleteportname as $id => $i) { $query = "SELECT *\n FROM `glpi_networking_ports`\n WHERE `on_device`='" . $ID_Device . "'\n AND `device_type`='" . $type . "'\n AND `logical_number`='" . $i . "';"; $result = $DB->query($query); $data = $DB->fetch_assoc($result); PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($data['ID']), $FK_process); PluginFusioninventorySnmphistory::addLogConnection("remove", $data['ID'], $FK_process); if ($nn->getFromDBForNetworkPort($data['ID'])) { $nn->delete($data); } $ptp->deleteFromDB($data["ID"], 1); $np->delete($data); } // Delete ports where logical number in glpi_plugin_fusioninventory_networking_ports // not exist on switch : it's ports reorder not well $logicalnumberlist = str_replace(",)", ")", $logicalnumberlist); $query = "SELECT *\n FROM `glpi_networking_ports`\n WHERE `on_device`='" . $ID_Device . "'\n AND `device_type`='" . $type . "'\n AND `logical_number` NOT IN " . $logicalnumberlist . ";"; $result = $DB->query($query); while ($data = $DB->fetch_array($result)) { PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($data['ID']), $FK_process); PluginFusioninventorySnmphistory::addLogConnection("remove", $data['ID'], $FK_process); if ($nn->getFromDBForNetworkPort($data['ID'])) { $nn->delete($data); } $np->delete($data); $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ports`\n WHERE `FK_networking_ports`='" . $data["ID"] . "';"; $DB->query($query_delete); } return $oidList; }
function plugin_pre_item_purge_fusioninventory($parm) { global $DB; if (isset($parm["_item_type_"])) { switch ($parm["_item_type_"]) { case NETWORKING_TYPE: // Delete all ports $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking`\n WHERE `FK_networking`='" . $parm["ID"] . "';"; $DB->query($query_delete); $query_select = "SELECT `glpi_plugin_fusioninventory_networking_ports`.`ID`\n FROM `glpi_plugin_fusioninventory_networking_ports`\n LEFT JOIN `glpi_networking_ports`\n ON `glpi_networking_ports`.`ID` = `FK_networking_ports`\n WHERE `on_device`='" . $parm["ID"] . "'\n AND `device_type`='" . NETWORKING_TYPE . "';"; $result = $DB->query($query_select); while ($data = $DB->fetch_array($result)) { $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ports`\n WHERE `ID`='" . $data["ID"] . "';"; $DB->query($query_delete); } $query_select = "SELECT `glpi_plugin_fusioninventory_networking_ifaddr`.`ID`\n FROM `glpi_plugin_fusioninventory_networking_ifaddr`\n LEFT JOIN `glpi_networking`\n ON `glpi_networking`.`ID` = `FK_networking`\n WHERE `FK_networking`='" . $parm["ID"] . "';"; $result = $DB->query($query_select); while ($data = $DB->fetch_array($result)) { $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_networking_ifaddr`\n WHERE `ID`='" . $data["ID"] . "';"; $DB->query($query_delete); } break; case PRINTER_TYPE: $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers`\n WHERE `FK_printers`='" . $parm["ID"] . "';"; $DB->query($query_delete); $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers_cartridges`\n WHERE `FK_printers`='" . $parm["ID"] . "';"; $DB->query($query_delete); $query_delete = "DELETE FROM `glpi_plugin_fusioninventory_printers_history`\n WHERE `FK_printers`='" . $parm["ID"] . "';"; $DB->query($query_delete); break; case PLUGIN_FUSIONINVENTORY_MAC_UNKNOWN: // Delete ports and connections if exists $np = new Netport(); $nn = new NetworkPort_NetworkPort(); $query = "SELECT `ID`\n FROM `glpi_networking_ports`\n WHERE `on_device` = '" . $parm["ID"] . "'\n AND `device_type` = '" . PLUGIN_FUSIONINVENTORY_MAC_UNKNOWN . "';"; $result = $DB->query($query); while ($data = $DB->fetch_array($result)) { if ($nn->getFromDBForNetworkPort($data['ID'])) { $nn->delete($data); } $np->delete(array("ID" => $data["ID"])); } break; } } return $parm; }