FreePBX. Asteriski seadistamine e-kirja teavitamiseks kadunud sisenevatest kõnedest järjekorras

FreePBX. Asteriski seadistamine e-kirja teavitamiseks kadunud sisenevatest kõnedest järjekorras
IP ATC Asterisk on võimas lahendus IP-telefonias. Asteriskile loodud FreePBXi veebiliides muudab seadistamise kohandamise ja süsteemi sisenemise lihtsamaks.
Kui suudate välja mõelda mistahes IP-telefoniga seotud ülesande, siis on peaaegu kindlasti võimalik see Asteriskis ellu viia. Kuid olge kindel, et tõuke ja kannatlikkuse osas on see vajalik.

Meie ülesanne oli seadistada e-kirjade teated kadunud kõnedest. Täpsemalt öeldes, teavitada e-kirjade kaudu juhul, kui sisenev kõne läks järjekorda, kuid keegi (agentidest) ei vastanud sellele sisenevale kõnele.

Üllatusena ei leidnud me FreePBXist selle ülesande lahendamiseks ametlikke vahendeid. Kuidas me selle ülesande lahendasime, sellest räägin allpool.

Eessõna

Enne otsese lahenduse otsimist otsisime loomulikult teavet internetist, kuid võtmelahendust ei leidnud (võib-olla ei otsinud piisavalt hästi, aga mis seal ikka...).

Asteriskiga otseselt töötamise oskusi ei ole nii palju, kui sooviksime, seega soovitatud lahendus siin, ei olnud täielikult arusaadav ja loobuti sellest.

Meile meeldis lahendus, mille esitas siin, kuigi see ei töötanud. Seetõttu rõhutasime, et Asteriskis tuleb töötada järjekordade kontekstis [ext-queues]. Ja kuna töötame FreePBXis, tuleb töötada failis „extensions_override_freepbx.conf“. Tõime välja, et „kadunud kõnede püüdmine“ on mugav teha enne hangupcall sündmust (kõne lõpp).
Diskussiooni lugedes siin, tekkis idee, et tuleb CDRis filtreerida muutuja „Disposition“ kõigi järjekorra agentide järgi. Pärast selle informatsiooni lugemist kujunesid välja selged sammud seatud ülesande lahendamiseks.

Mida meil on:

On FreePBX 13.0.197, mis kasutab Asterisk 13.12.1. OPER süsteemi versioon SHMZ release 6.6 (Final). Distsipriibutiiv põhineb CentOSil.

Asteriskis on seadistatud IVR (häälemenu), mis suunab sisenevaid kõnesid erinevatesse järjekordadesse. Iga järjekorra jaoks on määratud agendid.

Teooria

Mis toimub Asteriskis

Kui Asteriskisse jõuab sisenev kõne, jõuab see IVRi. Helistaja teeb oma valiku, vajutades telefonil kindlat numbrit, ja satub teatud järjekorda. Pärast seda saavad kõik vabad agendid järjekorrast samaaegselt kõne.

Kuna paremini mõista, mis sel hetkel toimub ja mis edasi saab, vaatame Report CDR-d (Kujutis 1).

FreePBX. Asteriski seadistamine e-kirja teavitamiseks kadunud sisenevatest kõnedest järjekorras
Kujutis 1

Kui sissetulev kõne jõudis järjekorda, siis kõikide agentide muutuja "Disposition" väärtus muutus "NO ANSWER"-iks, kui agendid sel hetkel ei olnud hõivatud. Muutuja "Disposition" võis võtta ka teisi väärtusi (vt. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr), peale väärtuse "ANSWERED". Ja hetkel, kui üks agendist vastab sissetulevale kõnele, muutub selle agendi muutuja "Disposition" väärtus "ANSWERED"-iks.
Report CDR-st on näha, et kui kõne läks järjekorda (veerus App muutub väärtuseks "Queue"), siis kõik sündmused on seotud sama "uniqueid"-ga (veerg System).

Lühidalt CDR-st

