Skript: "reload" bei IP-Wechsel

otaku42

Admin-Team
Mitglied seit
26 Mrz 2004
Beiträge
1,670
Punkte für Reaktionen
0
Punkte
36
In diesem Thread kam die Idee auf, per Skript zu ueberwachen, ob ein IP-Wechsel stattfindet und ggf. Asterisk die Konfiguration neu laden zu lassen. Ich habe ein passendes Skript geschrieben, Download unter
http://voip.otaku42.de/asterisk/downloads/ip-watch/.

Das Skript ermittelt zunaechst die aktuelle IP-Adresse mit Hilfe von http://checkip.dyndns.org. Dann schaut es, welche IP-Adresse Asterisk als externip "kennt" (falls als externip ein DynDNS-Name angegeben wird holt das Skript die Informationen aus einer dafuer angelegten temporaeren Datei). Wenn sich die IP geaendert hat, wird die aktuelle IP in sip.conf eingetragen (wenn dort kein DynDNS-Name verwendet wird) und anschliessend per Remote-Shell ein reload-Befehl abgesetzt.

Die Konfiguration des Skriptes wird im Skript selbst ueber einige Variablen durchgefuehrt. Die Bedeutung jeder Einstellung ist dort auch kurz erklaert. Wenn die Konfiguration fuer das eigene System angepasst ist und man ein Backup der aktuellen Asterisk-Config durchgefuehrt hat, kann man loslegen.

Will man das Skript als Cronjob laufen lassen, muss man die Variable INTERVAL auf 0 setzen (damit es nur einen Test durchfuehrt und sich dann wieder beendet). Setzt man INTERVAL auf einen Wert groesser 0, kann man das Skript auch im Hintergrund laufen lassen (z.B. durch ./astipwatch & - es testet dann alle X Sekunden, ob sich die IP-Adresse geaendert hat.

Viel Spass beim ausprobieren :)
Fragen, Anregungen etc. bitte hier in diesem Thread.

Ciao, Mike
 
Will Dir ja nicht zuviel Arbeit aufbürden. Hätte da noch ne (lokale) Verbesserung:
Hab ja n Hardware-Router. Da kann man im Webinterface die aktuelle IP nachsehen. Kann man das irgendwie einbauen. So braucht man den ipcheck von DynDns nicht. Der Router sollte ja (im Normalfall) am besten wissen, welche IP er hat.

Ach ja, hab ich noch vergessen:

Erst einmal Danke dafür. Braucht wesentlich weniger Speicher als mein Java-Programm, was ich dafür geschrieben habe (ca 10MB). Außerdem hatte sich das Programm von Zeit zu Zeit "verabschiedet". Hoffe, daß sich das mit deinem Skript jetzt erledigt hat.
 
Hi
spricht eigentlich was dagegen in der SIP.conf eine Dyndns anzugeben?

Ansonsten: danke für dieses Script - bisher habe ich per "Holzhammer-Methode" mit CRON asterisk stündlich reloadet.....
mfg
Thorsten
 
Hat beides Vor und Nachteile:
Wenn Du in der sip.conf die dyndns-Adresse stehen hast, dann wirst Du nicht das problem bekommen, daß sowohl Du als auch das Skript gleichzeitig die sip.conf "bearbeiten".
Der Nachtei ist, daß Du einen Dyndns-Client benötigst. Und wenn so ein Script feststellt, daß sich die Ip geändert hat, der DynDns-Eintrag aber noch nicht aktualisiert wurde (aus welchem Grund auch immer), dann nützt dir der reload von Asterisk nix.
Daher hätte ich es ja am besten gefunden, wenn man Asterisk die externe IP per Kommandozeile durchgeben kann. Das hätte beide Probleme ausgeschlossen.
 
Hupe schrieb:
So braucht man den ipcheck von DynDns nicht. Der Router sollte ja (im Normalfall) am besten wissen, welche IP er hat.
Was spricht dagegen, checkip von DynDNS zu verwenden? Der Dienst weiss auch, welche IP Du hast, denn er kann sie aus dem HTTP-Request "auslesen", den Du zur Abfrage hinschickst. Der Vorteil ist, dass das mit jedem Router geht, nicht nur mit bestimmten Modellen. Ich sehe wenig Sinn darin, dahingehend eine Aenderung einzubauen.

