diff --git a/check_kernel b/check_kernel index 78255f7..2b481f1 100755 --- a/check_kernel +++ b/check_kernel @@ -32,13 +32,14 @@ CRITICAL=2; UNKNOWN=3; get_offset() { - local file needle + local file needle offset file="$1" needle="$2" + offset="${3:-0}" perl -e ' undef $/; - $i = index(<>, "'"$needle"'"); + $i = index(<>, "'"$needle"'", '$offset'); if ($i < 0) { exit 1; }; @@ -125,7 +126,9 @@ get_image_linux() { GZHDR1="\x1f\x8b\x08\x00" GZHDR2="\x1f\x8b\x08\x08" - LZHDR="\x00\x00\x00\x02\xff" + #LZHDR="\x00\x00\x00\x02\xff" + LZHDR="\x5d\x00\x00" + XZHDR="\xfd7zXZ\x00" off=`get_offset "$image" $GZHDR1` [ "$?" != "0" ] && off="-1" @@ -143,8 +146,20 @@ get_image_linux() { off=`get_offset "$image" $LZHDR` [ "$?" != "0" ] && off="-1" + while [ -n "$off" -a "$off" -ne "-1" ] ; do + out="$((dd ibs="$off" skip=1 count=0 && dd bs=512k) < "$image" 2>/dev/null | lzcat 2>/dev/null)" + if [ -n "$out" ] ; then + echo "$out" + return + fi + off=`get_offset "$image" $LZHDR $[off+1]` + [ "$?" != "0" ] && off="-1" + done + + off=`get_offset "$image" $XZHDR` + [ "$?" != "0" ] && off="-1" if [ "$off" -ne "-1" ]; then - (dd ibs="$[off-1]" skip=1 count=0 && dd bs=512k) < "$image" 2>/dev/null | lzcat 2>/dev/null + (dd ibs="$off" skip=1 count=0 && dd bs=512k) < "$image" 2>/dev/null | xzcat 2> /dev/null return fi @@ -154,12 +169,19 @@ get_image_linux() { searched="" for on_disk in \ + "/boot/vmlinuz-linux"\ + "/boot/vmlinuz26"\ + "/boot/vmlinuz26-lts"\ "/boot/vmlinuz-`uname -r`"\ "/boot/vmlinux-`uname -r`"\ "/boot/kfreebsd-`uname -r`.gz"; do if [ -e "$on_disk" ]; then if [ "${on_disk/vmlinu}" != "$on_disk" ]; then + if uname -a | grep Ubuntu 1> /dev/null; then + on_disk_version="`get_image_linux "$on_disk" | strings | grep 'Linux version' | head -n1|sed -e 's/ ([^(]*)$//'`" + [ -z "$on_disk_version" ] || break + fi on_disk_version="`get_image_linux "$on_disk" | strings | grep 'Linux version' | head -n1`" [ -z "$on_disk_version" ] || break on_disk_version="`cat "$on_disk" | strings | grep 'Linux version' | head -n1`" @@ -183,7 +205,7 @@ if [ "$(uname -s)" = "Linux" ]; then running_version="`cat /proc/version`" if [ -z "$running_version" ] ; then echo "UNKNOWN: Failed to get a version string from running system" - exit $UNKNOWN + #exit $UNKNOWN fi if [ "$running_version" != "$on_disk_version" ]; then