FreePBX. Nastavenie Asterisk pre e-mailové upozornenia o zmeškaných prichádzajúcich hovore v rade

FreePBX. Nastavenie Asterisk pre e-mailové upozornenia o zmeškaných prichádzajúcich hovore v rade
IP ATC Asterisk — je silný nástroj v oblasti IP telefónie. Webové rozhranie FreePBX, vytvorené pre Asterisk, výrazne uľahčuje nastavenie a znižuje prah vstupu do systému.
Ak si viete predstaviť nejakú úlohu spojenú s IP telefóniou, tak to takmer určite možné zrealizovať v Asterisk. Ale buďte si istí, že od vás sa bude vyžadovať vytrvalosť a trpezlivosť.

Pred nami stála úloha nastaviť e-mailové oznámenia o missed calls. Presnejšie povedané, informovať prostredníctvom e-mailu o prípadoch, keď prichádzajúci hovor prešiel do fronty, ale nikto (z agentov) na tento prichádzajúci hovor neodpovedal.

Prekvapivo sme nenašli žiadne štandardné prostriedky na riešenie tejto úlohy vo FreePBX. O tom, ako sme túto úlohu vyriešili, poviem pod katom.

Úvod

Pred riešením úlohy priamo sme samozrejme hľadali informácie na internete, ale hotové riešenie sme nenašli (možno sme zle hľadali, ale čo sa dá robiť… ).

Zručností na prácu priamo v Asterisk nie je toľko, koľko by sme chceli, takže navrhované riešenie tu, nebolo úplne premyslené a bolo odmietnuté.

Páčilo sa nám riešenie navrhnuté tu, hoci nefungovalo. Odtiaľto sme zdôraznili, že pracovať v Asterisk je potrebné v kontexte frontov [ext-queues]. A keďže pracujeme vo Freepbx, treba pracovať v konfiguračnom súbore „extensions_override_freepbx.conf“. Všimli sme si, že „lapiť missed calls“ je pohodlné pred udalosťou hangupcall (ukončenie hovoru).
Prečítaním diskusie tu, prišla myšlienka, že je potrebné filtrovať v CDR premennú „Disposition“ podľa všetkých agentov v fronte. A po prečítaní tejto informácie sa vytvorili veľmi konkrétne kroky na riešenie stanoveného cieľa.

Čo máme:

Máme FreePBX 13.0.197, ktorý používa Asterisk 13.12.1. Verzia OS SHMZ release 6.6 (Final). Distribúcia je založená na CentOS.

V Asterisk je nastavené IVR (hlasové menu), ktoré rozdeľuje prichádzajúce hovory na rôzne Queues (fronty). Každej fronte sú priradení Agents (agenti), t. j. operátori.

Teória

Čo sa deje v Asterisk

Keď na Asterisk príde prichádzajúci hovor, tento hovor prechádza na IVR. Volajúci si vyberie stlačením určitého čísla na telefóne a dostáva sa do určitej fronty. Potom všetkým voľným agentom fronty naraz prichádza hovor.

Aby sme lepšie pochopili, čo sa deje v tomto momente a čo sa deje ďalej, obrátime sa na Report CDR (Obr. 1).

FreePBX. Nastavenie Asterisk pre e-mailové upozornenia o zmeškaných prichádzajúcich hovore v rade
Obr. 1

Keď prichádza hovor do fronty, hodnota premennej „Disposition“ sa pre všetkých agentov nastaví na „NO ANSWER“, ak agenti v tom momente nie sú zaneprázdnení. Premenná „Disposition“ môže získať aj iné hodnoty (pozri. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr), okrem hodnoty „ANSWERED“. A v momente, keď niektorý z agentov odpovedá na prichádzajúci hovor, hodnota premennej „Disposition“ tohto agenta sa nastaví na „ANSWERED“.
Z Reportu CDR je evidentné, že keď hovor prešiel do fronty (v stĺpci App hodnota sa stáva „Queue“), všetky udalosti sa objavujú s rovnakým „uniqueid“ (stĺpec System).

Stručne o CDR

