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

Debian\b.*?([\d.]+)/, + search => "

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