-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathselfheal.sh
executable file
·59 lines (55 loc) · 1.95 KB
/
selfheal.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/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