From a038193fc151b880662afc00880e2068be87a228 Mon Sep 17 00:00:00 2001 From: Savant Coder Date: Tue, 21 Jul 2026 14:25:06 -0400 Subject: [PATCH] Convert to s6-overlay v2 (cont-init.d + services.d) for base 10.1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Base image ghcr.io/hassio-addons/base 10.1.1 uses s6-overlay v2, which ignores the s6-rc.d (v3) structure — netclient never started. Reimplement as v2: cont-init.d/10-persist + 20-join run before services.d/netclient (daemon). Release 0.1.1. Co-Authored-By: Claude Opus 4.8 --- netmaker/config.yaml | 2 +- netmaker/rootfs/command/with-contenv-merge | 14 ---- .../s6-rc.d/local-network/dependencies.d/base | 0 .../etc/s6-overlay/s6-rc.d/local-network/run | 29 -------- .../etc/s6-overlay/s6-rc.d/local-network/type | 1 - .../etc/s6-overlay/s6-rc.d/local-network/up | 1 - .../netclient-daemon/dependencies.d/base | 0 .../s6-rc.d/netclient-daemon/finish | 40 ----------- .../s6-overlay/s6-rc.d/netclient-daemon/run | 39 ----------- .../s6-overlay/s6-rc.d/netclient-daemon/type | 1 - .../dependencies.d/local-network | 0 .../dependencies.d/netclient-daemon | 0 .../etc/s6-overlay/s6-rc.d/netclient-join/run | 68 ------------------- .../s6-overlay/s6-rc.d/netclient-join/type | 1 - .../etc/s6-overlay/s6-rc.d/netclient-join/up | 1 - .../s6-rc.d/user/contents.d/netclient-daemon | 0 .../s6-rc.d/user/contents.d/netclient-join | 0 netmaker/rootfs/usr/bin/healthcheck | 2 +- 18 files changed, 2 insertions(+), 197 deletions(-) delete mode 100644 netmaker/rootfs/command/with-contenv-merge delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/dependencies.d/base delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/run delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/type delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/up delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/dependencies.d/base delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/finish delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/run delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/type delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/local-network delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/netclient-daemon delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/run delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/type delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/up delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-daemon delete mode 100644 netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-join diff --git a/netmaker/config.yaml b/netmaker/config.yaml index 4ae76c7..70d524a 100644 --- a/netmaker/config.yaml +++ b/netmaker/config.yaml @@ -1,6 +1,6 @@ --- name: Netmaker -version: 0.1.0 +version: 0.1.1 slug: netmaker description: Join your Home Assistant instance to a Netmaker WireGuard network url: https://github.com/hassio-addons/app-netmaker diff --git a/netmaker/rootfs/command/with-contenv-merge b/netmaker/rootfs/command/with-contenv-merge deleted file mode 100644 index 596bfc6..0000000 --- a/netmaker/rootfs/command/with-contenv-merge +++ /dev/null @@ -1,14 +0,0 @@ -#!/command/execlineb -S0 - -ifelse -{ - importas -D 0 S6_KEEP_ENV S6_KEEP_ENV - eltest 0${S6_KEEP_ENV} -eq 0 -} -{ - s6-envdir -Lf -- /run/s6/container_environment - exec - $@ -} - -$@ diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/dependencies.d/base b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/dependencies.d/base deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/run b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/run deleted file mode 100644 index 31c7e06..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/run +++ /dev/null @@ -1,29 +0,0 @@ -#!/command/with-contenv bashio -# shellcheck shell=bash -export LOG_FD -# ============================================================================== -# Wait for the local network (default HA interface) to be ready -# ============================================================================== - -readonly WAIT_DELAY=5 # 5s -readonly WAIT_COUNT=60 # 60*5s = 300s = 5m - -declare wait_counter=0 - -# Some services need a working local network to function properly. -# They can mark this service as dependency, and wait for the successful startup. - -# Until HA has no default interface, we wait a little -while ! bashio::api.supervisor GET "/network/interface/default/info" false &> /dev/null; do - if (( wait_counter++ == WAIT_COUNT )); then - # We emit only a warning to let the app start, maybe this is the only connection to access the device, better to start than not. - # Let netclient figure out a way to connect to the network if the local network is temporarily down. - bashio::log.warning "Local network (default Home Assistant interface) is unreachable" - break - fi - bashio::log.info "Waiting for the local network (default Home Assistant interface) to be ready..." - sleep $WAIT_DELAY -done -if (( wait_counter != 0 && wait_counter <= WAIT_COUNT )); then - bashio::log.info "Local network is ready" -fi diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/type b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/type deleted file mode 100644 index bdd22a1..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/type +++ /dev/null @@ -1 +0,0 @@ -oneshot diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/up b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/up deleted file mode 100644 index 0831d37..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/local-network/up +++ /dev/null @@ -1 +0,0 @@ -/etc/s6-overlay/s6-rc.d/local-network/run diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/dependencies.d/base b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/dependencies.d/base deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/finish b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/finish deleted file mode 100644 index 326fbe8..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/finish +++ /dev/null @@ -1,40 +0,0 @@ -#!/command/with-contenv bashio -# shellcheck shell=bash -export LOG_FD -# ============================================================================== -# Home Assistant Community App: Netmaker -# Cleans up on daemon exit and takes down the S6 supervision tree on failure -# ============================================================================== -readonly exit_code_container=$( /dev/null || true -ip rule delete pref 2500 2> /dev/null || true -ip rule delete pref 2000 2> /dev/null || true -ip link del "${iface}" 2> /dev/null || true - -if [[ "${exit_code_service}" -eq 256 ]]; then - if [[ "${exit_code_container}" -eq 0 ]]; then - echo $((128 + $exit_code_signal)) > /run/s6-linux-init-container-results/exitcode - fi - [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt -elif [[ "${exit_code_service}" -ne 0 ]]; then - if [[ "${exit_code_container}" -eq 0 ]]; then - echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode - fi - exec /run/s6/basedir/bin/halt -fi diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/run b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/run deleted file mode 100644 index fbdbe8e..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/run +++ /dev/null @@ -1,39 +0,0 @@ -#!/command/with-contenv bashio -# shellcheck shell=bash -export LOG_FD -# ============================================================================== -# Home Assistant Community App: Netmaker -# Runs the netclient daemon -# ============================================================================== -declare log_level -declare verbosity - -bashio::log.info 'Starting Netmaker netclient...' - -# Netclient stores its host identity, keys and node/server config under the -# hard-coded path /etc/netclient/. Persist it across restarts by pointing that -# path at the add-on's /data volume so the node is not re-registered each boot. -mkdir -p /data/netclient -if [ ! -L /etc/netclient ]; then - # Migrate anything an earlier image may have written to the real directory - if [ -d /etc/netclient ] && [ ! -d /data/netclient/.migrated ]; then - cp -a /etc/netclient/. /data/netclient/ 2>/dev/null || true - rm -rf /etc/netclient - fi - ln -sf /data/netclient /etc/netclient -fi - -# Map the app's log_level to netclient's numeric verbosity (0..4) -log_level=$(bashio::config 'log_level') -case "${log_level}" in - trace) verbosity=4 ;; - debug) verbosity=3 ;; - info|notice) verbosity=2 ;; - warning) verbosity=1 ;; - error|fatal) verbosity=0 ;; - *) verbosity=2 ;; -esac - -# Run the daemon in the foreground so s6 supervises it directly. -# functions.Daemon() blocks and handles SIGTERM (clean shutdown) / SIGHUP (reload). -exec /opt/netclient daemon -v "${verbosity}" diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/type b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/type deleted file mode 100644 index 5883cff..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-daemon/type +++ /dev/null @@ -1 +0,0 @@ -longrun diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/local-network b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/local-network deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/netclient-daemon b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/dependencies.d/netclient-daemon deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/run b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/run deleted file mode 100644 index a5388f1..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/run +++ /dev/null @@ -1,68 +0,0 @@ -#!/command/with-contenv bashio -# shellcheck shell=bash -export LOG_FD -# ============================================================================== -# Home Assistant Community App: Netmaker -# Joins the netmaker network once, using an enrollment token -# ============================================================================== -declare token -declare -a options=() -declare value -declare wait_counter=0 - -readonly NODES_FILE="/etc/netclient/nodes.json" -readonly WAIT_DELAY=2 -readonly WAIT_COUNT=30 # 30*2s = 60s - -# An enrollment token is required for a headless join. The token is a base64 -# blob that already embeds the netmaker server address, so nothing else is -# needed to reach the server. -token=$(bashio::config 'enrollment_token') -if bashio::var.is_empty "${token}"; then - bashio::exit.nok \ - "No 'enrollment_token' configured. Generate one in your Netmaker dashboard" \ - "(Enrollment Keys) and set it in this app's configuration." -fi - -# If this host is already registered to a network, don't join again. The daemon -# keeps nodes.json populated; a non-empty object means we have joined before. -if bashio::fs.file_exists "${NODES_FILE}" \ - && jq --exit-status 'length > 0' "${NODES_FILE}" > /dev/null 2>&1; then - bashio::log.info "netclient is already joined to a network, skipping join" - exit 0 -fi - -# Build the optional join flags from configuration. -if value=$(bashio::config 'host_name') && bashio::var.has_value "${value}"; then - options+=(-o "${value}") -fi -if bashio::config.has_value 'port' && [[ "$(bashio::config 'port')" -ne 0 ]]; then - options+=(-p "$(bashio::config 'port')") -fi -if value=$(bashio::config 'interface') && bashio::var.has_value "${value}"; then - options+=(-I "${value}") -fi -if value=$(bashio::config 'endpoint') && bashio::var.has_value "${value}"; then - options+=(-e "${value}") -fi -if value=$(bashio::config 'endpoint6') && bashio::var.has_value "${value}"; then - options+=(-E "${value}") -fi -if value=$(bashio::config 'firewall') && bashio::var.has_value "${value}"; then - options+=(-f "${value}") -fi - -# Give the daemon a moment to initialize its config directory before joining. -while [ ! -d /etc/netclient ]; do - if (( wait_counter++ == WAIT_COUNT )); then - break - fi - sleep "${WAIT_DELAY}" -done - -bashio::log.info "Joining netmaker network..." -if ! /opt/netclient join -t "${token}" "${options[@]}"; then - bashio::exit.nok "Failed to join the netmaker network" -fi - -bashio::log.info "Successfully joined the netmaker network" diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/type b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/type deleted file mode 100644 index bdd22a1..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/type +++ /dev/null @@ -1 +0,0 @@ -oneshot diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/up b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/up deleted file mode 100644 index ab1a418..0000000 --- a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/netclient-join/up +++ /dev/null @@ -1 +0,0 @@ -/etc/s6-overlay/s6-rc.d/netclient-join/run diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-daemon b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-daemon deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-join b/netmaker/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/netclient-join deleted file mode 100644 index e69de29..0000000 diff --git a/netmaker/rootfs/usr/bin/healthcheck b/netmaker/rootfs/usr/bin/healthcheck index 9a720b8..dd04732 100644 --- a/netmaker/rootfs/usr/bin/healthcheck +++ b/netmaker/rootfs/usr/bin/healthcheck @@ -1,4 +1,4 @@ -#!/command/with-contenv bashio +#!/usr/bin/with-contenv bashio # shellcheck shell=bash export LOG_FD