mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2024-12-28 09:38:52 +00:00
114 lines
2.4 KiB
Bash
114 lines
2.4 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
set -e
|
||
|
|
||
|
timeout=30
|
||
|
while :; do
|
||
|
case $1 in
|
||
|
-s | --supervisor)
|
||
|
with_supervisor=1
|
||
|
shift
|
||
|
;;
|
||
|
-t | --timeout) # Takes an option argument, ensuring it has been specified.
|
||
|
if [ -n "$2" ]; then
|
||
|
timeout=$2
|
||
|
shift
|
||
|
else
|
||
|
printf 'ERROR: "--timeout" requires a non-empty option argument.\n' >&2
|
||
|
fi
|
||
|
break
|
||
|
;;
|
||
|
--) # End of all options.
|
||
|
shift
|
||
|
break
|
||
|
;;
|
||
|
-?*)
|
||
|
printf 'WARN: Unknown option (ignored): %s\n' "$1" >&2
|
||
|
;;
|
||
|
*) # Default case: If no more options then break out of the loop.
|
||
|
break ;;
|
||
|
esac
|
||
|
|
||
|
shift
|
||
|
done
|
||
|
|
||
|
cmd="$*"
|
||
|
|
||
|
# Use a local socket for docker by default
|
||
|
DOCKER_HOST="${DOCKER_HOST:-'unix:///var/run/docker.sock'}"
|
||
|
|
||
|
path=${DOCKER_HOST#*//}
|
||
|
host=${path%%/*}
|
||
|
proto=${DOCKER_HOST%:*}
|
||
|
|
||
|
# Install curl
|
||
|
apk add --update curl
|
||
|
|
||
|
docker_healthy() {
|
||
|
if [ "${proto}" = "unix" ]; then
|
||
|
curl -s -S --unix-socket "${path}" "http://localhost/_ping"
|
||
|
else
|
||
|
curl -s -S "http://${host}/_ping"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
dbus_healthy() {
|
||
|
# The dbus service creates a fake openvpn unit, if the query below
|
||
|
# succeeds, then the service is ready
|
||
|
dbus-send --system \
|
||
|
--print-reply \
|
||
|
--type=method_call \
|
||
|
--dest=org.freedesktop.systemd1 \
|
||
|
/org/freedesktop/systemd1 \
|
||
|
org.freedesktop.systemd1.Manager.GetUnit string:openvpn.service
|
||
|
}
|
||
|
|
||
|
set_abort_timer() {
|
||
|
sleep "$1"
|
||
|
# Send a USR2 signal to the given pid after the timeout happens
|
||
|
kill -USR2 "$2"
|
||
|
}
|
||
|
|
||
|
# Flag indicating whether the required services are ready
|
||
|
ready=0
|
||
|
abort_if_not_ready() {
|
||
|
# If the timeout is reached and the required services are not ready, it probably
|
||
|
# means something went wrong so we terminate the program with an error
|
||
|
if [ "${ready}" = "0" ]; then
|
||
|
echo "Something happened, failed to start in ${timeout}s" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
# Trap the signal and start the timer if user timeout is greater than 0
|
||
|
if [ "$timeout" -gt 0 ]; then
|
||
|
trap 'abort_if_not_ready' USR2
|
||
|
set_abort_timer "$timeout" $$ &
|
||
|
fi
|
||
|
|
||
|
# Wait for docker
|
||
|
until docker_healthy; do
|
||
|
echo "Waiting for docker at ${DOCKER_HOST}"
|
||
|
sleep 1
|
||
|
done
|
||
|
|
||
|
# Wait for dbus
|
||
|
until dbus_healthy >/dev/null; do
|
||
|
echo "Waiting for dbus"
|
||
|
sleep 1
|
||
|
done
|
||
|
|
||
|
# Wait for supervisor if user requested
|
||
|
BALENA_SUPERVISOR_ADDRESS="${BALENA_SUPERVISOR_ADDRESS:-'http://balena-supervisor:48484'}"
|
||
|
if [ "${with_supervisor}" = "1" ]; then
|
||
|
until curl -s -f "${BALENA_SUPERVISOR_ADDRESS}/v1/healthy" >/dev/null; do
|
||
|
echo "Waiting for supervisor at ${BALENA_SUPERVISOR_ADDRESS}"
|
||
|
sleep 1
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
# Ignore signal if received
|
||
|
ready=1
|
||
|
|
||
|
exec ${cmd}
|