From: Don Armstrong Date: Wed, 31 Dec 2014 00:35:36 +0000 (-0800) Subject: make sshsendmail more complicated to avoid having a dropped connection send a truncat... X-Git-Url: https://git.donarmstrong.com/?p=bin.git;a=commitdiff_plain;h=0c9b112effdd642db560859dbae5fb77d1bfea56 make sshsendmail more complicated to avoid having a dropped connection send a truncated file --- diff --git a/sshsendmail b/sshsendmail index 8668470..62efbb4 100755 --- a/sshsendmail +++ b/sshsendmail @@ -66,6 +66,9 @@ use User; use File::Basename qw(basename); use IO::Handle; use IO::File; +use Digest::MD5 qw(md5_hex); +use Sys::Syslog qw(:standard :macros); +use Data::Dumper; use vars qw($DEBUG); @@ -73,18 +76,20 @@ $0 = basename($0); # XXX parse config file +openlog('sshsendmail',[qw(nofatal perror pid)], LOG_MAIL); + my %options = (debug => 0, - help => 0, - man => 0, - host => undef, - identity => undef, - username => undef, - 'sendmail_options' => [''], + help => 0, + man => 0, + host => undef, + identity => undef, + username => undef, + 'sendmail_options' => [], ); GetOptions(\%options,'identity|i=s','username|l=s','daemon|d', 'syslog|s', - 'sendmail_options|sendmail-options|o=s@', - 'help|h|?','man|m'); + 'sendmail_options|sendmail-options|o=s@', + 'help|h|?','man|m'); pod2usage() if $options{help}; pod2usage({verbose=>2}) if $options{man}; @@ -124,23 +129,58 @@ my @ssh_arguments = ($hostname); push @ssh_arguments, '-i', $options{identity} if defined $options{identity}; push @ssh_arguments, '-l', $options{username} if defined $options{username}; -push @ssh_arguments, q(cat - | /usr/lib/sendmail ). - join(' ',ref($options{sendmail_options})?@{$options{sendmail_options}}:($options{sendmail_options}//'')). - ' '.join(' ',@recipients); +my @sendmail_options; +push @sendmail_options, + ref($options{sendmail_options})?@{$options{sendmail_options}}:$options{sendmail_options}; +push @sendmail_options,@recipients; +$Data::Dumper::Useqq=1; +my $sendmail_options = Data::Dumper->Dump([\@sendmail_options],[qw(*sendmail_options)]); +print STDERR $sendmail_options; +push @ssh_arguments, q(perl -e ').<; +my $sendmail_options +my \$digest = pop \@message; +\$digest =~ /(.*)([0-9a-fA-F]{32})\n/; +\$digest = \$2; +if (length \$1) { + push \@message,\$1; +} +my \$message = join(q(),\@message); +if (\$digest eq md5_hex(\$message)) { + my \$sendmail = IO::Handle->new(); + open (\$sendmail,q(|-),q(/usr/lib/sendmail), \@sendmail_options) or + die "Unable to open sendmail: \$!"; + print {\$sendmail} \$message or + die "Unable to write to sendmail: \$!"; + close (\$sendmail) or + die "Unable to close sendmail: \$!"; +} else { + die "Digest failure! \$digest vs ".md5_hex(\$message); +} +EOF + +$Data::Dumper::Useqq=0; +print STDERR Dumper(\@ssh_arguments); + qx(ping -q -c 3 $hostname 2>/dev/null); if ($?) { - print STDERR "${0}: Failed: unable to ping $hostname\n"; - exit (9); + syslog(LOG_WARNING,"${0}: Failed: unable to ping $hostname\n"); + exit (9); } +print STDERR md5_hex(join('',@message))."\n"; my $ssh = new IO::Handle; open($ssh,'|-','ssh',@ssh_arguments) or exit(17); print {$ssh} @message or exit(17); +print {$ssh} md5_hex(join('',@message))."\n"; close $ssh or exit(17); if ($?) { - print STDERR "${0}: Failed: sendmail died for some reason\n"; - exit (17); + syslog(LOG_WARNING,"${0}: Failed: sendmail died for some reason\n"); + syslog(LOG_WARNING,join("\n",@ssh_arguments)); + exit (17); } else { - print STDERR "${0}: Succeeded: Yeay\n"; - exit 0; + syslog(LOG_INFO,"${0}: Succeeded: Yeay\n"); + exit 0; }