#!/usr/bin/perl =begin ------------------------------------------------------------------------- searches cron.log entries for errors -> admin email; only looks for current date which is in yyyy-mm-dd format so uses DateTime::Format::MySQL for simplicity =cut --------------------------------------------------------------------------- use Getopt::Std; getopts('t'); # days, testing, query output our($opt_t); # warn $opt_t; exit; use strict; use warnings; my $JUST_TESTING = $opt_t || 0; # dumps result to console - no email ################################################################################ my @recipients = qw( raj ); my $src = '/home/raj/crons/cron.log'; ################################################################################ use lib '/home/raj/perl5/lib/perl5'; use IO::All; use DateTime; use Data::Printer; use DateTime::Format::MySQL; use FindBin qw($Bin); # warn $Bin; use lib "$Bin/../../../lib"; use LIMS::Local::ScriptHelpers; my $tools = LIMS::Local::ScriptHelpers->new(); $tools->test_only($JUST_TESTING); my @log = io($src)->slurp; # warn Dumper \@log; my $subject = 'CRON LOG ERROR'; my $today = DateTime->today; my @errors; # reverse so most recent entry 1st: ROW: for (reverse @log) { my ($date) = $_ =~ /\[(\d{4}-\d{2}-\d{2}) \d{2}\:\d{2}\:\d{2}\]/; # warn $date; unless ($date) { # will be error push @errors, $_; # retains new-line marker next ROW; } my $dt = DateTime::Format::MySQL->parse_date($date); # delta_days() returns zero for current date, otherwise positive integer: last ROW if $dt->delta_days($today)->delta_days; } if ( @errors ) { $subject .= 'S' if @errors > 1; my %args = ( subject => '***' . $subject . '***', msg => join '', reverse @errors, # revert to cronological order ); $JUST_TESTING ? p %args : $tools->mail_admin(\%args); }