check_release.pl
changeset 21 6b3eca8f7c0a
parent 20 464fb46c0b7d
child 22 18b866efccfe
equal deleted inserted replaced
20:464fb46c0b7d 21:6b3eca8f7c0a
    30     CRITICAL  => 2,
    30     CRITICAL  => 2,
    31     UNKNOWN   => 3,
    31     UNKNOWN   => 3,
    32     DEPENDENT => 4
    32     DEPENDENT => 4
    33 );
    33 );
    34 
    34 
    35 sub get_local_release;
    35 sub get_current_release($);
    36 sub get_stable_release($$);
    36 sub get_stable_release($$);
    37 sub report($$);
    37 sub report($$);
    38 sub version($$);
    38 sub version($$);
    39 
    39 
    40 my $ME      = basename $0;
    40 my $ME      = basename $0;
    41 my $VERSION = "2.5";
    41 my $VERSION = "2.5";
    42 
    42 
    43 my %opt = (
    43 my %opt = (
    44     url    => "http://www.debian.org/releases/stable/index.html",
    44     url    => "http://www.debian.org/releases/stable/index.html",
    45     search => qr/<p>Debian\b.*?([\d.]+)/,
    45     search => "<p>Debian",
    46     file   => "/etc/debian_version",
    46     file   => "/etc/debian_version",
    47 	ok     => 0
    47 	ok     => 0
    48 );
    48 );
    49 
    49 
    50 MAIN: {
    50 MAIN: {
    57         "h|help" => sub { pod2usage(-verbose => 1, -exitval => $ERRORS{OK}) },
    57         "h|help" => sub { pod2usage(-verbose => 1, -exitval => $ERRORS{OK}) },
    58         "m|man" => sub { pod2usage(-verbose => 2, -exitval => $ERRORS{OK}) },
    58         "m|man" => sub { pod2usage(-verbose => 2, -exitval => $ERRORS{OK}) },
    59         "V|version" => sub { version($ME, $VERSION); exit $ERRORS{OK}; }
    59         "V|version" => sub { version($ME, $VERSION); exit $ERRORS{OK}; }
    60     ) or pod2usage(-verbose => 1, -exitval => $ERRORS{CRITICAL});
    60     ) or pod2usage(-verbose => 1, -exitval => $ERRORS{CRITICAL});
    61 
    61 
    62     my ($local_release, $stable_release) = eval {
    62     my $current_release = get_current_release($opt{file});
    63 	get_local_release($opt{file}),
    63     my $stable_release = get_stable_release($opt{url}, $opt{search});
    64 	get_stable_release($opt{url}, $opt{search});
    64     report($current_release, $stable_release);
    65     };
    65 }
    66     if ($@) {
    66 
    67 	print "RELEASE CRITICAL: $@\n";
    67 sub get_current_release($) {
    68 	exit $ERRORS{CRITICAL};
    68     my $file            = shift;
    69     }
    69     my $current_release = undef;
    70     report($local_release, $stable_release);
    70 
    71 }
    71     unless (-r $file) {
    72 
    72         print
    73 sub get_local_release {
    73 "RELEASE CRITICAL: $file not exists or not read permission is granted\n";
    74 
    74         exit $ERRORS{CRITICAL};
    75     my $local_release = do {
    75     }
    76 	local @ARGV = grep { -r } @_
    76 
    77 	    or die "@_: $!\n";
    77     open(CR, "<$file");
    78 	<>;
    78     while (<CR>) {
    79     };
    79         chomp;
    80 
    80         $current_release = $_;
    81     chomp $local_release;
    81     }
    82     return $local_release;
    82     close(CR);
       
    83 
       
    84     return $current_release;
    83 }
    85 }
    84 
    86 
    85 sub get_stable_release($$) {
    87 sub get_stable_release($$) {
    86     my ($url,   $search)         = @_;
    88     my ($url,   $search)         = @_;
       
    89     my ($found, $stable_release) = undef;
    87     my $website;
    90     my $website;
    88 
    91     my @website = ();
    89     $website = get($url)
    92 
    90 	or die "Failed to get $url\n";
    93     $website = get($url);
    91 
    94     unless (defined $website) {
    92     $website =~ /$opt{search}/s
    95         print
    93 	or die  "an't parse $url\n";
    96 "RELEASE CRITICAL: failed to get $url\n";
    94 
    97         exit $ERRORS{CRITICAL};
    95     return $1;
    98     }
    96 }
    99 
    97 
   100     push @website, split("\n", $website);
    98 sub compare_versions {
   101 
    99     my ($left, $right) = @_;
   102     foreach (@website) {
   100     my @left = split '.', $left;
   103         unless ($found) {
   101     my @right = split '.', $right;
   104             /$search/ or next;
   102 
   105             $found = $_;
       
   106             next;
       
   107         }
       
   108     }
       
   109 
       
   110     if ($found =~ /$opt{search}\s+([\d\.]+).*/) {
       
   111         $stable_release = $1;
       
   112     }
       
   113 
       
   114     return $stable_release;
   103 }
   115 }
   104 
   116 
   105 sub report($$) {
   117 sub report($$) {
   106     my ($local_release, $stable_release) = @_;
   118     my ($current_release, $stable_release) = @_;
   107     my ($local_major, $stable_major) = map { int } $local_release, $stable_release;
   119 
   108 
   120 
   109     die "<$local_major | $stable_major>";
   121     if ($opt{ok} or $current_release eq $stable_release) {
   110 
   122         print "RELEASE OK: $current_release/$stable_release\n";
   111     if ($opt{ok} or $local_release eq $stable_release) {
       
   112         print "RELEASE OK: $local_release/$stable_release\n";
       
   113         exit $ERRORS{OK};
   123         exit $ERRORS{OK};
   114     }
   124     }
   115 
   125 
       
   126     $stable_release =~ /^(\d+)/ and my $stable_major = int($1);
       
   127     $current_release =~ /^(\d+)/ and my $current_major = int($1);
       
   128 
       
   129 
   116     if ($current_major - $stable_major < -1) {
   130     if ($current_major - $stable_major < -1) {
   117         print "RELEASE CRITICAL: $local_release / $stable_release\n";
   131         print "RELEASE CRITICAL: $current_release / $stable_release\n";
   118         exit $ERRORS{CRITICAL};
   132         exit $ERRORS{CRITICAL};
   119     }
   133     }
   120 
   134 
   121         print "RELEASE WARNING: $local_release / $stable_release\n";
   135         print "RELEASE WARNING: $current_release / $stable_release\n";
   122         exit $ERRORS{"WARNING"};
   136         exit $ERRORS{"WARNING"};
   123 
   137 
   124 }
   138 }
   125 
   139 
   126 sub version($$) {
   140 sub version($$) {