
IP ATC Asterisk est une machine performante dans le domaine de la téléphonie IP. Et l'interface Web FreePBX, créée pour Asterisk, simplifie grandement la configuration et réduit les barrières à l'entrée dans le système.
Si vous pensez à une tâche liée à la téléphonie IP, elle peut presque certainement être implémentée dans Asterisk. Mais rassurez-vous, il vous faudra de la persévérance et de l’endurance.
Nous avons été confrontés à la tâche de configurer des notifications par courrier électronique concernant les appels manqués. Plus précisément, notifiez par e-mail les cas où un appel entrant est entré dans la file d'attente, mais aucun (des agents) n'a répondu à cet appel entrant.
Étonnamment, nous n'avons trouvé aucun outil standard pour résoudre ce problème dans FreePBX. Je vais vous expliquer ci-dessous comment nous avons résolu ce problème.
Avant-propos
Avant de résoudre le problème de front, nous avons bien sûr cherché des informations sur Internet, mais n'avons pas trouvé de solution clé en main (nous n'avons peut-être pas bien cherché, mais que faire...).
Il n'y a pas autant de compétences que nous le souhaiterions pour travailler directement dans Asterisk, donc la solution proposée , n’a pas été entièrement compris et a été rejeté.
J'ai aimé la solution proposée , même si cela n'a pas fonctionné. C'est pourquoi ils ont souligné que vous devez travailler dans Asterisk dans le contexte de files d'attente [ext-queues]. Et puisque nous travaillons dans Freepbx, nous devons travailler dans le fichier de configuration « extensions_override_freepbx.conf ». Nous avons remarqué que « rattraper les appels manqués » est pratique avant l'événement de raccrochage (fin d'appel).
Après avoir lu la discussion , l'idée est venue qu'il fallait filtrer la variable « Disposition » dans le CDR par tous les agents de la file d'attente. Et après avoir lu informations, des étapes très spécifiques ont été élaborées pour résoudre le problème.
Ce que nous avons:
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.
Asterisk est configuré avec un IVR (menu vocal) qui distribue les appels entrants vers différentes files d'attente. Chaque file d'attente se voit attribuer des agents, c'est-à-dire des opérateurs.
Теория
Que se passe-t-il dans Asterisk
Lorsqu'Asterisk reçoit un appel entrant, l'appel est dirigé vers l'IVR. L'appelant fait un choix en appuyant sur un certain numéro du téléphone et est placé dans une certaine file d'attente. Après cela, tous les agents libres dans la file d'attente reçoivent un appel simultanément.
Afin de mieux comprendre ce qui se passe en ce moment et ce qui se passe ensuite, tournons-nous vers le rapport CDR (Fig. 1).

