Beiträge durchsuchen

Themenreihe FreePBX 15/Asterisk 16-Tips & Tricks-Teil 5.2. Überwachen der Amtsleitungen

 

Gerade in einem Geschäftsumfeld ist eine ständige telefonische Erreichbarkeit ein nicht zu unterschätzendes Wettbewerbskriterium. Wenn Vertrieb oder Support oder andere Notrufnummern für längere Zeit nicht erreichbar sind, kann sich das ganz schnell zu einer kritischen Situation entwickeln.

Aber wie bekommt man denn mit, ob die Amtsleitungen noch verfügbar oder bereits gestört sind? Eigentlich nur dadurch, wenn mann selbst versucht jemand anzurufen und merkt, dass es nicht funktioniert oder sich ein externer Anrufer über einen anderen Weg meldet un Ihnen diese Störung mitteilt. Bis dahin können aber schon viele erfolglos versucht haben Sie zu erreichen und Sie haben dadurch eventuell sogar Geschäfte oder mindesten das Vertrauen ihrer kunden in Ihre Zuverlässigkeit verloren.

Um das zu vermeiden ist es sinnvoll die Verfügbarkeit der Amtsleitungen automatisch in einem kürzeren Zeitintervall zu überprüfen .

Dieses Video zeigt ihnen wie Sie eine solche Amtsleitungsüberwachung einrichten.

Für die Funktion wird dieses Script benötigt: csg-trunk-monitor2.zip (463 Downloads )

