FreePBX Konfigurieren von Asterisk für E-Mail-Benachrichtigungen über verpasste eingehende Anrufe in der Warteschlange

Bild
IP ATC Asterisk ist ein leistungsstarker IP-Telefonieprozessor. Die für Asterisk erstellte webbasierte FreePBX-Oberfläche vereinfacht die Konfiguration erheblich und senkt den Anmeldeschwellenwert.
Wenn Sie eine Aufgabe im Zusammenhang mit IP-Telefonie entwickeln können, kann diese mit ziemlicher Sicherheit in Asterisk implementiert werden. Aber seien Sie sicher, dass Ausdauer und Ausdauer von Ihnen verlangt werden.

Wir standen vor der Aufgabe, E-Mail-Benachrichtigungen über verpasste Anrufe einzurichten. Genauer gesagt, um per E-Mail über Fälle zu benachrichtigen, in denen ein eingehender Anruf in die Warteschlange gestellt wurde, aber niemand (von den Agenten) diesen eingehenden Anruf beantwortet hat.

Überraschenderweise haben wir in FreePBX keine regulären Tools zur Lösung dieses Problems gefunden. Ich werde darüber sprechen, wie wir dieses Problem unter dem Schnitt gelöst haben.

Vorwort

Bevor wir das Problem „frontal“ gelöst haben, haben wir sicherlich im Internet nach Informationen gesucht, aber keine schlüsselfertigen Lösungen gefunden (vielleicht sahen sie schlecht aus, aber was können Sie tun ...).

Es gibt nicht so viele Arbeitsfähigkeiten direkt in Asterisk, wie wir möchten, daher wurde die hier vorgeschlagene Lösung nicht vollständig verstanden und verworfen.

Die hier vorgeschlagene Lösung hat mir gefallen, obwohl sie nicht funktioniert hat. Daher betonten sie, dass die Arbeit in Asterisk im Kontext von [ext-queues] notwendig ist. Und da wir in Freepbx arbeiten, müssen wir in der Konfigurationsdatei "extensions_override_freepbx.conf" arbeiten. Wir haben festgestellt, dass es praktisch ist, verpasste Anrufe vor dem Hangupcall-Ereignis (Ende eines Anrufs) abzufangen.
Nachdem wir die Diskussion hier gelesen hatten, kam die Idee auf, dass wir die Variable "Disposition" in der CDR für alle Agenten in der Warteschlange filtern müssen. Nach dem Lesen dieser Informationen wurden ganz bestimmte Schritte zur Lösung der Aufgabe gebildet.

Was haben wir:

Es gibt FreePBX 13.0.197, das Asterisk 13.12.1 verwendet. Betriebssystemversion SHMZ Release 6.6 (Final). Die Distribution basiert auf CentOS.

Asterisk ist mit IVR (Sprachmenü) konfiguriert, das eingehende Anrufe in verschiedene Warteschlangen (Warteschlangen) verteilt. Agenten (Agenten) werden jeder Warteschlange zugewiesen, d. H. Agenten.

Theorie

Was passiert bei Asterisk?

Wenn ein eingehender Anruf bei Asterisk eintrifft, geht dieser Anruf an den IVR. Der Anrufer trifft eine Auswahl, indem er eine bestimmte Nummer am Telefon drückt und eine bestimmte Warteschlange eingibt. Danach erhalten alle freien Agenten der Warteschlange gleichzeitig einen Anruf.

Um besser zu verstehen, was in diesem Moment passiert und was als nächstes passiert, wenden wir uns dem Bericht CDR zu (Abb. 1).

Bild
Abb. 1

Wenn ein eingehender Anruf in die Warteschlange fiel, wurde für alle Agenten der Wert der Variablen "Disposition" gleich "KEINE ANTWORT", wenn die Agenten zu diesem Zeitpunkt nicht beschäftigt waren. Die Variable "Disposition" kann andere Werte annehmen (siehe https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ), mit Ausnahme des Werts "ANTWORT". Und in dem Moment, in dem einer der Agenten den eingehenden Anruf beantwortet, wird der Wert der Variablen "Disposition" dieses Agenten gleich "ANTWORT".
In der Berichts-CDR können Sie feststellen, dass alle Ereignisse mit derselben „eindeutigen ID“ (Systemspalte) angezeigt werden, wenn der Anruf in die Warteschlange gestellt wird (in der Spalte App wird der Wert zu „Warteschlange“).

