check_release.pl
changeset 22 18b866efccfe
parent 21 6b3eca8f7c0a
child 25 34ca2b4008a4
equal deleted inserted replaced
21:6b3eca8f7c0a 22:18b866efccfe
    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_current_release($);
    35 sub get_local_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 => "<p>Debian",
    45     search => qr/<p>Debian\b.*?([\d.]+)/,
    46     file   => "/etc/debian_version",
    46     file   => "/etc/debian_version",
    47 	ok     => 0
    47     ok     => 0
    48 );
    48 );
    49 
    49 
    50 MAIN: {
    50 MAIN: {
    51     Getopt::Long::Configure('bundling');
    51     Getopt::Long::Configure('bundling');
    52     GetOptions(
    52     GetOptions(
    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 $current_release = get_current_release($opt{file});
    62     my ($local_release, $stable_release) = eval {
    63     my $stable_release = get_stable_release($opt{url}, $opt{search});
    63 	get_local_release($opt{file}),
    64     report($current_release, $stable_release);
    64 	get_stable_release($opt{url}, $opt{search});
    65 }
    65     };
    66 
    66     if ($@) {
    67 sub get_current_release($) {
    67 	print "RELEASE CRITICAL: $@\n";
    68     my $file            = shift;
    68 	exit $ERRORS{CRITICAL};
    69     my $current_release = undef;
    69     }
    70 
    70     report($local_release, $stable_release);
    71     unless (-r $file) {
    71 }
    72         print
    72 
    73 "RELEASE CRITICAL: $file not exists or not read permission is granted\n";
    73 sub get_local_release {
       
    74 
       
    75     my $local_release = do {
       
    76 	local @ARGV = grep { -r } @_
       
    77 	    or die "@_: $!\n";
       
    78 	<>;
       
    79     };
       
    80 
       
    81     chomp $local_release;
       
    82     return $local_release;
       
    83 }
       
    84 
       
    85 sub get_stable_release($$) {
       
    86     my ($url,   $search)         = @_;
       
    87     my $website;
       
    88 
       
    89     $website = get($url)
       
    90 	or die "Failed to get $url\n";
       
    91 
       
    92     $website =~ /$opt{search}/s
       
    93 	or die  "an't parse $url\n";
       
    94 
       
    95     return $1;
       
    96 }
       
    97 
       
    98 sub compare_versions {
       
    99     my ($left, $right) = @_;
       
   100     my @left = split '.', $left;
       
   101     my @right = split '.', $right;
       
   102 
       
   103 }
       
   104 
       
   105 sub report($$) {
       
   106     my ($local_release, $stable_release) = @_;
       
   107     my ($local_major, $stable_major) = map { int } $local_release, $stable_release;
       
   108 
       
   109 
       
   110     if ($opt{ok} or $local_release eq $stable_release or $local_major > $stable_major) {
       
   111         print "RELEASE OK: $local_release/$stable_release\n";
       
   112         exit $ERRORS{OK};
       
   113     }
       
   114 
       
   115     if ($local_major - $stable_major < -1) {
       
   116         print "RELEASE CRITICAL: $local_release / $stable_release\n";
    74         exit $ERRORS{CRITICAL};
   117         exit $ERRORS{CRITICAL};
    75     }
   118     }
    76 
   119 
    77     open(CR, "<$file");
   120     print "RELEASE WARNING: $local_release / $stable_release\n";
    78     while (<CR>) {
   121     exit $ERRORS{"WARNING"};
    79         chomp;
       
    80         $current_release = $_;
       
    81     }
       
    82     close(CR);
       
    83 
       
    84     return $current_release;
       
    85 }
       
    86 
       
    87 sub get_stable_release($$) {
       
    88     my ($url,   $search)         = @_;
       
    89     my ($found, $stable_release) = undef;
       
    90     my $website;
       
    91     my @website = ();
       
    92 
       
    93     $website = get($url);
       
    94     unless (defined $website) {
       
    95         print
       
    96 "RELEASE CRITICAL: failed to get $url\n";
       
    97         exit $ERRORS{CRITICAL};
       
    98     }
       
    99 
       
   100     push @website, split("\n", $website);
       
   101 
       
   102     foreach (@website) {
       
   103         unless ($found) {
       
   104             /$search/ or next;
       
   105             $found = $_;
       
   106             next;
       
   107         }
       
   108     }
       
   109 
       
   110     if ($found =~ /$opt{search}\s+([\d\.]+).*/) {
       
   111         $stable_release = $1;
       
   112     }
       
   113 
       
   114     return $stable_release;
       
   115 }
       
   116 
       
   117 sub report($$) {
       
   118     my ($current_release, $stable_release) = @_;
       
   119 
       
   120 
       
   121     if ($opt{ok} or $current_release eq $stable_release) {
       
   122         print "RELEASE OK: $current_release/$stable_release\n";
       
   123         exit $ERRORS{OK};
       
   124     }
       
   125 
       
   126     $stable_release =~ /^(\d+)/ and my $stable_major = int($1);
       
   127     $current_release =~ /^(\d+)/ and my $current_major = int($1);
       
   128 
       
   129 
       
   130     if ($current_major - $stable_major < -1) {
       
   131         print "RELEASE CRITICAL: $current_release / $stable_release\n";
       
   132         exit $ERRORS{CRITICAL};
       
   133     }
       
   134 
       
   135         print "RELEASE WARNING: $current_release / $stable_release\n";
       
   136         exit $ERRORS{"WARNING"};
       
   137 
   122 
   138 }
   123 }
   139 
   124 
   140 sub version($$) {
   125 sub version($$) {
   141     my ($progname, $version) = @_;
   126     my ($progname, $version) = @_;
   175 
   160 
   176 URL where to search for the search string (default: http://www.debian.org/releases/stable/index.html)
   161 URL where to search for the search string (default: http://www.debian.org/releases/stable/index.html)
   177 
   162 
   178 =item B<-s>|B<--search> I<string>
   163 =item B<-s>|B<--search> I<string>
   179 
   164 
   180 search string on the url (default: '<p>Debian')
   165 search string on the url (default: /<p>Debian\b.*?([\d.]+)/)
   181 
   166 
   182 =item B<-f>|B<--file> I<string>
   167 =item B<-f>|B<--file> I<string>
   183 
   168 
   184 file with current release informations (default: /etc/debian_version)
   169 file with current release informations (default: /etc/debian_version)
   185 
   170