diff --git a/check_snmp_printer b/check_snmp_printer old mode 100644 new mode 100755 index 6540f2b21df60464f28355ff14a1fac51700d42e..72fad4daebb0d15dd79cf40b1fb733640c2a097c --- a/check_snmp_printer +++ b/check_snmp_printer @@ -1,1016 +1,53 @@ -#!/usr/bin/perl -######################################################### -# # -# # -# SNMP Printer Check Plugin for Icinga # -# Version 1.2.3 (October 14, 2020) # -# by Rob McLoughlin # -# E-mail: rmcloughlin@outlook.com # -# # -# # -# Based on: # -# check_snmp_printer (Perl) # -# Version 1.6 (September 08, 2014) # -# ( by Franky Van Liedekerke # -# E-mail: liedekef@telenet.be ) # -# # -# Which was further based on: # -# check_snmp_printer.sh # -# Version 1.5 (January 15, 2010) # -# ( by Jason Leonard # -# E-mail: jason_leonard@yahoo.com ) # -# # -# Version History # -# - Refer to CHANGELOG.md # -# # -# Like the original, this plugin is distributed # -# under the GNU GPL license. You may re-destribute only # -# according to the terms of the GNU GPL. # -# # -######################################################### -######################################################### -# # -# DEPENDS On # -# Net::SNMP perl module # -# Nagios plugins installed and located in lib64 # -# # -######################################################### - -use strict; -use lib qw( /usr/lib/nagios/plugins /usr/lib64/nagios/plugins ); -use utils qw( %ERRORS $TIMEOUT &print_revision &support &usage ); -use Net::SNMP; -use Getopt::Long; -use Data::Dumper; - - -# globals -use vars qw( - $PROGNAME $VERSION %procs $snmp $errstr $oid - $opt_version $opt_help $opt_timeout $opt_retries $opt_host - $opt_community $opt_snmpver $opt_warning $opt_critical - $opt_messages $opt_model $opt_consum $opt_tray $opt_pagecount - $opt_metric $opt_nofeeder -); -my (@consumables,@status,@trays,@strays,@percentages,@mresults,@message,@measurables); -my ($state,$statuscode,$EXITSTRING); -my ($i,$tcount,$scount,$traynumber,$cnumber,$mnumber,$critcount,$warncount) = 0; - -my %STATUS_CODE = - ( 'UNKNOWN' => '3', 'OK' => '0', 'WARNING' => '1', 'CRITICAL' => '2' ); - -# config -$PROGNAME = $0; -$VERSION = '1.2.3'; - -# init options -$opt_version = undef; -$opt_help = undef; -$opt_timeout = $TIMEOUT; -$opt_retries = 3; -$opt_host = undef; -$opt_community = 'public'; -$opt_snmpver = 1; -$opt_warning = 20; # warning percentage: if lower: warning -$opt_critical = 5; # critical percentage: if lower: critical -$opt_messages = undef; -$opt_model = undef; -$opt_consum = undef; -$opt_tray = undef; -$opt_pagecount = undef; -$opt_metric = undef; - -# get options -Getopt::Long::Configure('bundling'); -GetOptions( - 'V|version' => \$opt_version, - 'h|help' => \$opt_help, - 't|timeout=i' => \$opt_timeout, - 'r|retries=i' => \$opt_retries, - 'H|host=s' => \$opt_host, - 'C|community=s' => \$opt_community, - 'v|snmpver=s' => \$opt_snmpver, - 'w|warning=i' => \$opt_warning, - 'c|critical=i' => \$opt_critical, - 'messages' => \$opt_messages, - 'model' => \$opt_model, - 'consum' => \$opt_consum, - 'trays' => \$opt_tray, - 'pagecount' => \$opt_pagecount, - 'nofeeder' => \$opt_nofeeder, - 'metric' => \$opt_metric -) or do { - print_usage(); - exit($ERRORS{'UNKNOWN'}); -}; - -if($opt_version) { - print_version(); - exit($ERRORS{'UNKNOWN'}); -} - -if($opt_help) { - print_help(); - exit($ERRORS{'UNKNOWN'}); -} - -if(!$opt_host) { - print "Host option not given\n"; - print_usage(); - exit($ERRORS{'UNKNOWN'}); -} - -# only use one of messages|model|consum|tray|pagecount options -my $count=0; -($opt_messages) && ($count++); -($opt_model) && ($count++); -($opt_consum) && ($count++); -(defined($opt_tray)) && ($count++); -($opt_pagecount) && ($count++); -if ($count>1) { - print "Only use one of messages|model|consum|trays|pagecount options\n"; - print_help(); - exit($ERRORS{'UNKNOWN'}); -} -if ($count<1) { - print "Only use one of messages|model|consum|trays|pagecount options\n"; - print_help(); - exit($ERRORS{'UNKNOWN'}); -} - -sub print_usage { - my $tab = ' ' x length($PROGNAME); - print <<EOB -Usage: - $PROGNAME -H host - $tab [-C snmp_community] [-v snmp_version] [-t timeout] - $PROGNAME --version - $PROGNAME --help -EOB -} - -sub print_version { - print_revision($PROGNAME, $VERSION); -} - -sub print_help { - print_version(); - print <<EOB; - -Check a printer through SNMP. - -EOB - - print_usage(); - print <<EOB; - -Required Arguments: - -H, --host=HOST - The name or address of the host running SNMP. - --messages - Print the messages of the printer - --model - Prints the model of the printer - --pagecount - Prints the number of pages printed - --trays - Checks trays for paper status. - --consum - Checks consumables for status. - -Optional Arguments: - -C, --community=STRING - The community string of the SNMP agent. Default: public - -v, --snmpver=STRING - The version of snmp to use. 1 and 2 are supported. Default: 1 - -w, --warning=INTEGER - The warning limit level to alert on. 0 to disable tray alerting. - -c, --critical=INTEGER - The critical limit level to alert on. 0 to disable tray alerting. - -t, --timeout=INTEGER - Number of seconds to wait for a response. - -r, --retries=INTEGER - Number of retries to try before timing out. Default: 3 - --metric - Converts output to metric. Default: imperial - --nofeeder - Disables checking of the manual feeder tray -EOB -} - -sub check_model { - my ($pcheck) = @_; - my ($oid,$result); - my $MODEL="Uknown model"; - my $SERIAL=""; - - if ($pcheck == 1 || $pcheck == 2) { - $oid=".1.3.6.1.2.1.25.3.2.1.3.1"; - $result=$snmp->get_request(-varbindlist => [$oid]); - ($result) && ($MODEL=$result->{$oid}); - if ($pcheck == 2) { return lc $MODEL; } - } - if ($pcheck == 1) { - $oid=".1.3.6.1.2.1.43.5.1.1.17.1"; - $result=$snmp->get_request(-varbindlist => [$oid]); - ($result) && ($SERIAL=$result->{$oid}); - $SERIAL =~ s/\"//g; - - print "$MODEL, Serial # $SERIAL\n"; - } -} - -sub check_messages { - my ($mcheck) = @_; - my ($oid,$result,$model); - my $MESSAGES=""; - - $model = check_model(2); - if ($model =~ m/hp/) { - $oid=".1.3.6.1.4.1.11.2.3.9.1.1.3"; - } else { - $oid=".1.3.6.1.2.1.43.16"; - } - - $result = $snmp->get_entries(-columns => [$oid]); - - foreach my $key (keys(%$result)) { - $result->{$key} =~ s/\"//g; - $result->{$key} =~ s/\n/\!/g; - $MESSAGES .= $result->{$key}."\n"; - } - chomp $MESSAGES; - if ($MESSAGES eq "") { - $MESSAGES= "(Can't determine messages)"; - } - if ($mcheck == 2) { return $MESSAGES; } - my @messages = split('\n',$MESSAGES); - foreach my $message (@messages) { - $message = lc $message; - if ($message =~ m/toner low|wenig toner|cartridge low|niedrig|attention/) { - $state = "WARNING"; - } - elsif ($message =~ m/replace toner|toner ersetzen|error|paper is out/) { - $state = "CRITICAL"; - } else { $state = "OK"; } - push @{ $status[$mnumber] }, $state; - $mnumber++; - } - print "$MESSAGES\n"; -} - -sub check_page_count { - my ($oid,$result,$model,$t_oid,$c_oid,$m_oid, - $m_a3_oid,$m_a4_oid,$c_a3_oid,$c_a4_oid, - $m_a3,$m_a4,$c_a3,$c_a4,$MonoPagecount,$ColorPagecount,$TotalPagecount); - my (%ttmpprs,%ctmpprs,%mtmpprs) = (); - - $model = check_model(2); - if ($model =~ m/hp/) { - $c_oid='.1.3.6.1.4.1.11.2.3.9.4.2.1.4.1.2.7.0'; - $m_oid='.1.3.6.1.4.1.11.2.3.9.4.2.1.4.1.2.6.0'; - } - if ($model =~ m/canon/) { - $t_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.101'; - $c_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.105'; - $m_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.108'; - $m_a3_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.112'; - $m_a4_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.113'; - $c_a3_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.222'; - $c_a4_oid='.1.3.6.1.4.1.1602.1.11.1.3.1.4.223'; - } - if ($model =~ m/xerox/) { - $c_oid='.1.3.6.1.4.1.253.8.53.13.2.1.6.1.20.33'; - $m_oid='.1.3.6.1.4.1.253.8.53.13.2.1.6.1.20.34'; - } - if ($model =~ m/lexmark/) { - $c_oid='.1.3.6.1.4.1.641.6.4.2.2.1.7.1.1'; - $m_oid='.1.3.6.1.4.1.641.6.4.2.2.1.6.1.1'; - } - if ($model =~ m/ricoh/) { - $c_oid='.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.21'; - $m_oid='.1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.22'; - } - if ($model =~ m/kyocera|ecosys|taskalfa|4200dn/) { - $t_oid='.1.3.6.1.4.1.1347.42.2.1.1.1.6.1'; - $c_oid='.1.3.6.1.4.1.1347.42.2.1.1.1.8.1'; - $m_oid='.1.3.6.1.4.1.1347.42.2.1.1.1.7.1'; - } - - $oid=".1.3.6.1.2.1.43.10.2.1.4.1.1"; - - - if (defined($snmp->get_request(-varbindlist => [$m_a3_oid]))) { $m_a3 = $snmp->get_request(-varbindlist => [$m_a3_oid]) } - if (defined($snmp->get_request(-varbindlist => [$m_a4_oid]))) { $m_a4 = $snmp->get_request(-varbindlist => [$m_a4_oid]) } - if (defined($snmp->get_request(-varbindlist => [$c_a3_oid]))) { $c_a3 = $snmp->get_request(-varbindlist => [$c_a3_oid]) } - if (defined($snmp->get_request(-varbindlist => [$c_a4_oid]))) { $c_a4 = $snmp->get_request(-varbindlist => [$c_a4_oid]) } - - if (($m_a3 || $m_a4) > 0) { - $MonoPagecount = $m_a3 + $m_a4; - } elsif ($model =~ m/kyocera|ecosys|taskalfa|4200dn/) { - my $tresult = $snmp->get_entries(-columns => [$t_oid]); - my $cresult = $snmp->get_entries(-columns => [$c_oid]); - my $mresult = $snmp->get_entries(-columns => [$m_oid]); - foreach my $tkey (keys(%$tresult)) { - my($tindex) = ($tkey =~ /($t_oid\.\d+)/); - $tresult->{$tkey} =~ s/[^\w\s]//g; - $ttmpprs{$tindex}{t_count} = $tresult->{$tkey}; - } - foreach my $tkey (keys(%ttmpprs)) { - my $t_count=$ttmpprs{$tkey}{t_count}; - $TotalPagecount = $TotalPagecount+$t_count; - } - foreach my $ckey (keys(%$cresult)) { - my($cindex) = ($ckey =~ /($c_oid\.\d+)/); - $cresult->{$ckey} =~ s/[^\w\s]//g; - $ctmpprs{$cindex}{c_count} = $cresult->{$ckey}; - } - foreach my $ckey (keys(%ctmpprs)) { - my $c_count=$ctmpprs{$ckey}{c_count}; - $ColorPagecount = $ColorPagecount+$c_count; - } - foreach my $mkey (keys(%$mresult)) { - my($mindex) = ($mkey =~ /($m_oid\.\d+)/); - $mresult->{$mkey} =~ s/[^\w\s]//g; - $mtmpprs{$mindex}{m_count} = $mresult->{$mkey}; - } - foreach my $mkey (keys(%mtmpprs)) { - my $m_count=$mtmpprs{$mkey}{m_count}; - $MonoPagecount = $MonoPagecount+$m_count; - } - } else { - $result=$snmp->get_request(-varbindlist => [$m_oid]); - if((not defined($result)) || ($result->{$m_oid} eq 'noSuchInstance')) { - $result=$snmp->get_request(-varbindlist => [$t_oid]); - if((not defined($result)) || ($result->{$m_oid} eq 'noSuchInstance')) { - $result=$snmp->get_request(-varbindlist => [$oid]); - if ($snmp->error() =~ m/genError/) { - $result = retry_snmp($oid,undef,undef,undef,undef,undef,undef,undef); - } - if(not defined($result)) { - print "CRITICAL - snmp error: " . $snmp->error() . "\n"; - exit($ERRORS{'CRITICAL'}); - } else { $TotalPagecount=$result->{$oid}; } - } else { $TotalPagecount=$result->{$t_oid}; } - } else { $MonoPagecount=$result->{$m_oid}; } - } - if (($c_a3 || $c_a4) > 0) { - $ColorPagecount = $c_a3 + $c_a4; - } else { - $result=$snmp->get_request(-varbindlist => [$c_oid]); - if(not defined($result)) { - } else { $ColorPagecount=$result->{$c_oid}; } - } - if (($TotalPagecount) or (($model =~ m/kyocera|ecosys|taskalfa|4200dn/))) { - $EXITSTRING = "Pagecount is $TotalPagecount"; - if ($model =~ m/kyocera|ecosys|taskalfa|4200dn/) { - $EXITSTRING.= " Total, $MonoPagecount Black-and-White"; - } - } else { $EXITSTRING = "Pagecount is $MonoPagecount Black-and-White"; } - if ($ColorPagecount > 0) { - $EXITSTRING.= ", $ColorPagecount Color"; - } - $EXITSTRING.= "\n"; - if (($TotalPagecount) or ($model =~ m/kyocera|ecosys|taskalfa|4200dn/)) { - $EXITSTRING.= "|Total=$TotalPagecount;;;;"; - if ($model =~ m/kyocera|ecosys|taskalfa|4200dn/) { - $EXITSTRING.= " Black-and-White=$MonoPagecount;;;;"; - } - } else { $EXITSTRING.= "|Black-and-White=$MonoPagecount;;;;"; } - if ($ColorPagecount > 0) { - $EXITSTRING.= " Color=$ColorPagecount;;;;"; - } - -} - -sub get_consumables { - my ($result,$Table,$Names,$CurCap,$MaxCap) = @_; - my %tmpprs = (); - my ($consumable, $curcap_pct); - my ($puncher, $found) = 0; - - foreach my $key (keys(%$result)) { - my($base, $index) = ($key =~ /($Table\.\d+\.\d+)\.(\d+)/); - if($base eq $Names ) { - $result->{$key} =~ s/[^\w\s]//g; - $tmpprs{$index}{name} = $result->{$key}; - } - if($base eq $CurCap) { $tmpprs{$index}{curcap} = $result->{$key}; } - if($base eq $MaxCap) { $tmpprs{$index}{maxcap} = $result->{$key}; } - } - - foreach my $key (keys(%tmpprs)) { - my $name=$tmpprs{$key}{name}; - if ($name =~ m/Imaging Unit|Imaging Kit/) { $consumable = $name; } - else { ($consumable = $name) =~ s/(\w+).*/$1/; } - if ($consumable eq "Canon") { - my @split = split(' ',$consumable = $name); - foreach my $cconsumable (@split) { - if ($cconsumable =~ m/Black|Yellow|Magenta|Cyan/) { $consumable = $cconsumable; } - else { next; } - } - } - if ($consumable eq "Image") { - my @split = split(' ',$consumable = $name); - foreach my $iconsumable (@split) { - if ($iconsumable =~ m/Transfer|Fuser/) { $consumable = $iconsumable. " Kit"; } - else { next; } - } - } - if (check_model(2) =~ m/generic 30c-9/) { - my @split = split(' ',$consumable = $name); - foreach my $gconsumable (@split) { - if ($gconsumable =~ m/Toner/) { - ($consumable) = $name =~ /\((.*)\)/; - } elsif ($gconsumable =~ m/Image|Fusing/) { - $consumable = $name; - } else { - next; - } - } - } - if (check_model(2) =~ m/ricoh/) { - my @split = split(' ',$consumable = $name); - foreach my $rconsumable (@split) { - if ($rconsumable =~ m/Toner/) { - ($consumable) = $name =~ /(?<=Toner )(\w+)/; - } else { - next; - } - } - } - - my $curcap=$tmpprs{$key}{curcap}; - my $maxcap=$tmpprs{$key}{maxcap}; - - if ($name =~ m/Drum|Resttoner|Waste Toner|Belt|Developer/) { - next; - } - - if ($consumable =~ m/Imaging Unit/) { } - elsif ($consumable =~ m/Black|Yellow|Magenta|Cyan/) { $consumable = $consumable." Toner"; } - elsif ($consumable =~ m/Schwarz|Gelb/) { $consumable = $consumable." Toner"; } # German - # Kyocera reports toner as model number so we need to convert that to something human readable - if ($consumable =~ m/TK/) { - if ($consumable =~ /CS$|C$/) { $consumable = "Cyan Toner"; } - elsif ($consumable =~ /MS$|M$/) { $consumable = "Magenta Toner"; } - elsif ($consumable =~ /YS$|Y$/) { $consumable = "Yellow Toner"; } - elsif ($consumable =~ /KS$|K$/) { $consumable = "Black Toner"; } - else { $consumable = "Black Toner"; } - } - if ($consumable eq 'Magneta') { $consumable = "Magenta Toner"; } # New HP OID has a typo - if ($consumable eq 'Clean') { $consumable = $consumable." Rollers"; } - if ($consumable eq 'Document') { $consumable = $consumable." Feeder Kit"; } - if ($consumable eq 'Maintenance') { $consumable = $consumable." Kit"; } - if ($consumable eq 'Transfer') { $consumable = $consumable." Unit"; } - if ($consumable eq 'Stapler') { } - if ($consumable eq 'Staples') { } - if ($consumable eq 'Saddle') { $consumable = $consumable." Staples"; } - if ($consumable eq 'Puncher') { $puncher = 1; $consumable = $consumable. " Waste"; } - - push (@consumables, $consumable); - - $found=1; - if ($puncher == 1) { - if ($curcap > 99) { - $state = "CRITICAL"; - } elsif ($curcap >= 96) { - $state = "WARNING"; - } else { - $state = "OK"; - } - push (@measurables, '1'); - push (@percentages, $curcap); - } else { - if ($maxcap>0 && $curcap>0) { - $curcap_pct=sprintf("%.2f",$curcap*100/$maxcap); - if ($curcap_pct<=$opt_critical) { - # critical messages come first - $state = "CRITICAL"; - } elsif ($curcap_pct<=$opt_warning) { - $state = "WARNING"; - } else { - $state = "OK"; - } - push (@measurables, '1'); - push (@percentages, $curcap_pct); - } elsif ($maxcap == 100 && $curcap == 0) { - $state = "CRITICAL"; - push (@measurables, '1'); - push (@percentages, 0); - } else { - if (check_model(2) =~ m/brother/) { - my ($bresult,$bstatus,$boid); - if ($consumable =~ m/Black|Schwarz/) { - $boid = ".1.3.6.1.4.1.2435.2.3.9.1.1.2.10.1"; - } - if ($consumable =~ m/Cyan/) { - $boid = ".1.3.6.1.4.1.2435.2.3.9.1.1.2.10.2"; - } - if ($consumable =~ m/Magenta/) { - $boid = ".1.3.6.1.4.1.2435.2.3.9.1.1.2.10.3"; - } - if ($consumable =~ m/Yellow|Gelb/) { - $boid = ".1.3.6.1.4.1.2435.2.3.9.1.1.2.10.4"; - } - if (defined($snmp->get_request(-varbindlist => [$boid]))) { - $bstatus = $bresult->{$oid}; - if ($bstatus == 0) { $state = "OK"; push (@measurables, 'b0'); $curcap = 100; } - if ($bstatus == 1) { $state = "WARNING"; push (@measurables, 'b1'); $curcap = 10; } - if ($bstatus == 2) { $state = "CRITICAL"; push (@measurables, 'b2'); $curcap = 0; } - if ($bstatus == 3) { $state = "CRITICAL"; push (@measurables, 'b3'); $curcap = 0; } - } else { ($state,$curcap) = nonmeasurable($curcap,$maxcap,$name); } - } else { - $state = nonmeasurable($curcap,$maxcap,$name); - } - push (@percentages, $curcap); - } - } - $puncher = 0; - push @{ $status[$cnumber] }, $state; - $cnumber++; - } -} - -sub nonmeasurable { - my ($curcap,$maxcap,$name) = @_; - - # Our object is not measurable - it's either FULL or EMPTY (such as a punch dust box) - # Let's report on it's status using appropriate terminology - if (check_model(2) =~ m/brother/) { - if ($curcap == -3) { $state = "OK"; push (@measurables, 'b0'); } - else { - my $smessage = check_messages(2); - my @messages = split('\n',$smessage); - foreach my $message (@messages) { - $message = lc $message; - if ($message =~ m/toner low|wenig toner/) { - $state = "WARNING"; - push (@measurables, 'b1'); - $curcap = 10; - } - elsif ($message =~ m/replace toner|toner ersetzen/) { - $state = "CRITICAL"; - push (@measurables, 'b3'); - $curcap = 0; - } - } - } - push (@measurables, '1'); - return $state, $curcap; - } elsif ($curcap==-3) { - if ($maxcap>0) { $state = "WARNING"; push (@measurables, 'lt'); } - else { $state = "OK"; (@measurables, 'gt'); } - } elsif ($curcap==-2) { - # The value (-2) means unknown - if ($name =~ m/W2020A|W2021A|W2022A|W2023A/) { # HP Color LaserJet Pro M454dw Toner - $state = "CRITICAL"; - push (@measurables, '1'); - } else { $state = "WARNING"; push (@measurables, '0'); } - } elsif ($curcap==0) { - # Something is empty! - $state = "CRITICAL"; - } - return $state; -} - -sub prioritize_results { - my ($metric) = @_; - my ($mcount,$scode); - - if ((scalar @consumables) > 0) { $mcount = (scalar @consumables); } - if ((scalar @strays) > 0) { $mcount = (scalar @strays); } - - $i = 0; - - while ($mcount > 0) { - - if ($status[$i][0] eq 'CRITICAL') { $scode = 1; } - if ($status[$i][0] eq 'WARNING') { $scode = 2; } - if ($status[$i][0] eq 'OK') { $scode = 3; } - - if ($metric eq "consumables") { - push @{ $mresults[$i] }, $scode, $status[$i][0], $consumables[$i], $message[$i]; - } - if ($metric eq "trays") { - push @{ $mresults[$i] }, $scode, $status[$i][0], $strays[$i][0], $message[$i]; - } - $mcount--; - $i++; - } - - @mresults = sort { $a->[0] cmp $b->[0] } @mresults; - - $i = 0; - $mcount = (scalar @mresults); - while ($mcount > 0) { - print "$mresults[$i][1]: $mresults[$i][2]$mresults[$i][3]\n"; - $mcount--; - $i++; - } -} - -sub check_consumables { - my %pr_oids = ( - 'Table' => '.1.3.6.1.2.1.43.11.1.1', - 'Names' => '.1.3.6.1.2.1.43.11.1.1.6.1', - 'CurCap' => '.1.3.6.1.2.1.43.11.1.1.9.1', - 'MaxCap' => '.1.3.6.1.2.1.43.11.1.1.8.1', - 'CTable' => '.1.3.6.1.2.1.43.31.1.1', - 'CNames' => '.1.3.6.1.2.1.43.31.1.1.5.1', - 'CCurCap' => '.1.3.6.1.2.1.43.31.1.1.8.1', - 'CMaxCap' => '.1.3.6.1.2.1.43.31.1.1.7.1' - ); - my ($consumable,$measurable,$perfcount); - my $pct_remaining = ""; - - my $result = $snmp->get_entries(-columns => [$pr_oids{Names}, $pr_oids{CurCap}, $pr_oids{MaxCap}]); - if ($snmp->error() =~ m/genError/) { - $result = retry_snmp($pr_oids{Names}, $pr_oids{CurCap}, $pr_oids{MaxCap},undef,undef,undef,undef,undef); - } - if(not defined($result)) { - print "CRITICAL - snmp error: " . $snmp->error() . "\n"; - exit($ERRORS{'CRITICAL'}); - } - my $cresult = $snmp->get_entries(-columns => [$pr_oids{CNames}, $pr_oids{CCurCap}, $pr_oids{CMaxCap}]); - - get_consumables($result, $pr_oids{Table}, $pr_oids{Names}, $pr_oids{CurCap}, $pr_oids{MaxCap}); - get_consumables($cresult, $pr_oids{CTable}, $pr_oids{CNames}, $pr_oids{CCurCap}, $pr_oids{CMaxCap}); - - $tcount = (scalar @consumables); - if (@percentages != 0 ) { $measurable = 1; } - if ($measurable) { - if ($consumables[0] eq "Puncher Waste") { - $pct_remaining = " is ".$percentages[0]. "% full."; - } elsif ($consumables[0] eq "Stapler") { - $pct_remaining = ""; - } elsif (check_model(2) =~ m/brother/) { - if ($measurables[$i] eq "b0") { - $pct_remaining = " levels are OK."; - } - if ($measurables[$i] eq "b1") { - $pct_remaining = " levels are LOW."; - } - if ($measurables[$i] eq "b2") { - $pct_remaining = " has no toner installed."; - } - if ($measurables[$i] eq "b3") { - $pct_remaining = " levels are EMPTY."; - } - } elsif ($percentages[$i] eq "-2") { - if ($measurables[$i] eq "0") { - $pct_remaining = " levels cannot be measured."; - } else { $pct_remaining = " is at 0% remaining."; } - } else { - $pct_remaining = " is at ".$percentages[0]. "% remaining."; - } - push (@message, $pct_remaining); - } - my $perfcount = $tcount; - if ($tcount > 1) { - $tcount--; - while ($tcount > 0) { - $i++; - if ($consumables[$i] eq "Waste") { - $tcount--; - next; - } - if ($measurable) { - if ($consumables[$i] eq "Puncher Waste") { - $pct_remaining = " is ".$percentages[$i]. "% full."; - } elsif ($consumables[$i] eq "Stapler") { - $pct_remaining = ""; - } elsif (check_model(2) =~ m/brother/) { - if ($measurables[$i] eq "b0") { - $pct_remaining = " levels are OK."; - } - if ($measurables[$i] eq "b1") { - $pct_remaining = " levels are LOW."; - } - if ($measurables[$i] eq "b2") { - $pct_remaining = " has no toner installed."; - } - if ($measurables[$i] eq "b3") { - $pct_remaining = " levels are EMPTY."; - } - } elsif ($percentages[$i] eq "-2") { - if ($measurables[$i] eq "0") { - $pct_remaining = " levels cannot be measured."; - } else { $pct_remaining = " is at 0% remaining."; } - } elsif ($percentages[$i] eq "-3") { - if ($measurables[$i] eq "lt") { - $pct_remaining = " levels are LOW."; - } - if ($measurables[$i] eq "gt") { - $pct_remaining = " levels are OK."; - } - } else { - $pct_remaining = " is at ".$percentages[$i]. "% remaining."; - } - } - push (@message, $pct_remaining); - $tcount--; - } - } - prioritize_results('consumables'); - $i = 0; - $EXITSTRING.= "|"; - while ($perfcount > 0) { - if ($consumables[$i] eq "Waste") { - $i++; - $perfcount--; - next; - } - ($consumable = $consumables[$i]) =~ s/ /_/g; - if ($measurable) { - if ($consumable eq "Stapler") { - if ($status[$i] eq 'CRITICAL') { $EXITSTRING.= $consumable."=0"; } - elsif ($status[$i] eq 'OK') { $EXITSTRING.= $consumable."=100"; } - } elsif ($percentages[$i] eq "-2") { - if ($measurables[$i] eq "0") { } - else { $EXITSTRING.= "$consumable=0"; } - } else { - $EXITSTRING.= $consumable."=".$percentages[$i]; - } - } else { - if ($status[$i] == "CRITICAL") { - $EXITSTRING.= $consumable."=0"; - } else { - $EXITSTRING.= $consumable."=1"; - } - } - $i++; - $perfcount--; - if ($perfcount == 0) { $EXITSTRING.= ";;;;"; } else { $EXITSTRING.=";;;; "; } - } -} - -sub check_paper_trays { - my $found=0; - my %tmpprs = (); - my ($name,$lcname,$feeder,$cap,$tstatus,$traymessage,$maxcap,$feeddim,$xfeeddim,$cap_pct); - my %tray_oids = ( - 'Table' => '.1.3.6.1.2.1.43.8.2.1', - 'Cap' => '.1.3.6.1.2.1.43.8.2.1.10.1', - 'Status' => '.1.3.6.1.2.1.43.8.2.1.11.1', - 'MaxCap' => '.1.3.6.1.2.1.43.8.2.1.9.1', - 'Name' => '.1.3.6.1.2.1.43.8.2.1.13.1', - 'FeedDim' => '.1.3.6.1.2.1.43.8.2.1.4.1', - 'FeedDimUnits' => '.1.3.6.1.2.1.43.8.2.1.2.1', - 'XFeedDim' => '.1.3.6.1.2.1.43.8.2.1.5.1', - 'XFeedDimUnits' => '.1.3.6.1.2.1.43.8.2.1.3.1' - ); - my $result = $snmp->get_entries(-columns => [$tray_oids{Name},$tray_oids{Cap},$tray_oids{MaxCap},$tray_oids{FeedDim},$tray_oids{FeedDimUnits},$tray_oids{XFeedDim},$tray_oids{XFeedDimUnits},$tray_oids{Status}]); - my $model = "Unknown Model"; - my $mresult = $snmp->get_request(-varbindlist => [".1.3.6.1.2.1.25.3.2.1.3.1"]); - ($mresult) && ($model=$mresult->{".1.3.6.1.2.1.25.3.2.1.3.1"}); - - if ($snmp->error() =~ m/genError/) { - $result = retry_snmp($tray_oids{Name},$tray_oids{Cap},$tray_oids{MaxCap},$tray_oids{FeedDim},$tray_oids{FeedDimUnits},$tray_oids{XFeedDim},$tray_oids{XFeedDimUnits},$tray_oids{Status}); - } - - if(not defined($result)) { - print "CRITICAL - snmp error: " . $snmp->error() . "\n"; - exit($ERRORS{'CRITICAL'}); - } - foreach my $key (keys(%$result)) { - my($base, $index) = ($key =~ /($tray_oids{Table}\.\d+\.\d+)\.(\d+)/); - $result->{$key} =~ s/\"//g; - if($base eq $tray_oids{Cap}) { $tmpprs{$index}{cap} = $result->{$key}; } - if($base eq $tray_oids{Status}) { $tmpprs{$index}{tstatus} = $result->{$key}; } - if($base eq $tray_oids{MaxCap}) { $tmpprs{$index}{maxcap} = $result->{$key}; } - if($base eq $tray_oids{Name}) { $tmpprs{$index}{name} = $result->{$key}; } - if($base eq $tray_oids{FeedDim}) { $tmpprs{$index}{feeddim} = $result->{$key}; } - if($base eq $tray_oids{XFeedDim}) { $tmpprs{$index}{xfeeddim} = $result->{$key}; } - } - - foreach my $key (keys(%tmpprs)) { - $name=$tmpprs{$key}{name}; - $cap=$tmpprs{$key}{cap}; - $tstatus=$tmpprs{$key}{tstatus}; - $maxcap=$tmpprs{$key}{maxcap}; - $feeddim=$tmpprs{$key}{feeddim}; - $xfeeddim=$tmpprs{$key}{xfeeddim}; - - # if name is empty, make one with the number - if ($name eq "") { - $name="Tray $key"; - } - if ($name =~ m/(MPT)/) { - $name =~ s/ \(MPT\)//g; - } - if ($name =~ m/Paper Tray/) { - ($name) = $name =~ /[^ ]* (.*)/; - } - $name =~ s/\n/\!/g; - if ($name =~ m/TRAY/) { - if ($name =~ /(?<=TRAY)[0-9]/) { - my @split = split(/(?<=\d)(?=\D)|(?<=\D)(?=\d)/, $name); - $name = @split[0]." ".@split[1]; - } - $name = (ucfirst(lc($name))); - } - $lcname = lc($name); - if (($lcname =~ m/stack bypass|mp tray|manual paper|manual envelope|multi-purpose_tray/) and ($opt_nofeeder)) { $feeder=1; next; } - if (($lcname =~ m/tray 1/) and ($opt_nofeeder) and (scalar(keys(%tmpprs) > 1)) and $feeder != 1) { next; } - $found=1; - push @{ $trays[$traynumber] }, $name, $cap, $maxcap, $feeddim, $xfeeddim, $tstatus; - $traynumber++; - } - - $traynumber = 0; - @strays = sort { $a->[0] cmp $b->[0] } @trays; - $tcount = scalar(@strays); - my $perfcount = $tcount; - - while ($tcount > 0) { - $name = $strays[$i][0]; - $cap = $strays[$i][1]; - $maxcap = $strays[$i][2]; - $feeddim = $strays[$i][3]; - $xfeeddim = $strays[$i][4]; - $tstatus = $strays[$i][5]; - $lcname = lc($name); - - if ($feeddim eq '-2') { $feeddim = "Any"; } - if ($xfeeddim eq '-2') { $xfeeddim = "Any"; } - - $model = check_model(2); - if (($feeddim || $xfeeddim) ne 'Any') { - if ($model =~ m/canon|xerox|ricoh|brother/) { - if ($opt_metric) { - $feeddim = sprintf("%.0f", $feeddim * .001)."mm"; - $xfeeddim = sprintf("%.0f", $xfeeddim * .001)."mm"; - } else { - $feeddim = sprintf("%.2f", (($feeddim / 2.54) * .0001))."in"; - $xfeeddim = sprintf("%.2f", (($xfeeddim / 2.54) * .0001))."in"; - } - } else { - if ($opt_metric) { - $feeddim = sprintf("%.0f", (($feeddim * 2.54) * .001))."mm"; - $xfeeddim = sprintf("%.0f", (($xfeeddim * 2.54) * .001))."mm"; - } else { - $feeddim = sprintf("%.2f", $feeddim * .0001)."in"; - $xfeeddim = sprintf("%.2f", $xfeeddim * .0001)."in"; - } - } - } - - if ($cap == -3) { - # The value (-3) means that the printer knows that at least one unit remains. - if ($model =~ m/lexmark/) { # When -3, Lexmark is really low status. - if (($opt_critical == 0) or ($opt_warning == 0 )) { - $state = "OK"; - } else { - $state = "WARNING"; - } - $traymessage = " is LOW. ($xfeeddim x $feeddim)"; - } else { - $state = "OK"; - $traymessage = " ($xfeeddim x $feeddim)"; - } - } elsif ($cap == -2) { - # The value (-2) means unknown - # so lets check the tray status instead - if ($tstatus eq '0') { - if ($model =~ m/canon|hp|ricoh/) { - $state = "OK"; - $traymessage = " ($xfeeddim x $feeddim)"; - } else { - $state = "WARNING"; - $traymessage = " is in an UNKNOWN state."; - } - if (($lcname =~ m/tray 1|stack bypass|mp tray|manual paper|manual envelope|multi-purpose_tray/) and ($state ne 'WARNING')) { - $traymessage = ""; - } - } elsif ($tstatus eq '4') { - if ($model =~ m/lexmark/) { - $state = "OK"; - $traymessage = " ($xfeeddim x $feeddim)"; - } - } elsif ($tstatus eq '9') { - if ($model =~ m/hp/) { - $state = "OK"; - $traymessage = " ($xfeeddim x $feeddim)"; - } - } else { - # still unknown so we'll mark it warning because we just don't know - $state = "WARNING"; - $traymessage = " is in UNKNOWN status."; - } - } elsif ($cap == 0) { - # 0 means there is no paper left! This is our only critical value. - # first lets check to see if it's a bypass tray, we'll always assume Tray 1 is such. - if ($lcname =~ m/tray 1|stack bypass|mp tray|manual paper|manual envelope|multi-purpose_tray/) { - $state = "CRITICAL"; - if (($xfeeddim || $feeddim) ne 'Any') { - $traymessage = " ($xfeeddim x $feeddim)"; - } else { $traymessage = " is empty."; } - } else { - if ($opt_critical > 0) { - $state = "CRITICAL"; - } else { - $state = "OK"; - } - $traymessage = " ($xfeeddim x $feeddim) is at 0% paper remaining."; - } - $cap_pct=sprintf("%.2f",$cap*100/$maxcap); - } else { - ($maxcap==0) && ($maxcap=1); - $cap_pct=sprintf("%.2f",$cap*100/$maxcap); - if (($cap_pct <= $opt_warning) and ($opt_warning > 0 )) { - $state = "WARNING"; - } else { - $state = "OK"; - } - $traymessage = " ($xfeeddim x $feeddim) is at $cap_pct% paper remaining."; - } - push @{ $status[$traynumber] }, $state, $cap_pct; - push (@message, $traymessage); - $traynumber++; - $tcount--; - $i++; - } - prioritize_results('trays'); - $i = 0; - $EXITSTRING.= "|"; - while ($perfcount > 0) { - (my $tray = $strays[$i][0]) =~ s/ /_/g; - if ($status[$i][0] eq 'CRITICAL') { - if ($status[$i][1] != "") { - $EXITSTRING.= $tray."=$status[$i][1]"; - } else { $EXITSTRING.= $tray."=0"; } - } - if ($status[$i][0] eq 'WARNING') { - if ($status[$i][1] != "") { - $EXITSTRING.= $tray."=$status[$i][1]"; - } else { $EXITSTRING.= $tray."=10"; } - } - if ($status[$i][0] eq 'OK') { - if ($status[$i][1] != "") { - $EXITSTRING.= $tray."=$status[$i][1]"; - } else { $EXITSTRING.= $tray."=100"; } - } - $i++; - $perfcount--; - if ($perfcount == 0) { $EXITSTRING.= ";;;;"; } else { $EXITSTRING.=";;;; "; } - } -} -sub retry_snmp { - my ($sr1,$sr2,$sr3,$sr4,$sr5,$sr6,$sr7,$sr8) = @_; - - if ($sr8) { - return $snmp->get_entries(-columns => [$sr1,$sr2,$sr3,$sr4,$sr5,$sr6,$sr7,$sr8]); - } elsif ($sr2) { - return $snmp->get_entries(-columns => [$sr1,$sr2,$sr3]); - } else { - return $snmp->get_request(-varbindlist => [$sr1]); - } -} - -# set alarm in case we hang -$SIG{ALRM} = sub { - print "CRITICAL - Timeout after $opt_timeout seconds\n"; - exit($ERRORS{'CRITICAL'}); -}; -alarm($opt_timeout*$opt_retries); - -# connect to the snmp server -($snmp, $errstr) = Net::SNMP->session( - -hostname => $opt_host, - -version => $opt_snmpver, - -community => $opt_community, - -timeout => $opt_timeout, - -retries => $opt_retries, -); -if (!$snmp) { - print "Could not create SNMP session: $errstr\n"; - exit($ERRORS{'UNKNOWN'}); -} - -if ($opt_messages) {check_messages();} -if ($opt_model) {check_model(1); exit($ERRORS{'OK'});} -if ($opt_pagecount) {check_page_count();} -if ($opt_consum) {check_consumables();} -if (defined($opt_tray)) {check_paper_trays($opt_tray);} - -$i = 0; -$scount = (scalar @status); -while ($scount > 0) { - if ($status[$i][0] eq "CRITICAL") { $critcount++; } - if (($status[$i][0] eq "WARNING") && ($state ne "CRITICAL")) { $warncount++; } - $scount--; - $i++; -} - -if ($critcount > 0) { $state = "CRITICAL"; } -elsif ($warncount > 0) { $state = "WARNING"; } -else { $state = "OK"; } - -stop($EXITSTRING, $state); -sub stop { - my $result = shift; - my $exit_code = shift; - print $result . "\n"; - exit ( $STATUS_CODE{$exit_code} ); -} +#!/bin/env bash +# ============================================================ +# +# Wrapper for check_snmp_printer plugin +# +# ------------------------------------------------------------ +# 2021-03-22 <axel.hahn@iml.unibe.ch> v0.1 +# ============================================================ + +# ------------------------------------------------------------ +# CONFIG +# ------------------------------------------------------------ + +check='/usr/lib64/nagios/plugins/check_snmp_printer' +debug=0 + +# ------------------------------------------------------------ +# MAIN +# ------------------------------------------------------------ +sParams="$*" + +# find host behind param -H +snmphost=$( echo $sParams | sed -Ee 's#.*\-H\ ([0-9a-z\.\-]*).*#\1#' ) + + +what=$( echo $sParams | sed -Ee 's#.*\-\-([a-z]*).*#\1#' ) +case "$what" in + consum) + what="Consumables" + ;; + messages) + what="Messages of the printer" + ;; + pagecount) + what="Number of printed pages" + ;; + trays) + what="Status of trays for paper" + sParams="$sParams --nofeeder" + ;; +esac + + +if [ "$debug" = "1" ]; then + echo COMMAND @ `date` + echo $0 $* + echo "$what - `$check --model -H $snmphost` - IP $snmphost" + echo --- + echo calling $check $sParams + echo --- +fi + +$check $sParams