v0.14.15-fix

This commit is contained in:
Mateusz Gruszczyński
2026-09-16 17:07:17 +02:00
parent 1862fed87f
commit c7d47db64e
26 changed files with 324 additions and 377 deletions
+56 -3
View File
@@ -2,6 +2,8 @@
set -Eeuo pipefail
CONFIG=/data/options.json
readonly HA_HTTP_PORT=8787
SUPERVISOR_API="${SUPERVISOR:-http://supervisor}"
read_option() {
local key="$1" default_value="${2-}"
@@ -13,6 +15,44 @@ read_option() {
fi
}
supervisor_get() {
local path="$1"
[[ -n "${SUPERVISOR_TOKEN:-}" ]] || return 1
curl --fail --silent --show-error --max-time 5 \
-H "Authorization: Bearer ${SUPERVISOR_TOKEN}" \
"${SUPERVISOR_API%/}${path}"
}
validate_ingress_port_contract() {
local payload ingress_port
payload="$(supervisor_get /addons/self/info 2>/dev/null || true)"
[[ -n "$payload" ]] || return 0
ingress_port="$(jq -r '.data.ingress_port // empty' <<<"$payload" 2>/dev/null || true)"
if [[ "$ingress_port" =~ ^[0-9]+$ ]] && (( ingress_port != HA_HTTP_PORT )); then
printf 'GREE Controller: refusing to start: HA ingress_port=%s but the add-on HTTP port contract is %s. Reinstall/update the official add-on package instead of changing ingress_port manually.\n' \
"$ingress_port" "$HA_HTTP_PORT" >&2
exit 78
fi
}
detect_primary_host_ipv4() {
local payload address
payload="$(supervisor_get /network/info 2>/dev/null || true)"
[[ -n "$payload" ]] || return 1
address="$(jq -r '
(.data.interfaces // [])
| (if type == "object" then [to_entries[] | (.value + {interface: (.value.interface // .key)})] else . end)
| map(select((.enabled // true) == true and (.connected // true) == true))
| map(. + {candidate_ipv4: (.ipv4.ip_address // .ip_address // (try .ipv4.address[0] catch empty) // empty)})
| map(select(.candidate_ipv4 != ""))
| ((map(select((.primary // false) == true)) | .[0]) // .[0] // {})
| (.candidate_ipv4 // empty)
' <<<"$payload" 2>/dev/null || true)"
address="${address%%/*}"
[[ "$address" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || return 1
printf '%s\n' "$address"
}
GREE_INTERFACE="$(read_option gree_interface '')"
DISCOVERY_BROADCAST="$(read_option discovery_broadcast '255.255.255.255:7000')"
SIMULATE="$(read_option simulate 'false')"
@@ -21,9 +61,20 @@ POLL_INTERVAL="$(read_option poll_interval_seconds '15')"
ZONE_INTERVAL="$(read_option zone_interval_seconds '5')"
DISCOVERY_TIMEOUT="$(read_option discovery_timeout_ms '3000')"
APP_TOKEN="$(read_option app_token '')"
PUBLIC_CHART_BASE_URL="$(read_option public_chart_base_url '')"
LOG_LEVEL="$(read_option log_level 'info')"
export GREE_CONTROLLER_BIND="0.0.0.0:8787"
validate_ingress_port_contract
PUBLIC_CHART_BASE_SOURCE="configured"
if [[ -z "$PUBLIC_CHART_BASE_URL" ]]; then
PUBLIC_CHART_BASE_SOURCE="browser-fallback"
if PRIMARY_HOST_IPV4="$(detect_primary_host_ipv4)"; then
PUBLIC_CHART_BASE_URL="http://${PRIMARY_HOST_IPV4}:${HA_HTTP_PORT}"
PUBLIC_CHART_BASE_SOURCE="supervisor-primary-ipv4"
fi
fi
export GREE_CONTROLLER_BIND="0.0.0.0:${HA_HTTP_PORT}"
export GREE_CONTROLLER_DATABASE="/data/gree-controller.db"
export GREE_CONTROLLER_GREE_INTERFACE="$GREE_INTERFACE"
export GREE_CONTROLLER_DISCOVERY_BROADCAST="$DISCOVERY_BROADCAST"
@@ -33,9 +84,11 @@ export GREE_CONTROLLER_POLL_INTERVAL_SECONDS="$POLL_INTERVAL"
export GREE_CONTROLLER_ZONE_INTERVAL_SECONDS="$ZONE_INTERVAL"
export GREE_CONTROLLER_DISCOVERY_TIMEOUT_MS="$DISCOVERY_TIMEOUT"
export GREE_CONTROLLER_APP_TOKEN="$APP_TOKEN"
export GREE_CONTROLLER_PUBLIC_CHART_BASE_URL="$PUBLIC_CHART_BASE_URL"
export GREE_CONTROLLER_HA_AUTH="supervisor"
export RUST_LOG="gree_controller=${LOG_LEVEL},tower_http=${LOG_LEVEL}"
printf 'GREE Controller: interface=%s discovery=%s database=%s\n' \
"${GREE_INTERFACE:-auto}" "$DISCOVERY_BROADCAST" "$GREE_CONTROLLER_DATABASE"
printf 'GREE Controller: interface=%s discovery=%s database=%s http_port=%s public_chart_base_source=%s\n' \
"${GREE_INTERFACE:-auto}" "$DISCOVERY_BROADCAST" "$GREE_CONTROLLER_DATABASE" "$HA_HTTP_PORT" \
"$PUBLIC_CHART_BASE_SOURCE"
exec /usr/local/bin/gree-controller