Blame scripts/services/puppet

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