diff -r 6b3eca8f7c0a -r 18b866efccfe check_release.pl --- a/check_release.pl Tue Mar 31 09:11:19 2015 +0200 +++ b/check_release.pl Tue Mar 31 09:18:11 2015 +0200 @@ -32,7 +32,7 @@ DEPENDENT => 4 ); -sub get_current_release($); +sub get_local_release; sub get_stable_release($$); sub report($$); sub version($$); @@ -42,9 +42,9 @@ my %opt = ( url => "http://www.debian.org/releases/stable/index.html", - search => "

Debian", + search => qr/

Debian\b.*?([\d.]+)/, file => "/etc/debian_version", - ok => 0 + ok => 0 ); MAIN: { @@ -59,81 +59,66 @@ "V|version" => sub { version($ME, $VERSION); exit $ERRORS{OK}; } ) or pod2usage(-verbose => 1, -exitval => $ERRORS{CRITICAL}); - my $current_release = get_current_release($opt{file}); - my $stable_release = get_stable_release($opt{url}, $opt{search}); - report($current_release, $stable_release); + my ($local_release, $stable_release) = eval { + get_local_release($opt{file}), + get_stable_release($opt{url}, $opt{search}); + }; + if ($@) { + print "RELEASE CRITICAL: $@\n"; + exit $ERRORS{CRITICAL}; + } + report($local_release, $stable_release); } -sub get_current_release($) { - my $file = shift; - my $current_release = undef; +sub get_local_release { - unless (-r $file) { - print -"RELEASE CRITICAL: $file not exists or not read permission is granted\n"; - exit $ERRORS{CRITICAL}; - } + my $local_release = do { + local @ARGV = grep { -r } @_ + or die "@_: $!\n"; + <>; + }; - open(CR, "<$file"); - while () { - chomp; - $current_release = $_; - } - close(CR); - - return $current_release; + chomp $local_release; + return $local_release; } sub get_stable_release($$) { my ($url, $search) = @_; - my ($found, $stable_release) = undef; my $website; - my @website = (); + + $website = get($url) + or die "Failed to get $url\n"; + + $website =~ /$opt{search}/s + or die "an't parse $url\n"; + + return $1; +} - $website = get($url); - unless (defined $website) { - print -"RELEASE CRITICAL: failed to get $url\n"; +sub compare_versions { + my ($left, $right) = @_; + my @left = split '.', $left; + my @right = split '.', $right; + +} + +sub report($$) { + my ($local_release, $stable_release) = @_; + my ($local_major, $stable_major) = map { int } $local_release, $stable_release; + + + if ($opt{ok} or $local_release eq $stable_release or $local_major > $stable_major) { + print "RELEASE OK: $local_release/$stable_release\n"; + exit $ERRORS{OK}; + } + + if ($local_major - $stable_major < -1) { + print "RELEASE CRITICAL: $local_release / $stable_release\n"; exit $ERRORS{CRITICAL}; } - push @website, split("\n", $website); - - foreach (@website) { - unless ($found) { - /$search/ or next; - $found = $_; - next; - } - } - - if ($found =~ /$opt{search}\s+([\d\.]+).*/) { - $stable_release = $1; - } - - return $stable_release; -} - -sub report($$) { - my ($current_release, $stable_release) = @_; - - - if ($opt{ok} or $current_release eq $stable_release) { - print "RELEASE OK: $current_release/$stable_release\n"; - exit $ERRORS{OK}; - } - - $stable_release =~ /^(\d+)/ and my $stable_major = int($1); - $current_release =~ /^(\d+)/ and my $current_major = int($1); - - - if ($current_major - $stable_major < -1) { - print "RELEASE CRITICAL: $current_release / $stable_release\n"; - exit $ERRORS{CRITICAL}; - } - - print "RELEASE WARNING: $current_release / $stable_release\n"; - exit $ERRORS{"WARNING"}; + print "RELEASE WARNING: $local_release / $stable_release\n"; + exit $ERRORS{"WARNING"}; } @@ -177,7 +162,7 @@ =item B<-s>|B<--search> I -search string on the url (default: '

Debian') +search string on the url (default: /

Debian\b.*?([\d.]+)/) =item B<-f>|B<--file> I