check_snmp_printer.pl

riky.none at email.it riky.none at email.it
Wed Jun 27 10:09:30 CEST 2007


i very problem to use this script
http://www.koders.com/perl/fid631F219FF353175BA5F08985533642B5F8B427FD.aspx

#!/usr/local/bin/perl -w

# check_snmp_printer - check for printer status via snmp
#  Supports both standard PRINT-MIB (RFC-1759) and HP Enterprise print-mib
#  that is supported by some of the older JetDirect interfaces

# Acknowledgements:
# the JetDirect code is taken from check_hpjd.c by Ethan Galstad
#   
#   The idea for the plugin (as well as some code) were taken from Jim
#   Trocki's pinter alert script in his "mon" utility, found at
#   http://www.kernel.org/software/mon
#

# Notes:
# 'JetDirect' is copyrighted by Hewlett-Packard
#
#
# License Information:
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
############################################################################
#
# TODO: Query HOST-RESOURCE MIB for a quick status
#
# hrPrinterStatus = .1.3.6.1.2.1.25.3.5.1;
# hrPrinterDetectedErrorState = .1.3.6.1.2.1.25.3.5.1.2
#
# hrPrinterStatus OBJECT-TYPE
#    SYNTAX     INTEGER {
#                   other(1),
#                   unknown(2),
#                   idle(3),
#                   printing(4),
#                   warmup(5)
#               }
#
# hrPrinterDetectedErrorState OBJECT-TYPE
#    SYNTAX     OCTET STRING
#    MAX-ACCESS read-only
#    STATUS     current
#    DESCRIPTION
#        "This object represents any error conditions detected
#        by the printer.  The error conditions are encoded as
#        bits in an octet string, with the following
#        definitions:
#
#             Condition         Bit #
#
#             lowPaper              0
#
#             noPaper               1
#             lowToner              2
#             noToner               3
#             doorOpen              4
#             jammed                5
#             offline               6
#             serviceRequested      7
#             inputTrayMissing      8
#             outputTrayMissing     9
#             markerSupplyMissing  10
#             outputNearFull       11
#             outputFull           12
#             inputTrayEmpty       13
#             overduePreventMaint  14
#
#  
#
use strict;
use Getopt::Long;
use vars qw($opt_V $opt_h $opt_H $opt_P $opt_t $opt_d $session $error
$answer 
$key
   $response $PROGNAME $port $hostname );
use lib  "utils.pm";
use utils qw(%ERRORS &print_revision &support &usage );
use Net::SNMP;

sub print_help ();
sub print_usage ();

$ENV{'PATH'}='';
$ENV{'BASH_ENV'}=''; 
$ENV{'ENV'}='';

# defaults 
my $ptype = 1;                                                  # to
standard 
RFC printer type
my $state = $ERRORS{'UNKNOWN'};
my $community = "public";
my $snmp_version = 1;
my $port = 161;

Getopt::Long::Configure('bundling');
GetOptions
        ("d"   => \$opt_d, "debug"                      => \$opt_d,
         "V"   => \$opt_V, "version"            => \$opt_V,
         "P=s" => \$opt_P, "Printer=s"      => \$opt_P,    # printer type -
HP 
or RFC
         "v=i" => \$snmp_version, "snmp_version=i"  => \$snmp_version,
         "p=i" => \$port, "port=i" => \$port,
         "C=s" => \$community,"community=s" => \$community,
         "h"   => \$opt_h, "help"               => \$opt_h,
         "H=s" => \$opt_H, "hostname=s"         => \$opt_H);



$PROGNAME = "check_snmp_printer";

if ($opt_V) {
        print_revision($PROGNAME,'$Revision: 1.1 $');
        exit $ERRORS{'OK'};
}

if ($opt_h) {print_help(); exit $ERRORS{'OK'};}

