PeterPawn
IPPF-Urgestein
- Mitglied seit
- 10 Mai 2006
- Beiträge
- 15,299
- Punkte für Reaktionen
- 1,760
- Punkte
- 113
Geht es genauer?Was nicht mehr funktioniert ist nun die ONLINECHANGED Abfrage,
Der Mechanismus mit dem
onlinechanged
läuft ja tatsächlich über den multid
, von dem wird - nach einer Benachrichtigung seitens des dsld
- das (Shell-)Skript /bin/onlinechanged
aufgerufen und zwar mit Parametern, die die Änderungen (offline
, online
, offlineipv6
, onlineipv6
- die Parameter ohne ipv6
beziehen sich dann eben auf IPv4) und den neuen "Gesamtzustand" (status_offline
, status_onlinev4
, status_onlinev6
oder status_online4v6
) spezifizieren.Dieses Skript sucht dann innerhalb des Verzeichnisses
/etc/onlinechanged
(nicht rekursiv) nach regulären Dateien (deshalb funktionieren dort auch bei AVM keine Symlinks) und versucht die gefundenen Dateien als Shell-Skripte (unabhängig von ihrem Inhalt und event. vorhandenen Shebangs) auszuführen, wobei die Parameter an diese Skripte weitergeleitet werden. In diesem Verzeichnis versammeln sich bei AVM dann auch die diversen Aktionen, die bei einem Wechsel des Online-Status ausgeführt werden sollen:send_crashreport
-> benachrichtigt bei Änderungen nach "online" denctlmgr
, der dann seinerseits prüft, ob es (a) zuvor einen Absturz gab und (b) das Senden derartiger Protokolle an AVM erlaubt ist, bevor er einen Absturzbericht versendetstart_smbd
-> stoppt und startet den (von AVM eingekauften) SMB-Servicenqcs
, wenn die Box als IP-Client läuft (ansonsten wird der nach jeder WebDAV-Änderung neu gestartet, damit auch ein vorhandenes bzw. fehlendes Verzeichnis für den "Online-Speicher" korrekt eingebunden wird) und der (IPv4-)Zustand nach online wechseltwebdav_net
-> dieses Skript ist eigentlich (heutzutage) einigermaßen überflüssig bzw. dem Beibehalten einer früheren Dateisystemstruktur geschuldet ... es prüft lediglich die Existenz eines weiteren Skripts (/etc/webdav_control
) und ruft dann dieses mit den Parametern auf, die schon anwebdav_net
übergeben wurden
/etc/onlinechanged
zufällig, wobei das verwendete find
-Kommando sicherlich immer dieselbe Reihenfolge (die nicht zwingend alphabetisch sortiert ist) ausspucken würde und dabei (immer noch) sequentiell (und nicht parallel, wie beim Start des Systems) gearbeitet wird.In Freetz-NG hingegen (und in den anderen Abkömmlingen von Freetz) gibt es eine Option dafür, dieses Verhalten zu ändern: https://github.com/Freetz-NG/freetz...8cd64a5f83e0e28f5a/config/ui/patches.in#L1687 - die (automatische) Übersetzung ins Deutsche ist:
Geändert wird das (neue) System dann an dieser Stelle: https://github.com/Freetz-NG/freetz-ng/blob/master/patches/scripts/109-replace_onlinechanged.sh und das erfolgt - wie man sieht - auch unabhängig davon, ob man das AVM-Skript ersetzen will oder nicht - im letzteren Fall kommt noch eine weitere Aufrufebene hinzu, bei der das Freetz-SkriptDas in AVM eingebaute onlinechanged wird auf einigen DSL-Dosen aus unbekannten Gründen nicht zuverlässig aufgerufen (siehe http://www.ip-phone-forum.de/showthread.php?t=231873).
Auf Boxen hinter einem NAT, z.B. auf vielen IP-Clients, hinter Kabelroutern usw., wird onlinechanged ebenfalls nicht ausgelöst, da dsld nicht für die Verbindung zuständig ist. Somit können die Dienste auf solchen Boxen nicht automatisch neu initialisiert werden, nachdem sich die externe IP-Adresse geändert hat.
An dieser Stelle kann dieser Patch nützlich sein: Er startet ein Shell-Skript /sbin/ip_watchdog über /etc/inittab und sorgt dafür, dass das Skript automatisch neu gestartet wird (über "respawn"), falls es versehentlich beendet wird. Das Skript prüft in regelmäßigen Abständen (60 s) die externe IP über /usr/bin/get_ip und ruft die onlinechanged-Skripte von AVM und Freetz über /bin/onlinechanged.sh auf, wenn sich die IP geändert hat. Gleichzeitig stellt der Patch sicher, dass das Master-Skript /bin/onlinechanged von AVM leer ist, so dass die Skripte nicht doppelt aufgerufen werden.
Wer sollte diesen Patch verwenden? In erster Linie Benutzer mit für NAT konfigurierten Boxen, die von AVM onlinechanged überhaupt nicht profitieren können. Zweitens Benutzer, die Probleme mit dem unzuverlässigen Aufruf von AVM onlinechanged auf ihren DSL-Boxen haben.
Begrenzungen: Die Umgebungsvariable IPADDR wird wie üblich gesetzt, aber keine anderen Variablen, die von AVM multid im ursprünglichen onlinechanged gesetzt werden, wie NETMASK, GATEWAY, DNS1, DNS2.
Sie werden derzeit weder von AVM noch von Freetz-Skripten verwendet verwendet, so dass diese Einschränkung kein Problem darstellen sollte. Ein weiterer Unterschied zu AVM onlinechanged ist, dass diese Lösung nur "onlinechanged online" aufruft, niemals "onlinechanged offline". Auch dies sollte kein Problem sein, aber Sie sollten sich dessen bewusst sein.
Übersetzt mit www.DeepL.com/Translator (kostenlose Version)
/bin/onlinechanged.sh
PARALLEL aufgerufen wird (https://github.com/Freetz-NG/freetz...ches/scripts/109-replace_onlinechanged.sh#L23) und dem (aufrufenden) multid
schon lange vor der Abarbeitung der ganzen "action"-Skripte signalisiert wird, daß die Verarbeitung der Signalisierung abgeschlossen ist. Das ist allerdings einigermaßen kontraproduktiv, besonders bei moderneren (FRITZ!)OS-Versionen und an Dual-Stack-Anschlüssen - dann fühlt sich der
multid
nämlich berechtigt, sofort nach einer "online"-Benachrichtigung für IPv4 eine weitere für IPv6 (oder auch umgekehrt, je nachdem, wie sich das System verhält) nachzureichen (da gibt es ja gar keine "gemeinsame" Nachricht, online
und onlineipv6
sind jeweils getrennte Änderungen, s.o.) und DAS muß jetzt (obwohl dem multid
ERNEUT der sofortige Erfolg gemeldet wird, weil die zweite Instanz von /bin/onlinechanged.sh
eben auch parallel gestartet wird) innerhalb von /bin/onlinechanged.sh
erst einmal passend synchronisiert bzw. serialisiert werden.WAS das
/bin/onlinechanged.sh
dann in seinen verschiedenen Prozessen (es ist ja IMMER dasselbe Skript) genau macht, protokolliert es aber einigermaßen ausführlich in der Datei /var/log/onlinechanged.log
- da sollte dann meines Erachtens auch bei einem Problem ETWAS MEHR als ein lakonisches:drin sein und mindestens dieses Protokoll noch "beigelegt" werden, wenn schon die (resultierende, also bestenfalls die "komprimierte") Konfigurationsdatei für Freetz-NG fehlt und man so auch nicht entscheiden kann, ob die o.g. Option zum Ersetzen des AVM-Mechanismus nun bei der Konfiguration ausgewählt wurde oder nicht.Was nicht mehr funktioniert ist nun die ONLINECHANGED Abfrage
Und in
onlinechanged.sh
werden dann auch deutlich mehr Orte nach Skripten durchsucht (https://github.com/Freetz-NG/freetz.../pkgs/mod/files/root/bin/onlinechanged.sh#L67) und diese obendrein noch (über alle Verzeichnisse) alphabetisch nach Namen sortiert, bevor sie dann aufgerufen werden - da muß man dann auch für mehr Orte im Dateisystem sicherstellen, daß einem da niemand ein Kuckucksei ins Nest legt und man das dann einfach aufruft. Außerdem besteht im Freetz-Skript zwischen den Zeilen 48 und 50 eine (wenn auch kleine) Chance für eine "race condition", wo dann ggf. zwei Instanzen von onlinechanged.sh
parallel an die Abarbeitung der Skript-Dateien gehen. Es gibt kein "atomares" Konstrukt aus einem einzelnen
test -e <filename>
und einem nachfolgenden touch <filename>
, aber das läßt sich anders regeln, indem man die eigene PID ins Semaphoren-File schreibt und dabei die Shell-Option noclobber
verwendet - gewonnen hat dann derjenige Prozess, dessen PID tatsächlich in der Datei steht und ein zweiter muß weiterhin warten, bis der Vorgänger seinerseits beendet ist. Für das Dateisystem sorgt dann der Kernel (i.V.m. den FS-Treibern) dafür, daß tatsächlich nur EINMAL die Datei erfolgreich angelegt werden kann, wenn zwei Prozesse parallel versuchen, dieselbe Datei zu erzeugen. Nur einer der konkurrierenden Prozesse erhält dann das Handle, mit dem er seine PID in die Datei schreiben kann und nur derjenige, dessen PID tatsächlich in der Datei steht, hat dann die Sperre als Eigentümer auch eingerichtet.