Hupe schrieb:
Erst einmal Danke dafür.
np :)

Ciao, Mike
 
Was spricht dagegen, checkip von DynDNS zu verwenden? Der Dienst weiss auch, welche IP Du hast, denn er kann sie aus dem HTTP-Request "auslesen", den Du zur Abfrage hinschickst. Der Vorteil ist, dass das mit jedem Router geht, nicht nur mit bestimmten Modellen. Ich sehe wenig Sinn darin, dahingehend eine Aenderung einzubauen.
Hab da eigentlich nur an das gedacht, was Du in dem Skript geschrieben hast.
Code:
# Interval, in dem die IP-Adresse geprueft werden soll (in Sekunden). Auf 0
# setzen, wenn nur ein einziger Durchlauf gewuenscht wird (beispielsweise
# wenn das Skript als Cronjob aufgerufen wird).
# Der Wert sollte nicht geringer als 60 sein, um die Last fuer den CheckIP-
# Dienst von DynDNS.org nicht unnoetig zu belasten.
INTERVAL=300
So könnte man dann die Ip abfrage, ohne "Traffic" zu verursachen.
 
thorsten.gehrig schrieb:
spricht eigentlich was dagegen in der SIP.conf eine Dyndns anzugeben?
Nein (das wird vom Skript auch unterstuetzt, siehe WORKMODE-Variable). Allerdings fuehrt das alleine wohl nicht dazu, dass Asterisk immer die gerade aktuelle IP-Adresse verwendet. Soweit ich es verstanden habe, wird die Aufloesung einmalig beim einlesen der Konfiguration vorgenommen, und dann das Ergebnis behalten.

Davon abgesehen gilt, was Hupe geschrieben hat: das ganze gibt Probleme, falls der DynDNS-Client den Eintrag im DNS noch nicht aktualisiert hat, wenn das Skript gestartet wird und den IP-Wechsel feststellt. Um das Problem zu umgehen, muesste das Skript nochmal geaendert werden: anstatt die IP aus dem lokalen File auszulesen, muesste man die IP zum in der sip.conf unter externip eingetragenen Hostnamen ermitteln.

thorsten.gehrig schrieb:
Ansonsten: danke für dieses Script - bisher habe ich per "Holzhammer-Methode" mit CRON asterisk stündlich reloadet.....
Dann wirds aber unangenehm, wenn Du waehrend einem solchen Reload gerade am telefonieren bist :)

Ciao, Mike
 
Hupe schrieb:
So könnte man dann die Ip abfrage, ohne "Traffic" zu verursachen.
Nun gut, aber ich denke, wenn man den Interval-Wert vernuenftig einstellt, sollte das kein allzu grosses Problem darstellen. Das waere eher interessant fuer Leute mit Volumen-Tarif, aber selbst da sollte der erzeugte Traffic nicht wirklich ins Gewicht fallen.

Mit dem Kommentar zu INTERVAL will ich eher verhindern, dass die Leute die Abfrage einmal pro Sekunde durchfuehren :)

Ciao, Mike
 
Ein "reload" hatte bisher bei mir nie Auswirkungen auf ein gerade laufendes Gespräch.
 
Hab noch einen (kleinen ) Verbesserungsvorschlag. Und zwar betrifft das die oben Angesprochene Sache:
Der Nachtei ist, daß Du einen Dyndns-Client benötigst. Und wenn so ein Script feststellt, daß sich die Ip geändert hat, der DynDns-Eintrag aber noch nicht aktualisiert wurde (aus welchem Grund auch immer), dann nützt dir der reload von Asterisk nix.
Das ist wohl bei ir geschehen. Nach dem reconnect, aber bevor der Router die dyndns-Adresse aktualisiert hat, muß wohl der Reload von asterisk gekommen sein (gleich beim ersten mal).
Daher mei Vorschlag:
In der Betriebsart "dyndns" sollte das Script NACHDEM es entdeckt hat, daß es ne neue IP gibt, vielleicht noch 20 oder 30 Sekunden warten, bis es bei Asterisk einen Reload macht. So hat, wenn der Reconnect und die IP-Abfrage des Scriptes Zeitnah geschehen, der DynDNS-Client noch die Möglichkeit die DynDNS-Adresse zu aktualisieren.
Und nocheinen habe ich:
Und zwar läuft bei mir der Dyndns-Client ja auf dem Router. Es gibt aber auch Leute, dioe dafür einen Software-Client auf ihrem Asterisk-Server laufen lassen. Und da ja otaku42's Schript eigentlich nichts anderes macht, könnte es für diese Leute ein Script aufrufen, das DynDNS-Updatet, und dann erst Asterisk reloadet. So wäre das alles etwas koordinierter.
 