unless (defined $opt_H) {
        print "No target hostname specified\n";
        exit $ERRORS{"UNKNOWN"};
}
$hostname = $opt_H;
if (! utils::is_hostname($hostname)){
        usage(" $hostname did not match pattern\n");
        exit $ERRORS{"UNKNOWN"};
}

if (defined $opt_P) {
        if ($opt_P eq "HP" ) {
                $ptype = 2;
        }elsif ($opt_P eq "RFC" ) {
                $ptype = 1;
        }else{
                print "Only \"HP\" and \"RFC\" are supported as printer
options 
at this time.\n";
                exit $ERRORS{"UNKNOWN"};
        }
}


if ( $snmp_version =~ /[12]/ ) {
                
        ($session, $error) = Net::SNMP->session(
              -hostname  => $hostname,
              -community => $community,
              -port      => $port,
                  -version      => $snmp_version
                   );

        if (!defined($session)) {
              $state='UNKNOWN';
              $answer=$error;
              print ("$state: no session - $answer\n");
              exit $ERRORS{$state};
        }

        print "Opened session|" if (defined ($opt_d));
                
}elsif ( $snmp_version =~ /3/ ) {
        $state='UNKNOWN';
        print ("$state: No support for SNMP v3 yet\n");
        exit $ERRORS{$state};
}else{
        $state='UNKNOWN';
        print ("$state: No support for SNMP v$snmp_version yet\n");
        exit $ERRORS{$state};
}






### main logic