CDR in Kürze

Es ist wichtig zu verstehen, was eine CDR ist und zu welchem ​​Zeitpunkt in der CDR die Daten eingegeben werden, die wir in der Berichts-CDR beobachten. Die CDR ist relativ zum Betriebssystem die Datenbank, in die Asterisk einen detaillierten Anrufbericht schreibt (siehe https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ). In unserem Fall handelt es sich um eine Datenbank namens asteriskcdrdb, die sich in MySQL befindet. Empirisch haben wir festgestellt, dass Daten zu einem Anruf mit einer bestimmten „eindeutigen ID“ nicht unmittelbar nach dem Auftreten eines Ereignisses, sondern nach dem Hangupcall-Ereignis (Ende des Anrufs) in asteriskcdrdb eingegeben werden.

Das Prinzip der geschaffenen Lösung

Da wir mehr Wissen in Bash als Wissen in Asterisk haben, lautet die Hauptidee wie folgt. Rufen Sie vor dem Hangupcall-Ereignis das Bash-Skript auf. Übergeben Sie 3 Parameter an dieses Skript. Der erste Parameter ist "uniqueid", um vom CDR empfangene Daten zu filtern. Der zweite Parameter ist "CALLERID (num)" (die Nummer des Anrufers), um zu wissen, wen er zurückrufen soll. Der dritte Parameter ist "NODEST" (Warteschlangennummer), an den der Anruf empfangen wurde, um zu wissen, bei welchem ​​Problem ein Anruf aufgetreten ist und an wen eine E-Mail-Benachrichtigung über einen verpassten Anruf gesendet werden soll.
Das Bash-Skript sollte eine Verbindung zur Datenbank asteriskcdrdb in MySQL herstellen und alle Werte der Variablen "Disposition" mit einer bestimmten "uniqueid" übernehmen. Von den erhaltenen Daten müssen die Werte "NO ANTWORT", "BUSY", "FAILED", "UNKNOWN" ausgeschlossen werden. Infolgedessen bleibt entweder "ANTWORT" - sie haben den eingehenden Anruf beantwortet oder gar nichts - der verpasste Anruf.

Wenn der Anruf verpasst wurde, sollte das Skript eine E-Mail-Benachrichtigung senden.
Mit Blick auf die Zukunft stelle ich einen wichtigen Punkt fest. Asterisk führt die Befehle nacheinander aus und wartet auf ihre Ausführung (was im Allgemeinen logisch ist). Und wir werden das Bash-Skript aufrufen, bevor der Befehl hangupcall ausgeführt wird. In dem Moment, in dem das Skript direkt ausgeführt wird, werden die Informationen über die gesuchte Uniqueid noch nicht in die CDR eingegeben. Um dieses Problem zu lösen, rufen wir das Bash-Skript mit dem Parameter "&" auf, sodass Asterisk sofort mit dem nächsten Schritt fortfährt, dh dem Auflegen. Und innerhalb des Bash-Skripts werden wir zu Beginn eine kleine Zeitverzögerung festlegen, damit Asterisk die Daten mit der für uns interessanten „Uniqueid“ in die CDR eingeben kann.

Übe

Bevor Sie mit der Konfiguration von Asterisk und der Erstellung eines Bash-Skripts fortfahren, müssen Sie das Senden von E-Mail-Benachrichtigungen konfigurieren. Dafür verwenden wir das Postfix-Dienstprogramm.

Postfix-Setup

Wir haben eine Mail-Domain "luck.ru" in Yandex. Wir werden Postfix im SMTP-Client-Modus konfigurieren und Briefe vom Konto asterisk@lucky.ru senden.
Die Lösung finden Sie hier: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex .

Zuerst installieren / aktualisieren / nach Paketen suchen:

yum install postfix yum install mailx yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain 

Wir werden die Haupt-Postfix-Konfigurationsdatei "/etc/postfix/main.cf" nicht überschreiben, sondern sichern:

 cp /etc/postfix/main.cf /etc/postfix/main.cf.sav 