Oluline on mõista, mis on CDR ja millal täpselt CDR-sse andmed kantakse, mida me jälgime Report CDR-s. CDR on operatsioonisüsteemi kohaselt andmebaas, kuhu Asterisk salvestab detailse kõnearuande (vt. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr). Meie puhul on selle andmebaasi nimi asteriskcdrdb, mis asub mysql-is. Kogemuste põhjal oleme kindlaks teinud, et andmed kõne kohta, millel on teatud "uniqueid", kantakse asteriskcdrdb-sse mitte kohe pärast mingit sündmust, vaid pärast hangupcall sündmust (kõne lõppemine).

Loodud lahenduse tööpõhimõte

Kuna meie teadmised bash-st on ulatuslikumad kui teadmised Asterisk-ist, siis sai peamine idee järgnev. Enne hangupcall sündmust kutsuda bash-skript. Sellesse skripti edastada 3 parameetrit. Esimene parameeter on "uniqueid", et filtreerida CDR-st saadud andmeid. Teine parameeter on "CALLERID(num)" (helistaja number), et teada, kellele tagasi helistada. Kolmas parameeter on "NODEST" (järjekorra number), kuhu kõne suunati, et teada, millise küsimusega kõne tehti ja kellele saata e-kirja teade puudunud kõne kohta.
Bash-skript peab ühenduma andmebaasiga asteriskcdrdb mysql-is ja võtma kõik muutuja "Disposition" väärtused teatud "uniqueid"-ga. Saadud andmetest tuleb välistada väärtused: "NO ANSWER", "BUSY", "FAILED", "UNKNOWN". Tulemusena jääb kas "ANSWERED" — sissetulevale kõnele vastati, või ei jää üldse midagi — kõne jäi vahele.

Edasi, kui kõne jäi vahele, peab skript saatma e-kirja teate.
Vaadates ette, tahan märkida olulise punkti. Asterisk täidab käske järjestikku, oodates nende lõpuleviimist (mis on tegelikult loogiline). Ja me kutsume bash-skripti enne, kui käsk hangupcall on täidetud. Seega, kui skripti tegelikult täidetakse, pole CDR-is veel teavet meie soovitud „uniqueid” kohta. Selle probleemi lahendamiseks kutsume bash-skripti parameetriga „&”, et Asterisk läheks kohe järgmise sammu juurde, st hangupcall. Ja bash-skripti sees, alguses, paneme me väikese ajaviivitus, et anda aega Asteriskile sisestada andmed meie huvipakkuva „uniqueid” kohta CDR-i.

Praktika

Enne kui liigume Asterisk'i seadistamise ja bash-skripti loomise juurde, peame seadistama e-kirjade teavitamise. Selleks kasutame utiliiti postfix.

Postfixi seadistamine

Meil on meilidomeen „lucky.ru”, mis asub Yandexis. Seadistame postfix smtp-klientide režiimile ja saadame kirju kontolt asterisk@lucky.ru.
Aluseks on lahendus siit: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex.

Esiteks installime/uuendame/kontrollime pakettide olemasolu:

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

Ärme kustuta postfixi põhikonfigureerimisfaili „/etc/postfix/main.cf”, vaid teeme sellest varukoopia:

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

Redigeerime faili „/etc/postfix/main.cf” ja kohandame selle järgmise näidise järgi:

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

Iga rida „/etc/postfix/main.cf” ei pruugi olla kommentaar. Kommentaarid mõnes reas ei määratle parseri poolt ja edastatakse töötlemiseks, mis toob kaasa vigu. Paremini on loobuda kommentaaridest selle faili sees. Võite sellega katsetada, käivitades kõrvalaknas „tail -f /var/log/messages”.

