5 =head1 NAME $RCSfile: tunnel.pl,v $
7 Set up a tunnel for emailing
15 Andrew DeFaria <Andrew@ClearSCM.com>
23 Wed 19 Aug 2020 09:09:09 AM MST
33 Usage: tunnel.pl [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug]
36 -u|sage: Displays this usage
37 -h|elp: Display full help
39 -d|ebug: Output debug messages
40 -host1: First host for tunnel (Default: localhost)
41 -port1: Port for host1
42 -host2: Second host for tunnel (Default: defaria.com)
43 -port2: Port for host2
44 -a|nnounce: Whether to announce startup (Default false)
45 -ap|pend Append to logfile (Default: Noappend)
46 -maxtretries: Maximum number of retry attempt to reestablish tunnel
48 -nodaemon: Whether to go into daemon mode (Default: Daemon mode)
52 This script sets up an SSH tunnel for the purposes of emailing.
59 use File::Temp qw(tempfile);
63 use POSIX ':sys_wait_h';
65 use lib "$FindBin::Bin/../lib";
74 my $VERSION = '$Revision: 1.0 $';
75 ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
78 usage => sub { pod2usage },
79 help => sub { pod2usage (-verbose => 2)},
80 verbose => sub { set_verbose },
81 debug => sub { set_debug },
84 host2 => 'defaria.com',
86 remotehost => 'defaria.com',
90 # Perlcritic complains if $DB::OUT is used only once.
92 $opts{daemon} = 1 unless defined $DB::OUT;
103 $log->err($msg, $err);
112 Report "Tunnel killed unexpectedly", 1;
114 kill 'INT', $ssh->get_master_pid;
120 my $tunnelStr = "-NL$opts{host1}:$opts{port1}:$opts{host2}:$opts{port2}";
122 my $retryattempts = 0;
125 my ($fh, $filename) = tempfile;
127 $ssh = Net::OpenSSH->new(
129 master_opts => $tunnelStr,
130 default_stderr_file => $filename
133 Report("Unable to establish ssh tunnel " . $ssh->error, 1) if $ssh->error;
135 # Check to see if address is already in use
142 if (grep { /address already in use/i } @lines) {
143 Report 'Unable to start tunnel - Address already in use', 1;
145 my $msg = 'Ssh tunnel ';
146 $msg .= $retryattempts ? 'reestablished' : 'established';
148 speak $msg, $log if $opts{announce};
152 # Reset retry attempts since we reestablished the tunnel
153 $retryattempts = 0 if $retryattempts;
155 # Wait for master to exit
156 waitpid($ssh->get_master_pid, WUNTRACED);
158 Report("Ssh tunnel terminated unexpectedly - Maximum retry count hit ($opts{maxretries}) - giving up", 1)
159 if $retryattempts++ >= $opts{maxretries};
187 path => '/var/local/log',
188 name => "$Logger::me",
189 timestamped => 'yes',
190 append => $opts{append},
193 $log->msg("$FindBin::Script v$VERSION");
195 $SIG{INT} = $SIG{TERM} = \&interrupt;
197 EnterDaemonMode unless $opts{daemon} and get_debug;