FreePBX. Konfigurimi i Asterisk për njoftimet e e-mail për thirrjet e humbura të ardhura në radhë

FreePBX. Konfigurimi i Asterisk për njoftimet e e-mail për thirrjet e humbura të ardhura në radhë
IP ATC Asterisk është një mjet i fuqishëm në fushën e IP-telefoni. Ndërfaqja web FreePBX, e krijuar për Asterisk, e thjeshton ndjeshëm konfigurimin dhe zvogëlon pragun e hyrjes në sistem.
Nëse mund të mendoni për ndonjë detyrë lidhur me IP-telefoni, ka shumë të ngjarë që mund të realizohet në Asterisk. Por sigurohuni se do t'ju nevojitet këmbëngulje dhe durim.

Na u paraqit detyra për të konfiguruar njoftimet e e-mail për thirrjet e humbura. Më saktësisht, të njoftojmë për ato raste kur një thirrje e ardhshme kalon në radhë, por askush (nga agjentët) nuk i përgjigjet asaj thirrjeje.

Për bije, nuk zbuluam mjete standarde për zgjidhjen e kësaj detyre në FreePBX. Si e zgjidhëm këtë detyrë, do ta tregojmë më poshtë.

Parathënie

Para zgjidhjes sĂ« detyrĂ«s "nĂ« mĂ«nyrĂ« direkte", natyrisht kĂ«rkuam informacion nĂ« internet, por nuk gjetĂ«m njĂ« zgjidhje tĂ« gatshme (ndoshta kĂ«rkuam keq, por çfarĂ« mund tĂ« bĂ«jmë  ).

Nuk ka aq shumë njohuri për të punuar direkt me Asterisk sa do të dëshironim, prandaj zgjidhja e ofruar këtu, nuk ishte plotësisht e kuptueshme dhe u hodh poshtë.

Na pëlqeu zgjidhja e propozuar këtu, edhe pse nuk funksionoi. Prandaj, theksuam se duhet të punojmë në Asterisk në kontekstin e radhëve [ext-queues]. Dhe sapo punojmë në FreePBX, duhet të punojmë në skedarin e konfigurimit 'extensions_override_freepbx.conf'. Vërejtëm se është më e lehtë të 'kapim thirrjet e humbura' para ngjarjes hangupcall (mbarimi i thirrjes).
Pas leximit të diskutimit këtu, lindi ideja se duhej të filtroni në CDR variablën 'Disposition' për të gjithë agjentët në radhë. Pas leximit të këtë informacionit, u formuan hapa të qartë për zgjidhjen e detyrës së caktuar.

ÇfarĂ« kemi:

Kemi FreePBX 13.0.197, i cili përdor Asterisk 13.12.1. Versioni i OS SHMZ release 6.6 (Final). Distribucioni bazohet në CentOS.

NĂ« Asterisk Ă«shtĂ« konfiguruar IVR (menu zanore) qĂ« shpĂ«rndan thirrjet e ardhshme nĂ« radhĂ«t e ndryshme. Çdo radhe i janĂ« caktuar AgjentĂ«t (agjentĂ«t), domethĂ«nĂ« operatorĂ«t.

Teoria

ÇfarĂ« ndodh nĂ« Asterisk

Kur një thirrje e ardhshme arrin në Asterisk, kjo thirrje kalon në IVR. Thirrësi bën zgjedhje duke shtypur një numër të caktuar në telefon dhe kalon në një radhe të caktuar. Pas kësaj, të gjithë agjentët e lirë të radhës marrin një thirrje në të njëjtën kohë.

Për të kuptuar më mirë se çfarë ndodh në këtë moment dhe çfarë ndodh më pas, le të referohemi tek Report CDR (Fig.1).

FreePBX. Konfigurimi i Asterisk për njoftimet e e-mail për thirrjet e humbura të ardhura në radhë
Fig.1

Kur një thirrje hyrëse mund të arrijë në radhë, të gjithë agjentët kanë vlerën e variablës "Disposition" të barabartë me "NO ANSWER", nëse agjentët në këtë moment nuk ishin të zënë. Variabla "Disposition" mund të marrë edhe vlera të tjera (shih. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr), përveç vlerës "ANSWERED". Ndërsa në momentin kur një nga agjentët përgjigjet në thirrjen hyrëse, vlera e variablës "Disposition" të këtij agjenti bëhet "ANSWERED."
Nga Report CDR mund të vihen re se kur thirrja kalon në radhë (në kolonën App vlera bëhet "Queue"), të gjitha ngjarjet figurojnë me të njëjtin "uniqueid" (kolona System).

Në shkurtime për CDR