Toon välja rea „smtputf8_autodetect_classes = all”. See rida lubab vaikimisi utf-8, mis võimaldab kasutada kirillitsat nii kirja kehas kui ka pealkirjas ilma täiendavate toiminguteta (vt. http://www.postfix.org/SMTPUTF8_README.html).

Loome katalooge konfiguratsioonifailide jaoks:

mkdir /etc/postfix/private

Muudame faili «/etc/postfix/private/sender_relay». Selles tuleb näidata, millisele smtp-serverile viidata meie e-posti domeeni kasutamisel:

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

Muudame faili «/etc/postfix/private/sasl_passwd». Selles märgime e-posti aadressi, mida kasutame kirjade saatmiseks, samuti konto(login) ja parooli (login ja parool eraldatakse kooloniga):

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

Muudame faili «/etc/postfix/generic». Selles määratleme väljamineva aadressi asendamise reeglid (vt. 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
#####################

Algne väljaminev aadress sõltub failide «/etc/hosts» ja «/etc/hostname» sisust ning ka kasutajanimest, kes saadab kirja. See tähendab, et hoolimata sellest, et kasutame smtp-klienti ja saadame kirju aadressilt asterisk@lucky.ru, seob postfix alguses ikka «mõne» oma aadressiga ja seda tuleb muuta selle konfiguratsioonifaili reeglitega.

Toon välja oma faili «/etc/hosts» sisu:

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

On oluline, et serveril oleks mingi domeen (väärtus pärast punkti), sest mail utiliit «otsib» domeeninime failist «/etc/hosts» ja kui seda kohe ei leia, jätkab see otsimist veel mõne minuti jooksul ning alles siis saadab kirja. See tähendab, et kui domeeni ei ole määratud, läheb kiri mitu minutit viivitusega.

Toon välja oma faili «/etc/hostname» sisu:

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

Seejärel tuleb loodud konfiguratsioonifailid tõlkida indekseeritud andmebaasidesse, selleks käivitame järgmise käsu:

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

Seejärel peame alla laadima ja paigaldama serverisse sertifikaadi smtp.yandex.ru, selleks käivitame järgmise käsu:

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

Kuid pärast seda, kui ekraanile ilmub tehniline teave, hakkab meeskond "edasi jääma". Vajutage Ctrl+C, et see katkestada.

Nüüd eemaldate käsitsi saadud failist kogu prahti ja jätate alles ainult sertifikaadi. Tuleb saada midagi sellist:

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

Ja lõpuks käivitame postfixi uuesti:

service postfix restart

Saadame testkirja:

echo "See on kirja sisu" | mail -s "See on teema" admin@lucky.ru

admin@lucky.ru — sihtaadress

Selleks on postfixi seadistus lõpule viidud.

Kirjutame bash-skripti

Loome katalooge bash-skripti hoidmiseks (kellele kus rohkem meeldib):

mkdir /home/asterisk/scripts

Loome bash-skripti faili:

touch /home/asterisk/scripts/noanswer.sh

Anname skripti failile täitmisõigused:

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

Kui faili õigustes on kahtlusi, võib ajutise silumise jaoks anda failile täisjuurdepääsu. Kuid see on "ebaturvaline".

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

Bash-skripti tekst:

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="tähtsa küsimuse kohta"
 ;;
 63100)
 address="debian@lucky.ru"
 subject="linux debiani küsimustes"
 ;;
 63200)
 address="windows@lucky.ru"
 subject="windowsi küsimustes"
 ;;
 63300)
 address="freebsd@lucky.ru"
 subject="freebsd küsimustes"
 ;;
 63400)
 address="ubuntu@lucky.ru"
 subject="linux ubuntu küsimustes"
 ;;
 63500)
 address="centos@lucky.ru"
 subject="linux centosi küsimustes"
 ;;
 *)
 address="admin@lucky.ru"
 error_kod=1
 ;;
 esac

 case $error_kod in
 0)
 echo "Vastus kõnelt, kes on $2, helistas $subject." | mail -s "Vastus kõnelt $2" $address
 echo "Vastus $address -lt kõnelt, kes on $2, helistas $subject. uid=$1" | mail -s "Vastus kõnelt $2" admin@lucky.ru
 ;;
 1)
 echo "Vastus kõnelt $2. Ootus tundmatu. uid=$1" | mail -s "Vastus kõnelt $2" admin@lucky.ru
 ;;
 esac

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

