145 lines
No EOL
3.7 KiB
Bash
Executable file
145 lines
No EOL
3.7 KiB
Bash
Executable file
#!/bin/bash
|
|
set -eE
|
|
|
|
SUPERVISOR_VERSON="$(curl -s https://version.home-assistant.io/stable.json | jq -e -r '.supervisor')"
|
|
DOCKER_TIMEOUT=30
|
|
DOCKER_PID=0
|
|
|
|
function start_docker() {
|
|
local starttime
|
|
local endtime
|
|
|
|
if grep -q 'Alpine|standard-WSL' /proc/version; then
|
|
# The docker daemon does not start when running WSL2 without adjusting iptables
|
|
update-alternatives --set iptables /usr/sbin/iptables-legacy || echo "Fails adjust iptables"
|
|
update-alternatives --set ip6tables /usr/sbin/iptables-legacy || echo "Fails adjust ip6tables"
|
|
fi
|
|
|
|
echo "Starting docker."
|
|
dockerd 2> /dev/null &
|
|
DOCKER_PID=$!
|
|
|
|
echo "Waiting for docker to initialize..."
|
|
starttime="$(date +%s)"
|
|
endtime="$(date +%s)"
|
|
until docker info >/dev/null 2>&1; do
|
|
if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then
|
|
sleep 1
|
|
endtime=$(date +%s)
|
|
else
|
|
echo "Timeout while waiting for docker to come up"
|
|
exit 1
|
|
fi
|
|
done
|
|
echo "Docker was initialized"
|
|
}
|
|
|
|
function stop_docker() {
|
|
local starttime
|
|
local endtime
|
|
|
|
echo "Stopping in container docker..."
|
|
if [ "$DOCKER_PID" -gt 0 ] && kill -0 "$DOCKER_PID" 2> /dev/null; then
|
|
starttime="$(date +%s)"
|
|
endtime="$(date +%s)"
|
|
|
|
# Now wait for it to die
|
|
kill "$DOCKER_PID"
|
|
while kill -0 "$DOCKER_PID" 2> /dev/null; do
|
|
if [ $((endtime - starttime)) -le $DOCKER_TIMEOUT ]; then
|
|
sleep 1
|
|
endtime=$(date +%s)
|
|
else
|
|
echo "Timeout while waiting for container docker to die"
|
|
exit 1
|
|
fi
|
|
done
|
|
else
|
|
echo "Your host might have been left with unreleased resources"
|
|
fi
|
|
}
|
|
|
|
|
|
function cleanup_lastboot() {
|
|
if [[ -f /tmp/supervisor_data/config.json ]]; then
|
|
echo "Cleaning up last boot"
|
|
cp /tmp/supervisor_data/config.json /tmp/config.json
|
|
jq -rM 'del(.last_boot)' /tmp/config.json > /tmp/supervisor_data/config.json
|
|
rm /tmp/config.json
|
|
fi
|
|
}
|
|
|
|
|
|
function cleanup_docker() {
|
|
echo "Cleaning up stopped containers..."
|
|
docker rm "$(docker ps -a -q)" || true
|
|
}
|
|
|
|
function run_supervisor() {
|
|
mkdir -p /tmp/supervisor_data
|
|
docker run --rm --privileged \
|
|
--name hassio_supervisor \
|
|
--privileged \
|
|
--security-opt seccomp=unconfined \
|
|
--security-opt apparmor:unconfined \
|
|
-v /run/docker.sock:/run/docker.sock:rw \
|
|
-v /run/dbus:/run/dbus:ro \
|
|
-v /run/udev:/run/udev:ro \
|
|
-v /tmp/supervisor_data:/data:rw \
|
|
-v "$WORKSPACE_DIRECTORY":/data/addons/local:rw \
|
|
-v /etc/machine-id:/etc/machine-id:ro \
|
|
-e SUPERVISOR_SHARE="/tmp/supervisor_data" \
|
|
-e SUPERVISOR_NAME=hassio_supervisor \
|
|
-e SUPERVISOR_DEV=1 \
|
|
-e SUPERVISOR_MACHINE="qemux86-64" \
|
|
"homeassistant/amd64-hassio-supervisor:${SUPERVISOR_VERSON}"
|
|
}
|
|
|
|
function init_dbus() {
|
|
if pgrep dbus-daemon; then
|
|
echo "Dbus is running"
|
|
return 0
|
|
fi
|
|
|
|
echo "Startup dbus"
|
|
mkdir -p /var/lib/dbus
|
|
cp -f /etc/machine-id /var/lib/dbus/machine-id
|
|
|
|
# cleanups
|
|
mkdir -p /run/dbus
|
|
rm -f /run/dbus/pid
|
|
|
|
# run
|
|
dbus-daemon --system --print-address
|
|
}
|
|
|
|
function init_udev() {
|
|
if pgrep systemd-udevd; then
|
|
echo "udev is running"
|
|
return 0
|
|
fi
|
|
|
|
echo "Startup udev"
|
|
|
|
# cleanups
|
|
mkdir -p /run/udev
|
|
|
|
# run
|
|
/lib/systemd/systemd-udevd --daemon
|
|
sleep 3
|
|
udevadm trigger && udevadm settle
|
|
}
|
|
|
|
echo "Start Test-Env"
|
|
|
|
start_docker
|
|
trap "stop_docker" ERR
|
|
|
|
docker system prune -f
|
|
|
|
cleanup_lastboot
|
|
cleanup_docker
|
|
init_dbus
|
|
init_udev
|
|
run_supervisor
|
|
stop_docker |