check_release.pl
changeset 20 464fb46c0b7d
parent 10 0b560168af46
child 21 6b3eca8f7c0a
--- 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"};
 
 }