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 local $0 = $FindBin::Script;
76 my $VERSION = '$Revision: 1.0 $';
77 ($VERSION) = ($VERSION =~ /\$Revision: (.*) /);
80 usage => sub { pod2usage },
81 help => sub { pod2usage (-verbose => 2)},
82 verbose => sub { set_verbose },
83 debug => sub { set_debug },
86 host2 => 'defaria.com',
88 remotehost => 'defaria.com',
92 # Perlcritic complains if $DB::OUT is used only once.
94 $opts{daemon} = 1 unless defined $DB::OUT;
100 my ($msg, $err) = @_;
105 $log->err($msg, $err);
114 Report "Tunnel killed unexpectedly", 1;
116 kill 'INT', $ssh->get_master_pid;
122 my $tunnelStr = "-NL$opts{host1}:$opts{port1}:$opts{host2}:$opts{port2}";
124 my $retryattempts = 0;
127 my ($fh, $filename) = tempfile;
129 $ssh = Net::OpenSSH->new(
131 master_opts => $tunnelStr,
132 default_stderr_file => $filename
135 Report("Unable to establish ssh tunnel " . $ssh->error, 1) if $ssh->error;
137 # Check to see if address is already in use
144 if (grep { /address already in use/i } @lines) {
145 Report 'Unable to start tunnel - Address already in use', 1;
147 my $msg = 'Ssh tunnel ';
148 $msg .= $retryattempts ? 'reestablished' : 'established';
150 speak $msg, $log if $opts{announce};
154 # Reset retry attempts since we reestablished the tunnel
155 $retryattempts = 0 if $retryattempts;
157 # Wait for master to exit
158 waitpid($ssh->get_master_pid, WUNTRACED);
160 Report("Ssh tunnel terminated unexpectedly - Maximum retry count hit ($opts{maxretries}) - giving up", 1)
161 if $retryattempts++ >= $opts{maxretries};
189 path => '/var/local/log',
190 name => "$Logger::me",
191 timestamped => 'yes',
192 append => $opts{append},
195 $log->msg("$FindBin::Script v$VERSION");
197 $SIG{INT} = $SIG{TERM} = \&interrupt;
199 EnterDaemonMode unless $opts{daemon} and get_debug;