diff --git a/scripts/server-execute.sh b/scripts/server-execute.sh index b6ddb7e..9bb0084 100755 --- a/scripts/server-execute.sh +++ b/scripts/server-execute.sh @@ -2,13 +2,14 @@ # # Execute/teardown on the server side # -if [[ ${#} != 2 ]]; then - echo "Usage: ${0} TUNNEL_ID IP_BASE" +if [[ ${#} != 3 ]]; then + echo "Usage: ${0} TUNNEL_ID IP_BASE MAX_FAILED_PINGS" exit 1 fi declare -r TUNNEL_ID=${1} declare -r IP_BASE=${2} +declare -r MAX_FAILED_PINGS=${3} declare -r NETWORK_DEVICE=tun${TUNNEL_ID} let CLIENT_LAST_IP_ADDR_OCTET="4*(${TUNNEL_ID}-1)+1" @@ -26,11 +27,11 @@ function teardown() { echo "CONNECTED" FAILED_PINGS=0 -while [[ ${FAILED_PINGS} -lt 10 ]]; do +while [[ ${FAILED_PINGS} -lt ${MAX_FAILED_PINGS} ]]; do ping -c3 -nq ${CLIENT_IP_ADDR} >/dev/null if [[ ${?} -ne 0 ]]; then let FAILED_PINGS+=1 - logger -i -p warn "xiringuito[${TUNNEL_ID}]: Failed to ping ${CLIENT_IP_ADDR} (${FAILED_PINGS})" + logger -i -p warn "xiringuito[${TUNNEL_ID}]: Failed to ping ${CLIENT_IP_ADDR} (${FAILED_PINGS}/${MAX_FAILED_PINGS})" else FAILED_PINGS=0 fi diff --git a/xiringuito b/xiringuito index 34593be..4f5979d 100755 --- a/xiringuito +++ b/xiringuito @@ -8,6 +8,7 @@ function print_help() { echo "Usage: ${0} [OPTIONS] [SSH_USER@]SSH_SERVER [NETWORK1, NETWORK2, ... NETWORKx]" echo echo "OPTIONS" + echo "-f X fail connection after X ping failures" echo "-R do not reconnect after connection failure" echo "-D do not fetch DNS config from server" echo "-h show this extremely helpful message" @@ -37,8 +38,19 @@ fi declare -r ORIGINAL_EXEC=${0} declare -r ORIGINAL_ARGS=${@} -while getopts "RDrh" o; do +while getopts "f:RDrh" o; do case ${o} in + f) + MAX_FAILED_PINGS=${OPTARG} + if [[ ! ${MAX_FAILED_PINGS} =~ ^[0-9]{1,}$ ]]; then + echo "'-f' option accepts only positive integer values" + exit 1 + fi + if [[ ${MAX_FAILED_PINGS} -eq 0 ]]; then + echo "'-f' option value should be greater then zero" + exit 1 + fi + ;; R) NO_RECONNECT=true ;; @@ -58,6 +70,8 @@ while getopts "RDrh" o; do esac done +declare -r MAX_FAILED_PINGS=${MAX_FAILED_PINGS-10} + shift $((OPTIND-1)) cd $(dirname ${0}) @@ -124,7 +138,7 @@ if [[ ${KERNEL} == linux ]]; then else SSH_TUNNEL_CMD="sudo -E ssh" fi -${SSH_TUNNEL_CMD} ${SSH_OPTS} -oStrictHostKeyChecking=no -w ${LOCAL_TUNNEL_ID}:${TUNNEL_ID} ${SSH_SERVER} ${REMOTE_PATH}/server-execute.sh ${TUNNEL_ID} ${IP_BASE} & +${SSH_TUNNEL_CMD} ${SSH_OPTS} -oStrictHostKeyChecking=no -w ${LOCAL_TUNNEL_ID}:${TUNNEL_ID} ${SSH_SERVER} ${REMOTE_PATH}/server-execute.sh ${TUNNEL_ID} ${IP_BASE} ${MAX_FAILED_PINGS} & SSH_PID=${!} sudo ./scripts/${KERNEL}/client-teardown.sh ${$} ${SSH_PID} ${LOCAL_TUNNEL_ID} & @@ -158,13 +172,13 @@ fi set +e FAILED_PINGS=0 -while [[ ${FAILED_PINGS} -lt 10 ]]; do +while [[ ${FAILED_PINGS} -lt ${MAX_FAILED_PINGS} ]]; do kill -0 ${SSH_PID} &>/dev/null || break ./scripts/client-ping-server.sh ${TUNNEL_ID} ${IP_BASE} if [[ ${?} -ne 0 ]]; then let FAILED_PINGS+=1 - echo "* Failed to ping server-side tunnel endpoint... (${FAILED_PINGS})" + echo "* Failed to ping server-side tunnel endpoint... (${FAILED_PINGS}/${MAX_FAILED_PINGS})" else FAILED_PINGS=0 fi