Ris.1
Lorsqu'un appel entrant entrait dans la file d'attente, la valeur de la variable « Disposition » pour tous les agents devenait égale à « PAS DE RÉPONSE » si les agents n'étaient pas occupés à ce moment-là. La variable « Disposition » pourrait prendre d'autres valeurs (voir. ), à l’exception de la valeur « RÉPONDU ». Et au moment où l'un des agents répond à un appel entrant, la valeur de la variable « Disposition » de cet agent devient égale à « RÉPONDÉ ».
Dans le rapport CDR, vous pouvez voir que lorsque l'appel est mis en file d'attente (dans la colonne App, la valeur devient égale à « Queue »), alors tous les événements apparaissent avec le même « uniqueid » (colonne Système).
En bref sur le CDR
Il est important de comprendre ce qu'est un CDR et à quel moment exactement les données que nous observons dans le rapport CDR sont saisies dans le CDR. Le CDR, relatif au système d'exploitation, est une base de données dans laquelle Asterisk écrit un rapport d'appel détaillé (voir. ). Dans notre cas, il s'agit d'une base de données appelée asteriskcdrdb, située dans MySQL. Nous avons établi empiriquement que les données sur un appel avec un certain « uniqueid » ne sont pas saisies dans asteriskcdrdb immédiatement après l'apparition d'un événement, mais après l'événement hangupcall (fin de l'appel).
Le principe de fonctionnement de la solution créée
Puisque nous avons plus de connaissances en bash qu'en Asterisk, l'idée principale s'est avérée être la suivante. Avant l'événement hangupcall, appelez un 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) » (numéro de l’appelant), pour savoir qui rappeler. Le troisième paramètre est « NODEST » (numéro de file d'attente) dans lequel l'appel a été reçu, afin de savoir de quel problème il s'agissait et à qui envoyer une notification par e-mail de l'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 certain « uniqueid ». Des données reçues, vous devez exclure les valeurs suivantes : « PAS DE RÉPONSE », « OCCUPE », « ÉCHEC », « INCONNU ». En conséquence, soit « RÉPONDÉ » restera - l'appel entrant a reçu une réponse, soit rien du tout - un appel manqué.
Ensuite, si l'appel est manqué, le script doit envoyer une notification par e-mail.
Pour l’avenir, je noterai un point important. Asterisk exécute les commandes de manière séquentielle, en attendant qu'elles se terminent (ce qui est généralement logique). Et nous appellerons le script bash avant que la commande hangupcall ne soit exécutée. Ainsi, au moment de l'exécution directe du script, les informations sur le « uniqueid » que nous recherchons ne seront pas encore saisies 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 raccrocher. Et à l'intérieur du script bash, au tout début, nous définirons un petit délai pour donner à Asterisk le temps de saisir les données avec l'identifiant unique qui nous intéresse dans le CDR.
Pratique
Avant de passer à la configuration d'Asterisk et à la création d'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 » hébergé sur Yandex. Nous allons configurer Postfix en mode client SMTP et envoyer des courriers depuis le compte asterisk@lucky.ru.
La solution est basée sur ceci : .
Commençons par installer/mettre à jour/vérifier les packages :
yum install postfix
yum install mailx
yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plainN'écrasons pas le fichier de configuration principal de Postfix « /etc/postfix/main.cf », mais créons-en une copie de sauvegarde :
cp /etc/postfix/main.cf /etc/postfix/main.cf.savNous éditons le fichier « /etc/postfix/main.cf » et le mettons 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 dans certaines lignes ne sont pas détectés par l'analyseur et sont envoyés 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 le cyrillique à la fois dans le corps de la lettre et dans le sujet de la lettre sans manipulations supplémentaires (Voir. ).
Créons un répertoire pour les fichiers de configuration :
mkdir /etc/postfix/privateEditez le fichier « /etc/postfix/private/sender_relay ». Dans celui-ci, vous devez indiquer à quel serveur SMTP vous devez vous connecter lorsque vous utilisez notre domaine de messagerie :
nano /etc/postfix/private/sender_relay
#####################
@lucky.ru smtp.yandex.ru
#####################Modifiez le fichier « /etc/postfix/private/sasl_passwd ». Nous y indiquerons l'adresse e-mail que nous utiliserons pour envoyer des lettres, ainsi que le login et le mot de passe de ce compte (nous indiquons le login et le mot de passe séparés par deux points) :
nano /etc/postfix/private/sasl_passwd
#####################
asterisk@lucky.ru asterisk@lucky.ru:password_asterisk
#####################Editez le fichier « /etc/postfix/generic ». Nous y écrirons les règles de remplacement de l'adresse sortante (voir. ):
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 de sortie initiale dépend du contenu de « /etc/hosts » et « /etc/hostname », ainsi que du nom de l'utilisateur qui enverra le message. Ainsi, même si nous utilisons un client SMTP et envoyons des messages depuis asterisk@lucky.ru, Postfix remplacera initialement « quelque chose de son propre » par l'adresse de l'expéditeur, ce qui doit être corrigé à l'aide des règles de ce fichier de configuration.
Voici 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 une sorte de domaine (la valeur après le point), car l'utilitaire de messagerie « cherche » le nom de domaine dans « /etc/hosts » et s'il ne le « trouve » pas immédiatement, il continuera à le faire pendant encore quelques minutes et ce n'est qu'alors qu'il enverra la lettre. Autrement dit, si le domaine n'est pas enregistré, la lettre sera envoyée avec un délai de plusieurs minutes.
Voici 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.pemMais une fois les informations techniques affichées à l’écran, la commande « continuera à se bloquer ». Appuyez sur Ctrl+C pour l'abandonner.
Maintenant, supprimons manuellement toutes les ordures du fichier résultant et ne laissons que le certificat. Ça devrait ressembler a quelque chose comme ca:
nano /etc/postfix/ca.pem
#####################
-----BEGIN CERTIFICATE-----
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
...
nRG0DfdqYIuPGApFORYe
-----END CERTIFICATE-----
#####################Et enfin redémarrez Postfix :
service postfix restartEnvoi d'une lettre test :
echo "Это тело письма" | mail -s "Это тема" admin@lucky.ruadmin@lucky.ru — adresse de destination
Ceci termine la configuration du posfix.
Écrire un script bash
Créez un répertoire pour stocker le script bash (voici où vous le préférez) :
mkdir /home/asterisk/scriptsCréez un fichier de script bash :
touch /home/asterisk/scripts/noanswer.shNous donnons au fichier de script les autorisations d'exécution :
chmod +x /home/asterisk/scripts/noanswer.shS'il y a des doutes sur les droits sur un fichier, vous pouvez alors accorder un accès complet au fichier pendant le débogage. Mais ce n’est « pas sûr ».
chmod 777 /home/asterisk/scripts/noanswer.shTexte 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
#####################Brève analyse du scénario :
"dormir 7":
C’est le même délai dont j’ai parlé plus tôt. Nous avons un délai fixé à 7 secondes. Mais je pense qu'une seconde suffit.
«res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"»:Nous avons déplacé la requête dans MySQL dans une variable distincte pour plus de commodité.
Ensuite, nous effectuons une requête dans MySQL et filtrons la sortie résultante. Nous supprimons toutes les options sauf « RÉPONDU », s'il y en a une. S'il y a plusieurs valeurs « RÉPONDU », il ne faut en laisser qu'une seule. A la fin, nous recevrons soit « RÉPONDÉ » soit « » dans la variable « réponse ».
Si la valeur de la variable "réponse" n'est pas "RÉPONDÉE", alors il s'agit d'un appel manqué. En fonction du numéro de file d'attente, à l'aide de l'instruction case, nous préciserons l'adresse à laquelle exactement la notification par e-mail doit être envoyée et ce qu'il faut écrire dans ce message (la partie variable du message).
Considérons ensuite le cas où la file d'attente est définie dans Asterisk, mais non décrite dans le script. Dans ce cas, admin@lucky.ru recevra un message indiquant que la file d'attente est inconnue du script.
Si la file d'attente est décrite, une lettre sera envoyée à la destination et une lettre en double à admin@lucky.ru indiquant « uniqueid », afin qu'il soit possible de suivre les événements sur cet appel, si nécessaire.
C'est ici que se termine le scénario.
Je note que pour nous connecter à MySQL, nous avons utilisé un identifiant et un mot de passe que nous avons appris à l'avance. Dans FreePBX, afin de connaître le login de l'utilisateur Asterisk dans mysql, exécutez la commande suivante :
cat /etc/amportal.conf | grep AMPDBUSEREt pour connaître le mot de passe de l'utilisateur Asterisk dans mysql, exécutez la commande suivante :
cat /etc/amportal.conf | grep AMPDBPASSConfiguration d'Asterisk
Nous utilisons FreePBX. FreePBX possède différents types de fichiers de configuration (voir ), certains d'entre eux sont écrasés par FreePBX au redémarrage, et d'autres ne sont pas écrasés (ils sont appelés personnalisés), car ils sont spécifiquement conçus pour l'utilisateur.
Nous travaillerons avec le fichier de configuration « extensions_override_freepbx.conf », puisqu'il est de type personnalisé.
Tout d’abord, assurons-nous que le fichier « extensions_override_freepbx.conf » est inclus 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
#####################Editez le fichier « /etc/asterisk/extensions_override_freepbx.conf » et amenez-le 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 obligatoire. Puisque 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 saisies dans mysql qu'après avoir exécuté « exten => h,2,Macro(hangupcall,) », nous n'avons pas besoin d'attendre le bash pour terminer le traitement 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 apportées au 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 1001ème façon de « récupérer les appels manqués » dans Asterisk. Partagez dans les commentaires comment vous résolvez ce problème. Et qu’est-ce qui, selon vous, peut être amélioré/refait/optimisé. Nous serons reconnaissants pour les idées constructives.
Source: habr.com
