Пример #1
0
 /**
  * Determine CDP ports (trunk)
  *
  * @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 $ArrayPortsID : array with port name and port ID (from DB)
  *
  * @return array of trunk ports
  *
  **/
 static function cdp_trunk($ID_Device, $type, $oidsModel, $oidvalues, $ArrayPort_LogicalNum_SNMPNum, $ArrayPortsID)
 {
     global $DB;
     $netwire = new Netwire();
     $nn = new NetworkPort_NetworkPort();
     $snmp_queries = new PluginFusioninventorySNMP();
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs = new PluginFusioninventoryLogs();
     }
     $walks = new PluginFusioninventoryWalk();
     $Threads = new PluginFusioninventoryProcesses();
     $tmpc = new PluginFusioninventoryTmpConnections();
     $manuf3com = new PluginFusioninventoryManufacturer3com();
     $manufCisco = new PluginFusioninventoryManufacturerCisco();
     $manufHP = new PluginFusioninventoryManufacturerHP();
     $Array_cdp_ifIndex = array();
     $Array_trunk_ifIndex = array();
     $Array_multiplemac_ifIndex = array();
     //$trunk_no_cdp = array();
     if ($_SESSION['fusioninventory_logs'] == "1") {
         $logs->write("fusioninventory_fullsync", ">>>>>>>>>> Networking : Get cdp trunk ports <<<<<<<<<<", $type, $ID_Device, 1);
     }
     switch (!false) {
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "Cisco IOS Software, C1"):
             $sysDescr = "Cisco IOS Software, C1";
             break;
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "Cisco"):
             $sysDescr = "Cisco";
             break;
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "ProCurve J"):
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "HP J4"):
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "PROCURVE J"):
             $sysDescr = "ProCurve J";
             break;
         case strstr($oidvalues[".1.3.6.1.2.1.1.1.0"][""], "3Com IntelliJack NJ225"):
             $sysDescr = "3Com IntelliJack NJ225";
             break;
     }
     // Detect if ports are non trunk and have multiple mac addresses
     // (with list of dot1dTpFdbPort & dot1dBasePortIfIndex)
     // Get all port_number
     $pass = 0;
     //$manufCisco->NbMacEachPort
     if ($sysDescr == "Cisco") {
         $Array_vlan = $walks->GetoidValuesFromWalk($oidvalues, $oidsModel[0][1]['vtpVlanName'], 1);
         if (array_count_values($Array_vlan) != 0 and array_count_values($Array_vlan) != 0) {
             $pass = 1;
             // Creation of var for each port
             foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) {
                 $Arraydot1dTpFdbPort[$ifIndex] = 0;
             }
             foreach ($Array_vlan as $num => $vlan) {
                 $ArrayPortNumber = $walks->GetoidValuesFromWalk($oidvalues, $oidsModel[0][1]['dot1dTpFdbPort'], 1, $vlan);
                 foreach ($ArrayPortNumber as $num => $dynamicdata) {
                     $BridgePortNumber = $oidvalues[$oidsModel[0][1]['dot1dTpFdbPort'] . "." . $dynamicdata][$vlan];
                     $Arraydot1dTpFdbPort[$oidvalues[$oidsModel[0][1]['dot1dBasePortIfIndex'] . "." . $BridgePortNumber][$vlan]]++;
                 }
             }
         }
     }
     if ($pass == "1") {
         foreach ($Arraydot1dTpFdbPort as $ifIndex => $num) {
             if ($num > 1) {
                 $Array_multiplemac_ifIndex[$ifIndex] = 1;
             }
         }
     } else {
         if ($pass == "0") {
             $Arraydot1dTpFdbPort = array();
             $ArrayConnectionsPort = $walks->GetoidValuesFromWalk($oidvalues, $oidsModel[0][1]['dot1dTpFdbPort'], 1);
             foreach ($ArrayConnectionsPort as $num => $Connectionkey) {
                 $Arraydot1dTpFdbPort[] = $oidvalues[$oidsModel[0][1]['dot1dTpFdbPort'] . "." . $Connectionkey][""];
             }
             $ArrayCount = array_count_values($Arraydot1dTpFdbPort);
             $ArrayPortNumber = $walks->GetoidValuesFromWalk($oidvalues, $oidsModel[0][1]['dot1dBasePortIfIndex'], 1);
             foreach ($ArrayPortNumber as $num => $PortNumber) {
                 if (isset($ArrayCount[$PortNumber]) and $ArrayCount[$PortNumber] > 1) {
                     $Array_multiplemac_ifIndex[$oidvalues[$oidsModel[0][1]['dot1dBasePortIfIndex'] . "." . $PortNumber][""]] = 1;
                 }
             }
         }
     }
     if ($sysDescr == "Cisco IOS Software, C1") {
         $Array_multiplemac_ifIndex[$oidvalues[$oidsModel[0][1]['dot1dBasePortIfIndex'] . ".3"][$vlan]] = 1;
     }
     // End detection of ports non trunk and have multiple mac addresses
     // Initialization of Trunk ports (Trunk in Cisco AND Tagged in other switchs)
     $Array_trunk_ifIndex = array();
     // ***** Get Trunk / taged ports
     switch ($sysDescr) {
         case "Cisco":
             $Array_trunk_ifIndex = $manufCisco->TrunkPorts($oidvalues, $oidsModel, $ID_Device, $type);
             break;
         case "ProCurve J":
             $Array_trunk_ifIndex = $manufHP->TrunkPorts($oidvalues, $oidsModel, $ID_Device, $type);
             break;
     }
     // ***** Get CDP ports
     switch ($sysDescr) {
         case "Cisco":
             list($Array_cdp_ifIndex, $Array_multiplemac_ifIndex) = $manufCisco->CDPPorts($oidvalues, $oidsModel, $ID_Device, $type, $Array_multiplemac_ifIndex);
             break;
         case "ProCurve J":
             list($Array_cdp_ifIndex, $Array_multiplemac_ifIndex) = $manufHP->CDPPorts($oidvalues, $oidsModel, $ID_Device, $type, $Array_multiplemac_ifIndex);
             break;
         case "3Com IntelliJack NJ225":
             $Array_multiplemac_ifIndex = $manuf3com->MultiplePorts();
             break;
     }
     // ** Update for all ports on this network device the field 'trunk' in
     // glpi_plugin_fusioninventory_networking_ports
     foreach ($ArrayPort_LogicalNum_SNMPNum as $num => $ifIndex) {
         $query = "SELECT *, `glpi_plugin_fusioninventory_networking_ports`.`ID` AS `sid`\n                FROM `glpi_networking_ports`\n                     LEFT JOIN `glpi_plugin_fusioninventory_networking_ports`\n                               ON `glpi_plugin_fusioninventory_networking_ports`.`FK_networking_ports` =\n                                  `glpi_networking_ports`.`ID`\n                WHERE `device_type`='2'\n                      AND `on_device`='" . $ID_Device . "'\n                      AND `logical_number`='" . $ifIndex . "';";
         $result = $DB->query($query);
         while ($data = $DB->fetch_array($result)) {
             // If trunk => 1
             if (isset($Array_trunk_ifIndex[$ifIndex]) and $Array_trunk_ifIndex[$ifIndex] == "1") {
                 if ($data['trunk'] != "1") {
                     $query_update = "UPDATE `glpi_plugin_fusioninventory_networking_ports`\n                                SET `trunk`='1'\n                                WHERE `ID`='" . $data['sid'] . "';";
                     $DB->query($query_update);
                     PluginFusioninventorySnmphistory::addLog($data["FK_networking_ports"], "trunk", "0", "1", "", $_SESSION['FK_process']);
                     // Remove vlan
                     $snmp_queries->CleanVlan($data['FK_networking_ports']);
                     $snmp_queries->CleanVlan($netwire->getOppositeContact($data['FK_networking_ports']));
                 }
                 // If multiple => -1
             } else {
                 if (isset($Array_multiplemac_ifIndex[$ifIndex]) and $Array_multiplemac_ifIndex[$ifIndex] == "1") {
                     if ($data['trunk'] != "-1") {
                         $query_update = "UPDATE `glpi_plugin_fusioninventory_networking_ports`\n                                SET `trunk`='-1'\n                                WHERE `ID`='" . $data['sid'] . "';";
                         $DB->query($query_update);
                         PluginFusioninventorySnmphistory::addLog($data["FK_networking_ports"], "trunk", "0", "-1", "", $_SESSION['FK_process']);
                         // Remove vlan
                         PluginFusioninventoryDb::lock_wire_check();
                         PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($data['FK_networking_ports']), $FK_process);
                         PluginFusioninventorySnmphistory::addLogConnection("remove", $data['FK_networking_ports'], $FK_process);
                         $snmp_queries->CleanVlan($data['FK_networking_ports']);
                         $snmp_queries->CleanVlan($netwire->getOppositeContact($data['FK_networking_ports']));
                         // Remove connection
                         if ($nn->getFromDBForNetworkPort($data['FK_networking_ports'])) {
                             $nn->delete(array('id' => $data['FK_networking_ports']));
                         }
                         PluginFusioninventoryDb::lock_wire_unlock();
                     }
                 } else {
                     if ($data['trunk'] != "0") {
                         $query_update = "UPDATE `glpi_plugin_fusioninventory_networking_ports`\n                             SET `trunk`='0'\n                             WHERE `ID`='" . $data['sid'] . "';";
                         $DB->query($query_update);
                         PluginFusioninventorySnmphistory::addLog($data["FK_networking_ports"], "trunk", "1", "0", "", $_SESSION['FK_process']);
                     }
                 }
             }
         }
     }
     // ***** Add ports and connections in glpi_plugin_fusioninventory_tmp_* tables for connections between
     // switchs
     foreach ($Array_multiplemac_ifIndex as $ifIndex => $val) {
         $ifName = $oidvalues[$oidsModel[0][1]['ifName'] . "." . $ifIndex][""];
         $TMP_ID = $tmpc->UpdatePort($ID_Device, $ArrayPortsID[$ifName]);
         switch ($sysDescr) {
             case "Cisco":
                 $manufCisco->tmpConnections($oidvalues, $oidsModel, $ifIndex, $TMP_ID, $ID_Device, $type);
                 break;
             case "ProCurve J":
                 $manufHP->tmpConnections($oidvalues, $oidsModel, $ifIndex, $TMP_ID, $ID_Device, $type);
                 break;
             case "3Com IntelliJack NJ225":
                 $manuf3com->tmpConnections($oidvalues, $oidsModel, $ifIndex, $TMP_ID, $ID_Device, $type);
                 break;
         }
     }
     foreach ($Array_cdp_ifIndex as $ifIndex => $val) {
         $ifName = $oidvalues[$oidsModel[0][1]['ifName'] . "." . $ifIndex][""];
         $TMP_ID = $tmpc->UpdatePort($ID_Device, $ArrayPortsID[$ifName], 1);
         $Array_multiplemac_ifIndex[$ifIndex] = 1;
     }
     return $Array_multiplemac_ifIndex;
 }
 function hubNetwork($p_oPort)
 {
     global $DB;
     $nw = new Netwire();
     $np = new Netport();
     $nn = new NetworkPort_NetworkPort();
     // List of macs : $p_oPort->getPortsToConnect
     // recherche dans unknown_device table le hub
     // qui a un port connecte sur le $port_ID
     // Get port connected on switch port
     if ($ID = $nw->getOppositeContact($p_oPort->getValue('ID'))) {
         $np->getFromDB($ID);
         if ($np->fields["device_type"] == $this->type) {
             $this->getFromDB($np->fields["on_device"]);
             if ($this->fields["hub"] == "1") {
                 // We will update ports and wire
                 return;
             }
         }
     }
     // sinon on cree un nouveau unknown_device type hub
     // + creation des ports qui sont connectes aux mac
     $input = array();
     $input['hub'] = "1";
     $input['name'] = "hub";
     $id_unknown = $this->add($input);
     $input = array();
     $input["on_device"] = $id_unknown;
     $input["device_type"] = $this->type;
     $input["name"] = "Link";
     $id_port = $np->add($input);
     $nn->add(array('networkports_id_1' => $p_oPort->getValue('ID'), 'networkports_id_2' => $id_port));
     foreach ($p_oPort->getMacsToConnect() as $ifmac) {
         $input = array();
         $input["on_device"] = $id_unknown;
         $input["device_type"] = $this->type;
         $id_port = $np->add($input);
         // TODO : recherche le port qui a cet $ifmac
         $query = "SELECT * FROM `glpi_networking_ports`\n            WHERE `ifmac` = '" . $ifmac . "' ";
         $result = $DB->query($query);
         if ($DB->numrows($result) == 1) {
             $line = $DB->fetch_assoc($result);
             $nn->add(array('networkports_id_1' => $line['ID'], 'networkports_id_2' => $id_port));
         } else {
             // Create device inconnu
         }
     }
 }
 static function addLogConnection($status, $port, $FK_process = 0)
 {
     global $DB, $CFG_GLPI;
     $CommonItem = new CommonItem();
     $pthc = new PluginFusioninventorySnmphistoryconnection();
     $nw = new Netwire();
     if ($FK_process == '0' and isset($_SESSION['glpi_plugin_fusioninventory_processnumber'])) {
         $input['process_number'] = $_SESSION['glpi_plugin_fusioninventory_processnumber'];
     }
     // Récupérer le port de la machine associé au port du switch
     // Récupérer le type de matériel
     $input["FK_port_source"] = $port;
     $opposite_port = $nw->getOppositeContact($port);
     if ($opposite_port == "0") {
         return;
     }
     $input['FK_port_destination'] = $opposite_port;
     $input['date'] = date("Y-m-d H:i:s");
     if ($status == 'remove') {
         $input['creation'] = 0;
     } else {
         if ($status == 'make') {
             $input['creation'] = 1;
         }
     }
     $pthc->add($input);
 }
