| Listing 1 errreporter script 
: # -*- perl -*-
eval "exec perl -S $0 $*"
if $running_under_some_shell;
#=====================================================================
# errreporter - mails interesting entries from the AIX error log
#=====================================================================
use strict;
use File::Basename;
use Getopt::Std;
# declare vars in the conf file ...
my ($email, @ignore);
# declare some other vars used below ...
my ($identifier, $timestamp, $resource, $description, @error);
my $me = basename($0);
chomp (my $hostname = `/usr/bin/hostname`);
my @usage_string = <<ENDOFUSAGESTRING;
Usage: $me [-hul] [-f file]
Run "$me -h" for additional information.
ENDOFUSAGESTRING
my %opts;
getopts('hulf:', \%opts) or die @usage_string;
if ($opts{h} || $opts{u})  { exec "perldoc $0" };
if ($opts{l})              { exec '/usr/bin/errpt', '-t'
                               or die "$me: couldn't exec 'errpt -t'\n" };  
my $conf = $opts{f} || "/etc/errreporter.conf";
eval `/usr/bin/cat $conf 2> /dev/null` 
  or die "$me: couldn't read specified conf file $conf\n";
unless (defined ($email)) { die "$me: email not defined " }
# add the errpt header line to the ignore list ...
push (@ignore, "IDENTIFIER");
# get the current time, in the form used by the errpt command ...
my $starttime = sprintf '%02d%02d%02d%02d%02d',
  sub { $_[4]+1, $_[3], $_[2], $_[1], $_[5] % 100 } -> (localtime);
print STDOUT "$me: starting errreporter at $starttime, using conf file $conf.\n";
# open an errpt process, reading the summary of errors posted
# after the start time of this script ...
open (ERRPT, "/usr/bin/errpt -c -s $starttime |") or
  die "$me: couldn't open errpt for reading!\n";
# while the above process is open ...
while (<ERRPT>) {
    chomp;
    # split the errpt entry into fields ...
    ($identifier, $timestamp, undef, undef, $resource, $description) =
      split (/\s+/, $_, 6);
    my $ignore = 'no';
    foreach (@ignore) {
        # check to see if the entry is on the ignore list ...
        if ($identifier =~ /$_/) { $ignore = 'yes' ; last }
    };
    unless  ($ignore eq 'yes') {
        # store the full entry in the array @error ...
        @error = `/usr/bin/errpt -a -s $timestamp`;
        # add a subject line to the @error array ...
        unshift (@error, "Subject: $hostname -- $resource -- $description\n");
        #  and send the e-mail ...
        open (SENDMAIL, "|/usr/sbin/sendmail $email") or
          die "$me: couldn't open sendmail: $!";
        print SENDMAIL @error;
        close (SENDMAIL);
    };
};
#=====================================================================
=pod
=head1 NAME
errreporter - e-mails interesting entries from the AIX error log
=head1 SYNOPSIS
B<errreporter> [B<-h | -u>] 
B<errreporter> [B<-l>]
B<errreporter> B<-f> conffile
=head1 DESCRIPTION
I<errreporter> monitors the AIX error log, checks if new error entries 
are listed in a configurable "ignore" list, and e-mails the error in
detailed format to a specified address.
-head1 OPTIONS
=over 5
=item B<-h | -u>
Execs "perldoc" on the I<errreporter> program, displaying this documentation.
=item B<-l>
Execs "errpt -t", which displays the error template summaries.  This is useful
when creating the "ignore" list of errors that you don't want to receive e-mail for.
=item B<-f conffile>
Uses the specified file as the configuration file.  If this flag is not specified,
the default of I<"/etc/errreporter.conf"> is used.
=back
=head1 CONFIGURATION
I<errreporter> uses a configuration file for the setting of two options: the e-mail
address to mail errors to, and the list of errors that should be ignored.  Because
the configuration file is "sourced" by the I<errreporter> program, it must follow
proper perl syntax.  The two options are:
=over 5
=item B<$email = "you\@your.address";>
Set the variable $email to the the email address that will receive the error log
entries.  Don't forget to backslash the at-sign, and end the line with a semi-colon.
=item B<@ignore = ("IDENTIFIER1", "IDENTIFIER2", ...);>
Set the array variable @ignore to a comma-separated quoted list of error identifiers
that I<errreporter> should not send mail for. 
=back
=head1 AUTHOR
Sandor W. Sklar
ssklar@stanford.edu
=cut |