Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 70 additions & 75 deletions cronwrap/cronwrap
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#! /usr/local/system/perl/bin/perl -w
#!/usr/local/system/perl/bin/perl
use strict;
use warnings;

use Getopt::Std;
use Mail::Mailer;
Expand All @@ -10,58 +11,53 @@ use Mail::Mailer;
# -m address : mail to this address (default $LOGNAME)
# -v : do send mail - even when exist status signals success

my $logfile="cronwrap.log";
if (-e $logfile)
{
open STDOUT,">>$logfile";
open STDERR,">&STDOUT";
}
else
{
open STDOUT,">/dev/null";
open STDERR,">/dev/null";
my $logfile = "cronwrap.log";
if (-e $logfile) {
open STDOUT, ">>$logfile";
open STDERR, ">&STDOUT";
} else {
open STDOUT,">/dev/null";
open STDERR,">/dev/null";
}

my %opt;
getopts('m:t:l:v',\%opt);
my $cmd=join " ",@ARGV;
my $start_time=localtime;
my $hostname=`/bin/hostname`;
getopts('m:t:l:v', \%opt);
my $cmd = join " ", @ARGV;
my $start_time = localtime;
my $hostname = `/bin/hostname`;
chomp($hostname);

warn "+++ $$ $start_time $hostname $0 $cmd\n";

die "no command" if $cmd eq "";
#warn "environment:\n",map("\t$_ => $ENV{$_}\n",keys %ENV);
#warn "environment:\n", map("\t$_ => $ENV{$_}\n", keys %ENV);

my $tmpdir=$opt{'t'}||'.';
my $tmpout="$tmpdir/cronwrap.tmp.$$";
my $tmpdir = $opt{'t'} || '.';
my $tmpout = "$tmpdir/cronwrap.tmp.$$";
#warn "tempout : $tmpout\n";

END
{
$tmpout && -e $tmpout && unlink $tmpout;
END {
$tmpout && -e $tmpout && unlink $tmpout;
}

-e $tmpout && unlink $tmpout;

my $pid=fork;
my $pid = fork;
defined $pid or die "fork failed $!\n";
unless ($pid)
{
my $umask=umask 077;
open STDOUT,">$tmpout";
open STDERR,">&STDOUT";
umask $umask;
exec {'/bin/sh'} '-sh','-c',$cmd;
die "exec failed : $!\n";
unless ($pid) {
my $umask = umask 077;
open STDOUT, ">$tmpout";
open STDERR, ">&STDOUT";
umask $umask;
exec {'/bin/sh'} '-sh', '-c', $cmd;
die "exec failed : $!\n";
}
wait;
my $status=$?;
my $status = $?;

if ($tmpout && -e $tmpout && $opt{'l'}) {
if (open OUT, ">>$opt{'l'}") {
open T,"<$tmpout";
open T, "<$tmpout";
while (<T>) {
print OUT;
}
Expand All @@ -72,51 +68,50 @@ if ($tmpout && -e $tmpout && $opt{'l'}) {
}
}

if ($status || $opt{v})
{
my $subject = ($status ? 'FAIL: ':'')."$cmd";
my $to=$opt{'m'}||$ENV{'LOGNAME'}||"nobody";
my @to=split/,/,$to;
@to=map {/@/ ? $_ : "$_ <$_\@molgen.mpg.de>" } @to;
if ($status || $opt{v}) {
my $subject = ($status ? 'FAIL: ' : '') . "$cmd";
my $to = $opt{'m'} || $ENV{'LOGNAME'} || "nobody";
my @to = split /,/, $to;
@to = map {/@/ ? $_ : "$_ <$_\@molgen.mpg.de>" } @to;

my $mailer=new Mail::Mailer 'smtp',Server=>'harry.molgen.mpg.de';
$mailer->open
(
{
From => "\"cronwrap\@$hostname\" <postmaster\@molgen.mpg.de>",
To => \@to,
Subject => $subject,
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=utf-8',
}
);
my $mailer = Mail::Mailer->new(
'smtp',
Server => 'harry.molgen.mpg.de',
From => 'postmaster@molgen.mpg.de'
);
$mailer->open ({
From => "\"cronwrap\@$hostname\" <postmaster\@molgen.mpg.de>",
To => \@to,
Subject => $subject,
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=utf-8',
});

print $mailer "You cron command $cmd\n";
print $mailer " started $start_time on $hostname\n";
print $mailer " completed ".scalar(localtime)."\n";
print $mailer "You cron command $cmd\n";
print $mailer " started $start_time on $hostname\n";
print $mailer " completed " . scalar(localtime)."\n";

if ($status) {
print $mailer "It terminated with an exit value of ",
$status>>8," and a signal status of ",$status&255,"\n";
}
if (-s $tmpout) {
print $mailer "It produced the following output:\n\n";
print $mailer "-"x60,"\n";
open T,"<$tmpout";
while (<T>) {
$_ eq ".\n" and $_="..\n";
print $mailer $_;
}
print $mailer "-"x60,"\n\n";
close T;
} else {
print $mailer "It didn't produce any output.\n";
}
print $mailer "\n\nYours\n cronwrap.pl\n";
$mailer->close;
warn "--- $$ ",scalar(localtime),' ',"$hostname completion status: $status - mail sent to $to\n";
if ($status) {
print $mailer "It terminated with an exit value of ",
$status>>8, " and a signal status of ", $status & 255, "\n";
}
if (-s $tmpout) {
print $mailer "It produced the following output:\n\n";
print $mailer "-" x 60,"\n";
open T, "<$tmpout";
while (<T>) {
$_ eq ".\n" and $_="..\n";
print $mailer $_;
}
print $mailer "-" x 60, "\n\n";
close T;
} else {
print $mailer "It didn't produce any output.\n";
}
print $mailer "\n\nYours\n cronwrap.pl\n";
$mailer->close;
warn "--- $$ ", scalar(localtime), ' ', "$hostname completion status: $status - mail sent to $to\n";
}
else
{
warn "--- $$ ",scalar(localtime),' ',"$hostname completion status: $status - no mail sent\n";
else {
warn "--- $$ ", scalar(localtime), ' ', "$hostname completion status: $status - no mail sent\n";
}