function setPatchCableAmount() { setFuncMessages(__FUNCTION__, array('OK' => 51)); commitSetPatchCableAmount(genericAssertion('id', 'uint'), genericAssertion('amount', 'uint0')); showFuncMessage(__FUNCTION__, 'OK'); }
function doSwitchSNMPmining($objectInfo, $device) { setFuncMessages(__FUNCTION__, array('ERR3' => 188, 'ERR4' => 189)); global $known_switches, $iftable_processors; if (FALSE === ($sysObjectID = $device->snmpget('sysObjectID.0'))) { showFuncMessage(__FUNCTION__, 'ERR3'); // // fatal SNMP failure return; } $sysObjectID = preg_replace('/^.*( \\.1\\.3\\.6\\.1\\.|enterprises\\.|joint-iso-ccitt\\.)([\\.[:digit:]]+)$/', '\\2', $sysObjectID); if (!isset($known_switches[$sysObjectID])) { showFuncMessage(__FUNCTION__, 'ERR4', array($sysObjectID)); // unknown OID return; } $sysName = substr($device->snmpget('sysName.0'), strlen('STRING: ')); $sysDescr = substr($device->snmpget('sysDescr.0'), strlen('STRING: ')); $sysDescr = str_replace(array("\n", "\r"), " ", $sysDescr); // Make it one line $ifDescr_tablename = array_fetch($known_switches[$sysObjectID], 'ifDescrOID', 'ifDescr'); showSuccess($known_switches[$sysObjectID]['text']); foreach (array_keys($known_switches[$sysObjectID]['processors']) as $pkey) { if (!array_key_exists($known_switches[$sysObjectID]['processors'][$pkey], $iftable_processors)) { showWarning('processor "' . $known_switches[$sysObjectID]['processors'][$pkey] . '" not found'); unset($known_switches[$sysObjectID]['processors'][$pkey]); } } updateStickerForCell($objectInfo, 2, $known_switches[$sysObjectID]['dict_key']); updateStickerForCell($objectInfo, 3, $sysName); detectSoftwareType($objectInfo, $sysDescr); switch (1) { case preg_match('/^9\\.1\\./', $sysObjectID): // Catalyst w/one AC port // Catalyst w/one AC port case preg_match('/^9\\.5\\.18/', $sysObjectID): $exact_release = preg_replace('/^.*, Version ([^ ]+), .*$/', '\\1', $sysDescr); $major_line = preg_replace('/^([[:digit:]]+\\.[[:digit:]]+)[^[:digit:]].*/', '\\1', $exact_release); $ios_codes = array('12.0' => 244, '12.1' => 251, '12.2' => 252, '15.0' => 1901, '15.1' => 2082); updateStickerForCell($objectInfo, 5, $exact_release); if (array_key_exists($major_line, $ios_codes)) { updateStickerForCell($objectInfo, 4, $ios_codes[$major_line]); } $sysChassi = $device->snmpget('1.3.6.1.4.1.9.3.6.3.0'); if ($sysChassi !== FALSE or $sysChassi !== NULL) { updateStickerForCell($objectInfo, 1, str_replace('"', '', substr($sysChassi, strlen('STRING: ')))); } checkPIC('1-29'); commitAddPort($objectInfo['id'], 'con0', '1-29', 'console', ''); // RJ-45 RS-232 console if (preg_match('/Cisco IOS Software, C2600/', $sysDescr)) { commitAddPort($objectInfo['id'], 'aux0', '1-29', 'auxillary', ''); } // RJ-45 RS-232 aux port if ($sysObjectID == '9.1.956') { // models with two AC inputs checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in-1', '1-16', 'AC1', ''); commitAddPort($objectInfo['id'], 'AC-in-2', '1-16', 'AC2', ''); } elseif ($sysObjectID != '9.1.749' and $sysObjectID != '9.1.920') { // assume the rest have one AC input, but exclude blade devices checkPIC('1-16'); // AC input commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); } break; case preg_match('/^9\\.5\\.42/', $sysObjectID): // Catalyst 2948 running CatOS // Catalyst 2948 running CatOS case preg_match('/^9\\.6\\.1\\./', $sysObjectID): // Cisco SMB series switches (200, 220, 300, 500) // Cisco SMB series switches (200, 220, 300, 500) case preg_match('/^2011\\.2\\.239?\\./', $sysObjectID): // Huawei checkPIC('1-681'); commitAddPort($objectInfo['id'], 'con0', '1-681', 'console', ''); // DB-9 RS-232 console checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^9\\.12\\.3\\.1\\.3\\./', $sysObjectID): // Nexus $exact_release = preg_replace('/^.*, Version ([^ ]+), .*$/', '\\1', $sysDescr); $major_line = preg_replace('/^([[:digit:]]+\\.[[:digit:]]+)[^[:digit:]].*/', '\\1', $exact_release); $nxos_codes = array('4.0' => 963, '4.1' => 964, '4.2' => 1365, '5.0' => 1410, '5.1' => 1411, '5.2' => 1809, '6.0' => 1643, '6.1' => 2028); if (array_key_exists($major_line, $nxos_codes)) { updateStickerForCell($objectInfo, 4, $nxos_codes[$major_line]); } updateStickerForCell($objectInfo, 5, $exact_release); $sysChassi = $device->snmpget('1.3.6.1.2.1.47.1.1.1.1.11.149'); if ($sysChassi !== FALSE or $sysChassi !== NULL) { updateStickerForCell($objectInfo, 1, str_replace('"', '', substr($sysChassi, strlen('STRING: ')))); } checkPIC('1-29'); commitAddPort($objectInfo['id'], 'con0', '1-29', 'console', ''); // RJ-45 RS-232 console checkPIC('1-16'); // AC input commitAddPort($objectInfo['id'], 'AC-in-1', '1-16', 'AC1', ''); commitAddPort($objectInfo['id'], 'AC-in-2', '1-16', 'AC2', ''); break; case preg_match('/^11\\.2\\.3\\.7\\.11\\.(\\d+)$/', $sysObjectID, $matches): // ProCurve $console_per_product = array(33 => '1-29', 63 => '1-29', 78 => '1-29', 79 => '1-29', 80 => '1-29', 84 => '1-29', 86 => '1-29', 87 => '1-29', 94 => '1-29', 95 => '1-29', 154 => '1-29', 19 => '1-681', 31 => '1-681', 34 => '1-681', 58 => '1-681', 59 => '1-681'); if (array_key_exists($matches[1], $console_per_product)) { checkPIC($console_per_product[$matches[1]]); commitAddPort($objectInfo['id'], 'console', $console_per_product[$matches[1]], 'console', ''); } $oom_per_product = array(33 => '1-24'); if (array_key_exists($matches[1], $oom_per_product)) { checkPIC($oom_per_product[$matches[1]]); commitAddPort($objectInfo['id'], 'mgmt', $oom_per_product[$matches[1]], 'mgmt', ''); } checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); $exact_release = preg_replace('/^.* revision ([^ ]+), .*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $exact_release); break; case preg_match('/^2636\\.1\\.1\\.1\\.2\\.(30|31|43)/', $sysObjectID): // Juniper EX2200/EX3200/EX4200 $sw_version = preg_replace('/^.*, kernel JUNOS ([^ ]+).*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $sw_version); // one RJ-45 RS-232 and one AC port (it could be DC, but chances are it's AC) checkPIC('1-29'); commitAddPort($objectInfo['id'], 'con', '1-29', 'CON', ''); // RJ-45 RS-232 console checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); // Juniper uses the same sysObjectID for multiple HW models, override if necessary if (preg_match('/^Juniper Networks, Inc. ex3200-48t internet router/', $sysDescr)) { updateStickerForCell($objectInfo, 2, 902); } if (preg_match('/^Juniper Networks, Inc. ex4200-48t internet router/', $sysDescr)) { updateStickerForCell($objectInfo, 2, 907); } break; case preg_match('/^1991\\.1\\.3\\.53\\.1\\.2$/', $sysObjectID): // TurboIron 24X // TurboIron 24X case preg_match('/^2636\\.1\\.1\\.1\\.2\\./', $sysObjectID): // Juniper checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console', '1-681', 'console', ''); // DB-9 RS-232 console break; case preg_match('/^1991\\.1\\.3\\.45\\./', $sysObjectID): // snFGSFamily // snFGSFamily case preg_match('/^1991\\.1\\.3\\.46\\./', $sysObjectID): // snFLSFamily // snFLSFamily case preg_match('/^1991\\.1\\.3\\.54\\.2\\.4\\.1\\.1$/', $sysObjectID): // FCX 648 $exact_release = preg_replace('/^.*, IronWare Version ([^ ]+) .*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $exact_release); # FOUNDRY-SN-AGENT-MIB::snChasSerNum.0 $sysChassi = $device->snmpget('enterprises.1991.1.1.1.1.2.0'); if ($sysChassi !== FALSE or $sysChassi !== NULL) { updateStickerForCell($objectInfo, 1, str_replace('"', '', substr($sysChassi, strlen('STRING: ')))); } # Type of uplink module installed. # table: FOUNDRY-SN-AGENT-MIB::snAgentBrdMainBrdDescription # Possible part numbers are: # FGS-1XG1XGC (one fixed CX4 port) # FGS-2XGC (two fixed CX4 ports) # FGS-2XG (two XFP slots) # And for FLS result (which is not handled here) would be: # 1991.1.1.2.2.1.1.2.1 = STRING: "FLS-24G 24-port Management Module" # 1991.1.1.2.2.1.1.2.3 = STRING: "FLS-1XG 1-port 10G Module (1-XFP)" # 1991.1.1.2.2.1.1.2.4 = STRING: "FLS-1XG 1-port 10G Module (1-XFP)" # (assuming, that the device has 2 XFP modules in slots 3 and 4). foreach ($device->snmpwalkoid('enterprises.1991.1.1.2.2.1.1.2') as $module_raw) { if (preg_match('/^STRING: "(FGS-1XG1XGC|FGS-2XGC) /i', $module_raw)) { $iftable_processors['fgs-uplinks']['dict_key'] = '1-40'; // CX4 break; } } # AC inputs # table: FOUNDRY-SN-AGENT-MIB::snChasPwrSupplyDescription # "Power supply 1 " # "Power supply 2 " foreach ($device->snmpwalkoid('enterprises.1991.1.1.1.2.1.1.2') as $PSU_raw) { $count = 0; $PSU_cooked = trim(preg_replace('/^string: "(.+)"$/i', '\\1', $PSU_raw, 1, $count)); if ($count) { checkPIC('1-16'); commitAddPort($objectInfo['id'], $PSU_cooked, '1-16', '', ''); } } # fixed console port checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console', '1-681', 'console', ''); // DB-9 RS-232 console break; case preg_match('/^1916\\.2\\./', $sysObjectID): // Extreme Networks Summit $xos_release = preg_replace('/^ExtremeXOS version ([[:digit:]]+)\\..*$/', '\\1', $sysDescr); $xos_codes = array('10' => 1350, '11' => 1351, '12' => 1352); if (array_key_exists($xos_release, $xos_codes)) { updateStickerForCell($objectInfo, 4, $xos_codes[$xos_release]); } checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console', '1-681', 'console', ''); // DB-9 RS-232 checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^6027\\.1\\./', $sysObjectID): # Force10 commitAddPort($objectInfo['id'], 'aux0', '1-29', 'RS-232', ''); // RJ-45 RS-232 console $m = array(); if (preg_match('/Force10 Application Software Version: ([\\d\\.]+)/', $sysDescr, $m)) { updateStickerForCell($objectInfo, 5, $m[1]); $ftos_release = preg_replace('/^([678])\\..+$/', '\\1', $m[1]); $ftos_codes = array('6' => 1592, '7' => 1593, '8' => 1594); if (array_key_exists($ftos_release, $ftos_codes)) { updateStickerForCell($objectInfo, 4, $ftos_codes[$ftos_release]); } } # F10-S-SERIES-CHASSIS-MIB::chStackUnitSerialNumber.1 $serialNo = $device->snmpget('enterprises.6027.3.10.1.2.2.1.12.1'); # F10-S-SERIES-CHASSIS-MIB::chSysPowerSupplyType.1.1 if ($device->snmpget('enterprises.6027.3.10.1.2.3.1.3.1.1') == 'INTEGER: 1') { checkPIC('1-16'); commitAddPort($objectInfo['id'], 'PSU0', '1-16', 'PSU0', ''); } # F10-S-SERIES-CHASSIS-MIB::chSysPowerSupplyType.1.2 if ($device->snmpget('enterprises.6027.3.10.1.2.3.1.3.1.2') == 'INTEGER: 1') { checkPIC('1-16'); commitAddPort($objectInfo['id'], 'PSU1', '1-16', 'PSU1', ''); } if (strlen($serialNo)) { updateStickerForCell($objectInfo, 1, str_replace('"', '', substr($serialNo, strlen('STRING: ')))); } break; case preg_match('/^171\\.10\\.63\\.8/', $sysObjectID): // D-Link DES-3052 // D-Link DES-3052 case preg_match('/^202\\.20\\./', $sysObjectID): // SMC TigerSwitch // SMC TigerSwitch case preg_match('/^674\\.10895\\.4/', $sysObjectID): // Dell PowerConnect // Dell PowerConnect case preg_match('/^674\\.10895\\.300(3|4|7|9)/', $sysObjectID): case preg_match('/^674\\.10895\\.301(0|4|7|9)/', $sysObjectID): case preg_match('/^674\\.10895\\.302(0|1|8)/', $sysObjectID): case preg_match('/^3955\\.6\\.1\\.20(24|48)\\.1/', $sysObjectID): // Linksys // Linksys case preg_match('/^3955\\.6\\.50(24|48)/', $sysObjectID): // Linksys // Linksys case preg_match('/^4526\\.100\\./', $sysObjectID): // NETGEAR (with console) // NETGEAR (with console) case preg_match('/^11863\\.1\\.1\\.1/', $sysObjectID): // TP-Link // TP-Link case preg_match('/^11863\\.6\\.10\\.58/', $sysObjectID): // one DB-9 RS-232 and one AC port checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console', '1-681', '', ''); // DB-9 RS-232 checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^388\\.18/', $sysObjectID): // Motorola RFS 4000 // one RJ-45 RS-232 and one AC port checkPIC('1-29'); commitAddPort($objectInfo['id'], 'console', '1-29', 'console', ''); checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^207\\.1\\.14\\./', $sysObjectID): // Allied Telesyn // one RJ-45 RS-232 and two AC ports checkPIC('1-29'); commitAddPort($objectInfo['id'], 'console', '1-29', 'console', ''); checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in-1', '1-16', 'AC1', ''); commitAddPort($objectInfo['id'], 'AC-in-2', '1-16', 'AC2', ''); break; case preg_match('/^674\\.10895\\.3000/', $sysObjectID): // one DB-9 RS-232, one 100Mb OOB mgmt, and one AC port checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console', '1-681', '', ''); // DB-9 RS-232 checkPIC('1-19'); commitAddPort($objectInfo['id'], 'mgmt', '1-19', '', ''); checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^43\\.1\\.16\\.4\\.3\\./', $sysObjectID): // 3Com $sw_version = preg_replace('/^.* Version 3Com OS ([^ ]+).*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $sw_version); // one RJ-45 RS-232 and one AC port checkPIC('1-29'); commitAddPort($objectInfo['id'], 'console', '1-29', '', ''); // RJ-45 RS-232 console checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^10977\\.11825\\.11833\\.97\\.25451\\.12800\\.100\\.4\\.4/', $sysObjectID): // Netgear $sw_version = preg_replace('/^.* V([^ ]+).*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $sw_version); // one AC port, no console checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^171\\.10\\.76\\.10/', $sysObjectID): // D-Link DGS-1210-24 // D-Link DGS-1210-24 case preg_match('/^207\\.1\\.4\\./', $sysObjectID): // Allied Telesyn AT-GS950/24 // Allied Telesyn AT-GS950/24 case preg_match('/^4526\\.100\\.4\\.(6|10)/', $sysObjectID): // NETGEAR (without console) // one AC port, no console checkPIC('1-16'); commitAddPort($objectInfo['id'], 'AC-in', '1-16', '', ''); break; case preg_match('/^30065\\.1\\.3011\\./', $sysObjectID): // Arista checkPIC('1-29'); commitAddPort($objectInfo['id'], 'console', '1-29', 'IOIOI', ''); $sw_version = preg_replace('/^Arista Networks EOS version (.+) running on .*$/', '\\1', $sysDescr); updateStickerForCell($objectInfo, 5, $sw_version); if (strlen($serialNo = $device->snmpget('mib-2.47.1.1.1.1.11.1'))) { # entPhysicalSerialNumber.1 updateStickerForCell($objectInfo, 1, str_replace('"', '', substr($serialNo, strlen('STRING: ')))); } break; case preg_match('/^119\\.1\\.203\\.2\\.2\\./', $sysObjectID): # NEC checkPIC('1-681'); commitAddPort($objectInfo['id'], 'console 0', '1-681', 'console', ''); checkPIC('1-16'); commitAddPort($objectInfo['id'], 'PS1', '1-16', '', ''); commitAddPort($objectInfo['id'], 'PS2', '1-16', '', ''); break; case preg_match('/^26543\\.1\\.7\\./', $sysObjectID): # IBM checkPIC('1-29'); commitAddPort($objectInfo['id'], 'console', '1-29', '', ''); # RJ-45 RS-232 console break; default: // Nortel... break; } $ifInfo = array(); foreach ($device->snmpwalkoid($ifDescr_tablename) as $oid => $value) { $randomindex = preg_replace("/^.*{$ifDescr_tablename}\\.(.+)\$/", '\\1', $oid); $value = trim(preg_replace('/^[^:]+: (.+)$/', '\\1', $value), '"'); $ifInfo[$randomindex]['ifDescr'] = $value; } foreach ($device->snmpwalkoid('ifPhysAddress') as $oid => $value) { $randomindex = preg_replace("/^.*ifPhysAddress\\.(.+)\$/", '\\1', $oid); $value = trim($value); // NET-SNMP may return MAC addresses in one of two (?) formats depending on // DISPLAY-HINT internal database. The best we can do about it is to accept both. // Bug originally reported by Walery Wysotsky against openSUSE 11.0. if (preg_match('/^string: [0-9a-f]{1,2}(:[0-9a-f]{1,2}){5}/i', $value)) { list($dummy, $value) = explode(' ', $value); $addrbytes = explode(':', $value); foreach ($addrbytes as $bidx => $bytestr) { if (strlen($bytestr) == 1) { $addrbytes[$bidx] = '0' . $bytestr; } } } elseif (preg_match('/^hex-string:( [0-9a-f]{2}){6}/i', $value)) { // Hex-STRING: xx yy zz xx yy zz $addrbytes = explode(' ', substr($value, -17)); } elseif (preg_match('/22[0-9a-f]{12}22$/', bin2hex($value))) { // STRING: "??????" $addrbytes = array(substr(bin2hex($value), -14, 12)); } else { continue; } // martian format $ifInfo[$randomindex]['ifPhysAddress'] = implode('', $addrbytes); } // process each interface only once regardless of how many processors we have to run foreach ($ifInfo as $iface) { foreach ($known_switches[$sysObjectID]['processors'] as $processor_name) { $newname = preg_replace($iftable_processors[$processor_name]['pattern'], $iftable_processors[$processor_name]['replacement'], $iface['ifDescr'], 1, $count); if ($newname === NULL) { showError('PCRE pattern error, terminating'); break 2; } if (!$count) { continue; } // try next processor on current port $newlabel = preg_replace($iftable_processors[$processor_name]['pattern'], $iftable_processors[$processor_name]['label'], $iface['ifDescr'], 1, $count); checkPIC($iftable_processors[$processor_name]['dict_key']); commitAddPort($objectInfo['id'], $newname, $iftable_processors[$processor_name]['dict_key'], $newlabel, $iface['ifPhysAddress']); if (!$iftable_processors[$processor_name]['try_next_proc']) { // done with this port continue 2; } } } // No failure up to this point, thus leave current tab for the "Ports" one. return buildRedirectURL(NULL, 'ports'); }