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 )
Hallo!
Tolle Themenreihe. Leider lässt sich die Script-ZIP-datei aus Teil 5.2 nicht öffnen. Bitte aktualisieren. Danke.
Hallo,
die Datei lässt sich downloaden, öffnen und auch entpacken. Hab’s eben gerade getestet.
Grüsse
Hallo,
der Download funktioniert nicht.
Link Adresse kopiert ergibt
https://blog.griebsch.de/download/879/
keine Datei dahinter.
Hallo,
der link funktioniert. Hab’s gerade eben getestet. Auch der Link, in Deinem Post funktioniert. Hab’s mit Chrome getestet.
Grüsse
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
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
Das Script wurde angepasst.
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
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
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
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
Danke jetzt geht es perfekt !!!! *großes LOB* für die schnelle Umsetzung…
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
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.
Ich empfehle Teil 5.11. Scripte richtig bearbeiten.
Grüsse
Das sind Fehler im Skript von Michael. Nicht von Hr. Griebsch.
Ich arbeite aus Prinzip nicht mit Windows-Rechnern, sondern nur unter Linux mit ssh und nano.
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"
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.
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