X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=sshsendmail;h=c9c4530ba0733e06e635da8db8a27182ca1fa45a;hb=1886c7247cb16ed68a78cd5550b152689a465999;hp=047d9a869ae1385691ced590857d1cea71c70d26;hpb=c5669fbd88cdbfd72ba94be8e209c808a72c0f9c;p=bin.git diff --git a/sshsendmail b/sshsendmail index 047d9a8..c9c4530 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,39 +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' => [], ); -# this is really janky, but because nullmailer doesn't properly handle -# quotes, we must do it for it. -my @fixed_argv; -my $concatenate_to_last; -my $p; -for my $opt (@ARGV) { - if ($concatenate_to_last) { - $fixed_argv[-1].=' '.$opt; - if (/$p/) { - $concatenate_to_last = 0; - } - next; - } - if (/(['"])(.+)/ && $2 !~ /$1/) { - $p = $1; - $concatenate_to_last = 1; - } - push @fixed_argv,$opt; -} -@ARGV=@fixed_argv; - GetOptions(\%options,'identity|i=s','username|l=s','daemon|d', 'syslog|s', - '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}; @@ -145,21 +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 ).$options{'sendmail-options'}.' '.join(' ',@recipients); -qx(ping -q -c 3 $hostname 2>/dev/null); +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 -w 3 -c 1 $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; }