19 Kommentare zu Themenreihe FreePBX 15/Asterisk 16-Tips & Tricks-Teil 5.2. Überwachen der Amtsleitungen

      1. Hallo,
        da ich weitere Meldungen bekommen habe, dass der Link nicht funktioniert, habe ich das noch mal mit verschiedenen Browsern getestet. Tatsächlich war es so, dass der Link mit einigen Browsern nicht funktioniert hat (z. B. Firefox und Edge). Ich habe das Problem jetzt gelöst. Jetzt sollte der Download mit allen Browsern funktionieren.
        Grüße

  1. Hallo,
    in Ihrem Script wird aber immer nur eine Leitung berücksichtigt. Also wenn ich mehrere Trunks habe, dann müssten alle Leitungen ausfallen, bis eine Meldung versendet wird. Daher find ich es besser wenn man nach “Unknown\|Unreachable\|Forbidden\|Rejected\|Unregistered” sucht und dann den if-Befehl auf gleich (ohne !) setzt.
    Grüße

  2. Hallo,
    ich schaue mit Begeisterung diese Video-Reihe und ich bin mir auch sicher, dass ich ohne die Videos meine FreePBX noch nicht so weit hätte.
    Deshalb an dieser Stelle vielen Dank für die tolle Reihe.

    Speziell zu diesem Video habe ich aber 3 Anmerkungen:

    1. Zum Speicherort des Skriptes:
    Eigene Skripte werden in Linux normalerweise unter “/usr/local/bin” bzw. “/usr/local/sbin” abgelegt. Diese Verzeichnisse bleiben vom System unangetastet und sie sind im Suchpfad noch vor “/usr/sbin”, die Skripte werden also auch dort sicher gefunden. Eine Ablage von eigenen Skripten unter “/usr/sbin” ist in Linux meines Erachtens keine gute Idee.

    2. Zum Eintrag in der Crontab
    Das Skript wird unter dem User “root” ausgeführt, die FreePBX läuft aber unter dem User “asterisk”. Deshalb ist es aus meiner Sicht besser, wenn auch in der Crontab das Skript unter dem User “asterisk” ausgeführt wird. Die crontab des User “asterisk” ändert man im Terminal (!) mit “crontab -e -u asterisk”.
    Der User kann dann im Eintrag weggelassen werden. Für den Aufruf des Skriptes sollte in der crontab der komplette Pfad angegeben werden und die Ausgabe sollte auf “/dev/null” umgeleitet werden.
    Mein Eintrag in der crontab des Users “asterisk” (im Terminal mit “crontab -e -u asterisk”) sieht so aus, damit funktioniert der Aufruf:
    */15 * * * * /usr/local/sbin/csg-trunk-alert > /dev/null 2>&1

    3. Zum Skript selbst:
    Wie hop schon geschrieben hat fragt das Skript ja eigentlich keine fehlerhaften Trunks ab sondern nur funktionierende (“Status = Registered”). Das Skript verschickt als erst dann eine Mail, wenn tatsächlich kein einziger Trunk mehr registriert ist.
    Der umgekehrte Fall ist aber auch nicht schwieriger, hier mein Skript (basierend auf dem Beispiel), das schon beim ersten ausgefallenen Trunk eine Mail verschickt (entspricht genau dem, was hop schon geschrieben hat, das habe ich aber erst danach gesehen):

    #!/bin/bash
    peername=MYTELCO
    runtest=[ /usr/sbin/asterisk -rx “pjsip show registrations” ] | grep “Unknown\|Unreachable\|Unregistered\|Forbidden\|Rejected”
    if [[ $? = 0 ]]; then
    echo “Mindestens ein Trunk ist ausgefallen”
    echo “Mindestens ein Trunk ist ausgefallen-bitte prüfen” | mail -s “FreePBX-Trunk ausgefallen” -rAbsendermail Empfängermail
    else
    echo “Alles in Ordnung”
    fi

    Viele Grüße,

    Dieter

    1. Hallo,
      ich hatte schon länger vor das Script zu ändern, bin leider nur noch nicht dazu gekommen. Ich habe die letzten beiden Posts zu diesem Beitrag jetzt als Anlass genommen, dass auch endlich mal zu machen. Also danke nochmals für den kleinen Anschubser. Alles andere, dh. Crontab, Speicherort usw. habe ich gelassen wie bisher, da es auf die Funktion keinen Einfluss hat. Es ist ja jedem Leser unbenommen den Hinweisen in Deinem Kommentar zu folgen.
      Also nochmals danke.
      Ich bitte aber um eines: Fangt bitte jetzt keine Diskussion über das Für und Wider des einen oder anderen Speicherortes oder des Ausführens von crontab unter root oder einem Benutzer an. Das hier ist kein Linux-Forum. Hier geht es um die FreePBX.
      Grüße

  3. Hallo Gemeinde, hallo Hr. Griebsch,
    ich habe ebenfalls mehrere Hauptleitungen registriert. Zum Test habe ich nicht wie bei Ihnen im Video die Amtsleitung deaktiviert (da diese bei mir dann nicht angezeigt wird wenn ich pjsip show registrations mache, sondern absichtlich einen falschen Benutzernamen angegeben. Nun steht diese eine Leitung auf Rejected… Ich lasse das Script ausführen (also das abgeänderte Script vom März) und das Script meldet “Alles in Ordnung”… wo könnte der Fehler liegen?

    Hier nochmal das Script:
    #!/bin/bash
    peername=MYTELCO
    runtest=[ /usr/sbin/asterisk -rx “pjsip show registrations” ] | grep “Unknown\|Unreachable\|Unregistered\|Forbidden\|Rejected”
    if [[ $? = 0 ]]; then
    echo “Mindestens ein Trunk ist ausgefallen”
    echo “Mindestens ein Trunk ist ausgefallen-bitte prüfen” | mail -s “FreePBX-Trunk ausgefallen” -rinfo@XXXXXXXXX info@XXXXXXXXX
    else
    echo “Alles in Ordnung”
    fi

    Über Feedback würde ich mich freuen… Herzlichen Dank

    1. In dem Script sind einige Zeichen falsch. Die Anführungszeichen (“) müssen gegen Hochkommas (‘) ausgetauscht werden.
      Ich habe das Script auch entsprechend geändert und wieder zum Download bereitgestellt.

      Grüsse

  4. Sehr guter Beitrag und Blog.
    Wir haben das Script für uns angepasst, da uns folgendes gestört hat:
    – Trunk Status “Unavailable” wird nicht berücksichtigt.
    – bei einem Trunk Ausfall wird alle 15 Minuten eine E-Mail versendet.
    – Es wird keine E-Mail versendet wenn der Trunk wieder online ist.
    – Es wird in der E-Mail nicht mitgeteilt welcher Trunk offline ist.

    Unsere Änderung:
    Wenn ein Trunk dauerhaft offline ist, wird nach dem Versand einer Ausfallmeldung per E-Mail eine definierte Wartezeit gewartet bevor erneut eine E-Mail versendet wird.
    Sind alle Trunks wieder online wird ebenfalls eine E-Mail versendet.
    Die Ausfallmeldung per E-Mail beinhaltet die Namen der Trunks die ausgefallen sind.
    Die Prüfung der Trunks erfolgt auch auf “Unavailable”.

    Es muss noch eine Status Datei angelegt und entsprechende Rechte vergeben werden, sowie den Pfad zur Datei im Script angepasst werden:

    Hier unser angepasster code:
    #!/bin/bash

    statusdatei=”Pfad/zur/Datei.txt”
    status=$(cat $statusdatei)
    fehler=0
    pjsipfehler=””
    wartezeit=26
    # Wartezeit ist abhaengig davon wie oft das script ausgefuehrt wird und wie oft eine E-Mail versendet werden soll
    # wartezeit = 60 / [cronjob alle x min] * [E-Mail max. alle x Stunden] + 2
    #(cronjob alle 15 min, E-Mail max. alle 6 Stunden = 60 / 15 * 6 + 2)

    /usr/sbin/asterisk -rx ‘pjsip show registrations’ | grep ‘Unknown\|Unreachable\|Unregistered\|Forbidden\|Rejected\|Unavailable’
    if [[ $? = 0 ]]; then
    fehler=1
    echo “Mindestens ein pjsip Trunk ist ausgefallen”
    pjsipfehler=”$(/usr/sbin/asterisk -rx ‘pjsip show registrations’ | grep ‘Unknown\|Unreachable\|Unregistered\|Forbidden\|Rejected\|Unavailable’ | cut -d ‘/’ -f1)”
    else
    echo “pjsip Trunks – Alles in Ordnung”
    fi

    if [[ $fehler = 1 && $status -le 1 ]]; then
    echo -e “Folgende pjsip Trunks sind ausgefallen:\n$pjsipfehler” | mail -s ‘FreePBX-Trunks ausgefallen’ -rAbsender Empfänger
    echo “2” > $statusdatei

    elif [[ $fehler = 0 && $status != 0 ]]; then
    echo -e “Alle pjsip Trunks sind online” | mail -s ‘FreePBX-Trunks alle erreichbar’ -rAbsender Empfänger
    echo “0” > $statusdatei

    elif [[ $status != 0 && $status -lt $wartezeit ]]; then
    status=$(($status+1))
    echo “$status” > $statusdatei
    fi

    if [[ $status -ge $wartezeit ]]; then
    echo “1” > $statusdatei
    fi

  5. bischen bockig ist das allerdings dann doch noch.

    Irgendwie vermutlich eine blöde Windows-Formatierung mit versteckt.
    ich sehe:
    /usr/local/sbin/csg-trunk-alert
    “pjsip Trunks – Alles in Ordnung”
    erreichbar’ contains invalid character ‘\342’

    –> das hat was mit white-spaces zu tun.
    Ausserdem wird “0” (mit Anführungszeichen) in die Statusdatei geschrieben. Das kann nicht mit -ge verglichen werden.

  6. Das natürliche Asterisk enthält schon eine Trunk-Überwachung. Die kann auch in FreePBX in der Trunk-Config eingetragen werden:
    Zeile: "Monitor trunk failures" auf "ja" setzen, und script-Name eintragen.
    Voraussetzungen sind die gleichen, postfix muss konfiguriert sein. Es bedarf keines Cron-jobs. Ob der volle Pfad zum script nötig ist, oder ob nur der script-name ausreichend ist, hab ich noch nicht getestet. Vielleicht macht das jemand?
    Lt. meinen Erkenntnissen gehört das script nach /var/lib/asterisk/agi-bin/ und muss auch ausführbar sein. Der Speicherort kann etwas kritisch sein, ggf. killen updates das dann wieder an diesem Ort.
    Das script macht erst mal einen reload, und mailt dann den Zustand aller trunks. Das ist insofern sinnvoll, weil oft ein einfacher reload schon hilft. Gern kann auch jeder das script noch erweitern, um z.B. den ausgefallenen Trunk vorher anzuzeigen. Ich arbeite hier mit ein paar Variablen, EMAIL ist nur der Mail-Empfänger. Absender ist der freepbx-hostname. Die Mail wird am Schluss aus den Variablen zusammengebaut.
    Eigentümer der script-datei ist der user asterisk. Also notfalls
    chown asterisk:asterisk /var/lib/asterisk/agi-bin/trunks-failure.sh absetzen und um die Datei ausführbar zu machen, mit chmod +x /var/lib/asterisk/agi-bin/trunks-failure.sh ein x dazusetzen.

    #!/bin/bash
    # Name der script-datei: /var/lib/asterisk/agi-bin/trunks-failure.sh
    EMAIL=admin@xxxxxxxxxxxx.de
    DATE=$(date)
    HOST=$(hostname)
    fwconsole reload
    SIPTRUNKS=$(/usr/sbin/asterisk -rx 'pjsip show registrations')
    IAXTRUNKS=$(/usr/sbin/asterisk -rx 'iax2 show peers')
    MESSAGE="A trunk failure forced a reload on $HOST"
    MESSAGE="$MESSAGE\nDATE: $DATE"
    MESSAGE="$MESSAGE\nCurrent Trunk Status:"
    MESSAGE="$MESSAGE\n\nSIP Trunks:\n$SIPTRUNKS"
    MESSAGE="$MESSAGE\n\nIAX2 Trunks:\n$IAXTRUNKS"
    echo -e "$MESSAGE" | mail -s "Trunk Failure" "$EMAIL"

    1. Es genügt, wenn in der Kofigurations-Zeile "trunks-failure.sh" (also der Name des Skripts) eingetragen ist.
      Offensichtlich ist der Pfad "/var/lib/asterisk/agi-bin/" ohnehin Teil der Umgebungsvariablen.
      Ist jetzt (unfreiwillig) von mir getestet.
      Das Skript selbst ist natürlich noch ausbau-fähig. Es fehlt z.B. erst mal der Name des Trunks, der die email auslöst.

  7. Hallo Herr Griebsch, erstmal vielen Dank für die gute erklärte Free-PBX.
    Auch wenn dieser Eintrag schon älter ist möchte ich hier einmal mein Skript einfügen da die bisherigen immer kleine Fehler gebracht haben.

    Ich wollte mehr als nur eine Leitung überwachen und habe ich es wie folgt umgesetzt.
    >>>

    #!/bin/bash

    # E-Mail-Empfänger und Betreff festlegen
    recipient=”DeineMailAdresse@xxx.com”
    subject=”TK-Anlage – FreePBX – PJSIP Status Alert”

    # Array zum Speichern der betroffenen PJSIP-Konten
    declare -a affected_pjsips

    # Holen der PJSIP-Registrierungen
    pjsip_status=$(asterisk -rx “pjsip show registrations”)

    # Durch die PJSIP-Registrierungen iterieren und nach relevanten Status filtern
    while IFS= read -r line; do

    # Überprüfen, ob die Zeile “Rejected”, “Unregistered”, “Forbidden”, “Unavailable”, “Unreachable” oder “Unknown” enthält
    if echo “$line” | grep -E ‘Rejected|Unregistered|Forbidden|Unavailable|Unreachable|Unknown’ > /dev/null; then
    # PJSIP-Konto extrahieren und zum Array hinzufügen
    pjsip_info=$(echo “$line” | awk ‘{print $(NF-1), $NF}’)
    affected_pjsips+=(“$pjsip_info”)
    fi
    done <<< "$pjsip_status"

    # Überprüfen, ob das Array nicht leer ist und E-Mail senden
    if [ ${#affected_pjsips[@]} -gt 0 ]; then
    email_body="Die folgenden PJSIP-Konten haben einen fehlerhaften Status ("Rejected", "Unregistered", "Forbidden", "Unavailable", "Unreachable" oder "Unknown")':\n\n"
    for entry in "${affected_pjsips[@]}"; do
    email_body+="$entry\n"
    done
    echo -e "$email_body" | mail -s "$subject" "$recipient"
    fi

    <<<
    Ich hoffe ich kann damit auch etwas zum Forum beitragen.
    Getestet habe ich es nur mit Rejected und Registered was funktioniert hat, der rest sollte also auch funktionieren.

    VG Phil

Schreibe einen Kommentar