98 lines
2.8 KiB
Bash
Executable file
98 lines
2.8 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Start script for haproxy container, managing startup process and automatic reload
|
|
# on config change (detected using inotify events triggering on MOVED_TO).
|
|
#
|
|
|
|
HAPROXYCFG=${HAPROXYCFG-'/etc/haproxy/haproxy.cfg'}
|
|
HAPROXYWAITIF=${HAPROXYWAITIF-'20'}
|
|
HAPROXYWAITCFG=${HAPROXYWAITCFG-'10'}
|
|
HAPROXYWAITCONTAINER=${HAPROXYWAITCONTAINER-'10'}
|
|
|
|
if [[ $WAIT_FOR_INTERFACE ]]; then
|
|
for i in $(seq ${HAPROXYWAITIF}); do
|
|
ip link ls dev "$WAIT_FOR_INTERFACE" | grep -q 'state UP' && break
|
|
echo "$0: Waiting for interface ${WAIT_FOR_INTERFACE} (${i}/${HAPROXYWAITIF})"
|
|
sleep 1
|
|
done
|
|
|
|
if ! ip link ls dev "$WAIT_FOR_INTERFACE" | grep -q 'state UP'; then
|
|
echo "$0: Interface ${WAIT_FOR_INTERFACE} not found after ${HAPROXYWAITIF} seconds"
|
|
exit 1
|
|
fi
|
|
|
|
echo "$0: Interface ${WAIT_FOR_INTERFACE} is UP:"
|
|
ip addr list "$WAIT_FOR_INTERFACE"
|
|
fi
|
|
|
|
for i in $(seq ${HAPROXYWAITCFG}); do
|
|
test -f "${HAPROXYCFG}" && break
|
|
echo "$0: Waiting for haproxy config file ${HAPROXYCFG} (${i}/${HAPROXYWAITCFG})"
|
|
sleep 1
|
|
done
|
|
|
|
if [ ! -f "${HAPROXYCFG}" ]; then
|
|
echo "$0: haproxy config not found after ${HAPROXYWAITCFG} seconds: ${HAPROXYCFG}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $WAIT_FOR_CONTAINER ]]; then
|
|
seen=0
|
|
for i in $(seq ${HAPROXYWAITCONTAINER}); do
|
|
ping -c 1 $WAIT_FOR_CONTAINER > /dev/null 2>&1 && seen=1
|
|
test $seen == 1 && break
|
|
echo "$0: Waiting for container ${WAIT_FOR_CONTAINER} to appear (${i}/${HAPROXYWAITCONTAINER})"
|
|
sleep 1
|
|
done
|
|
if [[ $seen != 1 ]]; then
|
|
echo "$0: Host ${WAIT_FOR_CONTAINER} not present after ${HAPROXYWAITCONTAINER} seconds"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
echo "$0: Checking config: ${HAPROXYCFG}"
|
|
|
|
/usr/sbin/haproxy -c -f "${HAPROXYCFG}"
|
|
|
|
echo "$0: Config ${HAPROXYCFG} checked OK, starting haproxy-systemd-wrapper"
|
|
/usr/sbin/haproxy-systemd-wrapper -p /run/haproxy.pid -f "${HAPROXYCFG}" &
|
|
pid=$!
|
|
pid2=0
|
|
|
|
term_handler() {
|
|
echo "$0: Received SIGTERM, shutting down ${pid}, ${pid2}"
|
|
if [ $pid -ne 0 ]; then
|
|
kill -SIGTERM "$pid"
|
|
wait "$pid"
|
|
fi
|
|
if [ $pid2 -ne 0 ]; then
|
|
kill -SIGTERM "$pid2"
|
|
wait "$pid2"
|
|
fi
|
|
exit 143; # 128 + 15 -- SIGTERM
|
|
}
|
|
|
|
trap 'term_handler' SIGTERM
|
|
|
|
|
|
while [ 1 ]; do
|
|
echo "$0: Waiting for ${HAPROXYCFG} to be moved-to"
|
|
|
|
# Block until an inotify event says that the config file was replaced
|
|
inotifywait -q -e moved_to "${HAPROXYCFG}" &
|
|
pid2=$!
|
|
wait $pid2
|
|
|
|
echo "$0: Move-to event triggered, checking config: ${HAPROXYCFG}"
|
|
config_ok=1
|
|
/usr/sbin/haproxy -c -f "${HAPROXYCFG}" || config_ok=0
|
|
if [ $config_ok = 1 ]; then
|
|
echo "$0: Config ${HAPROXYCFG} checked OK, gracefully restarting haproxy-systemd-wrapper"
|
|
/usr/sbin/haproxy $* -p /run/haproxy.pid -f "${HAPROXYCFG}" -sf `cat /run/haproxy.pid`
|
|
echo "$0: haproxy gracefully reloaded"
|
|
else
|
|
echo "$0: Config ${HAPROXYCFG} NOT OK"
|
|
fi
|
|
sleep 1 # spin control
|
|
done
|