
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 , ei olnud tÀielikult arusaadav ja loobuti sellest.
Meile meeldis lahendus, mille esitas , 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 , tekkis idee, et tuleb CDRis filtreerida muutuja âDispositionâ kĂ”igi jĂ€rjekorra agentide jĂ€rgi. PĂ€rast 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).

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. ), 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. ). 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: .
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.savRedigeerime 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. ).
Loome katalooge konfiguratsioonifailide jaoks:
mkdir /etc/postfix/privateMuudame 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. ):
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.pemKuid 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 restartSaadame testkirja:
echo "See on kirja sisu" | mail -s "See on teema" admin@lucky.ruadmin@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/scriptsLoome bash-skripti faili:
touch /home/asterisk/scripts/noanswer.shAnname skripti failile tÀitmisÔigused:
chmod +x /home/asterisk/scripts/noanswer.shKui faili Ôigustes on kahtlusi, vÔib ajutise silumise jaoks anda failile tÀisjuurdepÀÀsu. Kuid see on "ebaturvaline".
chmod 777 /home/asterisk/scripts/noanswer.shBash-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 AMPDBUSERJa Asteriski MySQL kasutaja parooli teada saamiseks tÀitke jÀrgmine kÀsk:
cat /etc/amportal.conf | grep AMPDBPASSAsteriski seadistamine
Kasutame FreePBX-i. FreePBX-is on erinevaid seadistusfailide tĂŒĂŒpe (vt. ), 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
