check_release.pl
changeset 22 18b866efccfe
parent 21 6b3eca8f7c0a
child 25 34ca2b4008a4
--- 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 => "<p>Debian",
+    search => qr/<p>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 (<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;
+}
 
-    $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<string>
 
-search string on the url (default: '<p>Debian')
+search string on the url (default: /<p>Debian\b.*?([\d.]+)/)
 
 =item B<-f>|B<--file> I<string>