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 hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster