]> git.uio.no Git - check_openmanage.git/blobdiff - check_openmanage
bugfixing for get_table()
[check_openmanage.git] / check_openmanage
index 338fa8a36b6d3a523510dca53fc3f7d4c00cc0a7..b6d7709c95a4adb9651298053e6ad88b0acb5405 100755 (executable)
@@ -46,7 +46,7 @@ use vars qw( $NAME $VERSION $AUTHOR $CONTACT $E_OK $E_WARNING $E_CRITICAL
 # Initialization and global variables
 #---------------------------------------------------------------------
 
-# Small subrouting to collect any perl warnings during execution
+# Small subroutine to collect any perl warnings during execution
 sub collect_perl_warning {
   push @perl_warnings, [@_];
 }
@@ -57,7 +57,7 @@ $SIG{__WARN__} = \&collect_perl_warning;
 
 # Version and similar info
 $NAME    = 'check_openmanage';
-$VERSION = '3.5.4-beta6';
+$VERSION = '3.5.6-beta6';
 $AUTHOR  = 'Trond H. Amundsen';
 $CONTACT = 't.h.amundsen@usit.uio.no';
 
@@ -100,9 +100,9 @@ OUTPUT OPTIONS:
    -i, --info          Prefix any alerts with the service tag
    -e, --extinfo       Append system info to alerts
    -s, --state         Prefix alerts with alert state
-   --short-state       Prefix alerts with alert state (abbreviated)
+   -S, --short-state   Prefix alerts with alert state (abbreviated)
    -o, --okinfo        Verbosity when check result is OK
-   --htmlinfo          HTML output with clickable links
+   -I, --htmlinfo      HTML output with clickable links
 
 CHECK CONTROL AND BLACKLISTING:
 
@@ -158,6 +158,7 @@ END_LICENSE
         'privpassword'      => undef, # SMNP v3
         'privkey'           => undef, # SMNP v3
         'privprotocol'      => undef, # SMNP v3
+         'use_get_table'     => 0,
        );
 
 # Get options
