Netmaker add-on: pull prebuilt image from Gitea registry

Home Assistant add-on that joins the instance to a Netmaker network via
netclient. Distributed as a repository add-on using a prebuilt arm64 image
(gitea.savant.io/homeassistant/netmaker) to avoid local buildx.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Savant Coder
2026-07-21 14:05:20 -04:00
commit 2803cf6792
27 changed files with 638 additions and 0 deletions

View File

@ -0,0 +1,68 @@
#!/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"

View File

@ -0,0 +1 @@
oneshot

View File

@ -0,0 +1 @@
/etc/s6-overlay/s6-rc.d/netclient-join/run