From 6003c366f94bbe9bd4226a0412efb25bb2e92e72 Mon Sep 17 00:00:00 2001 From: Matheson Steplock Date: Tue, 26 Oct 2021 04:22:03 -0400 Subject: [PATCH] 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 --- .github/workflows/build-deb.yml | 21 +++ .gitignore | 2 + homeassistant-supervised/DEBIAN/control | 14 ++ homeassistant-supervised/DEBIAN/postinst | 129 ++++++++++++++++++ homeassistant-supervised/DEBIAN/postrm | 18 +++ homeassistant-supervised/DEBIAN/preinst | 36 +++++ homeassistant-supervised/DEBIAN/templates | 4 + .../etc/NetworkManager}/NetworkManager.conf | 0 .../NetworkManager/system-connections/default | 0 .../etc/docker/daemon.json | 0 .../etc/network}/interfaces | 0 .../systemd/system}/hassio-apparmor.service | 0 .../systemd/system}/hassio-supervisor.service | 0 .../usr/bin}/ha | 0 .../usr/sbin}/hassio-apparmor | 0 .../usr/sbin}/hassio-supervisor | 0 .../share/hassio/apparmor/hassio-supervisor | 0 17 files changed, 224 insertions(+) create mode 100644 .github/workflows/build-deb.yml create mode 100644 .gitignore create mode 100755 homeassistant-supervised/DEBIAN/control create mode 100755 homeassistant-supervised/DEBIAN/postinst create mode 100644 homeassistant-supervised/DEBIAN/postrm create mode 100755 homeassistant-supervised/DEBIAN/preinst create mode 100755 homeassistant-supervised/DEBIAN/templates rename {files => homeassistant-supervised/etc/NetworkManager}/NetworkManager.conf (100%) rename files/system-connection-default => homeassistant-supervised/etc/NetworkManager/system-connections/default (100%) rename files/docker_daemon.json => homeassistant-supervised/etc/docker/daemon.json (100%) rename {files => homeassistant-supervised/etc/network}/interfaces (100%) rename {files => homeassistant-supervised/etc/systemd/system}/hassio-apparmor.service (100%) rename {files => homeassistant-supervised/etc/systemd/system}/hassio-supervisor.service (100%) rename {files => homeassistant-supervised/usr/bin}/ha (100%) rename {files => homeassistant-supervised/usr/sbin}/hassio-apparmor (100%) rename {files => homeassistant-supervised/usr/sbin}/hassio-supervisor (100%) create mode 100644 homeassistant-supervised/usr/share/hassio/apparmor/hassio-supervisor diff --git a/.github/workflows/build-deb.yml b/.github/workflows/build-deb.yml new file mode 100644 index 0000000..3be2eed --- /dev/null +++ b/.github/workflows/build-deb.yml @@ -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 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b430296 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +homeassistant-supervised.deb + diff --git a/homeassistant-supervised/DEBIAN/control b/homeassistant-supervised/DEBIAN/control new file mode 100755 index 0000000..0cedd0b --- /dev/null +++ b/homeassistant-supervised/DEBIAN/control @@ -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 +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. + diff --git a/homeassistant-supervised/DEBIAN/postinst b/homeassistant-supervised/DEBIAN/postinst new file mode 100755 index 0000000..24d5670 --- /dev/null +++ b/homeassistant-supervised/DEBIAN/postinst @@ -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" + diff --git a/homeassistant-supervised/DEBIAN/postrm b/homeassistant-supervised/DEBIAN/postrm new file mode 100644 index 0000000..c0d34ea --- /dev/null +++ b/homeassistant-supervised/DEBIAN/postrm @@ -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 \ No newline at end of file diff --git a/homeassistant-supervised/DEBIAN/preinst b/homeassistant-supervised/DEBIAN/preinst new file mode 100755 index 0000000..cc37f50 --- /dev/null +++ b/homeassistant-supervised/DEBIAN/preinst @@ -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 \ No newline at end of file diff --git a/homeassistant-supervised/DEBIAN/templates b/homeassistant-supervised/DEBIAN/templates new file mode 100755 index 0000000..ff9cda4 --- /dev/null +++ b/homeassistant-supervised/DEBIAN/templates @@ -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 \ No newline at end of file diff --git a/files/NetworkManager.conf b/homeassistant-supervised/etc/NetworkManager/NetworkManager.conf similarity index 100% rename from files/NetworkManager.conf rename to homeassistant-supervised/etc/NetworkManager/NetworkManager.conf diff --git a/files/system-connection-default b/homeassistant-supervised/etc/NetworkManager/system-connections/default similarity index 100% rename from files/system-connection-default rename to homeassistant-supervised/etc/NetworkManager/system-connections/default diff --git a/files/docker_daemon.json b/homeassistant-supervised/etc/docker/daemon.json similarity index 100% rename from files/docker_daemon.json rename to homeassistant-supervised/etc/docker/daemon.json diff --git a/files/interfaces b/homeassistant-supervised/etc/network/interfaces similarity index 100% rename from files/interfaces rename to homeassistant-supervised/etc/network/interfaces diff --git a/files/hassio-apparmor.service b/homeassistant-supervised/etc/systemd/system/hassio-apparmor.service similarity index 100% rename from files/hassio-apparmor.service rename to homeassistant-supervised/etc/systemd/system/hassio-apparmor.service diff --git a/files/hassio-supervisor.service b/homeassistant-supervised/etc/systemd/system/hassio-supervisor.service similarity index 100% rename from files/hassio-supervisor.service rename to homeassistant-supervised/etc/systemd/system/hassio-supervisor.service diff --git a/files/ha b/homeassistant-supervised/usr/bin/ha similarity index 100% rename from files/ha rename to homeassistant-supervised/usr/bin/ha diff --git a/files/hassio-apparmor b/homeassistant-supervised/usr/sbin/hassio-apparmor similarity index 100% rename from files/hassio-apparmor rename to homeassistant-supervised/usr/sbin/hassio-apparmor diff --git a/files/hassio-supervisor b/homeassistant-supervised/usr/sbin/hassio-supervisor similarity index 100% rename from files/hassio-supervisor rename to homeassistant-supervised/usr/sbin/hassio-supervisor diff --git a/homeassistant-supervised/usr/share/hassio/apparmor/hassio-supervisor b/homeassistant-supervised/usr/share/hassio/apparmor/hassio-supervisor new file mode 100644 index 0000000..e69de29