ËshtĂ« e rĂ«ndĂ«sishme tĂ« kuptohet se çfarĂ« Ă«shtĂ« CDR, dhe nĂ« cilin pikĂ« specifike nĂ« CDR regjistrohen tĂ« dhĂ«nat qĂ« ne vĂ«rejmĂ« nĂ« Report CDR. CDR, nĂ« lidhje me sistemin operativ — Ă«shtĂ« njĂ« bazĂ« tĂ« dhĂ«nash ku Asterisk regjistron njĂ« raport tĂ« detajuar tĂ« thirrjeve (shih. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr). NĂ« rastin tonĂ« kjo Ă«shtĂ« baza me emrin asteriskcdrdb, e cila ndodhet nĂ« mysql. NĂ« mĂ«nyrĂ« eksperimentale e kemi vendosur se tĂ« dhĂ«nat pĂ«r thirrjen me njĂ« "uniqueid" tĂ« caktuar regjistrohen nĂ« asteriskcdrdb jo menjĂ«herĂ« pas ndodhisĂ« sĂ« caktuar, por pas ndodhisĂ« hangupcall (pĂ«rfundimi i thirrjes).

Principi i funksionimit të zgjidhjes së krijuar

Duke pasur parasysh se kemi njohuri më shumë në bash se sa në Asterisk, ideja kryesore doli të jetë si më poshtë. Para ngjarjes hangupcall thirrni një skript bash. Në këtë skript kaloni 3 parametra. Parametri i parë "uniqueid", për filtrimin e të dhënave të marra nga CDR. Parametri i dytë "CALLERID(num)" (numri i telefonit), për të ditur kujt t'i kthejmë telefonatën. Parametri i tretë "NODEST" (numri i radhës), në të cilin ka hyrë thirrja, për të ditur për çfarë çështjeje ishte thirrja, dhe kujt t'i dërgojmë një njoftim për email për thirrjen e humbur.
Skripti bash duhet tĂ« lidhet me bazĂ«n asteriskcdrdb nĂ« mysql dhe tĂ« marrĂ« tĂ« gjitha vlerat e variablĂ«s "Disposition" me njĂ« "uniqueid" tĂ« caktuar. Nga tĂ« dhĂ«nat e marra duhet tĂ« pĂ«rjashtohen vlerat: "NO ANSWER", "BUSY", "FAILED", "UNKNOWN". Si rezultat do tĂ« mbesin ose "ANSWERED" — thirrja hyrĂ«se Ă«shtĂ« pĂ«rgjigjur, ose fare asgjĂ« — thirrje tĂ« humbur.

Më pas, nëse thirrja rezulton e humbur, skripti duhet të dërgojë një njoftim për email.
Duke hyrë në këtë pikë, të theksoj një moment të rëndësishëm. Asterisk ekzekuton komandat një pas një, duke pritur përfundimin e tyre (çfarëdo logjike). Por ne do ta thërrasim skriptin bash para se të kryhet komanda hangupcall. Pra, në momentin e ekzekutimit konkret të skriptit, në CDR nuk do të jetë përfshirë informacioni për "uniqueid" që kërkojmë. Për të zgjidhur këtë problem, skriptin bash do ta thërrasim me parametrin "&", në mënyrë që Asterisk të kalojë menjëherë në hapin tjetër, pra, hangupcall. Dhe brenda skriptit bash, në fillim do të vendosim një vonesë të vogël në kohë, për t'i dhënë kohë Asterisk-it të ndihmojë të dhënat e "uniqueid" në CDR.

Praktika

Para se të kalojmë në konfigurimin e Asterisk dhe krijimin e skriptit bash, duhet të konfigurojmë dërgimin e njoftimeve me e-mail. Për këtë ne do të përdorim utilitarin postfix.

Konfigurimi i postfix

Ne kemi një domen postal "lucky.ru", të vendosur në Yandex. Do ta konfigurojmë postfix në modin e klientit smtp dhe do të dërgojmë letra nga llogaria asterisk@lucky.ru.
Për të bazuar është marrë vendimi këtu: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex.

Së pari, do të instalojmë / përditësojmë / verifikojmë disponueshmërinë e pakot:

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

Nuk do ta zëvendësojmë skedarin kryesor të konfigurimit të postfix-it " /etc/postfix/main.cf ", por do të krijojmë një kopje rezervë:

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

Editojmë skedarin " /etc/postfix/main.cf " dhe e kthejmë atë në formën e mëposhtme:

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

Jo çdo rresht në " /etc/postfix/main.cf " mund të komentohet. Komentet në disa rreshta nuk identifikohen nga parseri dhe kalohen për përpunim, gjë që çon në gabime. Më mirë është të heqim dorë nga komentet brenda këtij skedari. Mund të eksperimentoni me këtë duke e kaluar me "tail -f /var/log/messages" në dritaren ngjitur.

