Compare commits

...

5 Commits

Author SHA1 Message Date
scriptos
04b741b28b Doku. 2025-10-27 22:00:40 +01:00
scriptos
189bd41ea1 Funktion "detect_compose_cmd" nachträglich committed. 2025-10-27 20:33:38 +01:00
scriptos
45f496590d Funktionen "update_yaml_with_yq" und "update_yaml_fallback" überarbeitet 2025-10-27 20:24:14 +01:00
scriptos
61ebf046b8 healthcheck auf HTTP mit Custom URL umgestellt. 2025-10-27 19:45:26 +01:00
scriptos
7cbd5cd5be fix update_yaml_fallback 2025-10-27 19:37:57 +01:00
2 changed files with 65 additions and 45 deletions

View File

@@ -1,8 +1,4 @@
# template_repository Dokumentation wird bei Gelegenheit nachgereicht.
Wichtig: Link für Lizenz anpassen.

View File

@@ -5,9 +5,9 @@
# Synapse: https://git.techniverse.net/scriptos/livekit-ip-watch.git # Synapse: https://git.techniverse.net/scriptos/livekit-ip-watch.git
# Autor: Patrick Asmus # Autor: Patrick Asmus
# Web: https://www.cleveradmin.de # Web: https://www.cleveradmin.de
# Version: 1.0 # Version: 1.2.1
# Datum: 27.10.2025 # Datum: 27.10.2025
# Modifikation: Initial # Modifikation: Funktion "detect_compose_cmd" nachträglich committed.
##################################################### #####################################################
set -euo pipefail set -euo pipefail
@@ -35,9 +35,8 @@ ENABLE_IPV6=false
# Wartezeit nach Neustart (Sekunden), dann Healthcheck # Wartezeit nach Neustart (Sekunden), dann Healthcheck
WAIT_AFTER_RESTART=20 WAIT_AFTER_RESTART=20
# Healthcheck-Konfiguration: nur TCP # Healthcheck-Konfiguration: HTTP
TCP_HOST="127.0.0.1" HEALTHCHECK_DOMAIN="rtc.matrix.techniverse.net"
TCP_PORT="7881"
HEALTHCHECK_TIMEOUT=3 HEALTHCHECK_TIMEOUT=3
# ntfy (optional) # ntfy (optional)
@@ -125,13 +124,25 @@ backup_config() {
echo "$backup" echo "$backup"
} }
is_mikefarah_yq() {
yq --version 2>&1 | grep -qi 'mikefarah'
}
update_yaml_with_yq() { update_yaml_with_yq() {
local cidr="$1" local cidr="$1"
YQ_VAR_CIDR="$cidr" yq -i ' if is_mikefarah_yq; then
.rtc |= (. // {}) | CIDR="$cidr" yq eval -i '
.rtc.ips |= (. // {}) | .rtc = (.rtc // {}) |
.rtc.ips.includes = [env(YQ_VAR_CIDR)] .rtc.ips = (.rtc.ips // {}) |
.rtc.ips.includes = [env(CIDR)]
' "$CONFIG_FILE" ' "$CONFIG_FILE"
else
yq -y -i --arg CIDR "$cidr" '
.rtc = (.rtc // {}) |
.rtc.ips = (.rtc.ips // {}) |
.rtc.ips.includes = [$CIDR]
' "$CONFIG_FILE"
fi
} }
update_yaml_fallback() { update_yaml_fallback() {
@@ -139,35 +150,55 @@ update_yaml_fallback() {
local tmp local tmp
tmp="$(mktemp)" tmp="$(mktemp)"
awk -v newcidr="$cidr" ' awk -v newcidr="$cidr" '
BEGIN{ in_rtc=0; in_ips=0; in_includes=0; injected=0 } function indent_of(s, m,sp) { match(s,/^([ ]*)/,m); sp=length(m[1]); return sp }
BEGIN { in_rtc=0; rtc_indent=-1; skipping_ips=0; ips_indent=-1; injected=0 }
{ {
line=$0 line=$0
if ($0 ~ /^[[:space:]]*rtc:[[:space:]]*$/) { in_rtc=1; in_ips=0; in_includes=0 } ind=indent_of(line)
else if (in_rtc && $0 ~ /^[[:space:]]*[[:alnum:]_]+:[[:space:]]*$/ && $0 !~ /^[[:space:]]*ips:/) {
if (!in_ips && !in_includes && !injected) { if ($0 ~ /^[[:space:]]*rtc:[[:space:]]*$/) {
in_rtc=1; rtc_indent=ind; injected=0
print line
next
}
if (in_rtc) {
if (skipping_ips) {
if (ind <= ips_indent) {
if (!injected) {
print " ips:" print " ips:"
print " includes:" print " includes:"
print " - " newcidr print " - " newcidr
injected=1 injected=1
} }
skipping_ips=0
} else { next }
} }
if (in_rtc && $0 ~ /^[[:space:]]*ips:[[:space:]]*$/) { in_ips=1; in_includes=0 }
if (in_ips && $0 ~ /^[[:space:]]*includes:[[:space:]]*$/) { in_includes=1; next } if ($0 ~ /^[[:space:]]*ips:[[:space:]]*$/ && ind > rtc_indent) {
if (in_includes) { skipping_ips=1; ips_indent=ind
if ($0 ~ /^[[:space:]]*-[[:space:]]*[^[:space:]]+/) {
next next
} else { }
if (ind <= rtc_indent && $0 ~ /^[[:alnum:]]_+:[[:space:]]*$/) {
if (!injected) { if (!injected) {
print " ips:"
print " includes:"
print " - " newcidr print " - " newcidr
injected=1 injected=1
} }
in_includes=0 in_rtc=0; rtc_indent=-1
in_ips=($0 ~ /^[[:space:]]*ips:/)?1:0 print line
next
} }
print line
next
} }
print line print line
} }
END{ END {
if (in_rtc && !injected) { if (in_rtc && !injected) {
print " ips:" print " ips:"
print " includes:" print " includes:"
@@ -199,16 +230,9 @@ restart_service() {
fi fi
} }
healthcheck_tcp() { healthcheck_http() {
if (exec 3<>/dev/tcp/"$TCP_HOST"/"$TCP_PORT") 2>/dev/null; then local url="https://${HEALTHCHECK_DOMAIN}/livekit/sfu/"
exec 3<&- curl -fsS --max-time "$HEALTHCHECK_TIMEOUT" "$url" >/dev/null
exec 3>&-
return 0
elif command -v nc >/dev/null 2>&1; then
nc -z -w "$HEALTHCHECK_TIMEOUT" "$TCP_HOST" "$TCP_PORT"
else
return 1
fi
} }
main() { main() {
@@ -263,7 +287,7 @@ main() {
info "Warte $WAIT_AFTER_RESTART Sekunden..." info "Warte $WAIT_AFTER_RESTART Sekunden..."
sleep "$WAIT_AFTER_RESTART" sleep "$WAIT_AFTER_RESTART"
if healthcheck_tcp; then if healthcheck_http; then
info "Healthcheck OK." info "Healthcheck OK."
echo "$current_ip" > "$state_file" echo "$current_ip" > "$state_file"
notify "info" "IP geändert auf $current_ip, Dienst gesund." notify "info" "IP geändert auf $current_ip, Dienst gesund."
@@ -280,7 +304,7 @@ main() {
info "Warte $WAIT_AFTER_RESTART Sekunden (Rollback)..." info "Warte $WAIT_AFTER_RESTART Sekunden (Rollback)..."
sleep "$WAIT_AFTER_RESTART" sleep "$WAIT_AFTER_RESTART"
if healthcheck_tcp; then if healthcheck_http; then
warn "Rollback erfolgreich. System läuft wieder mit alter Konfiguration." warn "Rollback erfolgreich. System läuft wieder mit alter Konfiguration."
notify "warn" "Rollback erfolgreich. Bitte prüfen. Alte IP bleibt ${last_ip:-unbekannt}." notify "warn" "Rollback erfolgreich. Bitte prüfen. Alte IP bleibt ${last_ip:-unbekannt}."
exit 10 exit 10