--- a/check_release.pl Wed Jan 28 21:25:36 2015 +0100
+++ b/check_release.pl Tue Mar 31 09:07:18 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,7 +42,7 @@
my %opt = (
url => "http://www.debian.org/releases/stable/index.html",
- search => "<p>Debian",
+ search => qr/<p>Debian\b.*?([\d.]+)/,
file => "/etc/debian_version",
ok => 0
);
@@ -59,80 +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 (<CR>) {
- 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;
+}
+
+sub compare_versions {
+ my ($left, $right) = @_;
+ my @left = split '.', $left;
+ my @right = split '.', $right;
- $website = get($url);
- unless (defined $website) {
- print
-"RELEASE CRITICAL: failed to get $url\n";
+}
+
+sub report($$) {
+ my ($local_release, $stable_release) = @_;
+ my ($local_major, $stable_major) = map { int } $local_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";
+ exit $ERRORS{OK};
+ }
+
+ if ($current_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";
+ print "RELEASE WARNING: $local_release / $stable_release\n";
exit $ERRORS{"WARNING"};
}