From 0ff7a57d401afc588db7bfd08605cce255d15353 Mon Sep 17 00:00:00 2001 From: Gordon Grant-Stuart Date: Mon, 10 Jul 2023 16:58:51 +0100 Subject: [PATCH] de-xargs'd the forking process --- tunnelkeeper | 105 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 34 deletions(-) diff --git a/tunnelkeeper b/tunnelkeeper index db5dc41..84f0c0b 100755 --- a/tunnelkeeper +++ b/tunnelkeeper @@ -42,7 +42,7 @@ function debugopt () { } function dbg () { - if [[ "$(awk "/^$1/ {print \$2}" ${DEBUGCONF})" =~ "[123]" ]]; then + if [[ "$(awk "/^$1/ {print \$2}" ${DEBUGCONF})" =~ [123] ]]; then cat | sed "s/^/$(date +"%H:%M:%S") /g" >> "$BASEDIR/var/log/tunnelkeeper-$(date +"%Y%m%d").log" fi } @@ -52,54 +52,91 @@ function connect () { ssh -F "${SSHCONF}" $bo -S "$BASEDIR/var/$1.tksock" -N $1 '#tunnelkeeper' 2>&1 | dbg $1 } - -case "$1" in - FORKSTART ) - (grep "$2" $WATCHCONF &>/dev/null) && $0 FORKWATCH $2 '#tunnelkeeper' & - if [[ $(grep -c "^$2" $PWCONF) -gt 0 ]]; then - pass=$(awk "/^$2/ {print \$2}" ${PWCONF}) # password needed - screen -d -m -S "tk${2}" $0 FORKSCREEN $2 '#tunnelkeeper' - while true; do - sleep 5 - if [[ -f "$BASEDIR/var/${2}.screen" ]]; then - screen -S "tk${2}" -X stuff "$pass -" - rm -f "$BASEDIR/var/${2}.screen" - fi - done - else # passwordless auth - while true; do - connect $2 - sleep 5 - done +function forkwatch () { + host=$1 + while true; do + TIMEOUT=$(awk "/^$host/ {print \$2}" ${WATCHCONF}) + sleep $TIMEOUT + echo "tick $host" | dbg + if [[ $(timeout $TIMEOUT ssh localhost -o "StrictHostKeyChecking no" -S $BASEDIR/var/$host.tksock "echo tk") != "tk" ]]; then + ssh localhost -O exit -S $BASEDIR/var/$host.tksock + echo "Killing connection to $host. Trying again." | dbg $host fi - exit - ;; - FORKWATCH ) # makes sure the connection is still working, even if ssh doesn't drop it. Needs a login shell to work. + done +} + +function forkstart () { + host=$1 + (grep "$host" $WATCHCONF &>/dev/null) && forkwatch $host & + if [[ $(grep -c "^$host" $PWCONF) -gt 0 ]]; then + pass=$(awk "/^$host/ {print \$2}" ${PWCONF}) # password needed + screen -d -m -S "tk${host}" $0 FORKSCREEN $host '#tunnelkeeper' while true; do - TIMEOUT=$(awk "/^$2/ {print \$2}" ${WATCHCONF}) - sleep $TIMEOUT - echo "tick $2" | dbg - if [[ $(timeout $TIMEOUT ssh localhost -o "StrictHostKeyChecking no" -S $BASEDIR/var/$2.tksock "echo tk") != "tk" ]]; then - ssh localhost -O exit -S $BASEDIR/var/$2.tksock - echo "Killing connection to $2. Trying again." | dbg $2 + sleep 5 + if [[ -f "$BASEDIR/var/${host}.screen" ]]; then + screen -S "tk${host}" -X stuff "$pass +" + rm -f "$BASEDIR/var/${host}.screen" fi done - exit - ;; + else # passwordless auth + while true; do + connect $host + sleep 5 + done + fi +} + +### main loop + +case "$1" in +# FORKSTART ) +# (grep "$2" $WATCHCONF &>/dev/null) && $0 FORKWATCH $2 '#tunnelkeeper' & +# if [[ $(grep -c "^$2" $PWCONF) -gt 0 ]]; then +# pass=$(awk "/^$2/ {print \$2}" ${PWCONF}) # password needed +# screen -d -m -S "tk${2}" $0 FORKSCREEN $2 '#tunnelkeeper' +# while true; do +# sleep 5 +# if [[ -f "$BASEDIR/var/${2}.screen" ]]; then +# screen -S "tk${2}" -X stuff "$pass +# " +# rm -f "$BASEDIR/var/${2}.screen" +# fi +# done +# else # passwordless auth +# while true; do +# connect $2 +# sleep 5 +# done +# fi +# exit +# ;; + # FORKWATCH ) # makes sure the connection is still working, even if ssh doesn't drop it. Needs a login shell to work. + # while true; do + # TIMEOUT=$(awk "/^$2/ {print \$2}" ${WATCHCONF}) + # sleep $TIMEOUT + # echo "tick $2" | dbg + # if [[ $(timeout $TIMEOUT ssh localhost -o "StrictHostKeyChecking no" -S $BASEDIR/var/$2.tksock "echo tk") != "tk" ]]; then + # ssh localhost -O exit -S $BASEDIR/var/$2.tksock + # echo "Killing connection to $2. Trying again." | dbg $2 + # fi + # done + # exit + # ;; FORKSCREEN ) while true; do echo $$ > "$BASEDIR/var/${2}.screen" connect $2 #$dbgopt sleep 5 done - exit + exit # de-forkbombing exit. ;; start) [[ -e "$BASEDIR/var/tunnelkeeper.pid" ]] && exit genconfig echo $$ > "$BASEDIR/var/tunnelkeeper.pid" - cat "$BASEDIR/etc/tunnelkeeper.conf" | awk '/^Host / {print $2}' | xargs -I% -P0 $0 FORKSTART % '#tunnelkeeper' & + # cat "$BASEDIR/etc/tunnelkeeper.conf" | awk '/^Host / {print $2}' | xargs -I% -P0 $0 FORKSTART % '#tunnelkeeper' & + cat "$BASEDIR/etc/tunnelkeeper.conf" | awk '/^Host / {print $2}' | while read host; do forkstart $host & ; done ;; stop ) rm -f "$BASEDIR/var/tunnelkeeper.pid"