#!/usr/bin/perl -w use Fcntl qw(LOCK_EX LOCK_NB); use strict; open( LOCK, ">>/tmp/SecureMail.lock" ) or die("Cannot open lock file: $!"); flock( LOCK, LOCK_EX | LOCK_NB ) or die("Another SecureMail session is already running - exiting"); my $SSHCMD = "ssh -a -C -N -o 'BatchMode=yes' -L 1430:mail.improbable.org:143 -L2525:mail2.qwknetllc.com:25 improbable.org"; chdir("/"); # No problems with $PWD disappearing open( STDOUT, "|-", "logger -t SecureMail" ); open( STDERR, ">&STDOUT" ); # Disable buffering for our input and output streams: select(STDERR); $| = 1; select(STDOUT); $| = 1; # Double-fork to avoid leaving a zombie process: unless ( fork() ) { unless ( fork() ) { sleep 1 until getppid() == 1; while ( 1 == 1 ) { kill_old_tunnels(); start_tunnel(); print "Sleeping before restarting SSH tunnel...\n"; sleep(3); } } } sub kill_old_tunnels { open( PS, "-|", "/bin/ps wwwwax -o pid,command" ) or die("Couldn't start ps: $!"); while () { if (m/^(\d+) $SSHCMD/i) { print "Killing old ssh tunnel[$1]\n"; kill($1); } } close(PS); } sub start_tunnel { print "Starting SSH tunnel using '$SSHCMD'\n"; open( TUNNEL, "-|", $SSHCMD ) or die("Couldn't start tunnel: $!"); while () { print $_; } close(TUNNEL); }