FreePBX Configuration d'Asterisk pour les notifications par e-mail des appels entrants manqués dans la file d'attente

image
IP ATC Asterisk est un puissant processeur de téléphonie IP. Et l'interface Web FreePBX créée pour Asterisk simplifie considérablement la configuration et abaisse le seuil de connexion.
Si vous pouvez proposer une sorte de tâche liée à la téléphonie IP, alors elle peut presque certainement être implémentée dans Asterisk. Mais soyez sûr que la persévérance et l'endurance vous seront demandées.

Nous avons dû configurer des notifications par e-mail des appels manqués. Plus précisément, pour notifier par e-mail les cas où un appel entrant a été mis en file d'attente, mais personne (des agents) n'a répondu à cet appel entrant.

Étonnamment, nous n'avons trouvé aucun outil régulier pour résoudre ce problème dans FreePBX. Je vais parler de la façon dont nous avons résolu ce problème sous la coupe.

Préface

Avant de résoudre le problème «de front», nous avons certainement recherché des informations sur Internet, mais nous n'avons pas trouvé de solutions clé en main (peut-être qu'ils cherchaient mal, mais que pouvez-vous faire ...).

Il n'y a pas autant de compétences professionnelles directement dans Asterisk que nous le souhaiterions, de sorte que la solution proposée ici n'a pas été entièrement comprise et a été rejetée.

