add SNMP support for HP Switches (GH #252)
[racktables] / wwwroot / inc / snmp.php
index 58e4f70..856421f 100644 (file)
@@ -726,6 +726,15 @@ $iftable_processors['nexus-any-10000SFP+'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['nexus-any-QSFP-split'] = array
+(
+       'pattern' => '@^Ethernet(([[:digit:]]+)/([[:digit:]]+)/([[:digit:]]+))$@',
+       'replacement' => 'e\\1',
+       'dict_key' => '9-1084',
+       'label' => '\\2/\\3:\\4',
+       'try_next_proc' => FALSE,
+);
+
 $iftable_processors['nexus-any-QSFP+'] = array
 (
        'pattern' => '@^Ethernet([[:digit:]]/[[:digit:]]+)$@',
@@ -735,6 +744,23 @@ $iftable_processors['nexus-any-QSFP+'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['nexus-3048-1000TX'] = array
+(
+       'pattern' => '@^Ethernet([[:digit:]]/[[:digit:]]+)$@',
+       'replacement' => 'e\\1',
+       'dict_key' => '24', // From database - check wwwroot/inc/install.php
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+$iftable_processors['nexus-3048-49-to-52-1000SFP'] = array
+(
+       'pattern' => '@^Ethernet([[:digit:]]+/)?(49|50|51|52)$@',
+       'replacement' => 'e\\1\\2',
+       'dict_key' => '9-1084',
+       'label' => '\\1\\2',
+       'try_next_proc' => FALSE,
+);
+
 $iftable_processors['ftos-any-1000T'] = array
 (
        'pattern' => '@^GigabitEthernet 0/(\d+)$@',
@@ -1374,6 +1400,15 @@ $iftable_processors['hce-any-SFP'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['hce-any-SFP28'] = array
+(
+       'pattern' => '@^25GE([[:digit:]]+/[[:digit:]]+/)([[:digit:]]+)$@',
+       'replacement' => '25ge\\1\\2',
+       'dict_key' => '16-1592',
+       'label' => '\\2',
+       'try_next_proc' => FALSE,
+);
+
 $iftable_processors['hce-any-QSFP-split'] = array
 (
        'pattern' => '@^40GE([[:digit:]]+/[[:digit:]]+/)([[:digit:]]+):([[:digit:]]+)$@',
@@ -1392,6 +1427,23 @@ $iftable_processors['hce-any-QSFP'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['hce-any-QSFP28-split'] = array
+(
+       'pattern' => '@^100GE([[:digit:]]+/[[:digit:]]+/)([[:digit:]]+):([[:digit:]]+)$@',
+       'replacement' => '100ge\\1\\2:\\3',
+       'dict_key' => '16-1592',
+       'label' => '\\2:\\3',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['hce-any-QSFP28'] = array
+(
+       'pattern' => '@^100GE([[:digit:]]+/[[:digit:]]+/)([[:digit:]]+)$@',
+       'replacement' => '100ge\\1\\2',
+       'dict_key' => '15-1588',
+       'label' => '\\2',
+       'try_next_proc' => FALSE,
+);
 $iftable_processors['quidway-XFP'] = array
 (
        'pattern' => '@^XGigabitEthernet([[:digit:]]+/[[:digit:]]+/)([[:digit:]]+)$@',
@@ -1842,9 +1894,9 @@ $iftable_processors['tplink-any-100T'] = array
        'dict_key' => 24,
        'label' => '\\1',
        'try_next_proc' => FALSE,
-); 
+);
 
-$iftable_processors['tplink-any-1000T'] = array
+$iftable_processors['tplink-sg-stackable-any-1000T'] = array
 (
        'pattern' => '@^.+ Port on unit .+ port ([[:digit:]]+)$@',
        'replacement' => 'g\\1',
@@ -1853,6 +1905,42 @@ $iftable_processors['tplink-any-1000T'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['tplink-sg-1000T'] = array
+(
+       'pattern' => '@^port ([[:digit:]]+): Gigabit Copper$@',
+       'replacement' => 'g\\1',
+       'dict_key' => 24,
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['tplink-jetstream-any-1000T'] = array
+(
+       'pattern' => '@^(gigabitEthernet\s|Gi)(\d+)/(\d+)/(\d+) : copper$@',
+       'replacement' => 'gi\\2/\\3/\\4',
+       'dict_key' => 24,
+       'label' => '\\4',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['tplink-jetstream-any-10000SFP+'] = array
+(
+       'pattern' => '@^Te(\d+)/(\d+)/(\d+) : fiber$@',
+       'replacement' => 'te\\1/\\2/\\3',
+       'dict_key' => '9-1084',
+       'label' => '\\3',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['tplink-jetstream-any-1000SFP'] = array
+(
+    'pattern' => '@^(gigabitEthernet\s|Gi)(\d+)/(\d+)/(\d+) : fiber@',
+    'replacement' => 'te\\2/\\3/\\4',
+    'dict_key' => '4-1077',
+    'label' => '\\4',
+    'try_next_proc' => FALSE,
+);
+
 $iftable_processors['motorola-rfs-any-1000T'] = array
 (
        'pattern' => '@^ge(\d+)$@',
@@ -1907,6 +1995,33 @@ $iftable_processors['dlink-any-1000T'] = array
        'try_next_proc' => FALSE,
 );
 
+$iftable_processors['Dlink-3028-100TX'] = array
+(
+     'pattern' => '@^D-Link DES-.+ R.+ Port (\d+)$@',
+     'replacement' => 'e\\1',
+     'dict_key' => 19,
+     'label' => '\\1',
+     'try_next_proc' => FALSE,
+);
+
+$iftable_processors['Dlink-3028-25-to-28-1000T'] = array
+(
+     'pattern' => '@^D-Link DES-.+ R.+ Port (25|26|27|28)$@',
+     'replacement' => 'g\\1',
+     'dict_key' => 24,
+     'label' => '\\1',
+     'try_next_proc' => FALSE,
+);
+
+$iftable_processors['Dlink-3028-25-to-26-Combo'] = array
+(
+     'pattern' => '@^D-Link DES-.+ R.+ Port (25|26)$@',
+     'replacement' => 'g\\1',
+     'dict_key' => '4-1077',
+     'label' => 'G\\1',
+     'try_next_proc' => TRUE,
+);
+
 $iftable_processors['dlink-rmon-any-100TX'] = array
 (
        'pattern' => '@^RMON Port (\d+) on Unit (\d+)$@',
@@ -2042,6 +2157,188 @@ $iftable_processors['brocade-icx-64xx-1000T'] = array
        'try_next_proc' => FALSE,
 );
 
+// In the following two declarations the leading zero is a placeholder -- in
+// the CLI it may be another number but the SNMP agent does not report it.
+$iftable_processors['brocade-vdx-QSFP+'] = array
+(
+       'pattern' => '@^FortyGigabitEthernet 0/(\d+)$@',
+       'replacement' => 'fo 0/0/\\1',
+       'dict_key' => '10-1588',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['brocade-vdx-SFP+'] = array
+(
+       'pattern' => '@^TenGigabitEthernet 0/(\d+)$@',
+       'replacement' => 'te 0/0/\\1',
+       'dict_key' => '9-1084', // empty SFP+
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['brocade-vdx-management'] = array
+(
+       'pattern' => '@^eth0$@',
+       'replacement' => 'management',
+       'dict_key' => '1-24',
+       'label' => 'Management',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['ubiquiti-chassis-any-1000T'] = array
+(
+       'pattern' => '@^Slot: (\d+) Port: (\d+) Gigabit - Level$@',
+       'replacement' => '\\1/\\2',
+       'dict_key' => 24,
+       'label' => '\\2',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['ubiquiti-chassis-any-SFP+'] = array
+(
+       'pattern' => '@^Slot: (\d+) Port: (\d+) 10G - Level$@',
+       'replacement' => '\\1/\\2',
+       'dict_key' => '9-1084',
+       'label' => '\\2',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['ubiquiti-chassis-51-to-52-1000SFP'] = array
+(
+       'pattern' => '@^Slot: (\d+) Port: (51|52) Gigabit - Level$@',
+       'replacement' => '\\1/\\2',
+       'dict_key' => '4-1077',
+       'label' => '\\2',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-25-to-28-1000SFP'] = array
+(
+       'pattern' => '@^GigabitEthernet1/0/(25|26|27|28)$@',
+       'replacement' => '\\1',
+       'dict_key' => '4-1077',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['catalyst-chassis-any-TenGb'] = array
+(
+       'pattern' => '@^Ten-GigabitEthernet([[:digit:]]+/)([[:digit:]]+/)([[:digit:]]+)$@',
+       'replacement' => 'Tgi\\1\\2\\3',
+       'dict_key' => '9-1084',
+       'label' => '\\3',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['catalyst-chassis-FortyGigE'] = array
+(
+       'pattern' => '@^FortyGigE([[:digit:]]+/)([[:digit:]]+/)(49|50|51|52)$@',
+       'replacement' => 'FGi\\1\\2\\3',
+       'dict_key' => '10-1588',
+       'label' => '\\3',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-51-to-52-10000SFP+'] = array
+(
+       'pattern' => '@^(Ten-GigabitEthernet1/0/(51|52))$@',
+       'replacement' => '\\1',
+       'dict_key' => '9-1084',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-49-to-50-10GBase-T'] = array
+(
+       'pattern' => '@^Ten-GigabitEthernet1/0/(49|50)$@',
+       'replacement' => '\\1',
+       'dict_key' => '1-1642',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-any-1000T'] = array
+(
+       'pattern' => '@^GigabitEthernet1/0/(\d+)$@',
+       'replacement' => '\\g1',
+       'dict_key' => 24,
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-8ports-1000T'] = array
+(
+       'pattern' => '@^Port:  (\d+) Gigabit - Level$@',
+       'replacement' => '\\1',
+       'dict_key' => 24,
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-1810-1000T'] = array
+(
+       'pattern' => '@^Port: (\d+) Gigabit - Level$@',
+       'replacement' => '\\1',
+       'dict_key' => 24,
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-1810-1000SFP'] = array
+(
+       'pattern' => '@^Port: (\d+) SFP - Level$@',
+       'replacement' => '\\1',
+       'dict_key' => '4-1077',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-1810-23-to-24-COMBO'] = array
+(
+       'pattern' => '@^Port: (23|24) Gigabit - Level$@',
+       'replacement' => '\\1',
+       'dict_key' => '4-1077',
+       'label' => '\\1',
+       'try_next_proc' => TRUE,
+);
+
+$iftable_processors['cisco-25-to-28-1000SFP'] = array
+(
+       'pattern' => '@^GigabitEthernet1/1/(25|26|27|28)$@',
+       'replacement' => 'gi1/1/\\1',
+       'dict_key' => '4-1077',
+       'label' => 'G\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['nexus-any-10000T'] = array
+(
+       'pattern' => '@^Ethernet([[:digit:]]/[[:digit:]]+)$@',
+       'replacement' => 'e\\1',
+       'dict_key' => '1-1642',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-25-to-28-1000SFPcombo'] = array
+(
+       'pattern' => '@^GigabitEthernet1/0/(25|26|27|28)$@',
+       'replacement' => '\\1',
+       'dict_key' => '4-1077',
+       'label' => '\\1',
+       'try_next_proc' => FALSE,
+);
+
+$iftable_processors['procurve-49-to-52-combo-1000SFP'] = array
+(
+       'pattern' => '@^(49|50|51|52)$@',
+       'replacement' => '\\1',
+       'dict_key' => '4-1077',
+       'label' => '\\1',
+       'try_next_proc' => TRUE,
+);
+
 global $known_switches;
 $known_switches = array // key is system OID w/o "enterprises" prefix
 (
@@ -2297,6 +2594,12 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'WS-CE500-24TT: 24 RJ-45/10-100TX + 2 RJ-45/10-100-1000T(X)',
                'processors' => array ('catalyst-any-100TX', 'catalyst-any-1000T'),
        ),
+       '9.1.726' => array
+       (
+               'dict_key' => 159,
+               'text' => 'WS-CE500-24PC: 24 RJ-45/10-100TX PoE + 2 combo',
+               'processors' => array ('catalyst-chassis-1-to-2-combo-1000T', 'catalyst-chassis-any-100TX', 'catalyst-chassis-mgmt'),
+       ),
        '9.1.727' => array
        (
                'dict_key' => 161,
@@ -2479,6 +2782,18 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                        'catalyst-stack-any-1000T',
                ),
        ),
+       '9.1.1226' => array
+       (
+               'dict_key' => 1576,
+               'text' => 'WS-C3560X-24T: 24 RJ-45/10-100-1000T(X) + network module + OOBM',
+               'processors' => array
+               (
+                       'C3KX-NM-10000',
+                       'C3KX-NM-1000',
+                       'catalyst-chassis-any-1000T',
+                       'catalyst-chassis-mgmt',
+               ),
+       ),
        '9.1.1227' => array
        (
                'dict_key' => 1577,
@@ -2509,6 +2824,12 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'WS-C2960S-24PS-L: 24 RJ-45/10-100-1000T(X) + 4 SFP/1000',
                'processors' => array ('catalyst-stack-25-to-28-SFP', 'catalyst-chassis-mgmt', 'catalyst-stack-any-1000T'),
        ),
+       '9.1.1266' => array
+       (
+               'dict_key' => 1388,
+               'text' => 'WS-C2960S-48TS-L: 48 RJ-45/10-100-1000T(X) + 4 SFP/1000',
+               'processors' => array ('catalyst-stack-49-to-52-SFP', 'catalyst-chassis-mgmt', 'catalyst-stack-any-1000T'),
+       ),
        '9.1.1292' => array
        (
                'dict_key' => 1606,
@@ -3143,11 +3464,17 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'N5K-C5548P: 32 SFP+/10000',
                'processors' => array ('nexus-any-10000SFP+', 'nexus-mgmt'),
        ),
+       '9.12.3.1.3.1106' => array
+       (
+               'dict_key' => 2333,
+               'text' => 'N3K-3048P: 48 RJ-45/100-1000TX + 4 SFP+/1000-10000',
+               'processors' => array ('nexus-3048-49-to-52-1000SFP', 'nexus-3048-1000TX', 'nexus-mgmt'),
+       ),
        '9.12.3.1.3.1417' => array
        (
                'dict_key' => 2331,
                'text' => 'Nexus 3132Q: 32 QSFP+',
-               'processors' => array ('nexus-any-QSFP+', 'nexus-mgmt'),
+               'processors' => array ('nexus-any-QSFP-split', 'nexus-any-QSFP+', 'nexus-mgmt'),
        ),
        '11.2.3.7.11.9' => array
        (
@@ -3362,12 +3689,24 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'J9452A: 48 RJ-45/10-100-1000T + 2 SFP-10000+',
                'processors' => array ('procurve-49-to-52-10000SFP+', 'procurve-chassis-1000T'),
        ),
+       '11.2.3.7.11.131' => array
+       (
+               'dict_key' => 2396,
+               'text' => 'J9625A: 24 RJ-45/10-100TX (12 PoE) + 2 1000T + 2 SFP-1000',
+               'processors' => array ('procurve-25-to-26-1000T', 'procurve-27-to-28-1000SFP', 'procurve-chassis-100TX'),
+       ),
        '11.2.3.7.11.154' => array
        (
                'dict_key' => 2213,
                'text' => 'J9728A: 44 RJ-45/10-100-1000T + 4 combo-gig',
                'processors' => array ('procurve-45-to-48-combo-1000SFP', 'procurve-chassis-1000T'),
        ),
+       '43.1.8.72' => array
+       (
+               'dict_key' => 2176,
+               'text' => '1910G 24-port: 24 RJ-45/10-100-1000T(X) + 4 SFP combo-gig',
+               'processors' => array ('3com-25-to-26-1000SFP', '3com-27-to-28-1000SFP', '3com-any-1000T'),
+       ),
        '43.1.16.4.3.8' => array
        (
                'dict_key' => 780,
@@ -3434,6 +3773,12 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'PF5240: 48 RJ-45/10-100-1000T(X) + 4 SFP+',
                'processors' => array ('nec-any-1000T', 'nec-any-SFP+', 'nec-mgmt'),
        ),
+       '171.10.63.6' => array
+       (
+               'dict_key' => 614,
+               'text' => '24-Port Fast Ethernet L2 Managed PoE Switch with 2 x 1000BASE-T and 2 x Combo 1000BASE-T/SFP ports ',
+               'processors' => array ('Dlink-3028-25-to-26-Combo','Dlink-3028-25-to-28-1000T','Dlink-3028-100TX'),
+       ),
        '171.10.63.8' => array
        (
                'dict_key' => 616,
@@ -3698,11 +4043,29 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'CE5850-48T4S2Q-EI: 48 RJ-45/10-100-1000T(X) + 4 SFP+ slots + 2 QSFP+ slots',
                'processors' => array ('hce-any-1000T', 'hce-any-SFP', 'hce-any-QSFP', 'quidway-mgmt'),
        ),
+       '2011.2.239.10' => array
+       (
+               'dict_key' => 1769,
+               'text' => 'CE5850-48T4S2Q-HI: 48 RJ-45/10-100-1000T(X) + 4 SFP+ slots + 2 QSFP+ slots',
+               'processors' => array ('hce-any-1000T', 'hce-any-SFP', 'hce-any-QSFP', 'quidway-mgmt'),
+       ),
        '2011.2.239.5' => array
        (
                'dict_key' => 1772,
-               'text' => 'CE6850-48S4Q-EI: 48 4 SFP+ slots + 4 QSFP+ slots',
-               'processors' => array ('hce-any-1000T', 'hce-any-SFP', 'hce-any-QSFP', 'quidway-mgmt'),
+               'text' => 'CE6850-48S4Q-EI: 48 SFP+ slots + 4 QSFP+ slots',
+               'processors' => array ('hce-any-SFP', 'hce-any-QSFP', 'quidway-mgmt'),
+       ),
+       '2011.2.239.49' => array
+       (
+               'dict_key' => 3716,
+               'text' => 'CE6865-48S8CQ-EI: 48 SFP28 slots + 8 QSFP28 slots',
+               'processors' => array ('hce-any-SFP28', 'hce-any-QSFP28-split', 'hce-any-QSFP28', 'quidway-mgmt'),
+       ),
+       '2011.2.239.32' => array
+       (
+               'dict_key' => 1772,
+               'text' => 'CE6870-48S6CQ-EI: 48 SFP+ slots + 6 QSFP28 slots',
+               'processors' => array ('hce-any-SFP', 'hce-any-QSFP28-split', 'hce-any-QSFP28', 'quidway-mgmt'),
        ),
        '2011.2.239.11' => array
        (
@@ -3710,6 +4073,12 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'CE7850-32Q-EI: 32 QSFP+ slots',
                'processors' => array ('hce-any-QSFP-split', 'hce-any-QSFP', 'quidway-mgmt'),
        ),
+       '2011.2.239.42' => array
+       (
+               'dict_key' => 2706,
+               'text' => 'CE8850-32CQ-EI: 32 QSFP28 slots',
+               'processors' => array ('hce-any-SFP', 'hce-any-QSFP28-split', 'hce-any-QSFP28', 'quidway-mgmt'),
+       ),
        '2636.1.1.1.2.29' => array
        (
                'dict_key' => 925,
@@ -3735,6 +4104,12 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'Juniper EX4200 series',
                'processors' => array ('juniper-ex-pic0-1000T', 'juniper-ex-mgmt'),
        ),
+       '2636.1.1.1.2.43' => array
+       (
+               'dict_key' => 2395,
+               'text' => 'Juniper EX2200 series',
+               'processors' => array ('juniper-ex-pic0-1000T', 'juniper-ex-mgmt'),
+       ),
        '3955.6.1.2024.1' => array
        (
                'dict_key' => 2212,
@@ -3852,8 +4227,32 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
        (
                'dict_key' => 1793,
                'text' => 'TL-SG5426: 22 RJ-45/10-100-1000T(X) + 4 combo ports',
-               'processors' => array ('tplink-21-to-24-combo-1000SFP', 'tplink-any-1000T'),
+               'processors' => array ('tplink-21-to-24-combo-1000SFP', 'tplink-sg-stackable-any-1000T'),
+       ),
+       '11863.1.1.12' => array
+       (
+               'dict_key' => 3671,
+               'text' => 'TL-SG2216: 16 RJ-45/10-100-1000T(X) + 2 combo ports',
+               'processors' => array ('tplink-15-to-16-combo-1000SFP', 'tplink-sg-1000T'),
+       ),
+       '11863.1.1.3' => array
+       (
+               'dict_key' => 3672,
+               'text' => 'TL-SG3424: 24 RJ-45/10-100-1000T(X) + 4 combo ports',
+               'processors' => array ('tplink-21-to-24-combo-1000SFP', 'tplink-sg-1000T'),
+       ),
+       '11863.5.31' => array
+       (
+               'dict_key' => 3670,
+               'text' => 'T1700G-28TQ: 24 RJ-45/10-100-1000T(X) + 4 SFP+/10000',
+               'processors' => array ('tplink-jetstream-any-1000T', 'tplink-jetstream-any-10000SFP+'),
        ),
+       '11863.5.86' => array
+    (
+        'dict_key' => 3701,
+        'text' => 'T1600G-18TS: 16 RJ-45/10-100-1000T(X) + 2 SFP/1000',
+        'processors' => array ('tplink-jetstream-any-1000T', 'tplink-jetstream-any-1000SFP'),
+    ),
        '12356.101.1.3002'=> array
        (
                'dict_key' => 1609,
@@ -3920,7 +4319,132 @@ $known_switches = array // key is system OID w/o "enterprises" prefix
                'text' => 'IBM System Networking RackSwitch G8000',
                'processors' => array ('ibm-45-to-48-SFP','ibm-49-to-52-SFP+','ibm-any-1000T'),
        ),
-
+       '1588.3.3.1.131' => array
+       (
+               'dict_key' => 2665,
+               'text' => 'Brocade VDX 6740',
+               'processors' => array ('brocade-vdx-QSFP+','brocade-vdx-SFP+', 'brocade-vdx-management'),
+       ),
+       '1991.1.3.62.2.1.1.1' => array
+       (
+               'dict_key' => 2666,
+               'text' => 'ICX7250-48 48x1000T + 8 SFP+/1000',
+               'processors' => array ('brocade-icx-64xx-1000T','brocade-icx-64xx-10000SFP', 'fcx-management'),
+       ),
+       '4413' => array
+       (
+               'dict_key' => 2624,
+               'text' => 'Ubiquiti EdgeSwitch ES-48-LITE',
+               'processors' => array ('ubiquiti-chassis-51-to-52-1000SFP','ubiquiti-chassis-any-1000T','ubiquiti-chassis-any-SFP+'),
+       ),
+       '11.2.3.7.11.145' => array
+       (
+               'dict_key' => 3654,
+               'text' => 'HP Aruba 2530 48 PoE+ Switch, (48) RJ-45 10/100 PoE+ ports, (2) autosensing 10/100/1000 ports, (2) fixed Gigabit Ethernet SFP ports',
+               'processors' => array ('procurve-51-to-52-1000SFP','procurve-49-to-50-1000T','procurve-chassis-100TX'),
+       ),
+       '11.2.3.7.11.146' => array
+       (
+               'dict_key' => 3655,
+               'text' => 'HP Aruba 2530 24 PoE+ Switch, (24) RJ-45 10/100 PoE+ ports, (2) autosensing 10/100/1000 ports, (2) fixed Gigabit Ethernet SFP ports',
+               'processors' => array ('procurve-27-to-28-1000SFP','procurve-25-to-26-1000T','procurve-chassis-100TX'),
+       ),
+       '25506.11.1.181' => array
+       (
+               'dict_key' => 3656,
+               'text' => 'HP 1950 48G 2SFP+ 2XGT Switch, (48) RJ-45 auto-negotiating 10/100/1000 PoE+ ports, (2) SFP+ fixed 1000/10000 SFP+ ports, (2) RJ-45 1/10GBASE-T ports',
+               'processors' => array ('procurve-49-to-50-10GBase-T','procurve-51-to-52-10000SFP+','procurve-any-1000T'),
+       ),
+       '25506.11.1.100' => array
+       (
+               'dict_key' => 3659,
+               'text' => 'HPE FlexFabric 5900AF 48XG 4QSFP+ Switch, 1G/10G SFP+ and 4 QSFP+-ports, dual hot-pluggable power supplies and fan trays,',
+               'processors' => array ('catalyst-chassis-FortyGigE','catalyst-chassis-any-TenGb'),
+       ),
+       '25506.11.1.101' => array
+       (
+               'dict_key' => 3658,
+               'text' => 'HPE 5500-24G-4SFP, 24 RJ-45 autosensing 10/100/1000 ports, 4 fixed Gigabit Ethernet SFP ports',
+               'processors' => array ('procurve-25-to-28-1000SFP', 'procurve-any-1000T', 'catalyst-chassis-any-TenGb'),
+       ),
+       '25506.11.1.46' => array
+       (
+               'dict_key' => 3662,
+               'text' => 'HP A5800AF-48G Switch with 2 Processors (JG225A), (48) RJ-45 10/100/1000 ports, (6) fixed 1000/10000 SFP+ ports',
+               'processors' => array ('catalyst-chassis-any-TenGb','procurve-any-1000T'),
+       ),
+       '11.2.3.7.11.150' => array
+       (
+               'dict_key' => 3660,
+               'text' => 'HP 1810-8G v2 (J9802A)',
+               'processors' => array ('procurve-8ports-1000T'),
+       ),
+       '11.2.3.7.11.151' => array
+       (
+               'dict_key' => 3730,
+               'text' => 'HP 1810-24G v2 (J9803A), 24 x Gigabit Ethernet 10/100/1000, 2 x SFP',
+               'processors' => array ('procurve-1810-1000SFP','procurve-1810-1000T'),
+       ),
+       '11.2.3.7.11.194' => array
+       (
+               'dict_key' => 2242,
+               'text' => 'HP 1810-24G (J9450A), 22 x Gigabit Ethernet 10/100/1000, 2 combo ports',
+               'processors' => array ('procurve-1810-23-to-24-COMBO','procurve-1810-1000T'),
+       ),
+       '11.2.3.7.11.103' => array
+       (
+               'dict_key' => 3729,
+               'text' => 'HP 1810-8G (J9449A), 8 Gigabit Ethernet 10/100/1000',
+               'processors' => array ('procurve-8ports-1000T'),
+       ),
+       '9.1.1643' => array
+       (
+               'dict_key' => 2190,
+               'text' => 'Cisco Catalyst 3850-48T-S Switch, 48 10/100/1000',
+               'processors' => array ('cisco-25-to-28-1000SFP', 'catalyst-stack-any-1000T'),
+       ),
+       '9.1.571' => array
+       (
+               'dict_key' => 3731,
+               'text' => 'Cisco 871',
+               'processors' => array ('catalyst-any-100TX'),
+       ),
+       '9.12.3.1.3.1239' => array
+       (
+               'dict_key' => 2332,
+               'text' => 'Cisco Nexus 3064-T Switch,  48 x 10GBase-T + 4 x QSFP+',
+               'processors' => array ('nexus-any-QSFP-split', 'nexus-any-10000T'),
+       ),
+       '9.1.1644' => array
+       (
+               'dict_key' => 2189,
+               'text' => 'Cisco Catalyst Model WS-C3850-24T, 24 Gigabit Ethernet',
+               'processors' => array ('cisco-25-to-28-1000SFP', 'catalyst-stack-any-1000T'),
+       ),
+       '11.2.3.7.11.50' => array
+       (
+               'dict_key' => 3728,
+               'text' => 'HP ProCurve Switch 5400zl Series, RJ-45 48 auto-sensing 10/100/1000 ports',
+               'processors' => array ('procurve-modular-1000T'),
+       ),
+       '10.107.158.51' => array
+       (
+               'dict_key' => 3732,
+               'text' => 'HP A5120-24G EI (JE068A),  24 ports 10/100/1000Base-T, 4 Combo ports 10/100/1000Base-T/SFP, 2 interface slots for 10Gbe',
+               'processors' => array ('procurve-25-to-28-1000SFPcombo','procurve-any-1000T'),
+       ),
+       '25506.11.1.85' => array
+       (
+               'dict_key' => 2238,
+               'text' => 'JE009A: 48 RJ-45/10-100-1000T(X) + 4 SFP-1000 ports',
+               'processors' => array ('procurve-49-to-52-combo-1000SFP','procurve-modular-1000T'),
+       ),
+       '11.2.3.7.11.69' => array
+       (
+               'dict_key' => 872,
+               'text' => ' J9049A: 24 RJ-45/10-100-1000T',
+               'processors' => array ('procurve-chassis-1000T'),
+       ),
 );
 
 global $swtype_pcre;
@@ -3933,7 +4457,7 @@ $swtype_pcre = array
        '/Huawei Versatile Routing Platform Software.+VRP.+Software,\s*Version 5\.120 /is' => 2081,
        '/Huawei Versatile Routing Platform Software.+VRP.+Software,\s*Version 5\.\d{3,} /is' => 2081, // fallback for all 5.120+
        '/Huawei Versatile Routing Platform Software.+VRP.+Software,\s*Version 8\./is' => 2027, // fallback for all 8.x
-       // FIXME: get sysDescr for IronWare 5 and add a pattern
+       '/^Foundry Networks.+, IronWare Version 05\./' => 1363, // Not an exact format, just a guess.
        '/^Brocade Communications Systems.+, IronWare Version 07\./' => 1364,
        '/^Juniper Networks,.+JUNOS 9\./' => 1366,
        '/^Juniper Networks,.+JUNOS 10\./' => 1367,
@@ -3954,13 +4478,13 @@ function updateStickerForCell ($cell, $attr_id, $new_value)
        if
        (
                isset ($cell['attrs'][$attr_id])
-               and !strlen ($cell['attrs'][$attr_id]['value'])
-               and     strlen ($new_value)
+               and $cell['attrs'][$attr_id]['value'] == ''
+               and $new_value != ''
        )
                commitUpdateAttrValue ($cell['id'], $attr_id, $new_value);
 }
 
-// Accept "X-Y" on input and make sure, that PortInterfaceCompat contains
+// Accept "X-Y" on input and make sure that PortInterfaceCompat contains
 // a record with IIF id = X and OIF id = Y.
 function checkPIC ($port_type_id)
 {
@@ -3970,20 +4494,17 @@ function checkPIC ($port_type_id)
        {
                $compat_array = array();
                foreach (getPortInterfaceCompat() as $record)
-               {
-                       $key = $record['iif_id'] . '-' . $record['oif_id'];
-                       $compat_array[$key] = 1;
-               }
+                       $compat_array[$record['iif_id'] . '-' . $record['oif_id']] = 1;
        }
 
        if (preg_match ('/^(?:(\d+)-)?(\d+)$/', $port_type_id, $m))
        {
                $iif_id = $m[1];
                $oif_id = $m[2];
-               if (empty ($iif_id))
+               if ($iif_id == '')
                {
                        $iif_id = 1;
-                       $port_type_id = $iif_id . '-' . $port_type_id;
+                       $port_type_id = '1-' . $port_type_id;
                }
                if (! array_key_exists ($port_type_id, $compat_array))
                {
@@ -3995,18 +4516,17 @@ function checkPIC ($port_type_id)
 
 function doSNMPmining ($object_id, $snmpsetup)
 {
-       setFuncMessages (__FUNCTION__, array ('ERR1' => 161, 'ERR2' => 162));
        $objectInfo = spotEntity ('object', $object_id);
        $objectInfo['attrs'] = getAttrValues ($object_id);
        $endpoints = findAllEndpoints ($object_id, $objectInfo['name']);
        if (count ($endpoints) == 0)
        {
-               showFuncMessage (__FUNCTION__, 'ERR1'); // endpoint not found
+               showError ('Endpoint not found. Please either set FQDN attribute or assign an IP address to the object.');
                return;
        }
        if (count ($endpoints) > 1)
        {
-               showFuncMessage (__FUNCTION__, 'ERR2'); // can't pick an address
+               showError ('More than one IP address is assigned to this object, please configure FQDN attribute.');
                return;
        }
 
@@ -4025,18 +4545,17 @@ function doSNMPmining ($object_id, $snmpsetup)
 
 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
+               showError ('Fatal SNMP failure');
                return;
        }
-       $sysObjectID = preg_replace ('/^.*(enterprises\.|joint-iso-ccitt\.)([\.[:digit:]]+)$/', '\\2', $sysObjectID);
+       $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
+               showError ("Unknown OID '{$sysObjectID}'");
                return;
        }
        $sysName = substr ($device->snmpget ('sysName.0'), strlen ('STRING: '));
@@ -4053,6 +4572,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
        updateStickerForCell ($objectInfo, 2, $known_switches[$sysObjectID]['dict_key']);
        updateStickerForCell ($objectInfo, 3, $sysName);
        detectSoftwareType ($objectInfo, $sysDescr);
+       $desiredPorts = array();
        switch (1)
        {
        case preg_match ('/^9\.1\./', $sysObjectID): // Catalyst w/one AC port
@@ -4066,38 +4586,39 @@ function doSwitchSNMPmining ($objectInfo, $device)
                        '12.2' => 252,
                        '15.0' => 1901,
                        '15.1' => 2082,
+                       '15.2' => 2142,
                );
                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)
+               if ($sysChassi !== FALSE || $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
+               addDesiredPort ($desiredPorts, '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
+                       addDesiredPort ($desiredPorts, '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', '');
+                       addDesiredPort ($desiredPorts, 'AC-in-1', '1-16', 'AC1', '');
+                       addDesiredPort ($desiredPorts, 'AC-in-2', '1-16', 'AC2', '');
                }
-               elseif ($sysObjectID != '9.1.749' and $sysObjectID != '9.1.920')
+               elseif ($sysObjectID != '9.1.749' && $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', '', '');
+                       addDesiredPort ($desiredPorts, 'AC-in', '1-16', '', '');
                }
                break;
        case preg_match ('/^9\.5\.42/', $sysObjectID): // Catalyst 2948 running CatOS
        case preg_match ('/^9\.6\.1\./', $sysObjectID): // 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
+               addDesiredPort ($desiredPorts, 'con0', '1-681', 'console', ''); // DB-9 RS-232 console
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, 'AC-in', '1-16', '', '');
                break;
        case preg_match ('/^9\.12\.3\.1\.3\./', $sysObjectID): // Nexus
                $exact_release = preg_replace ('/^.*, Version ([^ ]+), .*$/', '\\1', $sysDescr);
@@ -4106,18 +4627,24 @@ function doSwitchSNMPmining ($objectInfo, $device)
                (
                        '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)
+               if ($sysChassi !== FALSE || $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
+               addDesiredPort ($desiredPorts, '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', '');
+               addDesiredPort ($desiredPorts, 'AC-in-1', '1-16', 'AC1', '');
+               addDesiredPort ($desiredPorts, 'AC-in-2', '1-16', 'AC2', '');
                break;
        case preg_match ('/^11\.2\.3\.7\.11\.(\d+)$/', $sysObjectID, $matches): // ProCurve
                $console_per_product = array
@@ -4142,7 +4669,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
                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', '');
+                       addDesiredPort ($desiredPorts, 'console', $console_per_product[$matches[1]], 'console', '');
                }
                $oom_per_product = array
                (
@@ -4151,21 +4678,21 @@ function doSwitchSNMPmining ($objectInfo, $device)
                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', '');
+                       addDesiredPort ($desiredPorts, 'mgmt', $oom_per_product[$matches[1]], 'mgmt', '');
                }
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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
+       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
+               addDesiredPort ($desiredPorts, 'con', '1-29', 'CON', ''); // RJ-45 RS-232 console
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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);
@@ -4175,7 +4702,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
        case preg_match ('/^1991\.1\.3\.53\.1\.2$/', $sysObjectID): // 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
+               addDesiredPort ($desiredPorts, 'console', '1-681', 'console', ''); // DB-9 RS-232 console
                break;
        case preg_match ('/^1991\.1\.3\.45\./', $sysObjectID): // snFGSFamily
        case preg_match ('/^1991\.1\.3\.46\./', $sysObjectID): // snFLSFamily
@@ -4184,7 +4711,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
                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)
+               if ($sysChassi !== FALSE || $sysChassi !== NULL)
                        updateStickerForCell ($objectInfo, 1, str_replace ('"', '', substr ($sysChassi, strlen ('STRING: '))));
 
                # Type of uplink module installed.
@@ -4197,7 +4724,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
                # 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).
+               # (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))
@@ -4217,12 +4744,12 @@ function doSwitchSNMPmining ($objectInfo, $device)
                        if ($count)
                        {
                                checkPIC ('1-16');
-                               commitAddPort ($objectInfo['id'], $PSU_cooked, '1-16', '', '');
+                               addDesiredPort ($desiredPorts, $PSU_cooked, '1-16', '', '');
                        }
                }
                # fixed console port
                checkPIC ('1-681');
-               commitAddPort ($objectInfo['id'], 'console', '1-681', 'console', ''); // DB-9 RS-232 console
+               addDesiredPort ($desiredPorts, '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);
@@ -4235,12 +4762,12 @@ function doSwitchSNMPmining ($objectInfo, $device)
                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
+               addDesiredPort ($desiredPorts, 'console', '1-681', 'console', ''); // DB-9 RS-232
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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
+               addDesiredPort ($desiredPorts, 'aux0', '1-29', 'RS-232', ''); // RJ-45 RS-232 console
                $m = array();
                if (preg_match ('/Force10 Application Software Version: ([\d\.]+)/', $sysDescr, $m))
                {
@@ -4261,17 +4788,18 @@ function doSwitchSNMPmining ($objectInfo, $device)
                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', '');
+                       addDesiredPort ($desiredPorts, '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', '');
+                       addDesiredPort ($desiredPorts, 'PSU1', '1-16', 'PSU1', '');
                }
-               if (strlen ($serialNo))
+               if ($serialNo != '')
                        updateStickerForCell ($objectInfo, 1, str_replace ('"', '', substr ($serialNo, strlen ('STRING: '))));
                break;
+       case preg_match ('/^171\.10\.63\.6/', $sysObjectID): // D-Link DES-3028
        case preg_match ('/^171\.10\.63\.8/', $sysObjectID): // D-Link DES-3052
        case preg_match ('/^202\.20\./', $sysObjectID): // SMC TigerSwitch
        case preg_match ('/^674\.10895\.4/', $sysObjectID): // Dell PowerConnect
@@ -4281,47 +4809,49 @@ function doSwitchSNMPmining ($objectInfo, $device)
        case preg_match ('/^3955\.6\.1\.20(24|48)\.1/', $sysObjectID): // Linksys
        case preg_match ('/^3955\.6\.50(24|48)/', $sysObjectID): // Linksys
        case preg_match ('/^4526\.100\./', $sysObjectID): // NETGEAR (with console)
-       case preg_match ('/^11863\.1\.1\.1/', $sysObjectID): // TPLink
+       case preg_match ('/^11863\.1\.1\.1$/', $sysObjectID): // TP-Link
+       case preg_match ('/^11863\.1\.1\.3$/', $sysObjectID): // TP-Link TL-SG3424
        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
+               addDesiredPort ($desiredPorts, 'console', '1-681', '', ''); // DB-9 RS-232
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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', '');
+               addDesiredPort ($desiredPorts, 'console', '1-29', 'console', '');
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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', '');
+               addDesiredPort ($desiredPorts, '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', '');
+               addDesiredPort ($desiredPorts, 'AC-in-1', '1-16', 'AC1', '');
+               addDesiredPort ($desiredPorts, '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
+               addDesiredPort ($desiredPorts, 'console', '1-681', '', ''); // DB-9 RS-232
                checkPIC ('1-19');
-               commitAddPort ($objectInfo['id'], 'mgmt', '1-19', '', '');
+               addDesiredPort ($desiredPorts, 'mgmt', '1-19', '', '');
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, 'AC-in', '1-16', '', '');
                break;
+       case preg_match ('/^43\.1\.8\.72/', $sysObjectID): // 3Com
        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
+               addDesiredPort ($desiredPorts, 'console', '1-29', '', ''); // RJ-45 RS-232 console
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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);
@@ -4329,33 +4859,33 @@ function doSwitchSNMPmining ($objectInfo, $device)
 
                // one AC port, no console
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'AC-in', '1-16', '', '');
+               addDesiredPort ($desiredPorts, 'AC-in', '1-16', '', '');
                break;
        case preg_match ('/^171\.10\.76\.10/', $sysObjectID): // D-Link DGS-1210-24
        case preg_match ('/^207\.1\.4\./', $sysObjectID): // 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', '', '');
+               addDesiredPort ($desiredPorts, 'AC-in', '1-16', '', '');
                break;
        case preg_match ('/^30065\.1\.3011\./', $sysObjectID): // Arista
                checkPIC ('1-29');
-               commitAddPort ($objectInfo['id'], 'console', '1-29', 'IOIOI', '');
+               addDesiredPort ($desiredPorts, '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
+               if ('' != $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', '');
+               addDesiredPort ($desiredPorts, 'console 0', '1-681', 'console', '');
                checkPIC ('1-16');
-               commitAddPort ($objectInfo['id'], 'PS1', '1-16', '', '');
-               commitAddPort ($objectInfo['id'], 'PS2', '1-16', '', '');
+               addDesiredPort ($desiredPorts, 'PS1', '1-16', '', '');
+               addDesiredPort ($desiredPorts, '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
+               addDesiredPort ($desiredPorts, 'console', '1-29', '', ''); # RJ-45 RS-232 console
                break;
        default: // Nortel...
                break;
@@ -4372,7 +4902,7 @@ function doSwitchSNMPmining ($objectInfo, $device)
                $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.
+               // DISPLAY-HINT internal database. Try to work around it.
                // 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)) // STRING: x:yy:z:xx:y:zz
                {
@@ -4390,7 +4920,8 @@ function doSwitchSNMPmining ($objectInfo, $device)
                        continue; // martian format
                $ifInfo[$randomindex]['ifPhysAddress'] = implode ('', $addrbytes);
        }
-       // process each interface only once regardless of how many processors we have to run
+       // Zero or more (depending on the way they are defined) processors may yield
+       // RackTables ports for each SNMP port.
        foreach ($ifInfo as $iface)
                foreach ($known_switches[$sysObjectID]['processors'] as $processor_name)
                {
@@ -4404,10 +4935,19 @@ function doSwitchSNMPmining ($objectInfo, $device)
                                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']);
+                       addDesiredPort ($desiredPorts, $newname, $iftable_processors[$processor_name]['dict_key'], $newlabel, $iface['ifPhysAddress']);
                        if (!$iftable_processors[$processor_name]['try_next_proc']) // done with this port
                                continue 2;
                }
+       // Sync ports
+       try
+       {
+               replaceObjectPorts ($objectInfo['id'], $desiredPorts);
+       }
+       catch (InvalidArgException $iae)
+       {
+               throw $iae->newIRAE();
+       }
        // No failure up to this point, thus leave current tab for the "Ports" one.
        return buildRedirectURL (NULL, 'ports');
 }
@@ -4421,15 +4961,24 @@ function doPDUSNMPmining ($objectInfo, $switch)
        updateStickerForCell ($objectInfo, 3, $switch->getName());
        updateStickerForCell ($objectInfo, 5, $switch->getFWRev());
        checkPIC ('1-16');
-       commitAddPort ($objectInfo['id'], 'input', '1-16', 'input', '');
+       $desiredPorts = array();
+       addDesiredPort ($desiredPorts, 'input', '1-16', 'input', '');
        $portno = 1;
        foreach ($switch->getPorts() as $name => $port)
        {
-               $label = mb_strlen ($port[0]) ? $port[0] : $portno;
+               $label = $port[0] != '' ? $port[0] : $portno;
                checkPIC ('1-1322');
-               commitAddPort ($objectInfo['id'], $portno, '1-1322', $port[0], '');
+               addDesiredPort ($desiredPorts, $portno, '1-1322', $port[0], '');
                $portno++;
        }
+       try
+       {
+               replaceObjectPorts ($objectInfo['id'], $desiredPorts);
+       }
+       catch (InvalidArgException $iae)
+       {
+               throw $iae->newIRAE();
+       }
        showSuccess ("Added ${portno} port(s)");
        return buildRedirectURL (NULL, 'ports');
 }
@@ -4448,7 +4997,6 @@ class RTSNMPDevice
                switch ($snmpsetup['version'])
                {
                case 1:
-               default:
                        $this->snmp = new RTSNMPv1($hostname, $snmpsetup);
                        break;
                case 2:
@@ -4457,6 +5005,8 @@ class RTSNMPDevice
                case 3:
                        $this->snmp = new RTSNMPv3($hostname, $snmpsetup);
                        break;
+               default:
+                       throw new InvalidArgException ('snmpsetup[\'version\']', $snmpsetup['version'], 'unsupported SNMP version');
                }
        }
 
@@ -4630,6 +5180,8 @@ function nextMACAddress ($addr)
 {
        if ($addr == '')
                return '';
+       if (! preg_match ('/^[0-9a-f]{2}(:[0-9a-f]{2}){5}$/i', $addr))
+               throw new InvalidArgException ('addr', $addr, 'invalid MAC address format');
        $bytes = array();
        foreach (explode (':', $addr) as $hex)
                $bytes[] = hexdec ($hex);
@@ -4645,88 +5197,6 @@ function nextMACAddress ($addr)
        return implode (':', $bytes);
 }
 
-function generatePortsForCatModule ($object_id, $slotno = 1, $mtype = 'X6748', $mac_address = '')
-{
-       global $dbxlink;
-       $mac_address = l2addressFromDatabase (l2addressForDatabase ($mac_address));
-       switch ($mtype)
-       {
-       case 'WS-X6748-GE-TX':
-               $dbxlink->beginTransaction();
-               for ($i = 1; $i <= 48; $i++)
-               {
-                       commitAddPort ($object_id, "gi${slotno}/${i}", '1-24', "slot ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               $dbxlink->commit();
-               break;
-       case 'WS-X6708-10GE':
-               for ($i = 1; $i <= 8; $i++)
-               {
-                       commitAddPort ($object_id, "te${slotno}/${i}", '6-1080', "slot ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               break;
-       case 'WS-X6704-10GE':
-               for ($i = 1; $i <= 4; $i++)
-               {
-                       commitAddPort ($object_id, "te${slotno}/${i}", '5-1079', "slot ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               break;
-       case 'VS-S720-10G':
-               commitAddPort ($object_id, "gi${slotno}/1", '4-1077', "slot ${slotno} port 1", $mac_address);
-               $mac_address = nextMACAddress ($mac_address);
-               commitAddPort ($object_id, "gi${slotno}/2", '4-1077', "slot ${slotno} port 2", $mac_address);
-               $mac_address = nextMACAddress ($mac_address);
-               commitAddPort ($object_id, "gi${slotno}/3", '1-24',   "slot ${slotno} port 3", $mac_address);
-               $mac_address = nextMACAddress ($mac_address);
-               commitAddPort ($object_id, "te${slotno}/4", '6-1080', "slot ${slotno} port 4", $mac_address);
-               $mac_address = nextMACAddress ($mac_address);
-               commitAddPort ($object_id, "te${slotno}/5", '6-1080', "slot ${slotno} port 5", $mac_address);
-               break;
-       case '3750G-24TS':
-               // MAC address of 1st port is the next one after switch's address
-               $mac_address = nextMACAddress ($mac_address);
-               for ($i = 1; $i <= 24; $i++)
-               {
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '1-24', "unit ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               for ($i = 25; $i <= 28; $i++)
-               {
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '4-1077', "unit ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               break;
-       case '3750G-24T':
-               $mac_address = nextMACAddress ($mac_address);
-               for ($i = 1; $i <= 24; $i++)
-               {
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '1-24', "unit ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               break;
-       case '3750G-16TD':
-               $mac_address = nextMACAddress ($mac_address);
-               for ($i = 1; $i <= 16; $i++)
-               {
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '1-24', "unit ${slotno} port ${i}", $mac_address);
-                       $mac_address = nextMACAddress ($mac_address);
-               }
-               commitAddPort ($object_id, "te${slotno}/0/1", '5-1079', "unit ${slotno} port ${i}", $mac_address);
-               break;
-       case 'LE02G48TA':
-               for ($i = 0; $i <= 47; $i++)
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '1-24', "slot ${slotno} port ${i}", $mac_address);
-               break;
-       case 'LE02X12SA':
-               for ($i = 0; $i <= 11; $i++)
-                       commitAddPort ($object_id, "gi${slotno}/0/${i}", '9-1084', "slot ${slotno} port ${i}", $mac_address);
-               break;
-       }
-}
-
 function detectSoftwareType ($objectInfo, $sysDescr)
 {
        global $swtype_pcre;
@@ -4737,4 +5207,3 @@ function detectSoftwareType ($objectInfo, $sysDescr)
                        return;
                }
 }
-?>