* Recreate Supervisor container on OS upgrade/downgrade When the operating system gets upgraded or downgraded the Supervisor start script might start the Supervisor slightly differently (e.g. with RT scheduling support). If the container has already been created, a OS upgrade or downgrade won't recreate the Supervisor container. * Move startup script version file to /mnt/data
104 lines
4.4 KiB
Bash
Executable File
104 lines
4.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# shellcheck disable=SC1091
|
|
# ==============================================================================
|
|
# Supervisor on HassOS
|
|
# ==============================================================================
|
|
set -e
|
|
|
|
# Load configs
|
|
. /etc/os-release
|
|
|
|
# Init supervisor
|
|
SUPERVISOR_DATA=/mnt/data/supervisor
|
|
SUPERVISOR_STARTUP_MARKER="/run/supervisor/startup-marker"
|
|
SUPERVISOR_STARTSCRIPT_VERSION="/mnt/data/.hassos-supervisor-version"
|
|
SUPERVISOR_IMAGE="homeassistant/${SUPERVISOR_ARCH}-hassio-supervisor"
|
|
|
|
SUPERVISOR_IMAGE_ID=$(docker images --no-trunc --filter "reference=${SUPERVISOR_IMAGE}:latest" --format "{{.ID}}" || echo "")
|
|
SUPERVISOR_CONTAINER_ID=$(docker inspect --format='{{.Image}}' hassio_supervisor || echo "")
|
|
|
|
# Check if previous run left the startup-marker in place. If so, we assume the
|
|
# Container image or container is somehow corrupted.
|
|
# Delete the container, delete the image, pull a fresh one
|
|
if [ -f "${SUPERVISOR_STARTUP_MARKER}" ]; then
|
|
echo "[WARNING] Supervisor container did not remove the startup marker file. Assuming container image or container corruption."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
# Make sure we delete all supervisor images
|
|
SUPERVISOR_IMAGE_IDS=$(docker images --no-trunc --filter "reference=${SUPERVISOR_IMAGE}" --format "{{.ID}}" | uniq || echo "")
|
|
docker image rm --force "${SUPERVISOR_IMAGE_IDS}" || true
|
|
SUPERVISOR_IMAGE_ID=""
|
|
fi
|
|
|
|
# If Supervisor image is missing, pull it
|
|
mkdir -p "$(dirname ${SUPERVISOR_STARTUP_MARKER})"
|
|
touch ${SUPERVISOR_STARTUP_MARKER}
|
|
if [ -z "${SUPERVISOR_IMAGE_ID}" ]; then
|
|
# Get the latest from update information
|
|
# Using updater information instead of config. If the config version is
|
|
# broken, this creates a way (e.g., bad release).
|
|
SUPERVISOR_VERSION=$(jq -r '.supervisor // "latest"' "${SUPERVISOR_DATA}/updater.json" || echo "latest")
|
|
|
|
echo "[WARNING] Supervisor image missing, downloading a fresh one: ${SUPERVISOR_VERSION}"
|
|
|
|
# Pull in the Supervisor
|
|
if docker pull "${SUPERVISOR_IMAGE}:${SUPERVISOR_VERSION}"; then
|
|
# Tag as latest if versioned
|
|
if [ "${SUPERVISOR_VERSION}" != "latest" ]; then
|
|
docker tag "${SUPERVISOR_IMAGE}:${SUPERVISOR_VERSION}" "${SUPERVISOR_IMAGE}:latest"
|
|
fi
|
|
else
|
|
# Pull failed, updater info might be corrupted, re-trying with latest
|
|
echo "[WARNING] Supervisor downloading failed trying: latest"
|
|
docker pull "${SUPERVISOR_IMAGE}:latest"
|
|
fi
|
|
|
|
SUPERVISOR_IMAGE_ID=$(docker inspect --format='{{.Id}}' "${SUPERVISOR_IMAGE}" || echo "")
|
|
fi
|
|
|
|
if [ -n "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
# Image changed, remove previous container
|
|
if [ "${SUPERVISOR_IMAGE_ID}" != "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
echo "[INFO] Supervisor image has been updated, destroying previous container..."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
fi
|
|
|
|
# Start script changed, remove previous container
|
|
# shellcheck disable=SC3013
|
|
if [ ! -f "${SUPERVISOR_STARTSCRIPT_VERSION}" ] || [ "${SUPERVISOR_STARTSCRIPT_VERSION}" -nt "$0" ] || [ "${SUPERVISOR_STARTSCRIPT_VERSION}" -ot "$0" ]; then
|
|
echo "[INFO] Supervisor start script has changed, destroying previous container..."
|
|
docker container rm --force hassio_supervisor || true
|
|
SUPERVISOR_CONTAINER_ID=""
|
|
fi
|
|
fi
|
|
|
|
# If Supervisor container is missing, create it
|
|
if [ -z "${SUPERVISOR_CONTAINER_ID}" ]; then
|
|
echo "[INFO] Creating a new Supervisor container..."
|
|
# shellcheck disable=SC2086
|
|
docker container create \
|
|
--name hassio_supervisor \
|
|
--privileged --security-opt apparmor="hassio-supervisor" \
|
|
-v /run/docker.sock:/run/docker.sock:rw \
|
|
-v /run/dbus:/run/dbus:ro \
|
|
-v /run/supervisor:/run/os:rw \
|
|
-v /run/udev:/run/udev:ro \
|
|
-v /etc/machine-id:/etc/machine-id:ro \
|
|
-v ${SUPERVISOR_DATA}:/data:rw \
|
|
-e SUPERVISOR_SHARE=${SUPERVISOR_DATA} \
|
|
-e SUPERVISOR_NAME=hassio_supervisor \
|
|
-e SUPERVISOR_CPU_RT=1 \
|
|
-e SUPERVISOR_MACHINE=${SUPERVISOR_MACHINE} \
|
|
"${SUPERVISOR_IMAGE}:latest"
|
|
|
|
# Store the timestamp of this script. If the script changed, let's
|
|
# recreate the container automatically.
|
|
touch --reference="$0" "${SUPERVISOR_STARTSCRIPT_VERSION}"
|
|
fi
|
|
|
|
# Run supervisor
|
|
mkdir -p ${SUPERVISOR_DATA}
|
|
echo "[INFO] Starting the Supervisor..."
|
|
exec docker container start --attach hassio_supervisor
|