From 4d35eeae37fd76a49ea4c9dc9c59cf088c247ca2 Mon Sep 17 00:00:00 2001 From: Gordon Grant-Stuart Date: Mon, 20 Feb 2023 10:52:10 +0000 Subject: [PATCH] wibble --- etc/tunnelkeeper.conf | 1 + tunnelkeeper | 41 ++++++++++++++++++++++++++++++----------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/etc/tunnelkeeper.conf b/etc/tunnelkeeper.conf index 3091c27..7be4958 100644 --- a/etc/tunnelkeeper.conf +++ b/etc/tunnelkeeper.conf @@ -1,5 +1,6 @@ [settings] debug 0 +timeout 30 [ssh] # Everything in this section obeys the same rules as ~/.ssh/config diff --git a/tunnelkeeper b/tunnelkeeper index d57114d..6f24a74 100755 --- a/tunnelkeeper +++ b/tunnelkeeper @@ -22,28 +22,34 @@ function ruroot () { } DEBUGLEVEL=$(awk '/^debug/ {print $2}' $TKCONF &>/dev/null) +[[ -z $DEBUGLEVEL ]] && DEBUGLEVEL='0' case "$DEBUGLEVEL" in 2) dbgopt='-v';; 3) dbgopt='-vvv';; *) dbgopt='';; esac +TIMEOUT=$(awk '/^timeout/ {print $2}' $TKCONF &>/dev/null) +[[ -z $TIMEOUT ]] && TIMEOUT='60' + function dbg () { [[ $DEBUGLEVEL != "0" ]] && logger -t tunnelkeeper } function connect () { - ssh -F "${SSHCONF}" $dbgopt -N $1 '#tunnelkeeper' 2>&1 | dbg + # ssh -F "${SSHCONF}" $dbgopt -N $1 '#tunnelkeeper' 2>&1 | dbg + ssh -F "${SSHCONF}" $dbgopt -o "ControlMaster auto" -S "$BASEDIR/var/$1.tksock" -N $1 '#tunnelkeeper' 2>&1 | dbg } case "$1" in FORKSTART ) - echo -n $$ > "$BASEDIR/var/${2}.connected" + # echo -n $$ > "$BASEDIR/var/${2}.connected" 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 - while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + screen -d -m -S "tk${2}" $0 FORKSCREEN $2 '#tunnelkeeper' + # while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + while true; do sleep 5 if [[ -f "$BASEDIR/var/${2}.screen" ]]; then screen -S "tk${2}" -X stuff "$pass @@ -52,29 +58,41 @@ case "$1" in fi done else # passwordless auth - while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + # while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + while true; do connect $2 sleep 5 done fi + $0 FORKWATCH $2 '#tunnelkeeper' & exit ;; + FORKWATCH ) # makes sure the connection is still working, even if ssh doesn't drop it + while true; do + sleep $TIMEOUT + if [[ $(timeout $TIMEOUT ssh localhost -S $BASEDIR/var/$2.tksock "echo tk") != "tk" ]]; then + ssh localhost -O exit -S $BASEDIR/var/$2.tksock + fi + done + ;; FORKSCREEN ) - while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + # while [[ -e "$BASEDIR/var/${2}.connected" ]]; do + while true; do echo $$ > "$BASEDIR/var/${2}.screen" connect $2 + sleep 5 done exit ;; start) [[ -e "$BASEDIR/var/tunnelkeeper.pid" ]] && exit echo $$ > "$BASEDIR/var/tunnelkeeper.pid" - cat "$SSHCONF" | awk '/^Host / {print $2}' | xargs -I% -P0 $0 FORKSTART % & + cat "$SSHCONF" | awk '/^Host / {print $2}' | xargs -I% -P0 $0 FORKSTART % '#tunnelkeeper' & ;; stop ) rm -f "$BASEDIR/var/tunnelkeeper.pid" - rm -f "$BASEDIR/var/*.connected" - pkill -f 'tunnelkeeper' &>/dev/null + # rm -f "$BASEDIR/var/*.connected" + pkill -f '#tunnelkeeper' &>/dev/null ;; restart ) if systemctl status tunnelkeeper &>/dev/null; then @@ -85,7 +103,7 @@ case "$1" in ;; install ) ruroot - which screen &>/dev/null || yum install -y screen || apt install -y screen || echo "Couldn't install screen" && exit + which screen &>/dev/null || yum install -y screen || apt install -y screen || echo "Couldn't install screen" mkdir -p /opt/tunnelkeeper/var mkdir -p /opt/tunnelkeeper/etc if [[ "$BASEDIR" != '/opt/tunnelkeeper/' ]]; then @@ -121,7 +139,8 @@ WantedBy=multi-user.target" > /lib/systemd/system/tunnelkeeper.service ;; list ) echo "---" - find "$BASEDIR/var/" -name '*.connected' | sed 's/^.*\///g; s/\.connected//g' + # find "$BASEDIR/var/" -name '*.connected' | sed 's/^.*\///g; s/\.connected//g' + find "$BASEDIR/var/" -name '*.tksock' | sed 's/^.*\///g; s/\.tksock//g' echo "---" ;; config )