.titleBar { margin-bottom: 5px!important; }

Skript: "reload" bei IP-Wechsel

Dieses Thema im Forum "Asterisk Skripte" wurde erstellt von otaku42, 4 Aug. 2004.

  1. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  2. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  3. thorsten.gehrig

    thorsten.gehrig Mitglied

    Registriert seit:
    14 Juni 2004
    Beiträge:
    490
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  4. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  5. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.

    np :)

    Ciao, Mike
     
  6. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  7. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.

    Dann wirds aber unangenehm, wenn Du waehrend einem solchen Reload gerade am telefonieren bist :)

    Ciao, Mike
     
  8. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  9. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ein "reload" hatte bisher bei mir nie Auswirkungen auf ein gerade laufendes Gespräch.
     
  10. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ich hatte es noch nie ausprobiert... man lernt nie aus :)

    Ciao, Mike
     
  11. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hab noch einen (kleinen ) Verbesserungsvorschlag. Und zwar betrifft das die oben Angesprochene Sache:
    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.
     
  12. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    @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
     
  13. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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.
     
  14. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Wie waere es mit Syslog-Support? "logger" sollte eigentlich auf jedem System vorhanden sein, oder?

    Ciao, Mike
     
  15. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Bei mir ist das zu mindest so. Wäre prima.
     
  16. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Ich habe die neue Version des Skripts (0.2.0) fertiggestellt. Es gibt folgende Aenderungen:
    Die URL ist die gleiche geblieben. Bugmeldungen, Wuensche, Kritik, ... wie immer willkommen.

    Ciao, Mike
     
  17. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hab ich mal eingebaut, scheint auch gut zu laufen. Danke für die Änderungen.
    Wo landen eigentlich die Ausgaben von Syslog?
     
  18. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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
     
  19. Hupe

    Hupe Aktives Mitglied

    Registriert seit:
    8 Apr. 2004
    Beiträge:
    2,586
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hmm, mit dem Syslog scheint bei mir nicht zu gehen (hab auch debian). Der reload läuft, aber es landet nix im Syslog.
     
  20. otaku42

    otaku42 Admin-Team

    Registriert seit:
    26 März 2004
    Beiträge:
    1,670
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    SYSLOG=1? Kannst Du Deine /etc/syslog.conf hier mal posten?