if ( $ptype == 1 ) {   # STD MIB
        print "STD-MIB|" if (defined ($opt_d));

        my %snmp_response;
        my $snmp_index;
        my $col_oid;
        my %std_mib_inst_count ;
        my %std_mib_instances;
        my $display;
        my $inst;
        my $group;
        

        #### RFC1759 MIB OIDS

        # sub-unit status - textual convention
        my $subunit_status;   # integer from 0-126                          
   
                
                                                

        # column oid - not instances
        my %std_mib = (
                std_mib_input_status =>                                 
".1.3.6.1.2.1.43.8.2.1.11",  # 2 element index
                std_mib_input_name   =>                                 
".1.3.6.1.2.1.43.8.2.1.13",
                std_mib_output_remaining_capacity =>    
".1.3.6.1.2.1.43.9.2.1.5", 
                std_mib_output_status =>                                
".1.3.6.1.2.1.43.9.2.1.6",
                std_mib_marker_tech =>                                  
".1.3.6.1.2.1.43.10.2.1.2",
                std_mib_marker_counter_unit =>  ".1.3.6.1.2.1.43.10.2.1.3",
                std_mib_marker_life_count =>            
".1.3.6.1.2.1.43.10.2.1.4",
                std_mib_marker_status =>                                
".1.3.6.1.2.1.43.10.2.1.15",
                std_mib_supplies_type =>                                
".1.3.6.1.2.1.43.11.1.1.5",
                std_mib_supplies_level =>                               
".1.3.6.1.2.1.43.11.1.1.9",
                std_mib_media_path_type =>                              
".1.3.6.1.2.1.43.13.4.1.9",
                std_mib_media_path_status =>                    
".1.3.6.1.2.1.43.13.4.1.11",

                std_mib_status_display =>                               
".1.3.6.1.2.1.43.16.5.1.2",  # 2 element index

                std_mib_alert_sev_level =>                              
".1.3.6.1.2.1.43.18.1.1.2",
                std_mib_alert_grp =>                                    
".1.3.6.1.2.1.43.18.1.1.4",
                std_mib_alert_location =>                               
".1.3.6.1.2.1.43.18.1.1.5",

        );

        my %std_mib_marker_tech = (
                                        1 => "other",
                                        2 => "unknown",
                                        3 => "electrophotographicLED",
                                        4 => "electrophotographicLaser",
                                        5 => "electrophotographicOther",
                                        6 =>
"impactMovingHeadDotMatrix9pin",
                                        7 =>
"impactMovingHeadDotMatrix24pin",
                                        8 =>
"impactMovingHeadDotMatrixOther",
                                        9 => "impactMovingHeadFullyFormed",
                                        10 => "impactBand",
                                        11 => "impactOther",
                                        12 => "inkjectAqueous",
                                        13 => "inkjetSolid",
                                        14 => "inkjetOther",
                                        15 => "pen",
                                        16 => "thermalTransfer",
                                        17 => "thermalSensitive",
                                        18 => "thermalDiffusion",
                                        19 => "thermalOther",
                                        20 => "electroerosion",
                                        21 => "electrostatic",
                                        22 => "photographicMicrofiche",
                                        23 => "photographicImagesetter",
                                        24 => "photographicOther",
                                        25 => "ionDeposition",
                                        26 => "eBeam",
                                        27 => "typesetter",
        );
        
        my %std_mib_marker_counter_units = (
                                        3 => "tenThousandthsOfInches",
                                        4 => "micrometers",
                                        5 => "characters",
                                        6 => "lines",
                                        7 => "impressions",
                                        8 => "sheets",
                                        9 => "dotRow",
                                        11 => "hours",
                                        16 => "feet",
                                        17 => "meters",
        );

        my %std_mib_alert_groups = (
                1 => "unspecifiedOther",
                3 => "printerStorageMemory",  # hostResourcesMIBStorageTable
                4 => "internalDevice",                  # 
hostResourcesMIBDeviceTable
                5 => "generalPrinter",
                6 => "cover",
                7 => "localization",
                8 => "input",
                9 => "output",
                10 => "marker",
                11 => "markerSupplies",
                12 => "markerColorant",
                13 => "mediaPath",
                14 => "connectionChannel",
                15 => "interpreter",
                16 => "consoleDisplayBuffer",
                17 => "consoleLights",
        );

                
        my %std_mib_prt_alert_code = (
                1 => "other",                      # ok if on power save
                2 => "unknown",
        # -- codes common to serveral groups
                3 => "coverOpen",
                4 => "coverClosed",
                5 => "interlockOpen",
                6 => "interlockClosed",
                7 => "configurationChange",
                8 => "jam",                        # critical
                # -- general Printer group
                501 => "doorOpen",
                502 => "doorClosed",
                503 => "powerUp",
                504 => "powerDown",
                # -- Input Group
                801 => "inputMediaTrayMissing",
                802 => "inputMediaSizeChange",
                803 => "inputMediaWeightChange",
                804 => "inputMediaTypeChange",
                805 => "inputMediaColorChange",
                806 => "inputMediaFormPartsChange",
                807 => "inputMediaSupplyLow",
                808 => "inputMediaSupplyEmpty",
                # -- Output Group
                901 => "outputMediaTrayMissing",
                902 => "outputMediaTrayAlmostFull",
                903 => "outputMediaTrayFull",
                # -- Marker group
                1001 => "markerFuserUnderTemperature",
                1002 => "markerFuserOverTemperature",
                # -- Marker Supplies group
                1101 => "markerTonerEmpty",
                1102 => "markerInkEmpty",
                1103 => "markerPrintRibbonEmpty",
                1104 => "markerTonerAlmostEmpty",
                1105 => "markerInkAlmostEmpty",
                1106 => "markerPrintRibbonAlmostEmpty",
                1107 => "markerWasteTonerReceptacleAlmostFull",
                1108 => "markerWasteInkReceptacleAlmostFull",
                1109 => "markerWasteTonerReceptacleFull",
                1110 => "markerWasteInkReceptacleFull",
                1111 => "markerOpcLifeAlmostOver",
                1112 => "markerOpcLifeOver",
                1113 => "markerDeveloperAlmostEmpty",
                1114 => "markerDeveloperEmpty",
                # -- Media Path Device Group
                1301 => "mediaPathMediaTrayMissing",
                1302 => "mediaPathMediaTrayAlmostFull",
                1303 => "mediaPathMediaTrayFull",
                # -- interpreter Group  
                1501 => "interpreterMemoryIncrease",
                1502 => "interpreterMemoryDecrease",
                1503 => "interpreterCartridgeAdded",
                1504 => "interpreterCartridgeDeleted",
                1505 => "interpreterResourceAdded",
                1506 => "interpreterResourceDeleted",
        );

        ## Need multiple passes as oids are all part of tables  
        foreach $col_oid (sort keys %std_mib ){ 

                if ( !defined( $response = 
$session->get_table($std_mib{$col_oid}) ) ) {
                        print "Error col_oid $col_oid|" if (defined
($opt_d));

                        if (! ($col_oid =~ m/std_mib_alert/ ) ) {           
 # 
alerts don't have to exist all the time!
                                $answer=$session->error;
                                $session->close;
                                $state = 'CRITICAL';
                                print ("$state: $answer for 
$std_mib{$col_oid}\n");
                                exit $ERRORS{$state};
                        }
                }
                
                print "NoError col_oid $col_oid|" if (defined ($opt_d));
                
                foreach $key (keys %{$response}) {
                        $key =~ /.*\.(\d+)\.(\d+)$/;     # all oids have a
two 
part index appended
                        $snmp_index = $1 . "." . $2;   
                        print "\n$key => $col_oid.$snmp_index  = 
$response->{$key} \n" if (defined ($opt_d));
                        $snmp_response{$key} = $response->{$key} ;
                        
                        $std_mib_inst_count{$col_oid} += 1 ;   # count how
many 
instances
                        $std_mib_instances{$col_oid} .= $snmp_index .":" ;

                }
        
        }

        #foreach $key ( keys %std_mib_inst_count) {
        #       print "$key = $std_mib_inst_count{$key} 
$std_mib_instances{$key}  \n";
        #}
        # get (total) "page count" - perfdata
        #print "\n \n $std_mib_instances{'std_mib_marker_tech'} \n";    
        # how many marker technologies are in use?
        my ($pg, $pt, $pfd);
        my @mark_tech = split(/:/,
$std_mib_instances{'std_mib_marker_tech'});
        foreach $inst (sort @mark_tech){
                $pfd = 
$std_mib_marker_tech{$snmp_response{$std_mib{'std_mib_marker_tech'}."." 
.$inst}} ;
                $pfd .= 
",".$snmp_response{$std_mib{'std_mib_marker_life_count'}.".".$inst};
                $pfd .= 
",".$std_mib_marker_counter_units{$snmp_response{$std_mib{'std_mib_marker_counter_unit'}.".".$inst}};
                $pfd .= ";"; #perf data separator for multiple marker tech


                print "pfd = $pfd\n" if (defined ($opt_d));
        };

        # combine all lines of status display into one line
        #$std_mib_instances{'std_mib_status_display'} = 
substr($std_mib_instances{'std_mib_status_display'}, 1);
        my @display_index = split(/:/,  
$std_mib_instances{'std_mib_status_display'} );
        
        foreach $inst ( sort @display_index) {
                $display .=
$snmp_response{$std_mib{'std_mib_status_display'} . 
"." . $inst} . " ";
        }



        # see if there are any alerts
        if (defined ( $std_mib_inst_count{'std_mib_alert_sev_level'} )  ) {
                
                if ( ( lc($display) =~ /save/  || lc($display) =~ /warm/ )
&&   
$std_mib_inst_count{'std_mib_alert_sev_level'} == 1 ) {
                        $state='OK';
                        $answer = "Printer ok - $display";
                        print $answer . "|$pfd\n";
                        exit $ERRORS{$state};
                }
                
                # sometime during transitions from power save to warming
there 
are 2 alerts
                # if the 2nd alert is for something else it should get
caught 
in the
                # next call since warmup typically is much smaller than
check 
time
                # interval.
                if (  lc($display) =~ /warm/  &&        
$std_mib_inst_count{'std_mib_alert_sev_level'} == 2 )   {
                        $state='OK';
                        $answer = "$state: Printer - $display";
                        print $answer . "|$pfd\n";
                        exit $ERRORS{$state};
                }

                
                # We have alerts and the display does not say power save or 
warming up
                $std_mib_instances{'std_mib_alert_sev_level'} = 
substr($std_mib_instances{'std_mib_alert_sev_level'}, 1);
                @display_index = split(/:/,     
$std_mib_instances{'std_mib_alert_sev_level'} );
                $answer = "Alert location(s): ";
                
                for $inst (@display_index) {
                        $state = 'WARNING';
                        if (
$snmp_response{$std_mib{'std_mib_alert_location'} 
. "." . $inst} < 1) {
                                $answer .= "unknown location ";
                        }else{
                                $answer .= 
$std_mib_prt_alert_code{$snmp_response{$std_mib{'std_mib_alert_location'} .
"." 
. $inst} } . " ";
                        
                                #print 
$std_mib_prt_alert_code{$snmp_response{$std_mib{'std_mib_alert_location'}.
"." 
. $inst}} ;
                        }
                }

                print "$state: $answer|$pfd\n";
                exit $ERRORS{$state};
                
        }else{
                $state='OK';
                $answer = "$state: Printer ok - $display ";
                print $answer . "|$pfd\n";
                exit $ERRORS{$state};

        }
        
        
        

}
elsif( $ptype == 2 ) {  # HP MIB - JetDirect
        
        #### HP MIB OIDS - instance OIDs
        my $HPJD_LINE_STATUS=                   
".1.3.6.1.4.1.11.2.3.9.1.1.2.1.0";
        my $HPJD_PAPER_STATUS=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.2.0";
        my $HPJD_INTERVENTION_REQUIRED= ".1.3.6.1.4.1.11.2.3.9.1.1.2.3.0";
        my $HPJD_GD_PERIPHERAL_ERROR=   ".1.3.6.1.4.1.11.2.3.9.1.1.2.6.0";
        my $HPJD_GD_PAPER_JAM=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.8.0";
        my $HPJD_GD_PAPER_OUT=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.9.0";
        my $HPJD_GD_TONER_LOW=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.10.0";
        my $HPJD_GD_PAGE_PUNT=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.11.0";
        my $HPJD_GD_MEMORY_OUT=                 
".1.3.6.1.4.1.11.2.3.9.1.1.2.12.0";
        my $HPJD_GD_DOOR_OPEN=                  
".1.3.6.1.4.1.11.2.3.9.1.1.2.17.0";
        my $HPJD_GD_PAPER_OUTPUT=               
".1.3.6.1.4.1.11.2.3.9.1.1.2.19.0";
        my $HPJD_GD_STATUS_DISPLAY=            
".1.3.6.1.4.1.11.2.3.9.1.1.3.0";
        #define ONLINE          0
        #define OFFLINE         1

        my @hp_oids = ( 
$HPJD_LINE_STATUS,$HPJD_PAPER_STATUS,$HPJD_INTERVENTION_REQUIRED,$HPJD_GD_PERIPHERAL_ERROR,
                                
$HPJD_GD_PAPER_JAM,$HPJD_GD_PAPER_OUT,$HPJD_GD_TONER_LOW,$HPJD_GD_PAGE_PUNT,$HPJD_GD_MEMORY_OUT,
                                
$HPJD_GD_DOOR_OPEN,$HPJD_GD_PAPER_OUTPUT,$HPJD_GD_STATUS_DISPLAY);



        
        $state = $ERRORS{'OK'};

        if (!defined($response = $session->get_request(@hp_oids))) {
                $answer=$session->error;
                $session->close;
                $state = 'CRITICAL';
                print ("$state: $answer \n");
                exit $ERRORS{$state};
        }

        # cycle thru the responses and set the appropriate state
        
        if($response->{$HPJD_GD_PAPER_JAM} ) {
                $state='WARNING';
                $answer = "Paper Jam";
        }
        elsif($response->{$HPJD_GD_PAPER_OUT} ) {
                $state='WARNING';
                $answer = "Out of Paper";
        }
        elsif($response->{$HPJD_LINE_STATUS} ) {
                if ($response->{$HPJD_LINE_STATUS} ne "POWERSAVE ON" ) {
                        $state='WARNING';
                        $answer = "Printer Offline";
                }
        }
        elsif($response->{$HPJD_GD_PERIPHERAL_ERROR} ) {
                $state='WARNING';
                $answer = "Peripheral Error";
        }
        elsif($response->{$HPJD_INTERVENTION_REQUIRED} ) {
                $state='WARNING';
                $answer = "Intervention Required";
        }
        elsif($response->{$HPJD_GD_TONER_LOW} ) {
                $state='WARNING';
                $answer = "Toner Low";
        }
        elsif($response->{$HPJD_GD_MEMORY_OUT} ) {
                $state='WARNING';
                $answer = "Insufficient Memory";
        }
        elsif($response->{$HPJD_GD_DOOR_OPEN} ) {
                $state='WARNING';
                $answer = "Insufficient Memory";
        }
        elsif($response->{$HPJD_GD_PAPER_OUTPUT} ) {
                $state='WARNING';
                $answer = "OutPut Tray is Full";
        }
        elsif($response->{$HPJD_GD_PAGE_PUNT} ) {
                $state='WARNING';
                $answer = "Data too slow for Engine";
        }
        elsif($response->{$HPJD_PAPER_STATUS} ) {
                $state='WARNING';
                $answer = "Unknown Paper Error";
        }
        else            # add code to parse STATUS DISPLAY here
        {
                $state='OK';
                $answer = "Printer ok - $response->{$HPJD_GD_STATUS_DISPLAY}
";
        }

        # print and exit

        print "$state: $answer \n";
        exit $ERRORS{$state};


}
else{  # 3rd printer type - not yet supported
        
        print "Printer type $opt_P has not been implemented\n";
        $state='UNKNOWN';
        exit $ERRORS{$state};

}



#### subroutines
sub unit_status {
        my $stat = shift;
        

}

sub print_usage () {
        print "Usage: $PROGNAME -H <host> [-C community] [-P HP or RFC] [-p 
port]  [-v snmp_version] [-h help]  [-V version]\n";
}