Пример #4
0
 /**
  * Disconnect a port in DB
  *
  *@param $p_port='' Port ID to disconnect
  *@return nothing
  **/
 function disconnectDB($p_port = '')
 {
     if ($p_port == '') {
         $p_port = $this->getValue('ID');
     }
     $netwire = new Netwire();
     PluginFusioninventorySnmphistory::addLogConnection("remove", $netwire->getOppositeContact($p_port));
     //PluginFusioninventorySnmphistory::addLogConnection("remove",$p_port);
     $nn = new NetworkPort_NetworkPort();
     if ($nn->getFromDBForNetworkPort($p_port)) {
         if ($nn->delete(array('id' => $p_port))) {
             $ptap = new PluginFusioninventoryAgentsProcesses();
             $ptap->updateProcess($_SESSION['glpi_plugin_fusioninventory_processnumber'], array('query_nb_connections_deleted' => '1'));
         }
     }
 }
 function showForm($target, $ID)
 {
     global $DB, $CFG_GLPI, $LANG;
     $history = new PluginFusioninventorySnmphistory();
     if (!PluginFusioninventory::haveRight("snmp_networking", "r")) {
         return false;
     }
     if (PluginFusioninventory::haveRight("snmp_networking", "w")) {
         $canedit = true;
     } else {
         $canedit = false;
     }
     include GLPI_ROOT . "/plugins/fusioninventory/inc_constants/snmp.mapping.constant.php";
     $this->ID = $ID;
     $nw = new Netwire();
     $CommonItem = new CommonItem();
     $plugin_fusioninventory_snmp = new PluginFusioninventorySNMP();
     echo "<script type='text/javascript' src='" . GLPI_ROOT . "/lib/extjs/adapter/prototype/prototype.js'></script>";
     echo "<script type='text/javascript' src='" . GLPI_ROOT . "/lib/extjs/adapter/prototype/effects.js'></script>";
     if (!($data = $this->find("`FK_networking`='" . $ID . "'", '', 1))) {
         // Add in database if not exist
         $input['FK_networking'] = $ID;
         $ID_tn = $this->add($input);
         $this->getFromDB($ID_tn);
     } else {
         foreach ($data as $ID_tn => $datas) {
             $this->fields = $data[$ID_tn];
         }
     }
     $PID = $this->fields['last_PID_update'];
     // Form networking informations
     echo "<div align='center'>\n            <form method='post' name='snmp_form' id='snmp_form' action=\"" . $target . "\">";
     echo "<table class='tab_cadre' cellpadding='5' width='950'>";
     echo "<tr class='tab_bg_1'>";
     echo "<th colspan='3'>";
     echo $LANG['plugin_fusioninventory']["snmp"][11];
     echo "</th>";
     echo "</tr>";
     echo "<tr class='tab_bg_1'>";
     echo "<td align='center'>" . $LANG['plugin_fusioninventory']["profile"][24] . "</td>";
     echo "<td align='center'>";
     $query_models = "SELECT * \n                       FROM `glpi_plugin_fusioninventory_model_infos`\n                       WHERE `device_type`!='2'\n                             AND `device_type`!='0';";
     $result_models = $DB->query($query_models);
     $exclude_models = array();
     while ($data_models = $DB->fetch_array($result_models)) {
         $exclude_models[] = $data_models['ID'];
     }
     Dropdown::show("PluginFusioninventoryModelInfos", array('name' => "model_infos", 'value' => $this->fields['FK_model_infos'], 'comments' => 0, 'used' => $exclude_models));
     echo "</td>";
     echo "</tr>";
     echo "<tr class='tab_bg_1'>";
     echo "<td align='center'>" . $LANG['plugin_fusioninventory']["functionalities"][43] . "</td>";
     echo "<td align='center'>";
     PluginFusioninventorySNMP::auth_dropdown($this->fields['FK_snmp_connection']);
     echo "</td>";
     echo "</tr>";
     echo "<tr class='tab_bg_1 center'>";
     echo "<td>";
     echo " <input type='submit' name='GetRightModel'\n              value='" . $LANG['plugin_fusioninventory']["model_info"][13] . "' class='submit'/></td>";
     echo "<td>";
     echo "<input type='hidden' name='ID' value='" . $ID . "'>";
     echo "<input type='submit' name='update' value=\"" . $LANG["buttons"][7] . "\" class='submit' >";
     echo "</td>";
     echo "</tr>";
     echo "</table></form>";
     // Remote action of agent
     $pfit = new PluginFusioninventoryTask();
     $pfit->RemoteStateAgent($target, $ID, NETWORKING_TYPE, array('INVENTORY' => 1));
     // SNMP Informations
     //		echo "<div align='center'>
     echo "<form method='post' name='snmp_form' id='snmp_form'  action=\"" . $target . "\">";
     echo "<table class='tab_cadre' cellpadding='5' width='950'>";
     echo "<tr class='tab_bg_1'>";
     echo "<th colspan='3'>";
     echo $LANG['plugin_fusioninventory']["title"][1];
     echo "</th>";
     echo "</tr>";
     echo "<tr class='tab_bg_1 center'>";
     echo "<td colspan='2' height='30'>";
     echo $LANG['plugin_fusioninventory']["snmp"][52] . ": " . convDateTime($this->fields['last_fusioninventory_update']);
     echo "</td>";
     echo "</tr>";
     // Get link field to detect if cpu, memory and uptime are get onthis network device
     $Array_Object_TypeNameConstant = $plugin_fusioninventory_snmp->GetLinkOidToFields($ID, NETWORKING_TYPE);
     $mapping_name = array();
     foreach ($Array_Object_TypeNameConstant as $object => $mapping_type_name) {
         $mapping_name[$mapping_type_name] = "1";
     }
     if (isset($mapping_name['uptime']) and $mapping_name['uptime'] == "1") {
         echo "<tr class='tab_bg_1 center'>";
         echo "<td>" . $LANG['plugin_fusioninventory']["snmp"][12] . "</td>";
         echo "<td>";
         $sysUpTime = $this->fields['uptime'];
         if (strstr($sysUpTime, "days")) {
             list($day, $hour, $minute, $sec, $ticks) = sscanf($sysUpTime, "%d days, %d:%d:%d.%d");
         } else {
             if (strstr($sysUpTime, "hours")) {
                 $day = 0;
                 list($hour, $minute, $sec, $ticks) = sscanf($sysUpTime, "%d hours, %d:%d.%d");
             } else {
                 if (strstr($sysUpTime, "minutes")) {
                     $day = 0;
                     $hour = 0;
                     list($minute, $sec, $ticks) = sscanf($sysUpTime, "%d minutes, %d.%d");
                 } else {
                     if ($sysUpTime == "0") {
                         $day = 0;
                         $hour = 0;
                         $minute = 0;
                         $sec = 0;
                     } else {
                         list($hour, $minute, $sec, $ticks) = sscanf($sysUpTime, "%d:%d:%d.%d");
                         $day = 0;
                     }
                 }
             }
         }
         echo "<b>{$day}</b> " . $LANG["stats"][31] . " ";
         echo "<b>{$hour}</b> " . $LANG["job"][21] . " ";
         echo "<b>{$minute}</b> " . $LANG["job"][22] . " ";
         echo " " . strtolower($LANG["rulesengine"][42]) . " <b>{$sec}</b> " . $LANG["stats"][34] . " ";
         echo "</td>";
         echo "</tr>";
     }
     if (isset($mapping_name['cpu']) and $mapping_name['cpu'] == "1" or isset($mapping_name['cpuuser']) and $mapping_name['cpuuser'] == "1" and (isset($mapping_name['cpusystem']) and $mapping_name['cpusystem'] == "1")) {
         echo "<tr class='tab_bg_1 center'>";
         echo "<td>" . $LANG['plugin_fusioninventory']["snmp"][13] . "</td>";
         echo "<td>";
         PluginFusioninventoryDisplay::bar($this->fields['cpu'], '', 'inverse');
         echo "</td>";
         echo "</tr>";
     }
     if (isset($mapping_name['memory']) and $mapping_name['memory'] == "1") {
         echo "<tr class='tab_bg_1 center'>";
         echo "<td>" . $LANG['plugin_fusioninventory']["snmp"][14] . "</td>";
         echo "<td>";
         $query2 = "SELECT *\n                    FROM `glpi_networking`\n                    WHERE `ID`='" . $ID . "';";
         $result2 = $DB->query($query2);
         $data2 = $DB->fetch_assoc($result2);
         if (empty($data2["ram"])) {
             $ram_pourcentage = 0;
         } else {
             $ram_pourcentage = ceil(100 * ($data2["ram"] - $this->fields['memory']) / $data2["ram"]);
         }
         PluginFusioninventoryDisplay::bar($ram_pourcentage, " (" . ($data2["ram"] - $this->fields['memory']) . " Mo / " . $data2["ram"] . " Mo)", 'inverse');
         echo "</td>";
         echo "</tr>";
     }
     echo "</table></form>";
     // ********************************************************************************************** //
     // *********************************** METTRE TABLEAU DES PORTS ********************************* //
     // ********************************************************************************************** //
     function ByteSize($bytes, $sizeoct = 1024)
     {
         $size = $bytes / $sizeoct;
         if ($size < $sizeoct) {
             $size = number_format($size, 0);
             $size .= ' K';
         } else {
             if ($size / $sizeoct < $sizeoct) {
                 $size = number_format($size / $sizeoct, 0);
                 $size .= ' M';
             } else {
                 if ($size / $sizeoct / $sizeoct < $sizeoct) {
                     $size = number_format($size / $sizeoct / $sizeoct, 0);
                     $size .= ' G';
                 } else {
                     if ($size / $sizeoct / $sizeoct / $sizeoct < $sizeoct) {
                         $size = number_format($size / $sizeoct / $sizeoct / $sizeoct, 0);
                         $size .= ' T';
                     }
                 }
             }
         }
         return $size;
     }
     $query = "\n\t\tSELECT *,glpi_plugin_fusioninventory_networking_ports.ifmac as ifmacinternal\n\t\t\n\t\tFROM glpi_plugin_fusioninventory_networking_ports\n\n\t\tLEFT JOIN glpi_networking_ports\n\t\tON glpi_plugin_fusioninventory_networking_ports.FK_networking_ports = glpi_networking_ports.ID \n\t\tWHERE glpi_networking_ports.on_device='" . $ID . "'\n\t\tORDER BY logical_number ";
     echo "<script  type='text/javascript'>\nfunction close_array(id){\n\tdocument.getElementById('plusmoins'+id).innerHTML = '<img src=\\'" . GLPI_ROOT . "/pics/collapse.gif\\''+\n      'onClick=\\'Effect.Fade(\"viewfollowup'+id+'\");appear_array('+id+');\\' />';\n} \nfunction appear_array(id){\n\tdocument.getElementById('plusmoins'+id).innerHTML = '<img src=\\'" . GLPI_ROOT . "/pics/expand.gif\\''+\n      'onClick=\\'Effect.Appear(\"viewfollowup'+id+'\");close_array('+id+');\\' />';\n}\t\t\n\t\t\n\t\t</script>";
     echo "<table class='tab_cadre' cellpadding='5' width='1100'>";
     echo "<tr class='tab_bg_1'>";
     $query_array = "SELECT *\n                      FROM `glpi_display`\n                      WHERE `type`='" . PLUGIN_FUSIONINVENTORY_SNMP_NETWORKING_PORTS . "'\n                            AND `FK_users`='0'\n                      ORDER BY `rank`;";
     $result_array = $DB->query($query_array);
     echo "<th colspan='" . (mysql_num_rows($result_array) + 2) . "'>";
     echo $LANG['plugin_fusioninventory']["snmp"][40];
     $result = $DB->query($query);
     echo ' (' . $DB->numrows($result) . ')';
     if ($_SESSION["glpilanguage"] == "fr_FR") {
         $url_legend = "https://forge.indepnet.net/wiki/fusioninventory/Fr_VI_visualisationsdonnees_2_reseau";
     } else {
         $url_legend = "https://forge.indepnet.net/wiki/fusioninventory/En_VI_visualisationsdonnees_2_reseau";
     }
     echo " <a href='" . $url_legend . "'>[ " . $LANG['plugin_fusioninventory']["functionalities"][6] . " ]</a>";
     echo "</th>";
     echo "</tr>";
     echo "<tr class='tab_bg_1'>";
     echo '<th><img alt="Sélectionnez les éléments à afficher par défaut" 
                  title="Sélectionnez les éléments à afficher par défaut"
                  src="' . GLPI_ROOT . '/pics/options_search.png" class="pointer"
                  onclick="var w = window.open(\'' . GLPI_ROOT . '/front/popup.php?popup=search_config&type=5157\' ,\'glpipopup\',
                     \'height=400,
                  width=1000, top=100, left=100, scrollbars=yes\' ); w.focus();"></th>';
     echo "<th>" . $LANG["common"][16] . "</th>";
     $query_array = "SELECT * \n                      FROM `glpi_display`\n                      WHERE `type`='5157'\n                             AND `FK_users`='0'\n                      ORDER BY `rank`;";
     $result_array = $DB->query($query_array);
     while ($data_array = $DB->fetch_array($result_array)) {
         echo "<th>";
         switch ($data_array['num']) {
             case 2:
                 echo $LANG['plugin_fusioninventory']["snmp"][42];
                 break;
             case 3:
                 echo $LANG['plugin_fusioninventory']["snmp"][43];
                 break;
             case 4:
                 echo $LANG['plugin_fusioninventory']["snmp"][44];
                 break;
             case 5:
                 echo $LANG['plugin_fusioninventory']["snmp"][45];
                 break;
             case 6:
                 echo $LANG['plugin_fusioninventory']["snmp"][46];
                 break;
             case 7:
                 echo $LANG['plugin_fusioninventory']["snmp"][47];
                 break;
             case 8:
                 echo $LANG['plugin_fusioninventory']["snmp"][48];
                 break;
             case 9:
                 echo $LANG['plugin_fusioninventory']["snmp"][49];
                 break;
             case 10:
                 echo $LANG['plugin_fusioninventory']["snmp"][51];
                 break;
             case 11:
                 echo $LANG['plugin_fusioninventory']["mapping"][115];
                 break;
             case 12:
                 echo $LANG["networking"][17];
                 break;
             case 13:
                 echo $LANG['plugin_fusioninventory']["snmp"][50];
                 break;
             case 14:
                 echo $LANG["networking"][56];
                 break;
             case 15:
                 echo $LANG['plugin_fusioninventory']["snmp"][41];
                 break;
         }
         echo "</th>";
     }
     echo "</tr>";
     // Fin de l'entête du tableau
     if ($result) {
         while ($data = $DB->fetch_array($result)) {
             $background_img = "";
             if ($data["trunk"] == "1" and (strstr($data["ifstatus"], "up") or strstr($data["ifstatus"], "1"))) {
                 $background_img = " style='background-image: url(\"" . GLPI_ROOT . "/plugins/fusioninventory/pics/port_trunk.png\"); '";
             } else {
                 if ($data["trunk"] == "-1" and (strstr($data["ifstatus"], "up") or strstr($data["ifstatus"], "1"))) {
                     $background_img = " style='background-image: url(\"" . GLPI_ROOT . "/plugins/fusioninventory/pics/multiple_mac_addresses.png\"); '";
                 } else {
                     if (strstr($data["ifstatus"], "up") or strstr($data["ifstatus"], "1")) {
                         $background_img = " style='background-image: url(\"" . GLPI_ROOT . "/plugins/fusioninventory/pics/connected_trunk.png\"); '";
                     }
                 }
             }
             echo "<tr class='tab_bg_1 center' height='40'" . $background_img . ">";
             echo "<td id='plusmoins" . $data["ID"] . "'><img src='" . GLPI_ROOT . "/pics/expand.gif' onClick='Effect.Appear(\"viewfollowup" . $data["ID"] . "\");close_array(" . $data["ID"] . ");' /></td>";
             echo "<td><a href='networking.port.php?ID=" . $data["ID"] . "'>" . $data["name"] . "</a></td>";
             $query_array = "SELECT *\n                            FROM `glpi_display`\n                            WHERE `type`='5157'\n                                  AND `FK_users`='0'\n                            ORDER BY `rank`;";
             $result_array = $DB->query($query_array);
             while ($data_array = $DB->fetch_array($result_array)) {
                 switch ($data_array['num']) {
                     case 2:
                         echo "<td>" . $data["ifmtu"] . "</td>";
                         break;
                     case 3:
                         echo "<td>" . ByteSize($data["ifspeed"], 1000) . "bps</td>";
                         break;
                     case 4:
                         echo "<td>";
                         if (strstr($data["ifstatus"], "up") or strstr($data["ifinternalstatus"], "1")) {
                             echo "<img src='" . GLPI_ROOT . "/pics/greenbutton.png'/>";
                         } else {
                             if (strstr($data["ifstatus"], "down") or strstr($data["ifinternalstatus"], "2")) {
                                 echo "<img src='" . GLPI_ROOT . "/pics/redbutton.png'/>";
                             } else {
                                 if (strstr($data["ifstatus"], "testing") or strstr($data["ifinternalstatus"], "3")) {
                                     echo "<img src='" . GLPI_ROOT . "/plugins/fusioninventory/pics/yellowbutton.png'/>";
                                 }
                             }
                         }
                         echo "</td>";
                         break;
                     case 5:
                         echo "<td>" . $data["iflastchange"] . "</td>";
                         break;
                     case 6:
                         echo "<td>";
                         if ($data["ifinoctets"] == "0") {
                             echo "-";
                         } else {
                             echo ByteSize($data["ifinoctets"], 1000) . "o";
                         }
                         echo "</td>";
                         break;
                     case 7:
                         if ($data["ifinerrors"] == "0") {
                             echo "<td>-";
                         } else {
                             echo "<td background='#cf9b9b' class='tab_bg_1_2'>";
                             echo $data["ifinerrors"];
                         }
                         echo "</td>";
                         break;
                     case 8:
                         echo "<td>";
                         if ($data["ifinoctets"] == "0") {
                             echo "-";
                         } else {
                             echo ByteSize($data["ifoutoctets"], 1000) . "o";
                         }
                         echo "</td>";
                         break;
                     case 9:
                         if ($data["ifouterrors"] == "0") {
                             echo "<td>-";
                         } else {
                             echo "<td background='#cf9b9b' class='tab_bg_1_2'>";
                             echo $data["ifouterrors"];
                         }
                         echo "</td>";
                         break;
                     case 10:
                         echo "<td>" . $data["portduplex"] . "</td>";
                         break;
                     case 11:
                         // ** internal mac
                         echo "<td>" . $data["ifmac"] . "</td>";
                         break;
                     case 12:
                         // ** Mac address and link to device which are connected to this port
                         $opposite_port = $nw->getOppositeContact($data["FK_networking_ports"]);
                         if ($opposite_port != "") {
                             $query_device = "SELECT * \n                                         FROM `glpi_networking_ports`\n                                         WHERE `ID`='" . $opposite_port . "';";
                             $result_device = $DB->query($query_device);
                             $data_device = $DB->fetch_assoc($result_device);
                             $CommonItem->getFromDB($data_device["device_type"], $data_device["on_device"]);
                             $link1 = $CommonItem->getLink(1);
                             $link = str_replace($CommonItem->getName(0), $data_device["ifmac"], $CommonItem->getLink());
                             $link2 = str_replace($CommonItem->getName(0), $data_device["ifaddr"], $CommonItem->getLink());
                             if ($data_device["device_type"] == PLUGIN_FUSIONINVENTORY_MAC_UNKNOWN) {
                                 if ($CommonItem->getField("accepted") == "1") {
                                     echo "<td style='background:#bfec75'\n                                        class='tab_bg_1_2'>" . $link1;
                                 } else {
                                     echo "<td background='#cf9b9b'\n                                        class='tab_bg_1_2'>" . $link1;
                                 }
                                 if (!empty($link)) {
                                     echo "<br/>" . $link;
                                 }
                                 if (!empty($link2)) {
                                     echo "<br/>" . $link2;
                                 }
                                 echo "</td>";
                             } else {
                                 echo "<td>" . $link1;
                                 if (!empty($link)) {
                                     echo "<br/>" . $link;
                                 }
                                 if (!empty($link2)) {
                                     echo "<br/>" . $link2;
                                 }
                                 echo "</td>";
                             }
                         } else {
                             echo "<td></td>";
                         }
                         break;
                     case 13:
                         // ** Connection status
                         echo "<td>";
                         if (strstr($data["ifstatus"], "up") or strstr($data["ifstatus"], "1")) {
                             echo "<img src='" . GLPI_ROOT . "/pics/greenbutton.png'/>";
                         } else {
                             if (strstr($data["ifstatus"], "down") or strstr($data["ifstatus"], "2")) {
                                 echo "<img src='" . GLPI_ROOT . "/pics/redbutton.png'/>";
                             } else {
                                 if (strstr($data["ifstatus"], "testing") or strstr($data["ifstatus"], "3")) {
                                     echo "<img src='" . GLPI_ROOT . "/plugins/fusioninventory/pics/yellowbutton.png'/>";
                                 } else {
                                     if (strstr($data["ifstatus"], "dormant") or strstr($data["ifstatus"], "5")) {
                                         echo "<img src='" . GLPI_ROOT . "/plugins/fusioninventory/pics/orangebutton.png'/>";
                                     }
                                 }
                             }
                         }
                         echo "</td>";
                         break;
                     case 14:
                         echo "<td>";
                         $canedit = haveRight("networking", "w");
                         $used = array();
                         $query_vlan = "SELECT * FROM glpi_networking_vlan WHERE FK_port='" . $data["ID"] . "'";
                         $result_vlan = $DB->query($query_vlan);
                         if ($DB->numrows($result_vlan) > 0) {
                             echo "<table cellpadding='0' cellspacing='0'>";
                             while ($line = $DB->fetch_array($result_vlan)) {
                                 $used[] = $line["FK_vlan"];
                                 $a_vlan = Dropdown::getDropdownName("glpi_dropdown_vlan", $line["FK_vlan"], 1);
                                 echo "<tr><td>" . $a_vlan['name'] . " [" . $a_vlan['comments'] . "]";
                                 echo "</td><td>";
                                 if ($canedit) {
                                     echo "<a href='" . $CFG_GLPI["root_doc"] . "/front/networking.port.php?unassign_vlan=unassigned&amp;ID=" . $line["ID"] . "'>";
                                     echo "<img src=\"" . $CFG_GLPI["root_doc"] . "/pics/delete2.png\" alt='" . $LANG['buttons'][6] . "' title='" . $LANG['buttons'][6] . "'></a>";
                                 } else {
                                     echo "&nbsp;";
                                 }
                                 echo "</td></tr>";
                             }
                             echo "</table>";
                         } else {
                             echo "&nbsp;";
                         }
                         echo "</td>";
                         break;
                     case 15:
                         //Port description
                         echo "<td>" . $data["ifdescr"] . "</td>";
                         break;
                 }
             }
             echo "</tr>";
             // Historique
             echo "\n\t\t\t\t<tr style='display: none;' id='viewfollowup" . $data["ID"] . "'>\n\t\t\t\t\t<td colspan='" . (mysql_num_rows($result_array) + 2) . "'>" . PluginFusioninventorySnmphistory::showHistory($data["ID"]) . "</td>\n\t\t\t\t</tr>\n\t\t\t\t";
         }
     }
     echo "</table>";
 }