Je dôležité pochopiť, čo je CDR a v akom momente sa do CDR zapisujú údaje, ktoré pozorujeme v Reporte CDR. CDR, vzhľadom na operačný systém, je databáza, do ktorej Asterisk zapisuje podrobný prehľad hovorov (pozri. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr). V našom prípade ide o databázu s názvom asteriskcdrdb, ktorá sa nachádza v mysql. Experimentálne sme zistili, že údaje o hovore s konkrétnym „uniqueid“ sa do asteriskcdrdb nezapisujú hneď po vzniku akejkoľvek udalosti, ale až po udalosti hangupcall (ukončenie hovoru).

Princíp fungovania vytvoreného riešenia

Keďže máme viac znalostí v bash, ako majú vedomosti v Asterisk, hlavná myšlienka bola nasledovná. Pred udalosťou hangupcall zavolať bash skript. Do tohto skriptu sa odovzdajú 3 parametre. Prvý parameter „uniqueid“, na filtrovanie údajov získaných z CDR. Druhý parameter „CALLERID(num)“ (číslo volajúceho), aby sme vedeli, komu zavolať späť. Tretí parameter „NODEST“ (číslo fronty), do ktorej prišiel hovor, aby sme vedeli, aká otázka bola, a komu poslať e-mailové oznámenie o zmeškanom hovore.
Bash skript by sa mal pripojiť k databáze asteriskcdrdb v mysql a získať všetky hodnoty premennej „Disposition“ s konkrétnym „uniqueid“. Z získaných údajov je potrebné vylúčiť hodnoty: „NO ANSWER“, „BUSY“, „FAILED“, „UNKNOWN“. V dôsledku toho ostanú buď „ANSWERED“ — na prichádzajúci hovor odpovedali, alebo nič — zmeškaný hovor.

Následne, ak bol hovor zmeškaný, skript by mal poslať e-mailové oznámenie.
Na úvod si poznačím dôležitý bod. Asterisk vykonáva príkazy postupne a čaká na ich vykonanie (čo je logické). Bash skript vyvoláme skôr, než sa vykoná príkaz hangupcall. Tým pádom v okamihu vykonania skriptu ešte nebude v CDR zaznamenaná informácia o požadovanom „uniqueid“. Na riešenie tohto problému spustíme bash skript s parametrom „&“, aby Asterisk okamžite prešiel k vykonaniu ďalšieho kroku, t. j. hangupcall. Na začiatku bash skriptu nastavíme malú časovú oneskorenie, aby sme poskytli čas Asterisku na zaznamenanie údajov o zaujímavom „uniqueid“ do CDR.

Praktika

Predtým, než prejdeme na nastavenie Asterisku a vytvorenie bash skriptu, je potrebné nastaviť odosielanie e-mailových oznámení. Na tento účel použijeme nástroj postfix.

Nastavenie postfixu

Máme e-mailovú doménu „lucky.ru“, umiestnenú v Yandexe. Nastavíme postfix do režimu smtp klienta a budeme posielať správy z účtu asterisk@lucky.ru.
Základom je riešenie odtiaľto: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex.

Najprv nainštalujeme/aktualizujeme/skontrolujeme dostupnosť balíkov:

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

Nebudeme prepísať hlavný konfiguračný súbor postfixu „/etc/postfix/main.cf“, ale vytvoríme jeho zálohu:

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

Upravíme súbor „/etc/postfix/main.cf“ a privedieme ho k nasledujúcemu vzhľadu:

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

Nie každú vetu v „/etc/postfix/main.cf“ je možné komentovať. Niektoré komentáre nie sú rozpoznané parserom a sú odovzdávané na spracovanie, čo môže viesť k chybám. Je lepšie sa komentárom v tomto súbore vyhnúť. Môžete to otestovať spustením príkazu „tail -f /var/log/messages“ v vedľajšom okne.

