docker-transmission-openvpn/scripts/selfheal.sh
edgd1er af3d905b3a
DEBUG: print all lines before execution (#2096)
* DEBUG: print all lines before execution

if var DEBUG is set to anything other than false, each bash script will be run with a set -x. This would ease debugging

* DEBUG: centralize commands in utils.sh
2021-12-05 08:25:22 +09:00

60 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
source /etc/openvpn/utils.sh
SELFHEAL_INTERVAL=${SELFHEAL_INTERVAL:-1m}
SELFHEAL_TIMEOUT=${SELFHEAL_TIMEOUT:-30s}
SELFHEAL_START_PERIOD=${SELFHEAL_START_PERIOD:-0s}
SELFHEAL_RETRIES=${SELFHEAL_RETRIES:-3}
string_to_seconds() {
local STRING=$1
local LENGTH=${#STRING}
case ${STRING} in
*ms) echo "${STRING:0:$((LENGTH - 2))} / 1000" | bc -l ;;
*s) echo "${STRING:0:$((LENGTH - 1))}" ;;
*m) echo "$((${STRING:0:$((LENGTH - 1))} * 60))" ;;
*h) echo "$((${STRING:0:$((LENGTH - 1))} * 3600))" ;;
esac
}
INTERVAL=$(string_to_seconds 1m)
TIMEOUT=$(string_to_seconds 1m)
START_PERIOD=$(string_to_seconds ${SELFHEAL_START_PERIOD})
RETRIES_REMAINING=2
CONTAINER_STATUS="starting"
START_PERIOD_END=$(echo "$(date +%s) + ${START_PERIOD}" | bc -l)
echo "SELFHEAL: Container is starting, waiting for it to become healthy..."
while true; do
sleep ${INTERVAL}
MESSAGE=""
timeout ${TIMEOUT} setsid /etc/scripts/healthcheck.sh > /dev/null
STATUS=$?
if [[ ${STATUS} -ne 0 ]]; then
if [[ $(date +%s) -ge ${START_PERIOD_END} ]]; then
MESSAGE="failure"
let "RETRIES_REMAINING-=1"
fi
else
if [[ ${CONTAINER_STATUS} == "starting" ]]; then
INTERVAL=$(string_to_seconds ${SELFHEAL_INTERVAL})
TIMEOUT=$(string_to_seconds ${SELFHEAL_TIMEOUT})
START_PERIOD_END=$(date +%s)
fi
if [[ ${CONTAINER_STATUS} != "healthy" ]]; then
MESSAGE="success"
fi
RETRIES_REMAINING=${SELFHEAL_RETRIES}
CONTAINER_STATUS="healthy"
fi
if [[ ${RETRIES_REMAINING} -eq 0 ]]; then
MESSAGE="restart"
CONTAINER_STATUS="unhealthy"
fi
case ${MESSAGE} in
success) echo "SELFHEAL: Container is ${CONTAINER_STATUS}, health check succeeded." ;;
failure) echo "SELFHEAL: Container is ${CONTAINER_STATUS}, health check failed, ${RETRIES_REMAINING} retries remaining." ;;
restart) echo "SELFHEAL: Container is ${CONTAINER_STATUS}, failed ${SELFHEAL_RETRIES} health checks, exiting..."; kill 1; exit 1 ;;
esac
done