#! /usr/bin/perl
+# sshsendmail uses ssh to send a mail message to a different machine,
+# and is released under the terms of the GPL version 2, or any later
+# version, at your option. See the file README and COPYING for more
+# information.
+# Copyright 2005-10 by Don Armstrong <don@donarmstrong.com>.
# parse command line options
=head1 SYNOPSIS
-ss [options]
+Stick this command in /usr/lib/nullmailer/sshsendmail.
+
+Then add
+
+foohost.com sshsendmail --identity=/var/mail/.ssh/id_rsa --username remotemail --sendmail-options='-baruser@foohost.com'
+
+to /etc/nullmailer/remotes.
Options:
- --host, -H host to upload image to
- --dir, -D dir to place image (on host of -H set)
- --import-options, -I options to import (default -window root)
- --convert-options, -C options to convert (for scaling)
- --scale, -s make scaled image (default)
+ --identity, -i ssh identity to use to connect to the server
+ --username, -l remote username
+ --sendmail-options, -o options to pass to sendmail
--debug, -d debugging level (Default 0)
--help, -h display this help
--man, -m display manual
=back
-=head1 EXAMPLES
-
- ss
-
-Will pretty much do what you want
-
- ss -I
-
-Will take a picture of a window you select.
=cut
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);
# 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,
- log => '/var/mail/log',
- '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|o=s','log|l=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};
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 ').<<EOF .q(');
+use Digest::MD5 qw(md5_hex);
+use IO::Handle;
+my \@message = <>;
+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;
-my $log = new IO::File $options{log},'w+' or exit(2);
-print {$log} @message or exit(2);
-print {$log} join(' ',('ssh',@ssh_arguments)) or exit(2);
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";
- print {$log} "${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";
- print {$log} "${0}: Failed: sendmail died for some reason\n";
- exit 0;
+ syslog(LOG_INFO,"${0}: Succeeded: Yeay\n");
+ exit 0;
}