Upozorním na riadok „smtputf8_autodetect_classes = all“. Tento záznam povoluje utf-8 ako predvolený, čo umožňuje používanie cyriliky ako v tele správy, tak aj v predmetu správy bez dodatočných manipulácií (Pozri. http://www.postfix.org/SMTPUTF8_README.html).

Vytvoríme adresár pre konfiguračné súbory:

mkdir /etc/postfix/private

Upravujeme súbor „/etc/postfix/private/sender_relay“. V ňom musíme uviesť, na ktorý smtp server sa má odkazovať pri použití našej poštovej domény:

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

Upravujeme súbor „/etc/postfix/private/sasl_passwd“. V ňom uvedieme e-mailovú adresu, ktorú budeme používať na odosielanie správ, a tiež používateľské meno a heslo k tomuto účtu (používateľské meno a heslo uvádzame cez dvojbodku):

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

Upravujeme súbor „/etc/postfix/generic“. V ňom predpíšeme pravidlá na zmenu odosielacej adresy (pozri. 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
#####################

Počiatočná odosielacia adresa závisí od obsahu „/etc/hosts“ a „/etc/hostname“, ako aj od používateľského mena, ktoré bude správu odosielať. T. j. aj keď používame smtp klienta a odosielame správy z asterisk@lucky.ru, postfix prvotne vloží do adresy odosielateľa „niečo svoje“ a to je potrebné opraviť pravidlami z tohto konfiguračného súboru.

Príklad obsahu môjho súboru „/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
#####################

Je dôležité, aby server mal nejakú doménu (hodnota za bodkou), pretože utilita mail „hľadá“ názov domény v „/etc/hosts“ a ak ho „nenájde“ hneď, pokračuje v hľadaní ešte niekoľko minút a až potom odošle správu. T. j. ak doména nie je uvedená, správa bude odoslaná so oneskorením niekoľkých minút.

Príklad obsahu môjho súboru „/etc/hostname“:

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

Ďalej je potrebné previesť vytvorené konfiguračné súbory do indexovaných databáz, na to vykonáme nasledujúci príkaz:

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

Ďalej je potrebné stiahnuť a umiestniť na server certifikát smtp.yandex.ru, na to vykonáme nasledujúci príkaz:

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

Ale po zobrazení technických informácií bude tím „naďalej visieť“. Stlačte Ctrl+C na prerušenie.

Teraz ručne odstránime zo získaného súboru všetok odpad a ponecháme len certifikát. Malo by to vyzerať nasledovne:

nano /etc/postfix/ca.pem
#####################
-----ZAČIATOK CERTIFIKÁTU-----
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
...
nRG0DfdqYIuPGApFORYe
-----KONIEC CERTIFIKÁTU-----
#####################

A nakoniec reštartujeme postfix:

service postfix restart

Posielame testovací e-mail:

echo "Toto je telo e-mailu" | mail -s "Toto je téma" admin@lucky.ru

admin@lucky.ru — adresa príjemcu

Týmto je nastavenie postfixu dokončené.

Píšeme bash skript

Vytvárame adresár na uloženie bash skriptu (kde to komu viac vyhovuje):

mkdir /home/asterisk/scripts

Vytvárame súbor bash skriptu:

touch /home/asterisk/scripts/noanswer.sh

Dávame súboru skriptu práva na vykonávanie:

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

Ak máte pochybnosti o právach na súbor, tak na čas ladenia môžete dať úplný prístup k súboru. Ale to je „nebezpečné“.

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

Text bash skriptu:

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="o dôležitej záležitosti"
 ;;
 63100)
 address="debian@lucky.ru"
 subject="o otázkach linux debian"
 ;;
 63200)
 address="windows@lucky.ru"
 subject="o otázkach windows"
 ;;
 63300)
 address="freebsd@lucky.ru"
 subject="o otázkach freebsd"
 ;;
 63400)
 address="ubuntu@lucky.ru"
 subject="o otázkach linux ubuntu"
 ;;
 63500)
 address="centos@lucky.ru"
 subject="o otázkach linux centos"
 ;;
 *)
 address="admin@lucky.ru"
 error_kod=1
 ;;
 esac

 case $error_kod in
 0)
 echo "Zmeškaný hovor od predplatiteľa $2, ktorý volal $subject." | mail -s "Zmeškaný hovor od $2" $address
 echo "Zmeškaný hovor pre $address od predplatiteľa $2, ktorý volal $subject. uid=$1" | mail -s "Zmeškaný hovor od $2" admin@lucky.ru
 ;;
 1)
 echo "Zmeškaný hovor od $2. Čakajúca neznáma. uid=$1" | mail -s "Zmeškaný hovor od $2" admin@lucky.ru
 ;;
 esac