Wir bearbeiten die Datei "/etc/postfix/main.cf" und bringen sie in das folgende Formular:

 nano /etc/postfix/main.cf ##################### relayhost = smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/private/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_type = cyrus smtp_sasl_mechanism_filter = login smtp_sender_dependent_authentication = yes sender_dependent_relayhost_maps = hash:/etc/postfix/private/sender_relay smtp_generic_maps = hash:/etc/postfix/generic smtp_tls_CAfile = /etc/postfix/ca.pem smtp_use_tls = yes smtputf8_autodetect_classes = all ##################### 

Nicht jede Zeile in "/etc/postfix/main.cf" kann kommentiert werden. Kommentare in einigen Zeilen werden vom Parser nicht festgelegt und an die Verarbeitung übergeben. Dies führt zu Fehlern. Es ist besser, Kommentare in dieser Datei abzulehnen. Sie können damit experimentieren, indem Sie im nächsten Fenster "tail -f / var / log / messages" ausführen.

Ich werde die Zeile "smtputf8_autodetect_classes = all" markieren. Dieser Eintrag enthält standardmäßig utf-8, mit dem Sie das kyrillische Alphabet sowohl im Hauptteil des Buchstabens als auch in der Betreffzeile ohne zusätzliche Manipulationen verwenden können (siehe http://www.postfix.org/SMTPUTF8_README.html ).

Erstellen Sie ein Verzeichnis für die Konfigurationsdateien:

 mkdir /etc/postfix/private 

Wir bearbeiten die Datei "/ etc / postfix / private / sender_relay". Darin müssen Sie angeben, auf welchen SMTP-Server Sie bei Verwendung unserer Mail-Domain verweisen müssen:

 nano /etc/postfix/private/sender_relay ##################### @lucky.ru smtp.yandex.ru ##################### 

Wir bearbeiten die Datei "/ etc / postfix / private / sasl_passwd". Darin geben wir die E-Mail-Adresse an, die wir zum Senden von Briefen verwenden werden, sowie den Benutzernamen und das Passwort für dieses Konto (wir geben den Benutzernamen und das Passwort durch einen Doppelpunkt an):

 nano /etc/postfix/private/sasl_passwd ##################### asterisk@lucky.ru asterisk@lucky.ru:password_asterisk ##################### 

Bearbeiten der Datei / etc / postfix / generic. Darin werden wir die Regeln für das Ersetzen der ausgehenden Adresse aufschreiben (siehe https://wiki.merionet.ru/ip-telephoniya/30/postfix-nastrojka-otpravki-pochty-v-asterisk/ ):

 nano /etc/postfix/generic ##################### root asterisk@lucky.ru root@localhost asterisk@lucky.ru root@localhost.localdomain asterisk@lucky.ru root@freepbx asterisk@lucky.ru root@freepbx.localdomain asterisk@lucky.ru root@asterisk asterisk@lucky.ru root@asterisk.localdomain asterisk@lucky.ru asterisk asterisk@lucky.ru asterisk@localhost asterisk@lucky.ru asterisk@localhost.localdomain asterisk@lucky.ru asterisk@freepbx asterisk@lucky.ru asterisk@freepbx.localdomain asterisk@lucky.ru asterisk@asterisk asterisk@lucky.ru asterisk@asterisk.localdomain asterisk@lucky.ru root@localdomain.localdomain asterisk@lucky.ru ##################### 

Die anfängliche Ausgangsadresse hängt vom Inhalt von "/ etc / hosts" und "/ etc / hostname" sowie vom Namen des Benutzers ab, der den Brief senden wird. Das heißt, trotz der Tatsache, dass wir den SMTP-Client verwenden und Briefe von asterisk@lucky.ru senden, ersetzt postfix zunächst "etwas Eigenes" in die Absenderadresse und dies sollte mit den Regeln aus dieser Konfigurationsdatei korrigiert werden.

Ich werde den Inhalt meiner Datei / etc / hosts auflisten:

 cat /etc/hosts ##################### 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 asterisk.localdomain 127.0.0.1 localhost.localdomain localhost ::1 asterisk localhost localhost6 ##################### 

Es ist wichtig, dass der Server über eine Domäne verfügt (der Wert nach dem Punkt), da das Mail-Dienstprogramm den Domänennamen in "/ etc / hosts" "sucht" und ihn nicht sofort findet, wenn es ihn nicht sofort "findet" erst dann sende einen brief. Das heißt, wenn die Domain nicht registriert ist, wird der Brief mit einer Verzögerung von einigen Minuten verlassen.

Ich werde den Inhalt meiner Datei / etc / hostname auflisten:

 cat /etc/hostname ##################### asterisk ##################### 

Als Nächstes müssen Sie die erstellten Konfigurationsdateien in indizierte Datenbanken übertragen. Führen Sie dazu den folgenden Befehl aus:

 postmap /etc/postfix/generic && postmap /etc/postfix/private/{sasl_passwd,sender_relay} 

Als Nächstes müssen wir das Zertifikat smtp.yandex.ru herunterladen und auf dem Server ablegen. Führen Sie dazu den folgenden Befehl aus:

 openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25 > /etc/postfix/ca.pem 

Nachdem die technischen Informationen auf dem Bildschirm angezeigt werden, bleibt das Team "weiterhin hängen". Drücken Sie Strg + C, um den Vorgang abzubrechen.

Löschen Sie nun manuell den gesamten Müll aus der resultierenden Datei und lassen Sie nur das Zertifikat. Sie sollten so etwas bekommen:

 nano /etc/postfix/ca.pem ##################### -----BEGIN CERTIFICATE----- MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf ... nRG0DfdqYIuPGApFORYe -----END CERTIFICATE----- ##################### 

Starten Sie schließlich postfix neu:

 service postfix restart 

Wir senden einen Testbrief:

 echo "  " | mail -s " " admin@lucky.ru 

admin@lucky.ru - Zieladresse

Damit ist die Posfix-Konfiguration abgeschlossen.

Ein Bash-Skript schreiben

Erstellen Sie ein Verzeichnis zum Speichern eines Bash-Skripts (hier gefällt es jemandem wo):

 mkdir /home/asterisk/scripts 

Erstellen Sie eine Bash-Skriptdatei:

 touch /home/asterisk/scripts/noanswer.sh 

Wir geben der Skriptdatei die Berechtigung zum Ausführen:

 chmod +x /home/asterisk/scripts/noanswer.sh 

Wenn Zweifel an den Rechten an der Datei bestehen, können Sie während des Debuggens vollen Zugriff auf die Datei gewähren. Aber es ist "nicht sicher".

 chmod 777 /home/asterisk/scripts/noanswer.sh 

Der Text des Bash-Skripts:

 nano /home/asterisk/scripts/noanswer.sh ##################### #!/bin/bash sleep 7 res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'" answer=`mysql -u freepbxuser -pPassword_freepbxuser -D asteriskcdrdb -B -N -e "$res_sql" | grep -E -v "NO ANSWER|BUSY|FAILED|UNKNOWN" | head -n 1` error_kod=0 if [ "$answer" != "ANSWERED" ] then case $3 in 68800) address="big_boss@lucky.ru" subject="  " ;; 63100) address="debian@lucky.ru" subject="  linux debian" ;; 63200) address="windows@lucky.ru" subject="  windows" ;; 63300) address="freebsd@lucky.ru" subject="  freebsd" ;; 63400) address="ubuntu@lucky.ru" subject="  linux ubuntu" ;; 63500) address="centos@lucky.ru" subject="  linux centos" ;; *) address="admin@lucky.ru" error_kod=1 ;; esac case $error_kod in 0) echo "    $2,  $subject." | mail -s "   $2" $address echo "   $address   $2,  $subject. uid=$1" | mail -s "   $2" admin@lucky.ru ;; 1) echo "   $2.  . uid=$1" | mail -s "   $2" admin@lucky.ru ;; esac fi ##################### 

Eine kurze Analyse des Skripts:
"Schlaf 7":

Dies ist die gleiche Zeitverzögerung, über die ich früher geschrieben habe. Wir haben eine Verzögerung von 7 Sekunden. Obwohl ich denke, eine Sekunde ist genug.

 «res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"»: 

Die Abfrage in MySQL haben wir der Einfachheit halber in eine separate Variable eingefügt.

Als nächstes stellen wir eine Anfrage in MySQL und filtern die resultierende Ausgabe. Wir entfernen alle Optionen außer "ANTWORT", falls vorhanden. Wenn es mehrere "ANTWORTEN" -Werte gibt, sollte nur einer übrig bleiben. Am Ende erhalten wir in der Variablen "Antwort" entweder "ANTWORT" oder "".
Wenn der Wert der Antwortvariablen nicht gleich ANTWORT ist, handelt es sich um einen verpassten Anruf. Abhängig von der Warteschlangennummer legen wir mithilfe des Falloperators die Adresse fest, an die eine E-Mail-Benachrichtigung gesendet werden muss, und was in diese Nachricht geschrieben werden soll (variabler Teil der Nachricht).

Das Folgende ist eine Option, wenn die Warteschlange in Asterisk festgelegt, aber nicht im Skript beschrieben ist. In diesem Fall erhält admin@lucky.ru einen Brief, in dem angegeben wird, dass die Warteschlange dem Skript nicht bekannt ist.

Wenn die Warteschlange beschrieben ist, werden ein Zielbrief und ein doppelter Brief an admin@lucky.ru gesendet, in denen "uniqueid" angegeben ist, damit Sie bei Bedarf Ereignisse bei diesem Anruf verfolgen können.

Damit ist das Skript beendet.

Ich stelle fest, dass wir für die Verbindung zu MySQL den Benutzernamen und das Passwort verwendet haben, die wir im Voraus erkannt haben. Führen Sie in FreePBX den folgenden Befehl aus, um die Asterisk-Benutzeranmeldung in MySQL herauszufinden.

 cat /etc/amportal.conf | grep AMPDBUSER 

Führen Sie den folgenden Befehl aus, um das Kennwort des Asterisk-Benutzers in MySQL herauszufinden.

 cat /etc/amportal.conf | grep AMPDBPASS 

Konfigurieren Sie Asterisk

Wir benutzen FreePBX. FreePBX verfügt über verschiedene Arten von Konfigurationsdateien (siehe https://asterisk-pbx.ru/wiki/freepbx/files ). Einige davon werden beim Neustart von FreePBX überschrieben, andere werden nicht überschrieben (sie werden als benutzerdefiniert bezeichnet), da sie speziell entwickelt wurden für den Benutzer.

Wir werden mit der Konfigurationsdatei "extensions_override_freepbx.conf" arbeiten, da diese vom Typ custom ist.

Stellen Sie zunächst sicher, dass die Datei "extensions_override_freepbx.conf" mit der Datei "/etc/asterisk/extensions.conf" verbunden ist. Führen Sie dazu den folgenden Befehl aus:

 cat /etc/asterisk/extensions.conf | grep extensions_override_freepbx.conf ##################### #include extensions_override_freepbx.conf ##################### 

Wir bearbeiten die Datei "/etc/asterisk/extensions_override_freepbx.conf" und bringen sie in das folgende Formular:

 nano /etc/asterisk/extensions_override_freepbx.conf ##################### [ext-queues] exten => h,1,System(/home/asterisk/scripts/noanswer.sh ${CDR(uniqueid)} ${CALLERID(num)} ${NODEST} &) exten => h,2,Macro(hangupcall,) ##################### 

Wie ich bereits geschrieben habe, ist das Symbol "&" am Ende erforderlich. Da wir in einem Bash-Skript mit CDR-Daten direkt aus der MySQL-Datenbank arbeiten und diese Daten erst nach Ausführung von „exten => h, 2, Macro (hangupcall,)“ in MySQL eingegeben werden, müssen wir nicht auf den Abschluss des Bash-Skripts warten und fahren Sie mit dem nächsten Schritt in Asterisk fort. Und das Bash-Skript selbst muss eine Zeitverzögerung enthalten, bevor es seinen Hauptteil ausführt.

Damit die Änderungen in der Konfigurationsdatei "/etc/asterisk/extensions_override_freepbx.conf" wirksam werden, müssen Sie den Asterisk-Kernel mit dem folgenden Befehl neu starten:

 /usr/sbin/asterisk -rx "core restart now" 

Dies muss erfolgen, nachdem das Bash-Skript erstellt wurde.

Fazit

Dies ist wahrscheinlich die 1001. Möglichkeit, verpasste Anrufe in Asterisk abzufangen. Teilen Sie in den Kommentaren mit, wie Sie dieses Problem lösen. Und was kann Ihrer Meinung nach verbessert / erneuert / optimiert werden? Wir werden für die konstruktiven Ideen dankbar sein.

Source: https://habr.com/ru/post/de463829/


All Articles