Files
operating-system/buildroot-external/rootfs-overlay/usr/sbin/hassos-supervisor
Stefan Agner 303f63c222 Add access to containerd for Supervisor (#2102)
Add direct access to Docker's containerd instance by passing in its GRCP
socket. This can be useful to talk to the containerd GRPC API directly,
which exposes more information than the Docker API (e.g. OOM kill
events).
2022-09-02 14:49:25 +02:00

107 lines
4.7 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="ghcr.io/home-assistant/${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" \
--oom-score-adj=-300 \
-v /run/docker.sock:/run/docker.sock:rw \
-v /run/docker/containerd/containerd.sock:/run/docker/containerd/containerd.sock:rw \
-v /run/systemd-journal-gatewayd.sock:/run/systemd-journal-gatewayd.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_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..."
docker container start hassio_supervisor
exec docker container wait hassio_supervisor