Dua të theksoj rreshtin "smtputf8_autodetect_classes = all". Ky shënim aktivizon utf-8 si parazgjedhje, e cila lejon përdorimin e cirilikës si në trupin e letrës, ashtu edhe në subjektin e letrës pa manipullime të tjera (Shiko. http://www.postfix.org/SMTPUTF8_README.html).

Do të krijojmë një katalog për skedarët e konfigurimeve:

mkdir /etc/postfix/private

Modifikoni skedarin «/etc/postfix/private/sender_relay». Në të duhet të tregoni se në cilin server smtp duhet të referoheni kur përdorni domenin tonë të postës elektronike:

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

Modifikoni skedarin «/etc/postfix/private/sasl_passwd». Në të do të tregojmë adresën e emailit, që do të përdorim për dërgimin e mesazheve, si dhe emrin dhe fjalëkalimin e këtij llogarie (emri dhe fjalëkalimi tregohen me dy pika):

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

Modifikoni skedarin «/etc/postfix/generic». Në të do të shkruajmë rregullat për ndërrimin e adresës dalëse (shih. 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
#####################

Adresa fillestare e dërgimit varet nga përmbajtja e «/etc/hosts» dhe «/etc/hostname», si dhe nga emri i përdoruesit që do të dërgojë mesazhin. Që do të thotë, megjithëse ne përdorim një klient smtp dhe dërgojmë mesazhe nga asterisk@lucky.ru, përsëri në adresën e dërguesit postfix do të vendoset fillimisht «diçka e vet» dhe kjo duhet të korrigjohet me rregullat nga ky skedar konfigurimi.

Do të jap përmbajtjen e skedarit tim «/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
#####################

ËshtĂ« e rĂ«ndĂ«sishme qĂ« serveri tĂ« ketĂ« njĂ« domene (vlera pas pikĂ«s), sepse utility mail «kĂ«rkon» emrin e domeneve nĂ« «/etc/hosts» dhe nĂ«se «nuk e gjen» atĂ« menjĂ«herĂ«, do ta vazhdojĂ« tĂ« bĂ«jĂ« kĂ«tĂ« pĂ«r disa minuta mĂ« shumĂ« dhe vetĂ«m atĂ«herĂ« do tĂ« dĂ«rgojĂ« mesazhin. QĂ« do tĂ« thotĂ«, nĂ«se domeni nuk Ă«shtĂ« shkruar, atĂ«herĂ« mesazhi do tĂ« dĂ«rgohet me njĂ« vonesĂ« disa minutash.

Do të jap përmbajtjen e skedarit tim «/etc/hostname»:

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

Më pas është e nevojshme të transferojmë skederat e krijuara të konfigurimit në databaza të indekstuara, për këtë do të ekzekutojmë komandën e mëposhtme:

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

Më pas duhet të shkarkojmë dhe të vendosim në server certifikatin smtp.yandex.ru, për këtë do të ekzekutojmë komandën e mëposhtme:

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

Por të mos harrojmë, pasi informacioni teknik të shfaqet në ekran, ekipi do të "vazhdojë të mbetet i pezulluar". Shtypni Ctrl+C për ta ndërprerë atë.

Tani do të fshijmë manualisht çdo gjë të panevojshme nga skedari i përftuar dhe do të lëmë vetëm certifikatën. Duhet të duket diçka e tillë:

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

Dhe përfundimisht, do ta riaktivizojmë postfix-in:

service postfix restart

Dërgojmë një letër testuese:

echo "Ky është trupi i letrës" | mail -s "Ky është subjekti" admin@lucky.ru

admin@lucky.ru — adresa e destinacionit

Me këtë, konfigurimi i postfix-it përfundon.

Shkruajmë një bash-skript

Krijojmë një direktor për ruajtjen e bash-skriptit (në këtë rast, ku është më e përshtatshme për ju):

mkdir /home/asterisk/scripts

Krijojmë skedarin e bash-skriptit:

touch /home/asterisk/scripts/noanswer.sh

I japim skedarit të skriptit të drejtat për ekzekutim:

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

Nëse keni dyshime për të drejtat e skedarit, për qëllime debugimi mund t'i japim akses të plotë skedarit. Megjithatë, kjo "nuk është e sigurt".

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

Teksti i bash-skriptit:

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="për një çështje të rëndësishme"
 ;;
 63100)
 address="debian@lucky.ru"
 subject="për çështje linux debian"
 ;;
 63200)
 address="windows@lucky.ru"
 subject="për çështje windows"
 ;;
 63300)
 address="freebsd@lucky.ru"
 subject="për çështje freebsd"
 ;;
 63400)
 address="ubuntu@lucky.ru"
 subject="për çështje linux ubuntu"
 ;;
 63500)
 address="centos@lucky.ru"
 subject="për çështje linux centos"
 ;;
 *)
 address="admin@lucky.ru"
 error_kod=1
 ;;
 esac

 case $error_kod in
 0)
 echo "Thirrja e humbur nga abonenti $2, i cili telefononte $subject." | mail -s "Thirrja e humbur nga $2" $address
 echo "Thirrja e humbur për $address nga abonenti $2, i cili telefononte $subject. uid=$1" | mail -s "Thirrja e humbur nga $2" admin@lucky.ru
 ;;
 1)
 echo "Thirrja e humbur nga $2. Radhitë e paqartë. uid=$1" | mail -s "Thirrja e humbur nga $2" admin@lucky.ru
 ;;
 esac

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