@Hupe: Werde ich bei Gelegenheit aufnehmen. Wahrscheinlich mache ich es dann so, dass ein beliebiger Befehl vor dem "reload" fuer Asterisk aufgerufen wird (ebenfalls definierbar per Variable). Das kann dann ein einfaches "sleep 30" sein, oder aber auch "dyndnsclient; sleep 30".

Ciao, Mike
 
Will ja nicht unverschämt erscheinen: Wie wäre es noch mit ner Log-Datei, da bräuchte eigentlich nur drin stehen, wann deas Script entdeckt hat, daß der Server ne neue Ip hat (inc ip). Und vielleicht noch die Meldungen, die Asterisk beim Reload ausgiebt.
Dann würde es leichter sein, den Fehler zu finden, wenn es mal aus irgendeinem Grund nicht hinhaut.
 
otaku42 schrieb:
Wie waere es mit Syslog-Support? "logger" sollte eigentlich auf jedem System vorhanden sein, oder?

Ciao, Mike

Bei mir ist das zu mindest so. Wäre prima.
 
Ich habe die neue Version des Skripts (0.2.0) fertiggestellt. Es gibt folgende Aenderungen:
CHANGES schrieb:
  • wenn WORKMODE=ip, dann wird bei Start des Skriptes getestet, ob die in SIPCONF angegebene Datei existiert; kann die Datei nicht gefunden werden, wird das Skript abgebrochen
  • beim Start des Skriptes wird die Datei MEMORYFILE geloescht, wenn WORKMODE = dyndns und INTERVAL > 0
  • die neuen Variablen EXEC_PRE_RELOAD und EXEC_POST_RELOAD ermoeglichen die Angabe von Befehlen, die vor bzw. nach dem Absenden des "reload"-Befehls an Asterisk ausgefuehrt werden sollen
  • die neue Variable EXEC_RELOAD_ERROR ermoeglicht die Angabe von Befehlen, die nach einem fehlgeschlagenen 'reload' ausgefuehrt werden sollen
  • optionaler Support von Syslog (nur Meldungen ueber IP-Wechsel und Ergebnis von Asterisk 'reload')
  • Variable QUIET ersetzt durch Variable CONSOLE (Achtung, umgekehrte Bedeutung: CONSOLE=1 schaltet Ausgabe von Meldungen ueber die Konsole EIN!).
Die URL ist die gleiche geblieben. Bugmeldungen, Wuensche, Kritik, ... wie immer willkommen.

Ciao, Mike
 
Hab ich mal eingebaut, scheint auch gut zu laufen. Danke für die Änderungen.
Wo landen eigentlich die Ausgaben von Syslog?
 
Hupe schrieb:
Wo landen eigentlich die Ausgaben von Syslog?
Im Syslog? :))

Im Ernst: Der Syslog-Daemon verwaltet eine Reihe von Logfiles, in die Du dann die eintreffenden Nachrichten schreiben lassen kannst. Jede Nachricht hat eine "Facility" und eine Prioritaet. Ueber diese beiden Angaben kannst Du dann in der Konfiguration von syslogd bestimmen, in welche Logfiles die Meldungen geschrieben werden. Normalerweise gibt es ein Logfile, in dem alle Nachrichten reingeschrieben werden - bei Debian heisst das File /var/log/syslog.

Ciao, Mike
 
Hmm, mit dem Syslog scheint bei mir nicht zu gehen (hab auch debian). Der reload läuft, aber es landet nix im Syslog.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.