From f93e3eb38bafd12a4b452bc0e0db2452151d9a8a Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Wed, 6 May 2015 18:05:14 +0100 Subject: [PATCH] bin/outbound: Change how we wait for SSH tunnels to end. The old method didn't actually work. Instead, the shell just got stuck waiting for the pipe to open and never did anything useful. New approach: make a pipe, and wait for it to close for reading, using a backgrounded cat(1); have the SSH control-master process write its (empty) stdout to the pipe; and, finally, wait for the cat(1) to finish. --- bin/outbound | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/bin/outbound b/bin/outbound index 5ed160d..ac810aa 100755 --- a/bin/outbound +++ b/bin/outbound @@ -63,6 +63,9 @@ daemon () { ## Initial delay. delay=0 + ## Not waiting on a pipe yet. + kidcat=nil + ## Keep the connection up for as long as we can. while [ -f "$host.pid" ]; do @@ -80,9 +83,18 @@ daemon () { ;; esac + ## Prepare a pipe so that we can wait for SSH to finish. This is a + ## rotten hack. + case $kidcat in + nil) ;; + *) kill $kidcat >/dev/null 2>&1 || :; kidcat=nil ;; + esac + rm -f "$host.pipe"; mkfifo -m600 "$host.pipe" + cat $host.pipe >/dev/null& kidcat=$! + ## Start a new connection. writefile "$host.state" starting - if ! runssh -MNnf "$host" >/dev/null; then continue; fi + if ! runssh -MNnf "$host" >"$host.pipe"; then continue; fi if ! runssh -Ocheck "$host" >/dev/null 2>&1; then echo "connection to $host apparently stillborn" continue @@ -90,13 +102,10 @@ daemon () { writefile "$host.state" connected delay=0 - ## Wait until it gets torn down. The chicanery with a pipe is because - ## the ssh process will continue until either it gets disconnected from - ## the server or stdin closes -- so we have to arrange that stdin doesn't - ## close. Thanks to Richard Kettlewell for the suggestion. - rm -f "$host.pipe"; mkfifo -m400 "$host.pipe" - runssh -N "$host" >/dev/null <"$host.pipe" || : + ## Wait until it gets torn down. + wait $kidcat >/dev/null 2>&1 || : rm -f "$host.pipe" + clobber writefile "$host.state" disconnected done } -- 2.11.0