fi
#####################

Krátka analýza skriptu:
„sleep 7“:

Toto je tá oneskorenie, o ktorej som písal predtým. Máme nastavené oneskorenie na 7 sekúnd. Hoci si myslím, že aj jedna sekunda by stačila.

„res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"“:

Dotaz do mysql sme vyčlenili do samostatnej premennej pre pohodlie.

Ďalej urobíme dopyt do MySQL a filtrujeme získaný výstup. Odstránime všetky možnosti okrem „ANSWERED“, ak taká vôbec existuje. Ak je však hodnôt „ANSWERED“ viac, ponecháme iba jednu. Na konci v premennej „answer“ získame buď „ANSWERED“, alebo „“.
Ak hodnota premennej „answer“ nie je rovná „ANSWERED“, ide o nevybavený hovor. V závislosti od čísla fronty, pomocou operátora case určíme adresu, komu presne je potrebné poslať e-mailové oznámenie a čo v tejto správe napísať (meniteľná časť správy).

Ďalej je uvedená možnosť, keď je fronta nastavená v Asterisk, ale nie je opísaná v skripte. V tomto prípade admin@lucky.ru dostane e-mail o tom, že fronta nie je skriptu známa.

Ak je však fronta opísaná, bude odoslaný e-mail na určenie a duplikát e-mailu na admin@lucky.ru s uvedením „uniqueid“, aby bolo možné sledovať udalosti tohto hovoru v prípade potreby.

Na tomto skripte končíme.

Poznamenám, že na pripojenie k MySQL sme použili prihlásenie a heslo, ktoré sme sa dozvedeli vopred. Vo FreePBX, aby ste zistili prihlásenie používateľa Asterisk v MySQL, vykonajte nasledujúci príkaz:

cat /etc/amportal.conf | grep AMPDBUSER

A aby ste zistili heslo používateľa Asterisk v MySQL, vykonajte nasledujúci príkaz:

cat /etc/amportal.conf | grep AMPDBPASS

Nastavenie Asterisk

Používame FreePBX. Vo FreePBX existujú rôzne typy konfiguračných súborov (pozri. https://asterisk-pbx.ru/wiki/freepbx/files), niektoré z nich FreePBX prepisuje pri reštarte, a niektoré neprepíše (nazývajú sa custom), pretože sú špeciálne určené pre používateľa.

Budeme pracovať so súborom konfigurácie „extensions_override_freepbx.conf“, pretože patrí k typu custom.

Na začiatku sa uistíme, že v súbore „/etc/asterisk/extensions.conf“ je pripojený súbor „extensions_override_freepbx.conf“. Na to vykonáme nasledujúci príkaz:

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

Upravíme súbor „/etc/asterisk/extensions_override_freepbx.conf“ a privedieme ho do nasledujúceho tvaru:

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

Ako som už písal, znak „&“ na konci je povinný. Keďže budeme pracovať v bash skripte s údajmi CDR priamo z databázy mysql, a tieto údaje sa vkladajú do mysql až po vykonaní „exten => h,2,Macro(hangupcall,)“, je potrebné nečakať na ukončenie bash skriptu, ale prejsť k vykonaniu ďalšieho kroku v Asterisk. A samotný bash skript by mal obsahovať zdržanie pred vykonaním jeho hlavnej časti.

Aby zmeny v konfiguračnom súbore „/etc/asterisk/extensions_override_freepbx.conf“ nadobudli účinnosť, je potrebné reštartovať jadro Asterisk nasledujúcou príkazom:

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

To je potrebné urobiť po vytvorení bash skriptu.

Záver

Pravdepodobne je to 1001. spôsob „odchytenia zmeškaných hovorov“ v Asterisk. Podeľte sa v komentároch, ako túto úlohu riešite vy. A čo, podľa vášho názoru, by sa mohlo zlepšiť/premenovať/optimalizovať. Budeme vďační za konštruktívne nápady.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster