
IP ATC Asterisk on tõhus IP-telefoni lahendus. FreePBX veebiliides, mis on loodud Asteriskile, lihtsustab seadistamist ja alandab süsteemi kaudu sisenemise läve.
Kui suudate välja mõelda mistahes IP-telefoniülesande, siis tõenäoliselt on see Asteriskis teostatav. Kuid olge valmis, et see nõuab teilt visadust ja rahu.
Meie ülesanne oli seadistada e-kirjade teavitamine jäetud kõnedest. Täpsemalt öeldes, teavitada e-posti kaudu olukordadest, kus sisenev kõne läks järjekorda, kuid keegi (agentidest) ei vastanud sellele kõnele.
Kaalukaid lahendusi selle probleemiga tegelemiseks FreePBX-is me ei leidnud. Kuidas me selle ülesande lahendasime, räägin allpool.
Eessõna
Enne otsest lahenduse otsimist otsisime muidugi teavet internetist, kuid võtmelahendust ei leidnud (võib-olla ei otsinud piisavalt hästi, aga mis seal ikka ...).
Olenemata sellest pole Asteriskis töötamise oskusi nii palju, kui sooviksime, seetõttu oli pakutav lahendus , mitte täielikult läbi mõeldud ja loobusime sellest.
Meile meeldis pakutud lahendus , kuigi see ei töötanud. Siit rõhutati, et Asteriskis tuleb töötada konteksti [ext-queues] raames. Ja kuna me töötame FreePBX-is, siis tuleb töötada konfiguratsioonifailis «extensions_override_freepbx.conf». Pöörasime tähelepanu sellele, et «vastamata kõnede salvestamine» on mugav hangupcall sündmuse (kõne lõpp) eel.
Lugedes arutelu , tekkis idee, et CDR-is tuleb filtreerida «Disposition» muutujat kõigi järjekorra agente kohta. Ja pärast lugemist kujunesid välja üsna konkreetsed sammud seatud ülesande lahendamiseks.
Mis meil on:
On FreePBX 13.0.197, mis kasutab Asterisk 13.12.1. OS versioon on SHMZ release 6.6 (Final). Jaotuse baasil on CentOS.
Asteriskis on seadistatud IVR (häälmenüü), mis suunab saabuvad kõned erinevatesse jutustustesse (queues). Iga järjekorra jaoks on määratud Agente (agendid), st operaatorid.
Teooria
Mis Asteriskis toimub
Kui Asteriskisse saabub sissetulev kõne, jõuab see IVR-ile. Helistaja teeb valiku, vajutades telefonil kindlat numbrit, ja jõuab kindlasse järjekorda. Pärast seda saavad kõik vabade agentide järjekorrad samaaegselt kõne.
Parimaks, et mõista, mis sel hetkel toimub ja mis edasi juhtub, vaatame CDR-aruannet (Kujutis 1).

Kujutis 1
Kui sissetulev kõne jõuab järjekorda, siis kõigi agentide muutuja "Disposition" väärtus on muutunud "NO ANSWER"-iks, kui agentidel ei ole sel hetkel tööd. Muutuja "Disposition" võib võtta ka teisi väärtusi (vt. ), välja arvatud väärtus "ANSWERED". Ja hetkel, kui üks agendist vastab sissetulevale kõnele, muutub selle agendi muutuja "Disposition" väärtuseks "ANSWERED".
CDR-aruandest on näha, et kui kõne liigub järjekorda (veerg App väärtus muutub "Queue"-iks), siis kõik sündmused esinevad sama "uniqueid"-ga (veerg System).
Lühidalt CDR-ist
Oluline on mõista, mis on CDR ja millal CDR-i kantakse andmed, mida me CDR-aruandes näeme. CDR, mis puudutab operatsioonisüsteemi — on andmebaas, kuhu Asterisk salvestab detailse kõnearuande (vt. ). Meie puhul on see andmebaas nimega asteriskcdrdb, mis asub mysql'is. Katse-eksituse meetodil oleme välja selgitanud, et andmed kõne kohta, millel on teatud «uniqueid», salvestatakse asteriskcdrdb-s mitte kohe pärast mingeid sündmusi, vaid pärast hangupcall sündmust (kõne lõppemine).
Loodud lahenduse tööpõhimõte
Kuna meie teadmised bash-skriptidest on suuremad kui teadmised Asteriskist, siis on põhikontept järgmine. Enne hangupcall sündmust tuleb kutsuda bash-skript. Sellesse skripti tuleb 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» (reas numbrikood), kuhu kõne tuli, et teada, mis küsimuse üle kõne toimus ja kellele saata e-kiri puuduoleva kõne teavitamiseks.
Bash-skripti peab ühendama asteriskcdrdb andmebaasiga mysql'is ja võtma kõik väärtused muutuja «Disposition» kohta, millel on teatud «uniqueid». Saadud andmetest tuleb välja jätta väärtused: «NO ANSWER», «BUSY», «FAILED», «UNKNOWN». Tulemuseks jäävad kas «ANSWERED» — sissetulevale kõnele vastati, või üldse mitte midagi — mööda lastud kõne.
Seejärel, kui kõne jääb vahele, peab skript saatma e-kirja teate.
Tuleb märkida üks oluline punkt. Asterisk täidab käske järjestikku, ootamata nende lõpetamist (mis on mõistlik). Ja me viime bash-skripti elluviimise ellu, enne kui hangupcall käsk täidetakse. Seega skripti täitmise hetkel ei ole CDR-isse veel kantud otsitavat 'uniqueid'. Probleemi lahendamiseks käivitame bash-skripti parameetriga '&', et Asterisk saaks otse järgmisele etapile, st hangupcall. Ja bash-skripti alguses seadistame väikese viivituse, et anda Asteriskile aega andmete edastamiseks, mis puudutab meid huvitavat 'uniqueid' CDR-s.
Praktika
Enne kui liikuda Asteriski seadistamise ja bash-skripti loomise juurde, peab olema seadistatud e-kirja teavitused. Selleks kasutame utiliiti postfix.
Postfixi seadistamine
Meil on postidomeen 'lucky.ru', mis asub Yandexis. Seadistame postfixi smtp-kliendi režiimisse ja saadame kirju kontolt asterisk@lucky.ru.
Aluseks on võetud lahendus siit: .
Esiteks paigaldame/uuendame/kontrollime pakette:
yum install postfix
yum install mailx
yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plainÄrge pühkige põhikonfiguratsiooni faili postfix «/etc/postfix/main.cf», vaid tehke sellest varukoopia:
cp /etc/postfix/main.cf /etc/postfix/main.cf.savRedigeerime faili «/etc/postfix/main.cf» ja viime selle järgmisesse vormi:
nano /etc/postfix/main.cf
#####################
relayhost =
smtp_sasl_auth_enable = jah
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 = jah
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 = jah
smtputf8_autodetect_classes = kõik
#####################Mitte iga rida «/etc/postfix/main.cf» ei saa kommenteerida. Kommentaare mõnedes ridades ei määrata parseriga ja need edastatakse töötlemiseks, mis toob kaasa vigu. Parem on loobuda kommentaaridest selle faili sees. Võite sellega katsetada, käivitades kõrvalaknas «tail -f /var/log/messages».
Tähtsustan rida «smtputf8_autodetect_classes = kõik». See säte aktiveerib utf-8 vaikimisi, 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». Siin tuleb märkida, millisele smtp-serverile viidatakse meie e-posti domeeni kasutamisel:
nano /etc/postfix/private/sender_relay
#####################
@lucky.ru smtp.yandex.ru
#####################Muudame faili «/etc/postfix/private/sasl_passwd». Siin märgime e-posti aadressi, mida kasutame kirjade saatmiseks, samuti selle konto kasutajanime ja parooli (kasutajanimi ja parool on eraldatud kooloniga):
nano /etc/postfix/private/sasl_passwd
#####################
asterisk@lucky.ru asterisk@lucky.ru:password_asterisk
#####################Muudame faili «/etc/postfix/generic». Siin määratleme väljuvate aadresside 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äljuv aadress sõltub failide «/etc/hosts» ja «/etc/hostname» sisust ning ka kasutajanimest, kes ootab kirja saatmist. See tähendab, et kuigi me kasutame SMTP-kliendi ja saadame kirju aadressilt asterisk@lucky.ru, sisestab postfix väljasaatja aadressile ikkagi «mida iganes» ja seda tuleb muuta selle konfigureerimisfaili reeglitega.
Tõin 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
#####################Oluline on, et serveril oleks mingi domeen (väärtus pärast punkti), kuna mail utiliit «otsib» domeeninime failist «/etc/hosts» ja kui see «ei leia» seda kohe, siis jätkab see otsimist veel mitu minutit ja alles siis saadab kirja. See tähendab, et kui domeeni ei ole registreeritud, siis kirjad saadetakse viivitusega, mis võib kesta mitu minutit.
Tõin välja oma faili «/etc/hostname» sisu:
cat /etc/hostname
#####################
asterisk
#####################Edasi tuleb luua just loodud konfiguratsioonifailid indekseeritud andmebaasid, selleks täidame järgmise käsu:
postmap /etc/postfix/generic && postmap /etc/postfix/private/{sasl_passwd,sender_relay}Jätkamiseks peame alla laadima ja serverisse paigutama 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 tehniliste andmete ilmumist ekraanile jääb käsk «õhukeseks». Vajutage Ctrl+C, et katkestada see.
Nüüd eemaldame käsitsi saadud failist kogu prügi ja jätame ainult sertifikaadi. Tulemuseks peaks olema midagi sellist:
nano /etc/postfix/ca.pem
#####################
-----BEGIN CERTIFICATE-----
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
...
nRG0DfdqYIuPGApFORYe
-----END CERTIFICATE-----
#####################Ja lõpuks taaskäivitame postfixi:
service postfix restartSaadame katse kirja:
echo "See on kirja sisu" | mail -s "See on teema" admin@lucky.ruadmin@lucky.ru — sihtkoht
Sellega on postfixi seadistamine lõppenud.
Kirjutame bash-skripti
Loome katalooge bash-skripti salvestamiseks (siin, kus kellelgi rohkem meeldib):
mkdir /home/asterisk/scriptsLoome bash-skripti faili:
touch /home/asterisk/scripts/noanswer.shAnname skripti failile õigused täitmiseks:
chmod +x /home/asterisk/scripts/noanswer.shKui kahtlete faili õigustes, siis tõrkeotsingu ajal võib anda failile täielikud õigused. 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="oluline küsimus"
;;
63100)
address="debian@lucky.ru"
subject="linux debian küsimused"
;;
63200)
address="windows@lucky.ru"
subject="windows küsimused"
;;
63300)
address="freebsd@lucky.ru"
subject="freebsd küsimused"
;;
63400)
address="ubuntu@lucky.ru"
subject="linux ubuntu küsimused"
;;
63500)
address="centos@lucky.ru"
subject="linux centos küsimused"
;;
*)
address="admin@lucky.ru"
error_kod=1
;;
esac
case $error_kod in
0)
echo "Kadunud kõne numbrilt $2, kutsus $subject." | mail -s "Kadunud kõne numbrilt $2" $address
echo "Kadunud kõne $address numbrilt $2, kutsus $subject. uid=$1" | mail -s "Kadunud kõne numbrilt $2" admin@lucky.ru
;;
1)
echo "Kadunud kõne numbrilt $2. Ooteaeg teadmata. uid=$1" | mail -s "Kadunud kõne numbrilt $2" admin@lucky.ru
;;
esac
fi
#####################Lühike skripti ülevaade:
«sleep 7»:
See on see viivitus, millest ma varem rääkisin. Meil on viivitus seadistatud 7 sekundiks. Kuigi ma arvan, et üks sekund oleks täiesti piisav.
«res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"»:MySQLi päring on eraldi muutuja, et see oleks mugavam.
Seejärel teeme MySQLi päringu ja filtreerime saadud väljundi. Eemaldame kõik variandid peale 'ANSWERED', kui selline üldse olemas on. Kui 'ANSWERED' väärtusi on mitu, siis jätame alles ainult ühe. Lõpuks saame muutuja 'answer' sisse kas 'ANSWERED' või ''.
Kui muutuja 'answer' väärtus ei ole 'ANSWERED', siis on see jäetud kõne. Sõltuvalt järjekorra numbrist määrame case klausli abil aadressi, kellele e-kirja teavituse saata, ning mida selles sõnumis kirjutada (muudetav osa sõnumist).
Järgnevalt käsitletakse juhtumit, kus järjekord on määratud Asteriskis, kuid skriptis ei ole kirjeldatud. Sellisel juhul saadab admin@lucky.ru kirja, et järjekord ei ole skripti teada.
Kui aga järjekord on kirjeldatud, saadetakse kiri määratud aadressile ja dubleeriv kiri aadressile admin@lucky.ru koos 'uniqueid' näidisega, et vajadusel saaks kiidetiheduse põhjal sündmusi jälgida.
Sellega skript lõpeb.
Tähtis on märkida, et MySQL-i ühendamiseks kasutasime eelnevalt teada saadud kasutajat ning parooli. FreePBX-is Asteriski kasutaja sisselogimisnime teada saamiseks täitke järgmine käskus:
cat /etc/amportal.conf | grep AMPDBUSERJa Asteriski kasutaja parooli teada saamiseks täitke järgmine käskus:
cat /etc/amportal.conf | grep AMPDBPASSAsteriski seadistamine
Kasutame FreePBX-i. FreePBX-is on erinevat tüüpi konfiguratsioonifaile (vt. ), millest mõned kirjutab FreePBX taaskäivitamisel üle, teised mitte (need on nimega custom), kuna need on spetsiaalselt kasutaja jaoks mõeldud.
Töötame failiga «extensions_override_freepbx.conf», kuna see kuulub custom-tüüpi failide hulka.
Alustuseks veendume, et failis «/etc/asterisk/extensions.conf» on ühendatud fail «extensions_override_freepbx.conf». Selleks täidame järgmise käskluse:
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ärgmisse vormi:
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-andmetega otse MySQL andmebaasist ja need andmed salvestatakse MySQL-i alles pärast käsu „exten => h,2,Macro(hangupcall,)” täitmist, ei pea me ootama bash-skripti täitmise lõppu, vaid peaksime liikuma järgmise sammu juurde Asteriskis. Bash-skript ise peaks sisaldama ajalaiku, enne oma peamise osa täitmist.
Et muudatused konfiguratsioonifailis „/etc/asterisk/extensions_override_freepbx.conf” jõustuksid, tuleb Asteriski tuum järgmiseks käsuks taaskäivitada:
/usr/sbin/asterisk -rx "core restart now"Seda tuleb teha pärast bash-skripti loomist.
Kokkuvõte
Tõenäoliselt on see 1001. viis „faktide tabamiseks Asteriskis”. Jagage kommentaarides, kuidas teie seda probleemi lahendate. Ja mida teie arvates saaks täiustada/ümperehitiseda/optimeerida. Oleme tänulikud konstruktiivsete ideede eest.
Allikas: habr.com