@@ -172,12 +173,12 @@ GetOptions('b|blacklist=s'      => \@{ $opt{blacklist} },
           'p|perfdata:s'       => \$opt{perfdata},
           'i|info'             => \$opt{info},
           'e|extinfo'          => \$opt{extinfo},
-          'htmlinfo:s'         => \$opt{htmlinfo},
+          'I|htmlinfo:s'       => \$opt{htmlinfo},
           'postmsg=s'          => \$opt{postmsg},
           's|state'            => \$opt{state},
-          'short-state'        => \$opt{shortstate},
+          'S|short-state'      => \$opt{shortstate},
           'o|ok-info=i'        => \$opt{okinfo},
-          'l|linebreak=s'      => \$opt{linebreak},
+          'linebreak=s'        => \$opt{linebreak},
           'a|all'              => \$opt{all},
           'only=s'             => \$opt{only},
           'omreport=s'         => \$opt{omreport},
@@ -192,6 +193,7 @@ GetOptions('b|blacklist=s'      => \@{ $opt{blacklist} },
           'privpassword=s'     => \$opt{privpassword},
           'privkey=s'          => \$opt{privkey},
           'privprotocol=s'     => \$opt{privprotocol},
+           'use-get_table'      => \$opt{use_get_table},
          ) or do { print $USAGE; exit $E_UNKNOWN };
 
 # If user requested help
@@ -596,7 +598,7 @@ sub snmp_detect_blade {
     # Identify blade. Older models (4th and 5th gen models) and/or old
     # OMSA (4.x) don't have this OID. If we get "noSuchInstance" or
     # similar, we assume that this isn't a blade
-    if ($result->{$DellBaseBoardType} eq '3') {
+    if (exists $result->{$DellBaseBoardType} && $result->{$DellBaseBoardType} eq '3') {
        $blade = 1;
     }
     return;
@@ -827,7 +829,7 @@ sub run_omreport {
           | No\scontrollers\sfound                                     # No RAID controller
           | No\sbattery\sprobes\sfound\son\sthis\ssystem               # No battery probes
           | Invalid\scommand:\spwrmonitoring                           # Older OMSAs lack this command(?)
-#          | Current\sprobes\snot\sfound                                # No power monitoring capability
+#          | Current\sprobes\snot\sfound                                # OMSA + RHEL5.4 bug
         }xms;
 
     # Errors that are OK on blade servers
@@ -951,17 +953,26 @@ sub custom_temperature_thresholds {
 # Gets the output from SNMP result according to the OIDs checked
 sub get_snmp_output {
     my ($result,$oidref) = @_;
+    my @temp   = ();
     my @output = ();
 
     foreach my $oid (keys %{ $result }) {
-       my @dummy = split /\./xms, $oid;
-       my $id = pop @dummy;
-       --$id;
-       my $foo = join q{.}, @dummy;
-       if (exists $oidref->{$foo}) {
-           $output[$id]{$oidref->{$foo}} = $result->{$oid};
+       my $short = $oid;
+       $short =~ s{\s}{}gxms;                   # remove whitespace
+       $short =~ s{\A (.+) \. (\d+) \z}{$1}xms; # remove last number
+       my $id = $2;
+       if (exists $oidref->{$short}) {
+           $temp[$id]{$oidref->{$short}} = $result->{$oid};
        }
     }
+
+    # Remove any empty indexes
+    foreach my $out (@temp) {
+       if (defined $out) {
+           push @output, $out;
+       }
+    }
+
     return \@output;
 }
 
@@ -1098,6 +1109,8 @@ sub check_global {
 # STORAGE: Check controllers
 #-----------------------------------------
 sub check_controllers {
+    return if blacklisted('ctrl', 'all');
+
     my $id       = undef;
     my $nexus    = undef;
     my $name     = undef;
@@ -1107,8 +1120,8 @@ sub check_controllers {
     my $mindr    = undef;
     my $firmware = undef;
     my $driver   = undef;
-    my $minstdr  = undef;  # Minimum required Storport driver version (whats this?)
-    my $stdr     = undef;  # Storport driver version (whats this?)
+    my $minstdr  = undef;  # Minimum required Storport driver version
+    my $stdr     = undef;  # Storport driver version
     my @output   = ();
 
     if ($snmp) {
@@ -1170,7 +1183,7 @@ sub check_controllers {
            $minstdr  = exists $out->{'FIXME_StorportMinDriverVersion'}
              ? $out->{FIXME_StorportMinDriverVersion} : undef;
            $stdr     = exists $out->{FIXME_StorportDriverVersion}
-             ? $out->{FIXME_StorportDriverVersion} : 'N/A';
+             ? $out->{FIXME_StorportDriverVersion} : undef;
            $nexus    = convert_nexus($out->{controllerNexusID});
        }
        else {
@@ -1186,10 +1199,12 @@ sub check_controllers {
              ? $out->{'Firmware Version'} : 'N/A';
            $driver   = $out->{'Driver Version'} ne 'Not Applicable'
              ? $out->{'Driver Version'} : 'N/A';
-           $minstdr  = $out->{'Minimum Required Storport Driver Version'} ne 'Not Applicable'
+           $minstdr  = (exists $out->{'Minimum Required Storport Driver Version'}
+                        and $out->{'Minimum Required Storport Driver Version'} ne 'Not Applicable')
              ? $out->{'Minimum Required Storport Driver Version'} : undef;
-           $stdr     = $out->{'Storport Driver Version'} ne 'Not Applicable'
-             ? $out->{'Storport Driver Version'} : 'N/A';
+           $stdr     = (exists $out->{'Storport Driver Version'}
+                        and $out->{'Storport Driver Version'} ne 'Not Applicable')
+             ? $out->{'Storport Driver Version'} : undef;
            $nexus    = $id;
        }
 
@@ -1201,6 +1216,7 @@ sub check_controllers {
        $sysinfo{'controller'}{$id}{'name'}     = $name;
        $sysinfo{'controller'}{$id}{'driver'}   = $driver;
        $sysinfo{'controller'}{$id}{'firmware'} = $firmware;
+       $sysinfo{'controller'}{$id}{'storport'} = $stdr;
 
        next CTRL if blacklisted('ctrl', $nexus);
 
@@ -1227,7 +1243,7 @@ sub check_controllers {
        }
        # Ok
        if ($status eq 'Ok' or ($status eq 'Non-Critical'
-                               and (defined $minfw or defined $mindr))) {
+                               and (defined $minfw or defined $mindr or defined $minstdr))) {
            my $msg = sprintf 'Controller %d [%s] is %s',
              $id, $name, $state;
            report('storage', $msg, $E_OK, $nexus);
@@ -1248,6 +1264,7 @@ sub check_controllers {
 #-----------------------------------------
 sub check_physical_disks {
     return if $#controllers == -1;
+    return if blacklisted('pdisk', 'all');
 
     my $id       = undef;
     my $nexus    = undef;
@@ -1278,10 +1295,27 @@ sub check_physical_disks {
             '1.3.6.1.4.1.674.10893.1.20.130.4.1.24' => 'arrayDiskComponentStatus',
             '1.3.6.1.4.1.674.10893.1.20.130.4.1.26' => 'arrayDiskNexusID',
             '1.3.6.1.4.1.674.10893.1.20.130.4.1.31' => 'arrayDiskSmartAlertIndication',
-            '1.3.6.1.4.1.674.10893.1.20.130.5.1.5'  => 'arrayDiskEnclosureConnectionEnclosureNumber',
             '1.3.6.1.4.1.674.10893.1.20.130.5.1.7'  => 'arrayDiskEnclosureConnectionControllerNumber',
+            '1.3.6.1.4.1.674.10893.1.20.130.6.1.7'  => 'arrayDiskChannelConnectionControllerNumber',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %pdisk_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $arrayDiskTable = '1.3.6.1.4.1.674.10893.1.20.130.4';
+           my $arrayDiskEnclosureConnectionControllerNumber = '1.3.6.1.4.1.674.10893.1.20.130.5.1.7';
+           my $arrayDiskChannelConnectionControllerNumber = '1.3.6.1.4.1.674.10893.1.20.130.6.1.7';
+
+           $result  = $snmp_session->get_table(-baseoid => $arrayDiskTable);
+           my $ext1 = $snmp_session->get_table(-baseoid => $arrayDiskEnclosureConnectionControllerNumber);
+           my $ext2 = $snmp_session->get_table(-baseoid => $arrayDiskChannelConnectionControllerNumber);
+
+           if (defined $result) {
+               defined $ext1 && map { $$result{$_} = $$ext1{$_} } keys %{ $ext1 };
+               defined $ext2 && map { $$result{$_} = $$ext2{$_} } keys %{ $ext2 };
+           }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %pdisk_oid]);
+       }
 
        if (!defined $result) {
            printf "SNMP ERROR [storage / pdisk]: %s.\n", $snmp_session->error;
@@ -1293,6 +1327,10 @@ sub check_physical_disks {
     }
     else {
        foreach my $c (@controllers) {
+           # This blacklists disks with broken firmware, which includes
+           # illegal XML characters that makes openmanage choke on itself
+           next if blacklisted('ctrl_pdisk', $c);
+
            push @output, @{ run_omreport("storage pdisk controller=$c") };
            map_item('ctrl', $c, \@output);
        }
@@ -1326,9 +1364,9 @@ sub check_physical_disks {
     foreach my $out (@output) {
        if ($snmp) {
            $name   = $out->{arrayDiskName};
-           if ($name =~ m{.*\d+:\d+:\d+\z}xms) {
+           if (exists $out->{arrayDiskEnclosureID}) {
                $id = join q{:}, ($out->{arrayDiskChannel}, $out->{arrayDiskEnclosureID},
-                                $out->{arrayDiskTargetID});
+                                 $out->{arrayDiskTargetID});
            }
            else {
                $id = join q{:}, ($out->{arrayDiskChannel}, $out->{arrayDiskTargetID});
@@ -1337,13 +1375,19 @@ sub check_physical_disks {
            $status   = $snmp_status{$out->{arrayDiskComponentStatus}};
            $fpred    = $out->{arrayDiskSmartAlertIndication} == 2 ? 1 : 0;
            $progr    = q{};
-           $ctrl     = exists $out->{arrayDiskEnclosureConnectionControllerNumber}
-             ? $out->{arrayDiskEnclosureConnectionControllerNumber} - 1
-               : -1;
            $nexus    = convert_nexus($out->{arrayDiskNexusID});
            $vendor   = $out->{arrayDiskVendor};
            $product  = $out->{arrayDiskProductID};
            $capacity = $out->{arrayDiskLengthInMB} * 1024**2;
+           if (exists $out->{arrayDiskEnclosureConnectionControllerNumber}) {
+               $ctrl = $out->{arrayDiskEnclosureConnectionControllerNumber} - 1;
+           }
+           elsif (exists $out->{arrayDiskChannelConnectionControllerNumber}) {
+               $ctrl = $out->{arrayDiskChannelConnectionControllerNumber} - 1;
+           }
+           else {
+               $ctrl = -1;
+           }
        }
        else {
            $id       = $out->{'ID'};
@@ -1414,6 +1458,7 @@ sub check_physical_disks {
 #-----------------------------------------
 sub check_virtual_disks {
     return if $#controllers == -1;
+    return if blacklisted('vdisk', 'all');
 
     my $id     = undef;
     my $name   = undef;
@@ -1438,7 +1483,14 @@ sub check_virtual_disks {
             '1.3.6.1.4.1.674.10893.1.20.140.1.1.20' => 'virtualDiskComponentStatus',
             '1.3.6.1.4.1.674.10893.1.20.140.1.1.21' => 'virtualDiskNexusID',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %vdisk_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $virtualDiskTable = '1.3.6.1.4.1.674.10893.1.20.140.1';
+           $result = $snmp_session->get_table(-baseoid => $virtualDiskTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %vdisk_oid]);
+       }
 
        # No logical drives is OK
        return if !defined $result;
@@ -1547,6 +1599,7 @@ sub check_virtual_disks {
 #-----------------------------------------
 sub check_cache_battery {
     return if $#controllers == -1;
+    return if blacklisted('bat', 'all');
 
     my $id     = undef;
     my $nexus  = undef;
@@ -1567,7 +1620,21 @@ sub check_cache_battery {
             '1.3.6.1.4.1.674.10893.1.20.130.15.1.12' => 'batteryLearnState',
             '1.3.6.1.4.1.674.10893.1.20.130.16.1.5'  => 'batteryConnectionControllerNumber',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %bat_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $batteryTable = '1.3.6.1.4.1.674.10893.1.20.130.15';
+            my $batteryConnectionTable = '1.3.6.1.4.1.674.10893.1.20.130.16';
+
+           $result = $snmp_session->get_table(-baseoid => $batteryTable);
+            my $ext = $snmp_session->get_table(-baseoid => $batteryConnectionTable);
+
+           if (defined $result) {
+                defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+            }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %bat_oid]);
+       }
 
        # No cache battery is OK
        return if !defined $result;
@@ -1705,6 +1772,7 @@ sub check_cache_battery {
 #-----------------------------------------
 sub check_connectors {
     return if $#controllers == -1;
+    return if blacklisted('conn', 'all');
 
     my $id     = undef;
     my $nexus  = undef;
@@ -1725,7 +1793,14 @@ sub check_connectors {
             '1.3.6.1.4.1.674.10893.1.20.130.2.1.9'  => 'channelNexusID',
              '1.3.6.1.4.1.674.10893.1.20.130.2.1.11' => 'channelBusType',
             );
-        my $result = $snmp_session->get_entries(-columns => [keys %conn_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $channelTable = '1.3.6.1.4.1.674.10893.1.20.130.2';
+           $result = $snmp_session->get_table(-baseoid => $channelTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %conn_oid]);
+       }
 
         if (!defined $result) {
             printf "SNMP ERROR [storage / channel]: %s.\n", $snmp_session->error;
@@ -1800,6 +1875,8 @@ sub check_connectors {
 # STORAGE: Check enclosures
 #-----------------------------------------
 sub check_enclosures {
+    return if blacklisted('encl', 'all');
+
     my $id       = undef;
     my $nexus    = undef;
     my $name     = undef;
@@ -1820,7 +1897,14 @@ sub check_enclosures {
             '1.3.6.1.4.1.674.10893.1.20.130.3.1.25' => 'enclosureNexusID',
             '1.3.6.1.4.1.674.10893.1.20.130.3.1.26' => 'enclosureFirmwareVersion',
             );
-        my $result = $snmp_session->get_entries(-columns => [keys %encl_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $enclosureTable = '1.3.6.1.4.1.674.10893.1.20.130.3';
+           $result = $snmp_session->get_table(-baseoid => $enclosureTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %encl_oid]);
+       }
 
         # No enclosures is OK
         return if !defined $result;
@@ -1896,6 +1980,7 @@ sub check_enclosures {
 #-----------------------------------------
 sub check_enclosure_fans {
     return if $#controllers == -1;
+    return if blacklisted('encl_fan', 'all');
 
     my $id        = undef;
     my $nexus     = undef;
@@ -1919,8 +2004,21 @@ sub check_enclosure_fans {
             '1.3.6.1.4.1.674.10893.1.20.130.8.1.4'  => 'fanConnectionEnclosureName',
             '1.3.6.1.4.1.674.10893.1.20.130.8.1.5'  => 'fanConnectionEnclosureNumber',
            );
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $fanTable = '1.3.6.1.4.1.674.10893.1.20.130.7';
+            my $fanConnectionTable = '1.3.6.1.4.1.674.10893.1.20.130.8';
+
+           $result = $snmp_session->get_table(-baseoid => $fanTable);
+            my $ext = $snmp_session->get_table(-baseoid => $fanConnectionTable);
 
-       my $result = $snmp_session->get_entries(-columns => [keys %fan_oid]);
+           if (defined $result) {
+                defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+            }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %fan_oid]);
+       }
 
        # No enclosure fans is OK
        return if !defined $result;
@@ -1995,6 +2093,7 @@ sub check_enclosure_fans {
 #-----------------------------------------
 sub check_enclosure_pwr {
     return if $#controllers == -1;
+    return if blacklisted('encl_ps', 'all');
 
     my $id        = undef;
     my $nexus     = undef;
@@ -2016,7 +2115,21 @@ sub check_enclosure_pwr {
             '1.3.6.1.4.1.674.10893.1.20.130.10.1.4' => 'powerSupplyConnectionEnclosureName',
             '1.3.6.1.4.1.674.10893.1.20.130.10.1.5' => 'powerSupplyConnectionEnclosureNumber',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %ps_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $powerSupplyTable = '1.3.6.1.4.1.674.10893.1.20.130.9';
+            my $powerSupplyConnectionTable = '1.3.6.1.4.1.674.10893.1.20.130.10';
+
+           $result = $snmp_session->get_table(-baseoid => $powerSupplyTable);
+            my $ext = $snmp_session->get_table(-baseoid => $powerSupplyConnectionTable);
+
+           if (defined $result) {
+                defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+            }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %ps_oid]);
+       }
 
        # No enclosure power supplies is OK
        return if !defined $result;
@@ -2089,6 +2202,7 @@ sub check_enclosure_pwr {
 #-----------------------------------------
 sub check_enclosure_temp {
     return if $#controllers == -1;
+    return if blacklisted('encl_temp', 'all');
 
     my $id        = undef;
     my $nexus     = undef;
@@ -2118,7 +2232,21 @@ sub check_enclosure_temp {
             '1.3.6.1.4.1.674.10893.1.20.130.12.1.4'  => 'temperatureConnectionEnclosureName',
             '1.3.6.1.4.1.674.10893.1.20.130.12.1.5'  => 'temperatureConnectionEnclosureNumber',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %temp_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $temperatureProbeTable = '1.3.6.1.4.1.674.10893.1.20.130.11';
+            my $temperatureConnectionTable = '1.3.6.1.4.1.674.10893.1.20.130.12';
+
+           $result = $snmp_session->get_table(-baseoid => $temperatureProbeTable);
+            my $ext = $snmp_session->get_table(-baseoid => $temperatureConnectionTable);
+
+           if (defined $result) {
+                defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+            }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %temp_oid]);
+       }
 
        # No enclosure temperature probes is OK
        return if !defined $result;
@@ -2207,6 +2335,7 @@ sub check_enclosure_temp {
 #-----------------------------------------
 sub check_enclosure_emms {
     return if $#controllers == -1;
+    return if blacklisted('encl_emm', 'all');
 
     my $id        = undef;
     my $nexus     = undef;
@@ -2228,7 +2357,21 @@ sub check_enclosure_emms {
             '1.3.6.1.4.1.674.10893.1.20.130.14.1.4'  => 'enclosureManagementModuleConnectionEnclosureName',
             '1.3.6.1.4.1.674.10893.1.20.130.14.1.5'  => 'enclosureManagementModuleConnectionEnclosureNumber',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %emms_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $enclosureManagementModuleTable = '1.3.6.1.4.1.674.10893.1.20.130.13';
+            my $enclosureManagementModuleConnectionTable = '1.3.6.1.4.1.674.10893.1.20.130.14';
+
+           $result = $snmp_session->get_table(-baseoid => $enclosureManagementModuleTable);
+            my $ext = $snmp_session->get_table(-baseoid => $enclosureManagementModuleConnectionTable);
+
+           if (defined $result) {
+                defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+            }
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %emms_oid]);
+       }
 
        # No enclosure EMMs is OK
        return if !defined $result;
@@ -2301,6 +2444,8 @@ sub check_enclosure_emms {
 # CHASSIS: Check memory modules
 #-----------------------------------------
 sub check_memory {
+    return if blacklisted('dimm', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $location = undef;
@@ -2318,7 +2463,14 @@ sub check_memory {
             '1.3.6.1.4.1.674.10892.1.1100.50.1.14.1' => 'memoryDeviceSize',
             '1.3.6.1.4.1.674.10892.1.1100.50.1.20.1' => 'memoryDeviceFailureModes',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %dimm_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $memoryDeviceTable = '1.3.6.1.4.1.674.10892.1.1100.50.1';
+           $result = $snmp_session->get_table(-baseoid => $memoryDeviceTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %dimm_oid]);
+       }
 
        if (!defined $result) {
            printf "SNMP ERROR [memory]: %s.\n", $snmp_session->error;
@@ -2412,6 +2564,8 @@ sub check_memory {
 # CHASSIS: Check fans
 #-----------------------------------------
 sub check_fans {
+    return if blacklisted('fan', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -2430,7 +2584,14 @@ sub check_fans {
             '1.3.6.1.4.1.674.10892.1.700.12.1.10.1' => 'coolingDeviceUpperCriticalThreshold',
             '1.3.6.1.4.1.674.10892.1.700.12.1.11.1' => 'coolingDeviceUpperNonCriticalThreshold',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %cool_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $coolingDeviceTable = '1.3.6.1.4.1.674.10892.1.700.12.1';
+           $result = $snmp_session->get_table(-baseoid => $coolingDeviceTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %cool_oid]);
+       }
 
        if ($blade && !defined $result) {
            return 0;
@@ -2506,6 +2667,8 @@ sub check_fans {
 # CHASSIS: Check power supplies
 #-----------------------------------------
 sub check_powersupplies {
+    return if blacklisted('ps', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $type     = undef;
@@ -2523,7 +2686,14 @@ sub check_powersupplies {
             '1.3.6.1.4.1.674.10892.1.600.12.1.11.1' => 'powerSupplySensorState',
             '1.3.6.1.4.1.674.10892.1.600.12.1.12.1' => 'powerSupplyConfigurationErrorType',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %ps_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $powerDeviceTable = '1.3.6.1.4.1.674.10892.1.600.12.1';
+           $result = $snmp_session->get_table(-baseoid => $powerDeviceTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %ps_oid]);
+       }
 
        # No instrumented PSU is OK (blades, low-end servers)
        return 0 if !defined $result;
@@ -2622,6 +2792,8 @@ sub check_powersupplies {
 # CHASSIS: Check temperatures
 #-----------------------------------------
 sub check_temperatures {
+    return if blacklisted('temp', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -2803,6 +2975,8 @@ sub check_temperatures {
 # CHASSIS: Check processors
 #-----------------------------------------
 sub check_processors {
+    return if blacklisted('cpu', 'all');
+
     my $index   = undef;
     my $status  = undef;
     my $state   = undef;
@@ -2831,8 +3005,19 @@ sub check_processors {
             '1.3.6.1.4.1.674.10892.1.1100.32.1.5.1'  => 'processorDeviceStatusStatus',
             '1.3.6.1.4.1.674.10892.1.1100.32.1.6.1'  => 'processorDeviceStatusReading',
            );
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $processorDeviceTable = '1.3.6.1.4.1.674.10892.1.1100.30.1';
+           my $processorDeviceStatusTable = '1.3.6.1.4.1.674.10892.1.1100.32.1';
+
+           $result = $snmp_session->get_table(-baseoid => $processorDeviceTable);
+           my $ext = $snmp_session->get_table(-baseoid => $processorDeviceStatusTable);
 
-       my $result = $snmp_session->get_entries(-columns => [keys %cpu_oid]);
+            defined $ext && map { $$result{$_} = $$ext{$_} } keys %{ $ext };
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %cpu_oid]);
+       }
 
        if (!defined $result) {
            printf "SNMP ERROR [processors]: %s.\n", $snmp_session->error;
@@ -3007,6 +3192,8 @@ sub check_processors {
 # CHASSIS: Check voltage probes
 #-----------------------------------------
 sub check_volts {
+    return if blacklisted('volt', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -3048,7 +3235,7 @@ sub check_volts {
     foreach my $out (@output) {
        if ($snmp) {
            $index    = $out->{voltageProbeIndex} - 1;
-           $status   = $snmp_status{$out->{voltageProbeStatus}};
+           $status   = $snmp_probestatus{$out->{voltageProbeStatus}};
            $reading  = exists $out->{voltageProbeReading}
              ? sprintf('%.3f V', $out->{voltageProbeReading}/1000)
              : $volt_discrete_reading{$out->{voltageProbeDiscreteReading}};
@@ -3077,6 +3264,8 @@ sub check_volts {
 # CHASSIS: Check batteries
 #-----------------------------------------
 sub check_batteries {
+    return if blacklisted('bp', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -3091,7 +3280,14 @@ sub check_batteries {
             '1.3.6.1.4.1.674.10892.1.600.50.1.6.1' => 'batteryReading',
             '1.3.6.1.4.1.674.10892.1.600.50.1.7.1' => 'batteryLocationName',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %bat_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $batteryTable = '1.3.6.1.4.1.674.10892.1.600.50.1';
+           $result = $snmp_session->get_table(-baseoid => $batteryTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %bat_oid]);
+       }
 
        # No batteries is OK
        return 0 if !defined $result;
@@ -3139,6 +3335,8 @@ sub check_batteries {
 # CHASSIS: Check amperage probes (power monitoring)
 #-----------------------------------------
 sub check_pwrmonitoring {
+    return if blacklisted('amp', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -3160,7 +3358,14 @@ sub check_pwrmonitoring {
             '1.3.6.1.4.1.674.10892.1.600.30.1.11.1' => 'amperageProbeUpperNonCriticalThreshold',
             '1.3.6.1.4.1.674.10892.1.600.30.1.16.1' => 'amperageProbeDiscreteReading',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %amp_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $amperageProbeTable = '1.3.6.1.4.1.674.10892.1.600.30.1';
+           $result = $snmp_session->get_table(-baseoid => $amperageProbeTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %amp_oid]);
+       }
 
        # No pwrmonitoring is OK
        return 0 if !defined $result;
@@ -3315,6 +3520,8 @@ sub check_pwrmonitoring {
 # CHASSIS: Check intrusion
 #-----------------------------------------
 sub check_intrusion {
+    return if blacklisted('intr', 'all');
+
     my $index    = undef;
     my $status   = undef;
     my $reading  = undef;
@@ -3327,7 +3534,14 @@ sub check_intrusion {
             '1.3.6.1.4.1.674.10892.1.300.70.1.5.1' => 'intrusionStatus',
             '1.3.6.1.4.1.674.10892.1.300.70.1.6.1' => 'intrusionReading',
            );
-       my $result = $snmp_session->get_entries(-columns => [keys %int_oid]);
+       my $result = undef;
+       if ($opt{use_get_table}) {
+           my $intrusionTable = '1.3.6.1.4.1.674.10892.1.300.70.1';
+           $result = $snmp_session->get_table(-baseoid => $intrusionTable);
+       }
+       else {
+           $result = $snmp_session->get_entries(-columns => [keys %int_oid]);
+       }
 
        # No intrusion is OK
        return 0 if !defined $result;
@@ -4061,12 +4275,16 @@ elsif ($exit_code == $E_OK && !$opt{debug}) {
            my @storageprint = ();
            foreach my $id (sort keys %{ $sysinfo{controller} }) {
                chomp $sysinfo{controller}{$id}{driver};
-               push @storageprint, sprintf q{----- CTRL %s (%s): FW='%s', DR='%s'},
+               my $msg = sprintf q{----- Ctrl %s [%s]: Fw='%s', Dr='%s'},
                  $sysinfo{controller}{$id}{id}, $sysinfo{controller}{$id}{name},
                    $sysinfo{controller}{$id}{firmware}, $sysinfo{controller}{$id}{driver};
+               if (defined $sysinfo{controller}{$id}{storport}) {
+                   $msg .= sprintf q{, Storport: '%s'}, $sysinfo{controller}{$id}{storport};
+               }
+               push @storageprint, $msg;
            }
            foreach my $id (sort keys %{ $sysinfo{enclosure} }) {
-               push @storageprint, sprintf q{----- ENCL %s (%s): FW='%s'},
+               push @storageprint, sprintf q{----- Encl %s [%s]: Fw='%s'},
                  $sysinfo{enclosure}{$id}->{id}, $sysinfo{enclosure}{$id}->{name},
                    $sysinfo{enclosure}{$id}->{firmware};
            }