Një analizë e shkurtër e skriptit:
«sleep 7»:

Kjo është ajo vonesë e kohës për të cilën flisja më parë. Ne kemi vendosur një vonesë prej 7 sekondash. Megjithatë, mendoj se një sekondë do të ishte e mjaftueshme.

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

Kërkesa në mysql e kemi veçuar në një variabel për lehtësi.

Më pas ne bëjmë një kërkesë në mysql dhe filtrojmë daljen e marrë. Fshijmë të gjitha variantet përveç «ANSWERED», nëse ka një të tillë. Nëse ka disa vlera «ANSWERED», duhet të mbetet vetëm një. Në fund, në variablën «answer» do të marrim ose «ANSWERED» ose «».
Nëse vlera e variablës «answer» nuk është e barabartë me «ANSWERED», atëherë kjo është një thirrje e humbur. Në varësi të numrit të radhës, me operatori case do t'i caktojmë adresën, kujt saktësisht i nevojitet të dërgohet njoftimi me e-mail, dhe çfarë duhen shkruar në këtë mesazh (pjesa e ndryshueshme e mesazhit).

Më pas jepet një variant, kur radhët janë të caktuara në Asterisk, por nuk janë përshkruar në skript. Në këtë rast admin@lucky.ru do të marrë një mesazh, për atë se radhët nuk janë të njohura për skriptin.

Nëse radhët janë përshkruar, atëherë do të dërgohet një mesazh në destinacion dhe një mesazh kopje në admin@lucky.ru me tregimin e «uniqueid», që të mund të ndjekim ngjarjet në këtë thirrje, në rast nevoje.

Me këtë skript përfundojmë.

Do të theksoj se për të kaluar në mysql ne përdorëm emrin dhe fjalëkalimin që i morëm më parë. Në FreePBX, për të marrë emrin e përdoruesit Asterisk në mysql ekzekutoni komandën e mëposhtme:

cat /etc/amportal.conf | grep AMPDBUSER

Dhe për të marrë fjalëkalimin e përdoruesit Asterisk në mysql ekzekutoni komandën e mëposhtme:

cat /etc/amportal.conf | grep AMPDBPASS

Konfigurimi i Asterisk

Ne përdorim FreePBX. Në FreePBX ka lloje të ndryshme skedash konfigurimi (shih. https://asterisk-pbx.ru/wiki/freepbx/files), disa nga to FreePBX i rishkruan gjatë rinisjes, ndërsa disa nuk i rishkruan (ato quhen custom), pasi janë posaçërisht të destinuara për përdoruesin.

Ne do të punojmë me skedarin e konfigurimit «extensions_override_freepbx.conf», pasi ai i përket llojit custom.

Së pari, le të sigurohemi që në skedarin «/etc/asterisk/extensions.conf» është e lidhur skedari «extensions_override_freepbx.conf». Për këtë, ekzekutoni komandën e mëposhtme:

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

Redaktoni skedarin «/etc/asterisk/extensions_override_freepbx.conf» dhe sillni atë në këtë formë:

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

Si e kam shkruar më parë, simboli «&» në fund është i domosdoshëm. Duke qenë se ne do të punojmë në skriptin bash me të dhënat CDR direkt nga baza mysql, dhe këto të dhëna regjistrohen në mysql vetëm pas ekzekutimit të «exten => h,2,Macro(hangupcall,)», është e nevojshme të mos presim përfundimin e ekzekutimit të skriptit bash, por të kalojmë në realizimin e hapit të ardhshëm në Asterisk. Dhe skripti bash duhet të përmbajë një vonesë në kohë, përpara se të realizojë pjesën e tij kryesore.

Për të bërë të vlefshme ndryshimet në skedarin e konfigurimit «/etc/asterisk/extensions_override_freepbx.conf», është e nevojshme të rinisni bërthamën Asterisk me komandën e mëposhtme:

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

Kjo duhet bërë pasi të ketë përfunduar krijimi i skriptit bash.

Përfundim

Me siguri, kjo është mënyra e 1001-të e «kapjes së thirrjeve të humbura» në Asterisk. Ndani në komentet se si e zgjidhni ju këtë detyrë. Dhe çfarë, sipas jush, mund të përmirësohet/ripropozohet/optimizohet. Do të jemi mirënjohës për idetë konstruktive.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster