Пример #1
0
function doGenericSNMPmining($device)
{
    global $objectInfo, $known_devices, $iftable_processors;
    if (FALSE === ($sysObjectID = $device->snmpget('sysObjectID.0'))) {
        showFuncMessage(__FUNCTION__, 'ERR3');
        // // fatal SNMP failure
        return;
    }
    $sysObjectID = preg_replace('/^.*(enterprises\\.|joint-iso-ccitt\\.)([\\.[:digit:]]+)$/', '\\2', $sysObjectID);
    if (!isset($known_devices[$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
    showSuccess($known_devices[$sysObjectID]['text']);
    updateStickerForCell($objectInfo, 2, $known_devices[$sysObjectID]['dict_key']);
    // HW type
    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: '))));
            }
            // some models have the console port located on a module instead of the chassis
            $no_console = array('9.1.222', '9.1.283', '9.1.503');
            if (!in_array($sysObjectID, $no_console)) {
                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
            $dual_ac = array('9.1.222', '9.1.283', '9.1.956');
            if (in_array($sysObjectID, $dual_ac)) {
                // 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 SF series
        // Cisco SF series
        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);
            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\\.3(0|1)/', $sysObjectID):
            // Juniper 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):
            // TPLink
        // TPLink
        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;
    }
    if (isset($known_devices[$sysObjectID]['modular'])) {
        // this is a modular device
        // TODO: put the entire mining operation inside a single transaction (not possible now because commitAddPort() LOCKs/UNLOCKs the Port table which auto-commits any open transactions)
        global $snmp_data;
        $snmp_data = array();
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.4') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.4.'));
            $value = substr($raw_value, strlen('INTEGER: '));
            $snmp_data['entPhysicalContainedIn'][$key] = $value;
        }
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.2') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.2.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            $snmp_data['entPhysicalDescr'][$key] = $value;
        }
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.7') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.7.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            $snmp_data['entPhysicalName'][$key] = $value;
        }
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.13') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.13.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            $snmp_data['entPhysicalModelName'][$key] = $value;
        }
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.11') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.11.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            $snmp_data['entPhysicalSerialNum'][$key] = $value;
        }
        updateStickerForCell($objectInfo, 1, $snmp_data['entPhysicalSerialNum'][1]);
        // OEM S/N 1, safe to assume that the chassis is the first array element
        foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.9') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.9.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            $snmp_data['entPhysicalFirmwareRev'][$key] = $value;
        }
        foreach ($device->snmpwalkoid('ifPhysAddress') as $raw_key => $raw_value) {
            $key = substr($raw_key, strlen('IF-MIB::ifPhysAddress.'));
            $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
            if (preg_match('/^[0-9a-f]{1,2}(:[0-9a-f]{1,2}){5}/i', $value)) {
                $addrbytes = explode(':', $value);
                foreach ($addrbytes as $bidx => $bytestr) {
                    if (strlen($bytestr) == 1) {
                        $addrbytes[$bidx] = '0' . $bytestr;
                    }
                }
            } elseif (preg_match('/^[0-9a-f]{1,2}( [0-9a-f]{1,2}){5}/i', $value)) {
                // xx yy zz xx yy zz
                $addrbytes = explode(' ', substr($value, -17));
            } elseif (preg_match('/22[0-9a-f]{12}22$/', bin2hex($value))) {
                // "??????"
                $addrbytes = array(substr(bin2hex($value), -14, 12));
            } else {
                break;
            }
            // martian format
            // if this port's MAC is already assigned to another port, mark it as an empty string instead of causing a conflict
            $mac = implode('', $addrbytes);
            $snmp_data['ifPhysAddress'][$key] = (array_key_exists('ifPhysAddress', $snmp_data) and in_array($mac, $snmp_data['ifPhysAddress'])) ? '' : $mac;
        }
        // map entPhysicalIndex to ifIndex for MAC addresses association
        // first try to use entAliasMappingIdentifier (some devices don't support it)
        if ($entToIfMapping_raw = @$device->snmpwalkoid('mib-2.47.1.3.2.1.2')) {
            foreach ($entToIfMapping_raw as $key => $value) {
                // find the entID and map it to the ifID
                $e_array = explode('.', $key);
                $e_index = count($e_array) - 2;
                $eid = $e_array[$e_index];
                $iid = substr($value, strrpos($value, '.') + 1);
                $snmp_data['entToIfMapping'][$eid] = $iid;
            }
        } else {
            // entAliasMappingIdentifier isn't available, use entPhysicalName
            $ifName = array();
            foreach ($device->snmpwalkoid('ifName') as $raw_key => $raw_value) {
                $key = substr($raw_key, strlen('IF-MIB::ifName.'));
                $value = str_ireplace(array('STRING: ', '"'), '', $raw_value);
                $ifName[$key] = $value;
            }
            // query entPhysicalClass and note which entries which are ports
            foreach ($device->snmpwalkoid('mib-2.47.1.1.1.1.5') as $raw_key => $raw_value) {
                if (substr($raw_value, strlen('INTEGER: ')) == 10) {
                    $snmp_data['entPhysicalPorts'][] = substr($raw_key, strlen('SNMPv2-SMI::mib-2.47.1.1.1.1.5.'));
                }
            }
            // do the mapping, but only for ports
            foreach ($snmp_data['entPhysicalName'] as $key => $value) {
                if (in_array($key, $snmp_data['entPhysicalPorts'])) {
                    $snmp_data['entToIfMapping'][$key] = array_search($value, $ifName);
                }
            }
        }
        addModules(1, $objectInfo['id']);
    } else {
        // this is not a modular device
        $ifDescr_tablename = isset($known_devices[$sysObjectID]['ifDescrOID']) ? $known_devices[$sysObjectID]['ifDescrOID'] : 'ifDescr';
        foreach (array_keys($known_devices[$sysObjectID]['processors']) as $pkey) {
            if (!array_key_exists($known_devices[$sysObjectID]['processors'][$pkey], $iftable_processors)) {
                showWarning('processor "' . $known_devices[$sysObjectID]['processors'][$pkey] . '" not found');
                unset($known_devices[$sysObjectID]['processors'][$pkey]);
            }
        }
        $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_devices[$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');
}
Пример #2
0
function doSwitchSNMPmining($objectInfo, $device)
{
    global $known_switches, $iftable_processors;
    if (FALSE === ($sysObjectID = $device->snmpget('sysObjectID.0'))) {
        return showFuncMessage(__FUNCTION__, 'ERR3');
    }
    // // fatal SNMP failure
    $sysObjectID = preg_replace('/^.*(enterprises\\.|joint-iso-ccitt\\.)([\\.[:digit:]]+)$/', '\\2', $sysObjectID);
    $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 = isset($known_switches[$sysObjectID]['ifDescrOID']) ? $known_switches[$sysObjectID]['ifDescrOID'] : 'ifDescr';
    if (!isset($known_switches[$sysObjectID])) {
        return showFuncMessage(__FUNCTION__, 'ERR4', array($sysObjectID));
    }
    // unknown OID
    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);
    switch (1) {
        case preg_match('/^9\\.1\\./', $sysObjectID):
            // Catalyst w/one AC port
            $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);
            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\\.6\\.1\\./', $sysObjectID):
            // Cisco SF series
            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);
            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', 86 => '1-29', 87 => '1-29', 19 => '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('/^4526\\.100\\./', $sysObjectID):
            // NETGEAR
            checkPIC('1-681');
            commitAddPort($objectInfo['id'], 'console', '1-681', 'console', '');
            // DB-9 RS-232 console
            break;
        case preg_match('/^2011\\.2\\.23\\./', $sysObjectID):
            // Huawei
            detectSoftwareType($objectInfo, $sysDescr);
            checkPIC('1-681');
            commitAddPort($objectInfo['id'], 'con0', '1-681', 'console', '');
            // DB-9 RS-232 console
            break;
        case preg_match('/^2636\\.1\\.1\\.1\\.2\\.3(0|1)/', $sysObjectID):
            // Juniper EX3200/EX4200
            detectSoftwareType($objectInfo, $sysDescr);
            $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('/^2636\\.1\\.1\\.1\\.2\\./', $sysObjectID):
            // Juniper
            detectSoftwareType($objectInfo, $sysDescr);
            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
            detectSoftwareType($objectInfo, $sysDescr);
            $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('/^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)/', $sysObjectID):
        case preg_match('/^3955\\.6\\.1\\.2048\\.1/', $sysObjectID):
            // Linksys
            // 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('/^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\\.29/', $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('/^30065\\.1\\.3011\\./', $sysObjectID):
            // Arista
            detectSoftwareType($objectInfo, $sysDescr);
            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;
        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');
}