diff -r 000000000000 -r 2837df8eaada check_uptime.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/check_uptime.pl Tue May 17 15:55:18 2011 +0200 @@ -0,0 +1,210 @@ +#! /usr/bin/perl + +# Copyright (C) 2011 Christian Arnold +# +# 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 3 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, see . +# +# Christian Arnold + +use 5.010; +use strict; +use warnings; +use File::Basename qw(basename); +use Pod::Usage; +use Getopt::Long; + +delete @ENV{ grep /^LC_/ => keys %ENV }; +$ENV{LANG} = "C"; +$ENV{LC_ALL} = "C"; + +sub check_uptime($$); +sub report($$); +sub version($$); + +my %ERRORS = ( + OK => 0, + WARNING => 1, + CRITICAL => 2, + UNKNOWN => 3, + DEPENDENT => 4 +); + +my $ME = basename $0; +my $NAME = 'UPTIME'; +my $STAMP_DIR = '/var/tmp/nagios'; +my $STAMP_FILE = 'check_uptime.stamp'; +my $VERSION = '0.1'; + +my $PROC_UPTIME = '/proc/uptime'; + +my %opt = ( time => 86400 ); + +MAIN: { + Getopt::Long::Configure('no_ignore_case_always'); + GetOptions( + "t|time=i" => \$opt{time}, + "h|help" => sub { pod2usage( -verbose => 1, -exitval => $ERRORS{OK} ) }, + "m|man" => sub { pod2usage( -verbose => 2, -exitval => $ERRORS{OK} ) }, + "V|version" => sub { version( $ME, $VERSION ); exit $ERRORS{OK}; } + ) or pod2usage( -verbose => 1, -exitval => $ERRORS{CRITICAL} ); + + # prepare the nest + unless ( -d $STAMP_DIR ) { + unless ( mkdir $STAMP_DIR ) { + say "$NAME CRITICAL: cannot create directory $STAMP_DIR $!"; + exit $ERRORS{CRITICAL}; + } + my $mode = 0777; + chmod $mode, $STAMP_DIR; + } + + unless ( -r $PROC_UPTIME ) { + say "$NAME CRITICAL: $PROC_UPTIME not found or not readable."; + exit $ERRORS{CRITICAL}; + } + + my ( $rc, $uptime ) = check_uptime( $PROC_UPTIME, $opt{time} ); + report( $rc, $uptime ); + +} + +sub check_uptime($$) { + my ( $file, $time ) = @_; + my $rc = "OK"; + my $mesg = ""; + my $uptime = ""; + + # get current uptime + unless ( open UPTIME, '<', $file ) { + $rc = 'CRITICAL'; + $mesg = $!; + return ( $rc, $mesg ); + } + my $line = ; + close UPTIME; + + $line =~ /^(\d+)/ and $uptime = $1; + + # prepare the output + my $c_days = sprintf( "%.2f", $uptime / 60 / 60 / 24 ); + my $s_days = sprintf( "%.2f", $time / 60 / 60 / 24 ); + + if ( $uptime < $time ) { + $rc = "WARNING"; + $mesg = "current uptime $c_days days is less than $s_days days"; + } + else { + $rc = "OK"; + $mesg = "current uptime $c_days days is greater than $s_days days"; + } + + # store last check time + unless ( open STAMP, '>', "$STAMP_DIR/$STAMP_FILE" ) { + say "$NAME CRITICAL: connot open $STAMP_DIR/$STAMP_FILE for writing $!"; + exit $ERRORS{CRITICAL}; + } + + my $mode = 0666; + chmod $mode, "$STAMP_DIR/$STAMP_FILE"; + say STAMP time(); + close STAMP; + + return ( $rc, $mesg ); +} + +sub report($$) { + my ( $rc, $mesg ) = @_; + say "$NAME $rc: $mesg" + and exit $ERRORS{WARNING} + if ( $rc eq "WARNING" ); + say "$NAME $rc: $mesg"; + exit $ERRORS{OK}; +} + +sub version($$) { + my ( $progname, $version ) = @_; + say <<_VERSION; +$progname version $version +Copyright (C) 2011 by Christian Arnold and Schlittermann internet & unix support. + +$ME comes with ABSOLUTELY NO WARRANTY. This is free software, +and you are welcome to redistribute it under certain conditions. +See the GNU General Public Licence for details. +_VERSION +} + +__END__ + +=head1 NAME + +check_uptime - nagios plugin to check server uptime + +=head1 SYNOPSIS + +check_uptime [B<-t>|B<--time> integer] + +check_uptime [B<-h>|B<--help>] + +check_uptime [B<-m>|B<--man>] + +check_uptime [B<-V>|B<--version>] + +=head1 OPTIONS + +=over + +=item B<-t>|B<--time> I + +Uptime should be greater than B