Convert to s6-overlay v2 (cont-init.d + services.d) for base 10.1.1
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 <noreply@anthropic.com>
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Netmaker
|
name: Netmaker
|
||||||
version: 0.1.0
|
version: 0.1.1
|
||||||
slug: netmaker
|
slug: netmaker
|
||||||
description: Join your Home Assistant instance to a Netmaker WireGuard network
|
description: Join your Home Assistant instance to a Netmaker WireGuard network
|
||||||
url: https://github.com/hassio-addons/app-netmaker
|
url: https://github.com/hassio-addons/app-netmaker
|
||||||
|
|||||||
@ -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
|
|
||||||
$@
|
|
||||||
}
|
|
||||||
|
|
||||||
$@
|
|
||||||
@ -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
|
|
||||||
@ -1 +0,0 @@
|
|||||||
oneshot
|
|
||||||
@ -1 +0,0 @@
|
|||||||
/etc/s6-overlay/s6-rc.d/local-network/run
|
|
||||||
@ -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=$(</run/s6-linux-init-container-results/exitcode)
|
|
||||||
readonly exit_code_service="${1}"
|
|
||||||
readonly exit_code_signal="${2}"
|
|
||||||
readonly service="netclient-daemon"
|
|
||||||
|
|
||||||
declare iface
|
|
||||||
|
|
||||||
bashio::log.info \
|
|
||||||
"Service ${service} exited with code ${exit_code_service}" \
|
|
||||||
"(by signal ${exit_code_signal})"
|
|
||||||
|
|
||||||
# Replicate the cleanup netclient's container entrypoint performs on shutdown.
|
|
||||||
# The daemon is exec'd, so its own shell trap does not survive; do it here.
|
|
||||||
iface=$(bashio::config 'interface')
|
|
||||||
if bashio::var.is_empty "${iface}"; then
|
|
||||||
iface="netmaker"
|
|
||||||
fi
|
|
||||||
ip rule delete pref 3000 2> /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
|
|
||||||
@ -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}"
|
|
||||||
@ -1 +0,0 @@
|
|||||||
longrun
|
|
||||||
@ -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"
|
|
||||||
@ -1 +0,0 @@
|
|||||||
oneshot
|
|
||||||
@ -1 +0,0 @@
|
|||||||
/etc/s6-overlay/s6-rc.d/netclient-join/run
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
#!/command/with-contenv bashio
|
#!/usr/bin/with-contenv bashio
|
||||||
# shellcheck shell=bash
|
# shellcheck shell=bash
|
||||||
export LOG_FD
|
export LOG_FD
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user