Converting the supervised installer to a deb file (#154)

* laying the groundwork

* moving more stuff

* move files into place

* add control

* postinst script

* preinst

* added more to postinst and preinst

* I think this works

* fix gitignore and control

* fixes

* Delete homeassistant-supervised.deb

* Check network connection

* first test of build deb

* test 2

* create changelog

* switch to lowercase for github action

* test without args

* fix typo in example changelog

* Resolve errors

* Space out control

* added files to gitignore

* update gitignore

* putting everything in place

* revert actions changes

* Test action

* test workflow

* new action

* get rid of push

* set version number to match os agent format

* added machine type select

* move bin

* postrm undo dpkg-divert
This commit is contained in:
Matheson Steplock 2021-10-26 04:22:03 -04:00 committed by GitHub
parent 3717667ff1
commit 6003c366f9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 224 additions and 0 deletions

21
.github/workflows/build-deb.yml vendored Normal file
View file

@ -0,0 +1,21 @@
name: Build Deb Package
# yamllint disable-line rule:truthy
on:
workflow_dispatch:
release:
types: ["published"]
jobs:
build-deb-package:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- run: chmod 755 homeassistant-supervised/DEBIAN/p*
- run: dpkg-deb --build --root-owner-group homeassistant-supervised
- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: homeassistant-supervised.deb

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
homeassistant-supervised.deb

View file

@ -0,0 +1,14 @@
Package: homeassistant-supervised
Section: base
Version: 1.0.0
Priority: optional
Architecture: all
Depends: curl, bash, docker-ce, dbus, network-manager, apparmor, jq, systemd, os-agent
Maintainer: Matheson Steplock <https://mathesonsteplock.ca/>
Homepage: https://www.home-assistant.io/
Description: Home Assistant Supervised
This installation method provides the full Home Assistant experience on a regular operating system.
This means, all components from the Home Assistant method are used, except for the Home Assistant Operating System.
This system will run the Home Assistant Supervisor. The Supervisor is not just an application, it is a full appliance that manages the whole system.
It will clean up, repair or reset settings to default if they no longer match expected values.

View file

@ -0,0 +1,129 @@
#!/usr/bin/env bash
set -e
function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; exit 1; }
. /usr/share/debconf/confmodule
ARCH=$(uname -m)
BINARY_DOCKER=/usr/bin/docker
DOCKER_REPO=homeassistant
SERVICE_DOCKER="docker.service"
SERVICE_NM="NetworkManager.service"
# Read infos from web
URL_VERSION_HOST="version.home-assistant.io"
URL_VERSION="https://version.home-assistant.io/stable.json"
HASSIO_VERSION=$(curl -s $URL_VERSION | jq -e -r '.supervisor')
URL_APPARMOR_PROFILE="https://version.home-assistant.io/apparmor.txt"
# Restart NetworkManager
info "Restarting NetworkManager"
systemctl restart "${SERVICE_NM}"
# Restart Docker service
info "Restarting docker service"
systemctl restart "$SERVICE_DOCKER"
# Check network connection
while ! ping -c 1 -W 1 ${URL_VERSION_HOST}; do
info "Waiting for ${URL_VERSION_HOST} - network interface might be down..."
sleep 2
done
case $ARCH in
"i386" | "i686")
MACHINE=${MACHINE:=qemux86}
HASSIO_DOCKER="$DOCKER_REPO/i386-hassio-supervisor"
;;
"x86_64")
MACHINE=${MACHINE:=qemux86-64}
HASSIO_DOCKER="$DOCKER_REPO/amd64-hassio-supervisor"
;;
"arm" |"armv6l")
if [ -z $MACHINE ]; then
db_input critical ha/machine-type | true
db_go || true
db_get ha/machine-type || true
MACHINE="$RET"
db_stop
fi
HASSIO_DOCKER="$DOCKER_REPO/armhf-hassio-supervisor"
;;
"armv7l")
if [ -z $MACHINE ]; then
db_input critical ha/machine-type | true
db_go || true
db_get ha/machine-type || true
MACHINE="$RET"
db_stop
fi
HASSIO_DOCKER="$DOCKER_REPO/armv7-hassio-supervisor"
;;
"aarch64")
if [ -z $MACHINE ]; then
db_input critical ha/machine-type | true
db_go || true
db_get ha/machine-type || true
MACHINE="$RET"
db_stop
fi
HASSIO_DOCKER="$DOCKER_REPO/aarch64-hassio-supervisor"
;;
*)
error "$ARCH unknown!"
;;
esac
PREFIX=${PREFIX:-/usr}
SYSCONFDIR=${SYSCONFDIR:-/etc}
DATA_SHARE=${DATA_SHARE:-$PREFIX/share/hassio}
CONFIG=$SYSCONFDIR/hassio.json
cat > "$CONFIG" <<- EOF
{
"supervisor": "${HASSIO_DOCKER}",
"machine": "${MACHINE}",
"data": "${DATA_SHARE}"
}
EOF
# Pull Supervisor image
info "Install supervisor Docker container"
docker pull "$HASSIO_DOCKER:$HASSIO_VERSION" > /dev/null
docker tag "$HASSIO_DOCKER:$HASSIO_VERSION" "$HASSIO_DOCKER:latest" > /dev/null
# Install Supervisor
info "Install supervisor startup scripts"
sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}"/sbin/hassio-supervisor
sed -i -e "s,%%BINARY_DOCKER%%,${BINARY_DOCKER},g" \
-e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
-e "s,%%BINARY_HASSIO%%,${PREFIX}/sbin/hassio-supervisor,g" \
"${SYSCONFDIR}/systemd/system/hassio-supervisor.service"
chmod a+x "${PREFIX}/sbin/hassio-supervisor"
systemctl enable hassio-supervisor.service > /dev/null 2>&1;
# Install AppArmor
info "Install AppArmor scripts"
curl -sL ${URL_APPARMOR_PROFILE} > "${DATA_SHARE}/apparmor/hassio-supervisor"
sed -i "s,%%HASSIO_CONFIG%%,${CONFIG},g" "${PREFIX}/sbin/hassio-apparmor"
sed -i -e "s,%%SERVICE_DOCKER%%,${SERVICE_DOCKER},g" \
-e "s,%%HASSIO_APPARMOR_BINARY%%,${PREFIX}/sbin/hassio-apparmor,g" \
"${SYSCONFDIR}/systemd/system/hassio-apparmor.service"
chmod a+x "${PREFIX}/sbin/hassio-apparmor"
systemctl enable hassio-apparmor.service > /dev/null 2>&1;
systemctl start hassio-apparmor.service
# Start Supervisor
info "Start Home Assistant Supervised"
systemctl start hassio-supervisor.service
# Install HA CLI
info "Installing the 'ha' cli"
chmod a+x "${PREFIX}/bin/ha"

