X-Git-Url: https://defaria.com/gitweb/?a=blobdiff_plain;f=bin%2Ftunnel.pl;h=43dbfffc81083efb8229cc37711de620f5b3fa98;hb=338c4f27d2fd517aa63544459399aef9b28438be;hp=2ee85f0001592806c96725656bfcfbe648e23ff7;hpb=65420197aa633c6aabfec834730c7e87c93649cf;p=clearscm.git diff --git a/bin/tunnel.pl b/bin/tunnel.pl index 2ee85f0..43dbfff 100755 --- a/bin/tunnel.pl +++ b/bin/tunnel.pl @@ -30,22 +30,22 @@ $Date: $ =head1 SYNOPSIS - Usage: tunnel.pl [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug] - - Where: - - -u|sage: Displays this usage - -h|elp: Display full help - -ve|rbose: Be verbose - -d|ebug: Output debug messages - -host1: First host for tunnel (Default: localhost) - -port1: Port for host1 - -host2: Second host for tunnel (Default: defaria.com) - -port2: Port for host2 - -a|nnounce: Whether to announce startup (Default false) - -maxtretries: Maximum number of retry attempt to reestablish tunnel - (Default 3) - -nodaemon: Whether to go into daemon mode (Default: Daemon mode) + Usage: tunnel.pl [-u|sage] [-h|elp] [-ve|rbose] [-d|ebug] + + Where: + -u|sage: Displays this usage + -h|elp: Display full help + -ve|rbose: Be verbose + -d|ebug: Output debug messages + -host1: First host for tunnel (Default: localhost) + -port1: Port for host1 + -host2: Second host for tunnel (Default: defaria.com) + -port2: Port for host2 + -a|nnounce: Whether to announce startup (Default false) + -ap|pend Append to logfile (Default: Noappend) + -maxtretries: Maximum number of retry attempt to reestablish tunnel + (Default 3) + -nodaemon: Whether to go into daemon mode (Default: Daemon mode) =head1 DESCRIPTION @@ -68,6 +68,7 @@ use Pod::Usage; use Display; use Logger; +use Speak; use Utils; my $VERSION = '$Revision: 1.0 $'; @@ -84,32 +85,19 @@ my %opts = ( port2 => 25, remotehost => 'defaria.com', maxretries => 3, - daemon => 1, ); -my ($log, $ssh); - -sub Say($) { - my ($msg) = @_; - - if (-f "$FindBin::Bin/shh") { - $log->msg("Not speaking because we were asked to be quiet - $msg"); - - return; - } # if - - my ($status, @output) = Execute "/usr/local/bin/gt \"$msg\""; - - $log->err("Unable to speak (Status: $status) - " - . join ("\n", @output), $status) if $status; +# Perlcritic complains if $DB::OUT is used only once. +no warnings; +$opts{daemon} = 1 unless defined $DB::OUT; +use warnings; - return; -} # Say +my ($log, $ssh); sub Report ($;$) { my ($msg, $err) = @_; - Say $msg; + speak $msg, $log; if ($err) { $log->err($msg, $err); @@ -124,6 +112,8 @@ sub interrupt { Report "Tunnel killed unexpectedly", 1; kill 'INT', $ssh->get_master_pid; + + return; } # interrupt sub tunnel() { @@ -134,7 +124,7 @@ sub tunnel() { RETRY: my ($fh, $filename) = tempfile; - my $ssh = Net::OpenSSH->new( + $ssh = Net::OpenSSH->new( $opts{remotehost}, master_opts => $tunnelStr, default_stderr_file => $filename @@ -142,31 +132,33 @@ RETRY: Report("Unable to establish ssh tunnel " . $ssh->error, 1) if $ssh->error; + # Check to see if address is already in use my @lines = <$fh>; close $fh; unlink $filename; - if (grep /address already in use/i, @lines) { + if (grep { /address already in use/i } @lines) { Report 'Unable to start tunnel - Address already in use', 1; } else { my $msg = 'Ssh tunnel '; $msg .= $retryattempts ? 'reestablished' : 'established'; - Say $msg if $opts{announce}; + speak $msg, $log if $opts{announce}; $log->msg($msg); + # Reset retry attempts since we reestablished the tunnel + $retryattempts = 0 if $retryattempts; + # Wait for master to exit waitpid($ssh->get_master_pid, WUNTRACED); Report("Ssh tunnel terminated unexpectedly - Maximum retry count hit ($opts{maxretries}) - giving up", 1) if $retryattempts++ >= $opts{maxretries}; - $opts{announce} = $retryattempts; - - Report 'Ssh tunnel terminated unexpectedly - Attempting restart'; + undef $ssh; goto RETRY; } # if @@ -188,24 +180,20 @@ GetOptions ( 'announce!', 'maxretries=i', 'daemon!', + 'append', ) || Usage; -# Turn off daemon mode if we are in the Perl debugger; -no warnings; # Ignore warning about used only once $DB::OUT when not in debugger -$opts{daemon} = 0 if defined $DB::OUT; -use warnings; - $log = Logger->new( - path => '/var/log', + path => '/var/local/log', name => "$Logger::me", timestamped => 'yes', - append => 'yes', + append => $opts{append}, ); $log->msg("$FindBin::Script v$VERSION"); $SIG{INT} = $SIG{TERM} = \&interrupt; -EnterDaemonMode if $opts{daemon}; +EnterDaemonMode unless $opts{daemon} and get_debug; tunnel;