sub print_help () {
        print_revision($PROGNAME,'$Revision: 1.1 $');
        print "Copyright (c) 2002 Subhendu Ghosh/Ethan Galstad.








NON EXIST ANY DOC FOR THIS SCRIPT
step by step
Step 1
run this script
perl not found
i change in the script the path perl #!/usr/bin/perl -w
Step 2
lib net:sntp not found
i install perl lib SNMTP (ok)
Step 3
utils.pl not found
i download this script and copy it in libexec
Step 4
i run the script 
i have this message

./check_snmp_printer.pl

Parameter to use lib must be directory, not file at ./check_snmp_printer.pl
line 85
syntax error at ./check_snmp_printer.pl line 100, near "type
my "
Global symbol "$state" requires explicit package name at
./check_snmp_printer.pl line 100.
Execution of ./check_snmp_printer.pl aborted due to compilation errors.

PLEASE !!!HELP ME!!!!!!!!!! 
i dont know perl 

how to configure in nagios this service service ?????
GRAZIE

 
 --
 Email.it, the professional e-mail, gratis per te: http://www.email.it/f
 
 Sponsor:
 Vuoi giocare?In REGALO x te GPBikes 3D,Bubble Boom,Rock City Empire
 Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=6731&d=20070627



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Nagios-users mailing list
Nagios-users at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/nagios-users
::: Please include Nagios version, plugin version (-v) and OS when reporting any issue. 
::: Messages without supporting info will risk being sent to /dev/null





More information about the Users mailing list