|
Packit |
57988d |
#!/usr/bin/perl
|
|
Packit |
57988d |
##########################################################################
|
|
Packit |
57988d |
# $Id$
|
|
Packit |
57988d |
##########################################################################
|
|
Packit |
57988d |
# $Log$
|
|
Packit |
57988d |
########################################################
|
|
Packit |
57988d |
## Copyright (c) 2011 Nathan Crawford
|
|
Packit |
57988d |
## Covered under the included MIT/X-Consortium License:
|
|
Packit |
57988d |
## http://www.opensource.org/licenses/mit-license.php
|
|
Packit |
57988d |
## All modifications and contributions by other persons to
|
|
Packit |
57988d |
## this script are assumed to have been donated to the
|
|
Packit |
57988d |
## Logwatch project and thus assume the above copyright
|
|
Packit |
57988d |
## and licensing terms. If you want to make contributions
|
|
Packit |
57988d |
## under your own copyright or a different license this
|
|
Packit |
57988d |
## must be explicitly stated in the contribution and the
|
|
Packit |
57988d |
## Logwatch project reserves the right to not accept such
|
|
Packit |
57988d |
## contributions. If you have made significant
|
|
Packit |
57988d |
## contributions to this script and want to claim
|
|
Packit |
57988d |
## copyright please contact logwatch-devel@logwatch.org.
|
|
Packit |
57988d |
#########################################################
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# Detail level
|
|
Packit |
57988d |
$Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# Config
|
|
Packit |
57988d |
my $offline = $ENV{'puppet_offline_ok'};
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# Init counters
|
|
Packit |
57988d |
$FailedRuns = 0;
|
|
Packit |
57988d |
$SuccessfulRuns = 0;
|
|
Packit |
57988d |
$ResourceFailures = 0;
|
|
Packit |
57988d |
$DependencyFailures = 0;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
while (defined($ThisLine = <STDIN>)) {
|
|
Packit |
57988d |
chomp($ThisLine);
|
|
Packit |
57988d |
if (
|
|
Packit |
57988d |
($ThisLine =~ /Using cached catalog/) or
|
|
Packit |
57988d |
($ThisLine =~ /Caching catalog for /) or
|
|
Packit |
57988d |
($ThisLine =~ /Caching node for /) or
|
|
Packit |
57988d |
($ThisLine =~ /Caught TERM; calling stop/) or
|
|
Packit |
57988d |
($ThisLine =~ /[sS]hutting down/) or
|
|
Packit |
57988d |
($ThisLine =~ /Reopening log files/) or
|
|
Packit |
57988d |
($ThisLine =~ /Starting Puppet client version /) or
|
|
Packit |
57988d |
($ThisLine =~ /Restarting with.+puppetd/) or
|
|
Packit |
57988d |
($ThisLine =~ /Caught HUP; calling restart/) or
|
|
Packit |
57988d |
($ThisLine =~ /Skipping because of failed dependencies/) or
|
|
Packit |
57988d |
($ThisLine =~ /Failed to generate additional resources/) or
|
|
Packit |
57988d |
($ThisLine =~ /Could not evaluate: getaddrinfo: Name or service not known/) or
|
|
Packit |
57988d |
($ThisLine =~ /replacing from source .+ with contents /) or
|
|
Packit |
57988d |
($ThisLine =~ /Starting catalog run/) or
|
|
Packit |
57988d |
($ThisLine =~ /Applying configuration version/) or
|
|
Packit |
57988d |
($ThisLine =~ /Loading facts in/) or
|
|
Packit |
57988d |
($ThisLine =~ /Retrieving plugin/) or
|
|
Packit |
57988d |
($ThisLine =~ /FileBucket adding/) or
|
|
Packit |
57988d |
($ThisLine =~ /^Caching certificate/) or
|
|
Packit |
57988d |
($ThisLine =~ /^Certificate Request fingerprint/) or
|
|
Packit |
57988d |
($ThisLine =~ /^Creating state file/) or
|
|
Packit |
57988d |
($ThisLine =~ /Provider useradd does not support features manages/)
|
|
Packit |
57988d |
) {
|
|
Packit |
57988d |
# Ignore
|
|
Packit |
57988d |
} elsif (($junk, $failure, $reason) = ($ThisLine =~ /^(\(.*\) |)Could not ([^:]*): (.*)/)) {
|
|
Packit |
57988d |
if ($reason == "getaddrinfo: Name or service not known" && $offline) {
|
|
Packit |
57988d |
$FailedRuns--;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
$Failures{$failure}->{$reason}++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Finished catalog run in [0-9]+\.[0-9]+ seconds/) {
|
|
Packit |
57988d |
$SuccessfulRuns++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /skipping run/) {
|
|
Packit |
57988d |
$FailedRuns++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /(Did not receive certificate)/) {
|
|
Packit |
57988d |
$Errors{$1}++;
|
|
Packit |
57988d |
} elsif (($file) = $ThisLine =~ /Reparsing (.*)/) {
|
|
Packit |
57988d |
$Reparsed{$file}++;
|
|
Packit |
57988d |
} elsif (($fileinfo) = ($ThisLine =~ /Filebucketed (.*)/)) {
|
|
Packit |
57988d |
$FileBucketed{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Dependency .+\[.+\] has ([0-9]+ |)failure/) {
|
|
Packit |
57988d |
$DependencyFailures++;
|
|
Packit |
57988d |
} elsif (
|
|
Packit |
57988d |
($ThisLine =~ /Failed to retrieve current state of resource/) or
|
|
Packit |
57988d |
($ThisLine =~ /Package.+ensure.+Could not find package/) or
|
|
Packit |
57988d |
($ThisLine =~ /File\[.+\].+ Could not describe /) or
|
|
Packit |
57988d |
($ThisLine =~ /File\[.+\].+ No specified sources exist/)
|
|
Packit |
57988d |
) {
|
|
Packit |
57988d |
$ResourceFailures++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Package\[(.+)\].+ensure changed/) {
|
|
Packit |
57988d |
$ChangedPackages{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Package\[(.+)\].+ensure\) created/) {
|
|
Packit |
57988d |
$InstalledPackages{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Package\[(.+)\].+ensure\) removed/) {
|
|
Packit |
57988d |
$RemovedPackages{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Exec\[(.+)\].+executed successfully/) {
|
|
Packit |
57988d |
$ExecRuns{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Exec\[(.+)\].+Trigger(?:ing|ed) 'refresh' from [0-9]+ (?:dependencies|events)/) {
|
|
Packit |
57988d |
$ExecRuns{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Exec\[(.+)\].+Triggered 'refresh' from [0-9]+ events/) {
|
|
Packit |
57988d |
$ExecRuns{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Service\[(.+)\].+ensure changed \'.+\' to \'running\'/) {
|
|
Packit |
57988d |
$ServiceStarts{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Service\[(.+)\].+Trigger(?:ing|ed) 'refresh' from [0-9]+ (?:dependencies|events)/) {
|
|
Packit |
57988d |
$ServiceStarts{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Service\[(.+)\].+Triggered 'refresh' from [0-9]+ events/) {
|
|
Packit |
57988d |
$ServiceStarts{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /Service\[(.+)\].+ensure changed \'.+\' to \'stopped\'/) {
|
|
Packit |
57988d |
$ServiceStops{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /User\[(.+)\].+changed password/) {
|
|
Packit |
57988d |
$PasswordChanged{$1}++;
|
|
Packit |
57988d |
} elsif ($ThisLine =~ /User\[(.+)\].+defined \'expiry\' as \'([0-9-]{10})\'/) {
|
|
Packit |
57988d |
$ExpiryChanged{$1}{$2}++;
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# Generic rules need to be last
|
|
Packit |
57988d |
} elsif (($type, $name, $attr) = $ThisLine =~ /([^\/]+)\[([^\]]+)\]\/([^\/]+)\) (created|defined content)/) {
|
|
Packit |
57988d |
$Created{$type}->{$name}++;
|
|
Packit |
57988d |
} elsif (($type, $name, $attr) = $ThisLine =~ /([^\/]+)\[([^\]]+)\]\/([^\/]+)\) removed/) {
|
|
Packit |
57988d |
$Removed{$type}->{$name}++;
|
|
Packit |
57988d |
} elsif (($type, $name, $attr, $from, $to) = $ThisLine =~ /([^\/]+)\[([^\]]+)\]\/([^\/]+)\) .+ changed '(.*)' to '(.*)/) {
|
|
Packit |
57988d |
if ($attr eq 'content' or $attr eq 'checksum') {
|
|
Packit |
57988d |
# Only count these types of changes
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{$attr}++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
# Get details for all other types of changes
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{$attr}->{'from'} = $from;
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{$attr}->{'to'} = $to;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} elsif (($type, $name, $attr, $from) = $ThisLine =~ /([^\/]+)\[([^\]]+)\]\/([^\/]+)\) undefined '.+' from '(.*)'/) {
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{$attr}->{'from'} = $from;
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{$attr}->{'to'} = 'undefined';
|
|
Packit |
57988d |
} elsif (($type, $name, $content) = $ThisLine =~ /([^\/]+)\[([^\]]+)\]\/content\)(.*)/) {
|
|
Packit |
57988d |
$content =~ s/#011/\t/g;
|
|
Packit |
57988d |
$content =~ s/#012/\n /g or $content .= "\n ";
|
|
Packit |
57988d |
$Changed{$type}->{$name}->{'contents'} .= $content;
|
|
Packit |
57988d |
} elsif (($source, $target) = $ThisLine =~ /^\(\/(.*)\) Scheduling refresh of (.*)/) {
|
|
Packit |
57988d |
$ScheduledRefresh{"$source -> $target"}++;
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
# Report any unmatched entries...
|
|
Packit |
57988d |
$OtherList{$ThisLine}++;
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
#######################################
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($SuccessfulRuns > 0 && $Detail > 0) {
|
|
Packit |
57988d |
print "\nSuccessful runs: $SuccessfulRuns\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($FailedRuns > 0) {
|
|
Packit |
57988d |
print "\nFailed runs: $FailedRuns\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Errors) {
|
|
Packit |
57988d |
print "\nERRORS:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %Errors) {
|
|
Packit |
57988d |
print " $ThisOne: $Errors{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach $failure (sort(keys %Failures)) {
|
|
Packit |
57988d |
print "\nERROR: Could not $failure:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %{$Failures{$failure}}) {
|
|
Packit |
57988d |
print " $ThisOne: $Failures{$failure}->{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($ResourceFailures > 0) {
|
|
Packit |
57988d |
print "\nResource failures: $ResourceFailures\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if ($DependencyFailures > 0) {
|
|
Packit |
57988d |
print "\nDependency failures: $DependencyFailures\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %Reparsed) {
|
|
Packit |
57988d |
print "\nReparsed:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %Reparsed) {
|
|
Packit |
57988d |
print " $ThisOne: $Reparsed{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %FileBucketed and $Detail >= 5) {
|
|
Packit |
57988d |
print "\nFileBucketed files:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %FileBucketed) {
|
|
Packit |
57988d |
print " $ThisOne\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %InstalledPackages) {
|
|
Packit |
57988d |
print "\nInstalled packages:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %InstalledPackages) {
|
|
Packit |
57988d |
print " $ThisOne: $InstalledPackages{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ChangedPackages) {
|
|
Packit |
57988d |
print "\nChanged packages:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ChangedPackages) {
|
|
Packit |
57988d |
print " $ThisOne: $ChangedPackages{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %RemovedPackages) {
|
|
Packit |
57988d |
print "\nRemoved packages:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %RemovedPackages) {
|
|
Packit |
57988d |
print " $ThisOne: $RemovedPackages{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ExecRuns) {
|
|
Packit |
57988d |
print "\nExec runs:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ExecRuns) {
|
|
Packit |
57988d |
print " $ThisOne: $ExecRuns{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ServiceStarts) {
|
|
Packit |
57988d |
print "\nService starts:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ServiceStarts) {
|
|
Packit |
57988d |
print " $ThisOne: $ServiceStarts{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ServiceStops) {
|
|
Packit |
57988d |
print "\nService stops:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ServiceStops) {
|
|
Packit |
57988d |
print " $ThisOne: $ServiceStops{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %PasswordChanged) {
|
|
Packit |
57988d |
print "\nPassword changed:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %PasswordChanged) {
|
|
Packit |
57988d |
print " $ThisOne: $PasswordChanged{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ExpiryChanged) {
|
|
Packit |
57988d |
print "\nExpiry changed:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ExpiryChanged) {
|
|
Packit |
57988d |
print " $ThisOne:\n";
|
|
Packit |
57988d |
foreach $date (keys %{${ExpiryChanged}{$ThisOne}}) {
|
|
Packit |
57988d |
print " $date: $ExpiryChanged{$ThisOne}{$date} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach $Type (sort(keys %Created)) {
|
|
Packit |
57988d |
print "\n$Type created:\n";
|
|
Packit |
57988d |
foreach $Name (sort(keys %{$Created{$Type}})) {
|
|
Packit |
57988d |
print " $Name: $Created{$Type}->{$Name} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach $Type (sort(keys %Changed)) {
|
|
Packit |
57988d |
print "\n$Type changed:\n";
|
|
Packit |
57988d |
foreach $Name (sort(keys %{$Changed{$Type}})) {
|
|
Packit |
57988d |
print " $Name:\n";
|
|
Packit |
57988d |
foreach $Attr (sort(keys %{$Changed{$Type}->{$Name}})) {
|
|
Packit |
57988d |
if ($Attr eq 'contents') {
|
|
Packit |
57988d |
if ($Detail >= 3) {
|
|
Packit |
57988d |
print " $Attr:";
|
|
Packit |
57988d |
print "$Changed{$Type}->{$Name}->{$Attr}\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
print " $Attr: ";
|
|
Packit |
57988d |
if (defined($Changed{$Type}->{$Name}->{$Attr}->{'from'})) {
|
|
Packit |
57988d |
print "from '$Changed{$Type}->{$Name}->{$Attr}->{from}' to '$Changed{$Type}->{$Name}->{$Attr}->{to}'\n";
|
|
Packit |
57988d |
} else {
|
|
Packit |
57988d |
print "$Changed{$Type}->{$Name}->{$Attr} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
foreach $Type (sort(keys %Removed)) {
|
|
Packit |
57988d |
print "\n$Type removed:\n";
|
|
Packit |
57988d |
foreach $Name (sort(keys %{$Removed{$Type}})) {
|
|
Packit |
57988d |
print " $Name: $Removed{$Type}->{$Name} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %ScheduledRefresh) {
|
|
Packit |
57988d |
print "\nScheduled refresh:\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %ScheduledRefresh) {
|
|
Packit |
57988d |
print " $ThisOne: $ScheduledRefresh{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
if (keys %OtherList) {
|
|
Packit |
57988d |
print "\n**Unmatched Entries**\n";
|
|
Packit |
57988d |
foreach $ThisOne (keys %OtherList) {
|
|
Packit |
57988d |
print " $ThisOne: $OtherList{$ThisOne} Time(s)\n";
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
}
|
|
Packit |
57988d |
|
|
Packit |
57988d |
exit(0);
|
|
Packit |
57988d |
|
|
Packit |
57988d |
# vi: shiftwidth=3 tabstop=3 syntax=perl et
|
|
Packit |
57988d |
|