From 4c3f7fa3c66c197fb560bb3261fdc8f7a46dda21 Mon Sep 17 00:00:00 2001 From: Heikki Levanto Date: Wed, 26 Feb 2014 16:06:42 +0100 Subject: [PATCH] towards checking all machines not just debian --- aptcheck/aptcheck.pl | 82 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/aptcheck/aptcheck.pl b/aptcheck/aptcheck.pl index 3121946..627eb2a 100755 --- a/aptcheck/aptcheck.pl +++ b/aptcheck/aptcheck.pl @@ -27,6 +27,14 @@ # and architectures at the same time. Gets only the highest version from # all, and reports anything less than this. Good enough for now. # +# TODO: Check CentOs systems too +# Need a check_rpm plugin, and nagios checks defined on the CentOs machines, +# then we can grep for that check in nagios configs, and find rpm machines +# that way. Or, check all machines listed in nagios, determine what they +# run, and use proper commands to check for packages. +# +# TODO: Summary section for hosts that have too old updates still pending +# - those that are marked with (!) #### Init use strict; @@ -52,12 +60,13 @@ my %hostcomments = ( # Nagios knows most of our hosts. It even knows which are worth # checking, they have a command to check apts! print "Getting hostlist from nagios\n" if $debug; -my $hostlist1 = `ssh nagios grep -l Apt /etc/nagios3/indexdata-conf.d/*.cfg` +my $hostlist1 = `ssh nagios grep -l \\"define host\\" /etc/nagios3/indexdata-conf.d/*.cfg` or die "Could not get host list from nagios (dk)"; print "Getting hostlist from nagios-us\n" if $debug; -my $hostlist2 = `ssh nagios-us grep -l Apt /etc/nagios3/indexdata-conf.d/*.cfg` - or die "Could not get host list from nagios (dk)"; +#my $hostlist2 = `ssh nagios-us grep -l Apt /etc/nagios3/indexdata-conf.d/*.cfg` +my $hostlist2 = `ssh nagios-us grep -l \\"define host\\" /etc/nagios3/indexdata-conf.d/*.cfg` + or die "Could not get host list from nagios (us)"; my $hostlist = $hostlist1 . $hostlist2; print "Got list:\n$hostlist\n" if $debug>2; @@ -152,25 +161,42 @@ if ( -f $datefilename ) { my $table = "\n"; -#for my $hline ( split("\n",$hostlist) ) { +HOSTLOOP: for my $hline ( sort( split("\n",$hostlist) ) ) { next unless ( $hline =~ /\/([a-z0-9-]+)\.cfg$/ ); my $H = $1; + print "Checking $H\n" if $debug; + next if ($H =~ /^xdummy/ ); next if ($H =~ /^commands/ ); + next if ($H =~ /^contacts/ ); next if ($H =~ /^servicegroups/ ); - print "Checking $H\n" if $debug; + next if ($H =~ /^hostgroups/ ); + next if ($H =~ /^host-/ ); + last if ($H =~/cookie/) && $debug; $allhosts{$H}=1; + my $cmd = + "if test -f /etc/debian_version; " . + "then " . + " cat /etc/debian_version; " . + " apt-cache -q policy " . join(" ",sort(keys(%restrpkgs))) .";" . + " apt-get upgrade -s -o 'Debug::NoLocking=true'; " . + "else " . + " cat /etc/redhat-release; " . + # " yum check-update -q; ". + " echo done ;". # to be sure we have one "real" line + "fi " ; + my $cmd0 = "cat /etc/debian_version"; my $cmd1 = "apt-cache -q policy " . join(" ",sort(keys(%restrpkgs))); my $cmd2 = "apt-get upgrade -s -o 'Debug::NoLocking=true' "; # Note, do not append -qq, we want some output even when nothing to do - print "ssh -q $H \"$cmd0; $cmd1 ; $cmd2 \" 2>/dev/null \n" if ($debug>1); - my $apt = `ssh -q $H "$cmd0; $cmd1 ; $cmd2 " 2>/dev/null`; + print "ssh -q $H \"$cmd\" 2>/dev/null \n" if ($debug>1); + my $apt = `ssh -q $H "$cmd" 2>/dev/null`; if ( !$apt ) { $table .= "\n"; - $table .= "\n"; $skiphosts{$H}=1; - next; + next HOSTLOOP; } print "Got apts for $H: \n$apt\n" if $debug>2; my $det = ""; # detail lines @@ -181,17 +207,32 @@ for my $hline ( sort( split("\n",$hostlist) ) ) { my $restrname = ""; my $restrinst = ""; my $restrcand = ""; - my $debver = 0; + my $versionseen = 0; + my $is_debian = 0; for my $p ( split("\n",$apt) ) { - if ( !$debver ) { # first line - $debver = 1; - $p =~ s/(5[0-9.]+)/$1 LENNY !!!/; - $p =~ s/(6[0-9.]+)/$1 squeeze/; - $p =~ s/(7[0-9.]+)/$1 wheezy/; - $p = " Debian $p"; - $debversions{$H} = $p; - print "Deb version for $H is $p\n" if ($debug>1); - next; + if ( !$versionseen ) { # first line + $versionseen = 1; + if ( $p =~ /Centos/i ) { + print "CentOs version for $H is $p\n" if ($debug>1); + $debversions{$H} = $p; + } else { # must be Debian + $p =~ s/(5[0-9.]+)/$1 LENNY !!!/; + $p =~ s/(6[0-9.]+)/$1 squeeze/; + $p =~ s/(7[0-9.]+)/$1 wheezy/; + $p = " Debian $p"; + $debversions{$H} = $p; + $is_debian = 1; + print "Deb version for $H is $p\n" if ($debug>1); + } + next; + } + if ( ! $is_debian ) { + $table .= "\n"; + $table .= "\n"; + $table .= "\n"; + $skiphosts{$H}=1; + next HOSTLOOP; } # parse apt-cache output $restrname = $1 if $p =~ /^(\S+):$/; @@ -311,7 +352,6 @@ for my $hline ( sort( split("\n",$hostlist) ) ) { if ( $hostcomments{$H} ); $table .= $det if $pkgs; print "\n$table\n" if $debug>2; - last if $H =~/diane/ && $debug; } $table .= "
 
$H (skipped)\n"; + $table .= "
$H (skipped)
 
$H (skipped)
Looks like Centos, " . + "not yet implemented
\n"; @@ -336,7 +376,7 @@ open F, ">$outfile" print F "\n"; print F "Apt upgrade status\n"; print F "\n"; -print F "

Apt package status

\n"; +print F "

Package status

\n"; print F "" . ( $sectot + $owntot + $mantot + $normtot ) . " packages pending ($sectot critical) \n"; -- 1.7.10.4