1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#!/usr/bin/perl
# check_kernel_status : check if the running kernel is the latest installed
# By Toni Van Remortel [toni.van.remortel@p-ops.be]
# 2008-07-28
# GPLv2
# Downloaded from
# http://www.monitoringexchange.org/attachment/download/Check-Plugins/Operating-Systems/Linux/Running-kernel-compared-to-installed-kernel-version/check_kernel_status
use strict;
use warnings;
my $OK = 0;
my $WARN = 1;
my $CRIT = 2;
my $UNKN = 3;
my $sig;
my @running_version;
my @installed_version;
# First, find the current running kernel version
if ( -e '/proc/version_signature' )
{
# Likely Ubuntu
$sig = `cat /proc/version_signature`;
if ( $sig =~ /.* (\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)-[generic|server]/ )
{
@running_version = ($1, $2, $3, $4, $5);
}
else
{
print "UNKNOWN - Cannot find running Ubuntu kernel version\n";
exit $UNKN;
}
}
elsif ( -e '/proc/version' )
{
# Likely Debian
$sig = `cat /proc/version`;
if ( $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\)/
|| $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\w+(\d+)\)/
|| $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)-(\d+).+?(\d+).+?(\d+)\)/
|| $sig =~ /\(Debian (\d+)\.(\d+)\.(\d+)-(\d+)lenny(\d+)\)/
)
{
@running_version = ($1, $2, $3, $4, $5, $6);
}
else
{
print "UNKNOWN - Cannot find running Debian kernel version\n";
exit $UNKN;
}
}
else
{
print "UNKNOWN - Cannot extract running kernel info\n";
exit $UNKN;
}
# Next, find the installed kernel version
# Yes, as you can see, it is limited to 2.6 kernels here.
# But I assume that you don't need reboots anymore when this major version has passed.
my $dpkg_list = `dpkg -l | grep linux-image-2.6`;
chomp($dpkg_list);
my @dpkg_lines = split("\n", $dpkg_list);
my $dpkg = pop(@dpkg_lines);
# Now, which OS is it, and which footprint do they use?
if ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)/ )
{
# Ubuntu
@installed_version = ($1, $2, $3, $4, $5, 0);
}
elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+)\w+(\d+)/ )
{
# Debian Etch and older
@installed_version = ($1, $2, $3, $4, $5, $6);
}
elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)\.dfsg\.(\d+)-(\d+) / )
{
# Debian Etch and older
@installed_version = ($1, $2, $3, $4, $5, 0);
}
elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)\~.+?(\d+).+?(\d+)/ )
{
# Debian Etch and older
@installed_version = ($1, $2, $3, $4, $5, $6);
}
elsif ( $dpkg =~ /Debian (\d+)\.(\d+)\.(\d+)\+(\d+)\+lenny(\d+)/ )
{
# Debian Lenny
@installed_version = ($1, $2, $3, $4, $5, 0);
}
elsif ( $dpkg =~ /(\d+)\.(\d+)\.(\d+)-(\d+)lenny(\d+)/ )
{
# Debian Lenny
@installed_version = ($1, $2, $3, $4, $5, 0);
}
elsif ( $dpkg =~ / (\d+)\.(\d+)\.(\d+)-(\d+)/ )
{
# Debian Lenny
@installed_version = ($1, $2, $3, $4, 0, 0);
}
else
{
print "UNKNOWN - Could not determine installed version.\n";
exit $UNKN;
}
# Calculate sums for easy comparison
my $running_version_sum = sprintf("%02d%02d%02d%02d%02d%02d", @running_version);
my $installed_version_sum = sprintf("%02d%02d%02d%02d%02d%02d", @installed_version);
# And some readable format
my $print_running_version = sprintf("%d.%d.%d-%d.%d.%d", @running_version);
my $print_installed_version = sprintf("%d.%d.%d-%d.%d.%d", @installed_version);
# Do we need a reboot?
if ( $running_version_sum < $installed_version_sum )
{
print "WARNING - Reboot required : running kernel = $print_running_version, installed kernel = $print_installed_version\n";
exit $WARN;
}
else
{
print "OK - running kernel = $print_running_version, installed kernel = $print_installed_version\n";
exit $OK;
}
|