Skripti lühikokkuvõte:
"sleep 7":

See on see viivitus, millest ma varem rääkisin. Meil on viivitus seatud 7 sekundiks. Kuigi arvan, et üks sekund on täiesti piisav.

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

MySQL-i päringu eraldasime mugavuse huvides eraldi muutujasse.

Seejärgmiseks teeme päringu MySQL-i ja filtreerime saadud väljundi. Eemaldame kõik variandid, välja arvatud "ANSWERED", kui selline üldse olemas on. Kui "ANSWERED" väärtusi on mitu, tuleks jätta alles ainult üks. Lõpuks saame muutuja "answer" väärtuseks kas "ANSWERED" või "".
Kui muutuja "answer" väärtus ei ole "ANSWERED", siis on tegu vastamata kõnega. Sõltuvalt järjekorra numbrist määrame juhtumite operatsiooni case abil, kellele e-kirja teavitust saata ja mida selles sõnumis kirjutada (muudetav osa sõnumist).

Edasi vaatame olukorda, kus järjekord on määratud Asteriski, kuid skripti sees ei ole seda kirjeldatud. Sellisel juhul saab admin@lucky.ru kirja, et järjekord ei ole skripti jaoks tundmatu.

Kui järjekord on kirja pandud, saadetakse kiri sihtkohta ja dubleeriv kiri admin@lucky.ru, kus on märgitud "uniqueid", et oleks võimalik selle kõne sündmusi vajadusel jälgida.

Skripti lõpp.

Tahan märkida, et MySQL-i ühenduse loomiseks kasutasime eelnevalt teadaolevat kasutajanime ja parooli. FreePBX-is Asteriski MySQL kasutajanime teada saamiseks täitke järgmine käsk:

cat /etc/amportal.conf | grep AMPDBUSER

Ja Asteriski MySQL kasutaja parooli teada saamiseks täitke järgmine käsk:

cat /etc/amportal.conf | grep AMPDBPASS

Asteriski seadistamine

Kasutame FreePBX-i. FreePBX-is on erinevaid seadistusfailide tüüpe (vt. https://asterisk-pbx.ru/wiki/freepbx/files), mõned neist FreePBX kirjutab käivitamisel üle, mõned mitte (need, mida nimetatakse custom, on spetsiaalselt kasutaja jaoks mõeldud).

Töötame failiga „extensions_override_freepbx.conf”, kuna see kuulub custom-tüüpi.

Alustuseks veendume, et failis „/etc/asterisk/extensions.conf” on fail „extensions_override_freepbx.conf” ühendatud. Selle jaoks täitke järgmine käsk:

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

Redigeerime faili „/etc/asterisk/extensions_override_freepbx.conf” ja viime selle järgmise kujuga:

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

Nagu ma varem mainisin, on sümbol «&» lõpus kohustuslik. Kuna me töötame bash-skripti kaudu CDR-andmete kallal otse MySQL andmebaasist, ja need andmed kantakse MySQLi alles pärast «exten => h,2,Macro(hangupcall,)» täitmist, tuleb meil mitte oodata bash-skripti lõpuleviimist, vaid liikuda Asteriskis järgmise sammu juurde. Bash-skript peab sisaldama ajaviivet enne oma põhiosa täitmist.

Kuna muudatused конфигурационном файле «/etc/asterisk/extensions_override_freepbx.conf» hakkavad kehtima, tuleb Asteriski südamikku järgnev käsk:

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

See tuleb teha pärast bash-skripti loomist.

Kokkuvõte

See on ilmselt 1001. viis «kaotatud kõnede» tuvastamiseks Asteriskis. Jagage kommentaarides, kuidas teie sellele probleemile lähenete. Ja mida arvate, võiks veel täiustada/ümber teha/optimeerida. Oleme tänulikud konstruktiivsete ideede eest.

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster