Syd Alsobrook schrieb:
On Thursday 16 August 2007 10:29, Nicole Hähnel wrote:
After recompiling nagios doesn't crash anymore.
But now I get CRITICAL and "(null)" as status information.

Odd, all my status information cleaned right up after I did this. Is this a custom plugin or a base one?

Syd


It's a custom plugin.


#!/usr/bin/perl
#
# Josh Yost
# written: 07.14.06
# updated: 06.05.07
#
#       Use the output of snmpget hrSystemDate.0 to create warning/critical
# signals to Nagios w/ the help of Time::Local and localtime().
#
# LICENSE
#   Distributed freely w/ no license &  w/ absolutely no warranty of any kind =)
#
# BUGS & PATCHES
#       mailto: [EMAIL PROTECTED]
# 
# VERSIONS
# 1.0.5 
#       - switched to Getopt::Long
#       - all non-zero snmpget exits are UNKNOWN, bad usage is UNKNOWN
#       - added SNMPv3 options
#       - expanded help a bit, expanded debug output
# 1.0.4
#       - using utils.pm (took a while...); re-directing STDERR to STDOUT on 
syscalls
# 1.0.3
#       - re-wrote some code for cleanliness & (hopefully) efficiency
#       - changed usage handling

use warnings;
use strict;
use File::Basename;
use Getopt::Long;
use Time::Local;
use lib "/usr/lib/nagios/plugins";
use utils qw ( %ERRORS $TIMEOUT );

our $snmpget = '/usr/bin/snmpget';
our $exe     = basename $0;
our $vers    = '1.0.5';

#########################88### Functions ###################################
sub usage{
  print "Usage: $exe [-dhV] -H <host> -C <community> | -u <user>\n",
  ' ' x length("Usage: $exe "), "[-n <secs>][-v 1|2c|3][-a MD5|SHA]\n",
  ' ' x length("Usage: $exe "), "[-A <authpass>][-x DES|AES][-X <privpass>]\n",
  ' ' x length("Usage: $exe "), "[-e <secengine>][-E <conengine][-N 
<context>]\n";
  print "Try '--help' for more information.\n";
  exit $ERRORS{'UNKNOWN'};
}

sub HELP{
  print "$exe\t\t$vers\n",
        "\n\tCheck the system time on a host against the localhost's time 
using\n",
        "net-snmp's snmpget.\n",
        "\n\tThis plugin returns a critical state if the target has drifted\n",
        "more than 10 times your allowed number of drift seconds, and it 
returns \n",
        "a warning state for anything in between (for example, if you allow 
60\n",
        "seconds of deviation, a warning will be returned if the target 
differs\n",
        "by 61 - 600 seconds and critical if more than 600).\n",
        "\nOPTIONS\n",
        "  -a,--authproto MD5|SHA\n",       "     Set the SNMPv3 auth protocol 
(defaults to MD5)\n",
        "  -A,--authpass <arg>\n",          "     Set the SNMPv3 auth 
passphrase\n",
        "  -C,--community <arg>\n",         "     Set the SNMP v1|v2c community 
string\n",
        "  -d,--debug\n",                   "     Show debugging output\n",
        "  -e,--secengine <arg>\n",         "     Set the SNMPv3 security 
engine ID\n",
        "  -E,--conengine <arg>\n",         "     Set the SNMPv3 context engine 
ID\n",
        "  -h,--help\n",                    "     Show this help information\n",
        "  -H,--host <host[:port]>\n",      "     Set the target host (& port 
optionally)\n",
        "  -n,--num <secs>\n",              "     The amount of drift allowed 
in seconds (defaults to 120)\n",
        "  -N,--context <arg>\n",           "     Set the SNMP context name\n",
        "  -t,--timeout <arg>\n",           "     Set the timeout value in 
seconds\n",
        "  -v,--snmpversion 1|2c|3\n",      "     Set the SNMP version 
(defaults to 1)\n",
        "  -V,--version\n",                 "     Show version information\n",
        "  -u,--username <arg>\n",          "     Set the SNMPv3 username\n",
        "  -x,--privproto DES|AES\n",       "     Set the SNMPv3 priv protocol 
(defaults to DES)\n",
        "  -X,--privpass <arg>\n",          "     Set the SNMPv3 privacy 
passphrase\n",
        "\nCAVEATS\n",
        " - This script depends on having net-snmp's snmpget installed.\n",
        " - The executable path is hard-coded to '/usr/bin/snmpget.' Please 
edit the\n",
        "    '\$snmpget' variable near the top of the script for your 
environment.\n",
        " - You may also need to change the 'use lib' path to utils.pm for your 
system\n",
        "    (make sure you use an absolute path!!)\n",
        "\nEXAMPLES\n",
        "  \$ $exe -H host1 -C public\n",
        "  \$ $exe -H host2 -n 30 -u MD5User -A \"My Passphrase\"\n";

  exit $ERRORS{'OK'};
}

sub VERS{
  print "$exe\t\t$vers\n";
  exit $ERRORS{'OK'};
}

$SIG{ALRM} = sub { print "ERROR - Global timeout exceeded\n"; exit 
$ERRORS{'UNKNOWN'} };

###### Variables
Getopt::Long::Configure("bundling");
my %opts;
GetOptions(\%opts, 'authproto|a=s','authpass|A=s',   'community|C=s','debug|d',
                   'secengine|e=s','conengine|E=s',  'help|h',       'host|H=s',
                   'num|n=i',      'context|N=s',    'snmpversion|v=s', 
'timeout|t=i',
                   'version|V',    'username|u=s',   
'privproto|x=s','privpass|X=s') || &usage();

&HELP()  if defined($opts{help});
&VERS()  if defined($opts{version});

my $aproto   = ($opts{authproto} || 'MD5');
my $aphrase  =  $opts{authpass}  if defined ($opts{authpass});
my $pass     =  $opts{community} if defined ($opts{community});
my $DEBUG    = defined ($opts{debug});
my $dev      =  $opts{device}    if defined ($opts{device});
my $sengine  =  $opts{secengine} if defined ($opts{secengine});
my $cengine  =  $opts{conengine} if defined ($opts{conengine});
my $host     =  $opts{host}      if defined ($opts{host});
my $diff     = ($opts{num} || 120);                     # number of seconds
my $context  =  $opts{context}   if defined ($opts{context});
my $snmpvers = ($opts{snmpversion} || '1');
my $timeout  = ($opts{timeout} || $TIMEOUT);
my $user     =  $opts{username}  if defined ($opts{username});
my $pproto   = ($opts{privproto} || 'DES');
my $pphrase  =  $opts{privpass}  if defined ($opts{privpass});

#### sanity checksy
if (!(defined($host) && (defined($pass) || defined($user)))){
  print "ERROR - At least -H and either -C or -u must be defined.\n";
  &usage();
}
if (! -x $snmpget){
  print "ERROR - $snmpget not found. Please edit the script for your 
environment.\n";
  exit $ERRORS{'UNKNOWN'};
}
if ($diff < 0 || $timeout < 0){
  print "ERROR - are you serious? The argument to -n and -t must be greater 
than 0 ...\n";
  exit $ERRORS{'UNKNOWN'};
}
&usage() if !(($aproto eq 'MD5' || $aproto eq 'SHA') && ($pproto eq 'DES' || 
$pproto eq 'AES'));
&usage() if !($snmpvers eq '1' || $snmpvers eq '2c' || $snmpvers eq '3');
&usage() if (@ARGV);

if (defined($user)) { $snmpvers = '3' }

#### Prepare System Call
my $syscall;
if ($snmpvers eq '3' && defined($user)){
  if (defined($pphrase)){
    if (!defined($aphrase)){
      print "ERROR - auth passphrase is not defined.\n";
      exit $ERRORS{'UNKNOWN'};
    }
    print "debug >> using SNMPv3 authPriv\n" if $DEBUG;
    $syscall = "$snmpget -v${snmpvers} -u $user -a $aproto -A \"$aphrase\" -x 
$pproto -X \"$pphrase\" -l authPriv";
  }
  elsif (defined($aphrase)){
    print "debug >> using SNMPv3 authNoPriv\n" if $DEBUG;
    $syscall = "$snmpget -v${snmpvers} -u $user -a $aproto -A \"$aphrase\" -l 
authNoPriv";
  }
  else{
    print "debug >> using SNMPv3 noAuthNoPriv\n" if $DEBUG;
    $syscall = "$snmpget -v${snmpvers} -u $user -l noAuthNoPriv";
  }
  $syscall .= " -n \"$context\"" if defined($context);
  $syscall .= " -e $sengine" if defined($sengine);
  $syscall .= " -E $cengine" if defined($cengine);
}
elsif ($snmpvers eq '1' || $snmpvers eq '2c'){
  print "debug >> using SNMPv$snmpvers\n" if $DEBUG;
  $syscall = "$snmpget -v${snmpvers} -c \"$pass\"";
}
else{
  print "ERROR - SNMPv3 requires at least the '-u' option.\n";
  &usage();
}

#### Actual syscall
# .1.3.6.1.2.1.25.1.2.0 = hrSystemDate.0
alarm $timeout;
my $oid    = '.1.3.6.1.2.1.25.1.2.0'; 

print "debug >> syscall - $syscall $host $oid 2>&1\n" if $DEBUG;

my $output = `$syscall $host $oid 2>&1`;
my $state  = $?;

print "debug >> output - |$output|","debug >> state : $state\n" if $DEBUG;

alarm 0;
if ($state != 0){
        print $output;
        exit $ERRORS{'UNKNOWN'};
}
else{
  # STRING: 2006-7-19,18:16:28.0,-5:0 
  if ($output =~ /STRING\s*:\s*(\d\d\d\d)-(\d+)-(\d+),(\d+):(\d+):(\d{1,2})/){
    my $ctime = localtime();
    my ($t_epoch, $l_epoch) = (timelocal($6,$5,$4,$3,$2-1,$1-1900),time);
    my $t_ctime = sprintf "%02d-%02d-%d, %02d:%02d:%02d",$2,$3,$1,$4,$5,$6;
    my $abs_time  = abs($l_epoch - $t_epoch);
          
    if ($DEBUG){
      print "debug >>\n",
            "  sec:\t$6\n  min:\t$5\n  hr:\t$4\n  day:\t$3\n  mon:\t",$2-1," 
($2)\n  yr:\t",$1-1900, " ($1)\n",
            "debug >> localhost time     : $ctime\n",
            "debug >> localhost epoch    : $l_epoch\n",
            "debug >> target epoch       : $t_epoch\n",
            "debug >> allowed difference : $diff sec\tactual diff: $abs_time 
sec\n",
            "--\n";
    } 
        
    # Test epoch times
    if ($abs_time > ($diff*10)){
      print "CRITICAL - System time is off by $abs_time sec ($t_ctime).\n";
      exit $ERRORS{'CRITICAL'};
    }
    elsif ($abs_time > $diff){
      print "WARNING - System time is off by $abs_time sec ($t_ctime).\n";
      exit $ERRORS{'WARNING'};
    }
    else{
      print "System Time OK - $t_ctime\n";
      exit $ERRORS{'OK'};
    }
  }
  # No match on the RE
  else{
    print "UNKNOWN - snmpget returned unknown output: $output\n";
    exit $ERRORS{'UNKNOWN'};
  }
}

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Nagios-users mailing list
Nagios-users@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

Reply via email to