#!/usr/bin/perl -w

# Usage:   check_kernel
# No arguments are required

# You may need to set to lib path below
# You will need an RPM-based distribution for this to work

use strict;
use lib "/usr/lib/nagios/plugins";
use utils qw(%ERRORS);

my $suse_version=`egrep VERSION_ID /etc/os-release | cut -f2 -d\\"`;
my $suse_arch=`egrep PRETTY_NAME /etc/os-release | cut -f2 -d\\( | cut -f1 -d\\)`;
if ($suse_version > 20160000) {
  # Tumbleweed
  $suse_arch=`uname -p`;
  $suse_arch =~ s/i6/i5/i;
}
my $running_kernel=`uname -r`;
my $running_kernel_flavour=$running_kernel;
$running_kernel_flavour =~ s/.*-([a-z]*)$/$1/;
chomp ($running_kernel_flavour);
my $installed_kernel=`rpm -q kernel-$running_kernel_flavour | tr . - | sort -nr -k3 -k4 -k5 -k6 -k7 -t- | head -n 1`;
my $rpm = `which rpm`;

$running_kernel =~ s/\./-/g;
chomp $running_kernel;
chomp $installed_kernel;

if ($rpm =~ m/no rpm in/i) {
   print "UNKNOWN - You must be running an RPM-based system\n";
   exit $ERRORS{'UNKNOWN'};
}

if (!defined $running_kernel || !defined $installed_kernel) {
   print "UNKNOWN - Test failed\n";
   exit $ERRORS{'UNKNOWN'};
}

# change the sequence of flavour and version number
$running_kernel =~ s/(.*)-([a-z]*)$/$2-$1/;
# Strip off the leadin "kernel-" prefix and the trailing build system sequence number, so the strings will match
if ($suse_version >= 11.2) {
  if ($suse_arch eq "i586\n") {
    $installed_kernel =~ s/\-[^\-]{4,}\-(i[56]86)$/-1-$1/gi;
    $installed_kernel =~ s/kernel-(.*)\-[0-9]*\-i[56]86$/$1/gi;
  } else {
    $installed_kernel =~ s/\-[^\-]{4,}\-x86_64$/-1-x86_64/gi;
    $installed_kernel =~ s/kernel-(.*)\-[0-9]*\-x86_64$/$1/gi;
  }
} else {
  $installed_kernel =~ s/kernel-(.*)\-[0-9]*$/$1/gi;
}

# Do the test
if ($running_kernel eq $installed_kernel) {
   print "OK - running latest installed kernel: kernel-$running_kernel\n";
   exit $ERRORS{'OK'};
} else {
   print "WARNING - reboot to run latest installed kernel: kernel-$installed_kernel\n";
   exit $ERRORS{'WARNING'};
}