J'ai aimé la solution proposée ici , même si elle n'a pas fonctionné. Par conséquent, ils ont souligné que travailler dans Asterisk est nécessaire dans le contexte des [ext-queues]. Et puisque nous travaillons dans Freepbx, nous devons travailler dans le fichier de configuration «extensions_override_freepbx.conf». Nous avons remarqué qu'il est pratique de «capturer les appels manqués» avant l'événement de raccrochage (fin d'un appel).
Après avoir lu la discussion ici , l'idée est venue que nous devons filtrer la variable «Disposition» dans le CDR pour tous les agents dans la file d'attente. Et après avoir lu ces informations, des étapes assez spécifiques ont été formées pour résoudre la tâche.

Qu'avons-nous:

Il existe FreePBX 13.0.197 qui utilise Asterisk 13.12.1. Version du système d'exploitation SHMZ version 6.6 (finale). La distribution est basée sur CentOS.

L'astérisque est configuré avec IVR (menu vocal) dispersant les appels entrants dans différentes files d'attente (files d'attente). Des agents (agents) sont affectés à chaque file d'attente, c'est-à-dire des agents.

Théorie

Que se passe-t-il chez Asterisk

Lorsqu'un appel entrant arrive à Asterisk, cet appel est dirigé vers l'IVR. L'appelant fait un choix en appuyant sur un numéro spécifique du téléphone et entre dans une file d'attente spécifique. Après cela, tous les agents libres de la file d'attente reçoivent simultanément un appel.

Afin de mieux comprendre ce qui se passe en ce moment et ce qui se passe ensuite, nous nous tournons vers Report CDR (Fig. 1).

image
Fig.1

Lorsqu'un appel entrant tombait dans la file d'attente, pour tous les agents, la valeur de la variable "Disposition" devenait égale à "AUCUNE RÉPONSE" si les agents n'étaient pas occupés à ce moment. La variable "Disposition" peut prendre d'autres valeurs (voir https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ), à l'exception de la valeur "ANSWERED". Et au moment où l'un des agents répond à l'appel entrant, la valeur de la variable "Disposition" de cet agent devient égale à "REPONSE".
Dans le rapport CDR, vous pouvez remarquer que lorsque l'appel est mis en file d'attente (dans la colonne App, la valeur devient «Queue»), tous les événements apparaissent avec le même «uniqueid» (colonne System).

CDR en bref

Il est important de comprendre ce qu'est un CDR et à quel moment dans le CDR les données que nous observons dans le rapport CDR sont entrées. Le CDR, relatif au système d'exploitation, est la base de données dans laquelle Asterisk enregistre un rapport d'appel détaillé (voir https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ). Dans notre cas, il s'agit d'une base de données appelée asteriskcdrdb, qui se trouve dans mysql. Empiriquement, nous avons constaté que les données sur un appel avec un certain «uniqueid» ne sont pas entrées dans asteriskcdrdb immédiatement après l'occurrence d'un événement, mais après l'événement hangupcall (fin de l'appel).

Le principe de la solution créée

Puisque nous avons plus de connaissances en bash que de connaissances en astérisque, l'idée principale est la suivante. Avant l'événement hangupcall, appelez le script bash. Passez 3 paramètres à ce script. Le premier paramètre est «uniqueid», pour filtrer les données reçues du CDR. Le deuxième paramètre est «CALLERID (num)» (le numéro de l'appelant) pour savoir qui rappeler. Le troisième paramètre est «NODEST» (numéro de file d'attente), auquel l'appel a été reçu, afin de savoir sur quel problème il y a eu un appel et à qui envoyer une notification par e-mail d'un appel manqué.
Le script bash doit se connecter à la base de données asteriskcdrdb dans mysql et prendre toutes les valeurs de la variable "Disposition" avec un "uniqueid" spécifique. A partir des données obtenues, il faut exclure les valeurs: "PAS DE REPONSE", "OCCUPÉ", "ECHEC", "INCONNU". En conséquence, soit "RÉPONSE" restera - ils ont répondu à l'appel entrant, soit rien du tout - l'appel manqué.

De plus, si l'appel a été manqué, le script doit envoyer une notification par e-mail.
Pour l'avenir, je note un point important. Asterisk exécute les commandes séquentiellement, en attendant leur exécution (ce qui est généralement logique). Et nous appellerons le script bash avant l'exécution de la commande hangupcall. Ainsi, au moment où le script est directement exécuté, les informations sur l'identifiant unique que nous recherchons ne seront pas encore entrées dans le CDR. Pour résoudre ce problème, nous appellerons le script bash avec le paramètre «&» afin qu'Asterisk passe immédiatement à l'étape suivante, c'est-à-dire hangupcall. Et à l'intérieur du script bash, au tout début, nous allons définir un petit délai pour donner le temps à Asterisk d'entrer les données avec l '"uniqueid" qui nous intéresse dans le CDR.

Pratique

Avant de configurer Asterisk et de créer un script bash, vous devez configurer l'envoi de notifications par e-mail. Pour cela, nous utiliserons l'utilitaire postfix.

Configuration de Postfix

Nous avons un domaine de messagerie "lucky.ru" situé à Yandex. Nous configurerons postfix en mode client smtp et enverrons des lettres du compte asterisk@lucky.ru.
La solution est prise à partir d'ici: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex .

Première installation / mise à jour / vérification des packages:

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

Nous n'écraserons pas le fichier de configuration principal de postfix «/etc/postfix/main.cf», mais le sauvegarderons:

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

Nous éditons le fichier «/etc/postfix/main.cf» et le portons sous la forme suivante:

 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 ##################### 

Toutes les lignes de "/etc/postfix/main.cf" ne peuvent pas être commentées. Les commentaires de certaines lignes ne sont pas déterminés par l'analyseur et sont transmis au traitement, ce qui entraîne des erreurs. Il vaut mieux refuser les commentaires à l'intérieur de ce fichier. Vous pouvez expérimenter cela en exécutant «tail -f / var / log / messages» dans la fenêtre suivante.

Je marquerai la ligne "smtputf8_autodetect_classes = all". Cette entrée inclut utf-8 par défaut, ce qui vous permet d'utiliser l'alphabet cyrillique dans le corps de la lettre et dans la ligne d'objet sans manipulations supplémentaires (voir http://www.postfix.org/SMTPUTF8_README.html ).

Créez un répertoire pour les fichiers de configuration:

 mkdir /etc/postfix/private 

Nous éditons le fichier "/ etc / postfix / private / sender_relay". Dans ce document, vous devez spécifier à quel serveur smtp vous devez vous référer lorsque vous utilisez notre domaine de messagerie:

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

Nous éditons le fichier "/ etc / postfix / private / sasl_passwd". Nous y indiquerons l'adresse e-mail que nous utiliserons pour envoyer des lettres, ainsi que le nom d'utilisateur et le mot de passe de ce compte (nous spécifions le nom d'utilisateur et le mot de passe via deux points):

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

Modification du fichier / etc / postfix / generic. Nous y noterons les règles de remplacement de l'adresse sortante (voir 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 ##################### 

L'adresse sortante initiale dépend du contenu de «/ etc / hosts» et «/ etc / hostname», ainsi que du nom de l'utilisateur qui enverra la lettre. Autrement dit, malgré le fait que nous utilisons le client smtp et envoyons des lettres de asterisk@lucky.ru, de toute façon, postfix remplacera initialement «quelque chose de propre» dans l'adresse de l'expéditeur et cela doit être corrigé par les règles de ce fichier de configuration.

Je vais lister le contenu de mon fichier / etc / hosts:

 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 ##################### 

Il est important que le serveur ait n'importe quel domaine (la valeur après la période), car l'utilitaire de messagerie "recherche" le nom de domaine dans "/ etc / hosts" et s'il ne le "trouve" pas immédiatement, il continuera à le faire pendant plusieurs minutes et alors seulement envoyez une lettre. Autrement dit, si le domaine n'est pas enregistré, la lettre partira avec un retard de plusieurs minutes.

Je vais lister le contenu de mon fichier / etc / hostname:

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

Ensuite, vous devez transférer les fichiers de configuration créés vers des bases de données indexées, pour ce faire, exécutez la commande suivante:

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

Ensuite, nous devons télécharger et placer le certificat smtp.yandex.ru sur le serveur, pour ce faire, exécutez la commande suivante:

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

Mais une fois que les informations techniques seront affichées à l'écran, l'équipe "continuera de se bloquer". Appuyez sur Ctrl + C pour l'annuler.

Maintenant, supprimez manuellement toutes les ordures du fichier résultant et ne laissez que le certificat. Vous devriez obtenir quelque chose comme ceci:

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

Enfin, redémarrez postfix:

 service postfix restart 

Nous envoyons une lettre de test:

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

admin@lucky.ru - adresse de destination

Ceci termine la configuration posfix.

Écrire un script bash

Créez un répertoire pour stocker un script bash (ici, quelqu'un l'aime où):

 mkdir /home/asterisk/scripts 

Créez un fichier de script bash:

 touch /home/asterisk/scripts/noanswer.sh 

Nous donnons au fichier de script les autorisations pour exécuter:

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

En cas de doute sur les droits sur le fichier, vous pouvez donner un accès complet au fichier pendant le débogage. Mais ce n'est "pas sûr".

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

Le texte du script bash:

 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 ##################### 

Une brève analyse du script:
"Sleep 7":

C'est le même délai que celui que j'ai écrit plus tôt. Nous avons un délai de 7 secondes. Bien que, je pense, une seconde suffit.

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

La requête dans mysql nous mettons dans une variable distincte pour plus de commodité.

Ensuite, nous faisons une demande dans mysql et filtrons la sortie résultante. Nous supprimons toutes les options sauf "RÉPONDRE", le cas échéant. S'il y a plusieurs valeurs «ANSWERED», alors une seule doit être laissée. À la fin, dans la variable «réponse», nous obtenons «RÉPONSE» ou «».
Si la valeur de la variable de réponse n'est pas égale à RÉPONSE, il s'agit d'un appel manqué. En fonction du numéro de file d'attente, à l'aide de l'opérateur de cas, nous définirons l'adresse à laquelle il est nécessaire d'envoyer une notification par e-mail, et quoi écrire dans ce message (partie variable du message).

Ce qui suit est une option lorsque la file d'attente est définie dans Asterisk, mais n'est pas décrite dans le script. Dans ce cas, admin@lucky.ru recevra une lettre indiquant que la file d'attente n'est pas connue du script.

Si la file d'attente est décrite, une lettre de destination et une lettre en double seront envoyées à admin@lucky.ru indiquant «uniqueid», afin que vous puissiez suivre les événements de cet appel, si nécessaire.

Ceci termine le script.

Je note que pour se connecter à mysql, nous avons utilisé le nom d'utilisateur et le mot de passe que nous avons reconnus à l'avance. Dans FreePBX, afin de découvrir la connexion utilisateur Asterisk dans mysql, exécutez la commande suivante:

 cat /etc/amportal.conf | grep AMPDBUSER 

Et afin de trouver le mot de passe de l'utilisateur Asterisk dans mysql, exécutez la commande suivante:

 cat /etc/amportal.conf | grep AMPDBPASS 

Configurer Asterisk

Nous utilisons FreePBX. FreePBX a différents types de fichiers de configuration (voir https://asterisk-pbx.ru/wiki/freepbx/files ), certains d'entre eux sont remplacés par FreePBX au redémarrage, et certains ne sont pas écrasés (ils sont appelés personnalisés), car ils sont spécialement conçus pour l'utilisateur.

Nous travaillerons avec le fichier de configuration «extensions_override_freepbx.conf», car il est de type custom.

Tout d'abord, assurez-vous que le fichier «extensions_override_freepbx.conf» est connecté dans le fichier «/etc/asterisk/extensions.conf». Pour ce faire, exécutez la commande suivante:

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

Nous éditons le fichier "/etc/asterisk/extensions_override_freepbx.conf" et le portons sous la forme suivante:

 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,) ##################### 

Comme je l'ai écrit plus tôt, le symbole «&» à la fin est requis. Étant donné que nous travaillerons dans un script bash avec des données CDR directement à partir de la base de données mysql, et que ces données ne sont entrées dans mysql qu'après avoir exécuté "exten => h, 2, Macro (hangupcall,)", nous n'avons pas besoin d'attendre la fin du script bash et passez à l'étape suivante dans Asterisk. Et le script bash lui-même doit contenir un délai avant d'exécuter sa partie principale.

Pour que les modifications du fichier de configuration «/etc/asterisk/extensions_override_freepbx.conf» prennent effet, vous devez redémarrer le noyau Asterisk avec la commande suivante:

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

Cela doit être fait après la création du script bash.

Conclusion

C'est probablement la 1001e façon de «capturer les appels manqués» dans Asterisk. Partagez dans les commentaires comment vous résolvez ce problème. Et ce qui, à votre avis, peut être amélioré / refait / optimisé. Nous serons reconnaissants pour les idées constructives.

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


All Articles