View file

@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -e
function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; exit 1; }
# Undo diversions
dpkg-divert --package homeassistant-supervised --remove --rename \
--divert /etc/NetworkManager/NetworkManager.conf.real /etc/NetworkManager/NetworkManager.conf
dpkg-divert --package homeassistant-supervised --remove --rename \
--divert /etc/NetworkManager/system-connections/default.real /etc/NetworkManager/system-connections/default
dpkg-divert --package homeassistant-supervised --remove --rename \
--divert /etc/docker/daemon.json.real /etc/docker/daemon.json
dpkg-divert --package homeassistant-supervised --remove --rename \
--divert /etc/network/interfaces.real /etc/network/interfaces

View file

@ -0,0 +1,36 @@
#!/usr/bin/env bash
set -e
function info { echo -e "\e[32m[info] $*\e[39m"; }
function warn { echo -e "\e[33m[warn] $*\e[39m"; }
function error { echo -e "\e[31m[error] $*\e[39m"; exit 1; }
warn ""
warn "If you want more control over your own system, run"
warn "Home Assistant as a VM or run Home Assistant Core"
warn "via a Docker container."
warn ""
# Check if Modem Manager is enabled
if systemctl is-enabled ModemManager.service &> /dev/null; then
warn "ModemManager service is enabled. This might cause issue when using serial devices."
fi
# Check dmesg access
if [[ "$(sysctl --values kernel.dmesg_restrict)" != "0" ]]; then
info "Fix kernel dmesg restriction"
echo 0 > /proc/sys/kernel/dmesg_restrict
echo "kernel.dmesg_restrict=0" >> /etc/sysctl.conf
fi
dpkg-divert --package homeassistant-supervised --add --rename \
--divert /etc/NetworkManager/NetworkManager.conf.real /etc/NetworkManager/NetworkManager.conf
dpkg-divert --package homeassistant-supervised --add --rename \
--divert /etc/NetworkManager/system-connections/default.real /etc/NetworkManager/system-connections/default
dpkg-divert --package homeassistant-supervised --add --rename \
--divert /etc/docker/daemon.json.real /etc/docker/daemon.json
dpkg-divert --package homeassistant-supervised --add --rename \
--divert /etc/network/interfaces.real /etc/network/interfaces

View file

@ -0,0 +1,4 @@
Template: ha/machine-type
Type: Select
Choices: generic-x86-64, odroid-c2, odroid-n2, odroid-xu, qemuarm, qemuarm-64, qemux86, qemux86-64, raspberrypi, raspberrypi2, raspberrypi3, raspberrypi4, raspberrypi3-64, raspberrypi4-64, tinker, khadas-vim3
Description: Select machine type