my %normpkgs;
my %okhosts;
my %skiphosts;
+my %allhosts;
my $sectot = 0;
my $owntot = 0;
my $normtot = 0;
next if ($H =~ /^commands/ );
next if ($H =~ /^servicegroups/ );
print "Checking $H\n" if $debug;
+ $allhosts{$H}=1;
my $apt = `ssh $H apt-get upgrade -s -o 'Debug::NoLocking=true' `;
# Note, do not append -qq, we want some output even when nothing to do
if ( !$apt ) {
$pkgs++;
my $key = $pkg;
if ( $src =~ /Security/ ) {
- $det .= "<b>$pkg</b>";
- $key = "<b>$pkg</b>";
+ $det .= "<b>$pkg (s)</b> ";
$sechosts{$H}=1;
$secpkgs{$pkg}=1;
$secs++;
$sectot++;
} elsif ( $src =~ /Indexdata/ ) {
- $det .= "<b><i>$pkg</i></b>";
- $key = "<i>$pkg</i>";
+ $det .= "<i><b>$pkg</b> (id) </i>";
$ownhosts{$H}=1;
$ownpkgs{$pkg}=1;
$own++;
$owntot++;
} else {
- $det .= "$pkg";
+ $det .= "$pkg ";
$normhosts{$H}=1;
$normpkgs{$pkg}=1;
$normtot++;
if ( !$summary{$key} ) {
$summary{$key} = "";
}
+ $summary{$key} .= "$H ";
$new = strdiff($cur,$new);
$cur = strdiff($new,$cur);
- $summary{$key} .= "$H ";
$det .= "</td> ";
$det .= "<td>$cur</td> ";
$det .= "<td>$new</td> ";
$table .= " $own from indexdata " if $own;
} else {
$table .= "ok";
+ $okhosts{$H} = 1;
}
my $updlink = $wikilink . ucfirst($H) . "Updates" . $year;
+ # Fix some pages that do not follow the convention.
+ # Mostly because the host names would not make proper WikiWords
+ $updlink =~ s/Bugzilla3Updates/BugzillaUpdates/;
+ $updlink =~ s/Opencontent-solrUpdates/OpenContentSolrUpdates/;
$table .= " <a href='$updlink' >Upd</a>";
$table .= "</td></tr>\n";
$table .= $det if $pkgs;
}
$table .= "</table>\n";
-# Produce page
+# Page header
my $outfile = "/tmp/aptcheck.html";
open F, ">$outfile"
or die "Could not open $outfile for writing: $!";
print F "<H1>Apt package status</H1>\n";
-# Summary table
+# Summary table: one row for per host group
+print F "<p/>\n";
print F "<table border='1' >\n";
print F "<tr><td> </td>" ;
-print F "<td><b>Security</b><br/>" . scalar(keys(%sechosts)) .
- " / " . scalar(keys(%secpkgs)) . " / $sectot </td>\n" ;
-print F "<td>Indexdata<br/>" . scalar(keys(%ownhosts)) .
- " / " . scalar(keys(%ownpkgs)) . " / $owntot </td>\n" ;
-print F "<td>Normal<br/>" . scalar(keys(%normhosts)) .
- " / " . scalar(keys(%normpkgs)) . " / $normtot </td>" . "</tr>\n";
-print F "<tr><td>Hosts</td>\n";
-
-
-print F "<td>";
-for $HH ( sort(keys(%sechosts)) ) {
- print F "<a href='#$HH'><b>$HH</b></a> ";
+print F "<td><b>Hosts</b></td>\n";
+print F "<td><b>Packages</b></td></tr>\n";
+
+if ( $sectot ) {
+ print F "<tr><td><b>Security</b><br/>" . scalar(keys(%sechosts)) .
+ " / " . scalar(keys(%secpkgs)) . " / $sectot </td>\n" ;
+ print F "<td>";
+ for $HH ( sort(keys(%sechosts)) ) {
+ print F "<a href='#$HH'><b>$HH</b></a> ";
+ }
+ print F "</td>";
+ print F "<td>";
+ for $PP ( sort(keys(%secpkgs)) ) {
+ print F "<a href='#$PP'>$PP</a> ";
+ }
+ print F "</td>";
+ print F "</tr>\n";
}
-print F " </td>\n";
-#print F "<td><b>" . join(" ",sort(keys(%sechosts))) . "</b> </td>";
-#print F "<td><b>" . join(" ",sort(keys(%ownhosts))) . "</b> </td>";
-print F "<td>";
-for $HH ( sort(keys(%ownhosts)) ) {
- print F "<a href='#$HH'><b>$HH</b></a> ";
+if ( $owntot ) {
+ print F "<tr><td><b>Indexdata</b><br/>" . scalar(keys(%ownhosts)) .
+ " / " . scalar(keys(%ownpkgs)) . " / $owntot </td>\n" ;
+ print F "<td>";
+ for $HH ( sort(keys(%ownhosts)) ) {
+ print F "<a href='#$HH'><b>$HH</b></a> ";
+ }
+ print F "</td>";
+ print F "<td>";
+ for $PP ( sort(keys(%ownpkgs)) ) {
+ print F "<a href='#$PP'>$PP</a> ";
+ }
+ print F "</td>";
+ print F "</tr>\n";
}
-print F " </td>\n";
-#print F "<td><b>" . join(" ",sort(keys(%normhosts))) . "</b> </td></tr>\n";
-print F "<td>";
-for $HH ( sort(keys(%normhosts)) ) {
- print F "<a href='#$HH'><b>$HH</b></a> ";
+if ( $normtot ) {
+ print F "<tr><td>Normal<br/>" . scalar(keys(%normhosts)) .
+ " / " . scalar(keys(%normpkgs)) . " / $normtot </td>\n" ;
+ print F "<td>";
+ for $HH ( sort(keys(%normhosts)) ) {
+ print F "<a href='#$HH'><b>$HH</b></a> ";
+ }
+ print F "</td>";
+ print F "<td>";
+ for $PP ( sort(keys(%normpkgs)) ) {
+ print F "<a href='#$PP'>$PP</a> ";
+ }
+ print F "</td>";
+ print F "</tr>\n";
+}
+if ( %skiphosts ) {
+ print F "<tr><td>Skipped " . scalar(keys(%skiphosts)) . "</td>\n";
+ print F "<td colspan='2'>";
+ for $HH ( sort(keys(%skiphosts)) ) {
+ print F "<a href='#$HH'><b>$HH</b></a> ";
+ }
+ print F "</td></tr>\n";
+}
+if ( %okhosts ) {
+ print F "<tr><td>Ok " . scalar(keys(%okhosts)) . "</td>\n";
+ print F "<td colspan='2'>";
+ for $HH ( sort(keys(%okhosts)) ) {
+ print F "<a href='#$HH'><b>$HH</b></a> ";
+ }
+ print F "</td></tr>\n";
}
-print F " </td>\n";
-
-print F "<tr><td>Packages</td>\n";
-print F "<td>" . join(" ",sort(keys(%secpkgs))) . " </td>";
-print F "<td>" . join(" ",sort(keys(%ownpkgs))) . " </td>";
-print F "<td>" . join(" ",sort(keys(%normpkgs))) . " </td></tr>\n";
print F "</table>\n";
+
+# The host table
print F $table;
+# Package table
+print F "<p/><b><u>Packages</u></b>\n";
+print F "<table>\n";
+for $P ( sort(keys(%summary)) ) {
+ my $PN = $P;
+ $PN = "<b>$P (s)</b>" if ($secpkgs{$P});
+ $PN = "$P (id)" if ($ownpkgs{$P});
+ print F "<tr><td><a name='$P'/>$PN</td>\n";
+ print F "<td>";
+ for $HH ( split(' ',$summary{$P} )) {
+ print F "<a href=#$HH>$HH</a> ";
+ }
+ print F "</td>\n";
+
+}
+print F "</table>\n";
+
print F "<p/>Produced " . `date`.
" on " . `hostname` . " by " . `whoami` .
"<br/>\n";
system "scp -q $outfile nagios:/var/www/heikki/index.html";
+exit(0);
+
# Helper to take two strings and highligt that part of the second
# that is different from the first.
sub strdiff {
my $x = shift;
my $y = shift;
print "strdiff: '$x' '$y' \n" if $debug>1;
+ if ( $x eq $y ) {
+ return "$x <b>??</b>";
+ }
my $a = 0;
while ( $a < length($y) &&
substr($x,$a,1) eq substr($y,$a,1) ) {
$a++;
}
if ( $a == length($y) ) {
- return "$y ???";
+ return "$y ??";
}
my $b = 1;
while ( $b < length($y)-$a &&