
Az IP ATC Asterisk egy erőteljes megoldás az IP-telefonálás területén. A FreePBX webes felülete, amely az Asteriskhez készült, jelentősen egyszerűsíti a beállítást és csökkenti a rendszerbe való belépés küszöbét.
Ha tudsz bármit is elképzelni, ami az IP-telefonáláshoz kapcsolódik, szinte biztos, hogy azt meg lehet valósítani az Asteriskben. De légy biztos abban, hogy kitartásra és türelemre lesz szükséged.
Feladatunk volt, hogy e-mail értesítéseket állítsunk be a kihagyott hívásokról. Pontosabban, értesíteni kell azokat az eseteket, amikor egy bejövő hívás a sorba került, de senki (az ügynökök közül) nem válaszolt a hívásra.
Meglepő módon nem találtunk beépített megoldást erre a feladatra a FreePBX-ben. Arról, hogyan oldottuk meg ezt a feladatot, a továbbiakban mesélek.
Bevezető
A feladat "arcba nézése" előtt természetesen kerestünk információkat az interneten, de kulcsrakész megoldást nem találtunk (lehet, hogy nem kerestünk elég jól, de mit tegyünk…).
A közvetlen Asterisk használati tapasztalatunk nem olyan gazdag, mint szeretnénk, ezért az ajánlott megoldás, , nem volt teljesen átgondolt, és elvetettük.
Tetszett az a megoldás, amit , bár nem működött. Ebből kiemeltük, hogy az Asteriskben a munkát a sorok [ext-queues] kontextusában kell végezni. Mivel a FreePBX-ben dolgozunk, a "extensions_override_freepbx.conf" konfigurációs fájlban kell dolgozni. Megfigyeltük, hogy a kihagyott hívások "elkapása" kényelmes a hangupcall esemény előtt (a hívás befejezése).
Olvasva a diskurzus , felmerült az ötlet, hogy a CDR-ben a "Disposition" változót szűrni kellene az összes ügynökre a sorban. A információk elolvasása után konkrét lépések alakultak ki a megoldandó feladatra.
Amink van:
Van egy FreePBX 13.0.197, ami Asterisk 13.12.1-et használ. Az operációs rendszer verziója SHMZ release 6.6 (Final). A disztribúció CentOS-ra alapozódik.
Az Asteriskben egy IVR (hangos menü) van beállítva, amely a bejövő hívásokat különböző Queues (sorok) közé osztja. Minden sorhoz ügynökök (Agents) vannak rendelve, vagyis operátorok.
Elmélet
Mi történik az Asteriskben?
Amikor egy bejövő hívás érkezik az Asteriskhez, a hívás az IVR-hez jut. A hívó egy bizonyos számot nyomva választ, és egy adott sorba kerül. Ezt követően az összes szabad ügynök egy időben hívást kap.
Ahhoz, hogy jobban megértsük, mi történik ebben a pillanatban, és mi történik később, nézzük meg a CDR Jelentést (1. ábra).

1. ábra
Amikor a bejövő hívás a sorba került, minden ügynök Disposition változójának értéke NO ANSWER lett, ha az ügynökök ebben a pillanatban nem voltak elfoglalva. A Disposition változó más értékeket is felvehetett (lásd: ), a ANSWERED értéken kívül. Abban a pillanatban, amikor az egyik ügynök válaszol a bejövő hívásra, az ügynök Disposition változójának értéke ANSWERED lesz.
A CDR Jelentésből látható, hogy amikor a hívás a sorba került (az App oszlop értéke Queue-ra változik), minden esemény ugyanazzal a uniqueid-dal szerepel (System oszlop).
Röviden a CDR-ről
Fontos megérteni, mi a CDR, és hogy pontosan mikor kerülnek be az adatok a CDR-be, amelyeket a CDR Jelentésben figyelünk meg. A CDR, az operációs rendszert illetően – ez egy adatbázis, amelybe az Asterisk részletes hívási jelentést rögzít (lásd: ). Esetünkben ez az asteriskcdrdb nevű adatbázis, amely a mysql-ban található. Tapasztalataink szerint megállapítottuk, hogy a bizonyos uniqueid-jú hívás adatait az asteriskcdrdb-be nem közvetlenül egy esemény bekövetkezte után jegyzik be, hanem a hangupcall esemény után (a hívás befejezése).
A létrehozott megoldás működési elve
Mivel a bash ismereteink jobbak, mint az Asterisk ismereteink, a fő ötlet a következő lett. A hangupcall esemény előtt egy bash scriptet kell hívni. Ehhez a scripthez 3 paramétert kell átadni. Az első paraméter a uniqueid, amely a CDR-ből származó adatok kiszűrésére szolgál. A második paraméter a CALLERID(num) (a hívó száma), hogy tudjuk, kinek kell visszahívni. A harmadik paraméter a NODEST (a hívásra érkezett sor száma), hogy tudjuk, miről szólt a hívás, és kinek kell e-mail értesítést küldeni a kihagyott hívásról.
A bash scriptnek kapcsolódnia kell az asteriskcdrdb adatbázishoz mysql-ban, és le kell kérnie az összes Disposition változó értékét egy adott uniqueid-hoz. A kapott adatokból ki kell zárni azokat az értékeket: NO ANSWER, BUSY, FAILED, UNKNOWN. Ennek eredményeként vagy ANSWERED marad – a bejövő hívásra válaszoltak, vagy nem marad semmi – kihagyott hívás.
Ezután, ha a hívás kihagyott, a scriptnek e-mail értesítést kell küldenie.
Előre szeretném hangsúlyozni egy fontos szempontot. Az Asterisk sorban hajtja végre a parancsokat, megvárva azok befejezését (ami logikus). A bash-skriptet pedig a hangupcall parancs végrehajtása előtt fogjuk hívni. Így a skript tényleges végrehajtásának időpontjában a CDR-ben még nem szerepel az általunk keresett „uniqueid” információ. A probléma megoldására a bash-skriptet „&” paraméterrel fogjuk hívni, hogy az Asterisk azonnal a következő lépésre lépjen, azaz a hangupcall-ra. A bash-skript elején egy rövid időzítést fogunk beállítani, hogy időt adjunk az Asterisk-nek a minket érdeklő „uniqueid” adatainak a CDR-be történő beírására.
Gyakorlat
Mielőtt a Asterisk beállítására és a bash-skript létrehozására térnénk, be kell állítanunk az e-mail értesítések küldését. Ehhez a postfix segédprogramot fogjuk használni.
Postfix beállítása
Van egy levelezési domainünk, a „lucky.ru”, amely a Yandexnél található. A postfixet SMTP-kliensekként fogjuk beállítani, és az asterisk@lucky.ru fiókból fogunk e-maileket küldeni.
A megoldás alapja innen származik: .
Először telepítsük/újítsuk meg/ellenőrizzük a csomagok meglétét:
yum install postfix
yum install mailx
yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-plainNe a postfix fő konfigurációs fájlját „/etc/postfix/main.cf” módosítsuk, hanem készítsünk róla biztonsági másolatot:
cp /etc/postfix/main.cf /etc/postfix/main.cf.savSzerkesztjük a „/etc/postfix/main.cf” fájlt, és az alábbiak szerint módosítjuk:
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
#####################Nem minden sort lehet kommentálni a „/etc/postfix/main.cf”-ben. Egyes sorokban a megjegyzések nem definiáltak a parser által, és továbbítódnak a feldolgozásra, ami hibákhoz vezet. Jobb, ha lemondunk a megjegyzésekről ebben a fájlban. Kísérletezhet ezzel, ha a szomszédos ablakban futtatja a „tail -f /var/log/messages” parancsot.
Megjegyzem a „smtputf8_autodetect_classes = all” sort. Ez a bejegyzés automatikusan engedélyezi az utf-8-t, amely lehetővé teszi a cirill betűk használatát az e-mail szövegében és tárgyában is további manipulációk nélkül (Lásd. ).
Hozzunk létre egy könyvtárat a konfigurációs fájlok számára:
mkdir /etc/postfix/privateA fájl szerkesztése: «/etc/postfix/private/sender_relay». Itt kell megadni, hogy melyik smtp-szerverre kell hivatkozni a levelezési doménk használatakor:
nano /etc/postfix/private/sender_relay
#####################
@lucky.ru smtp.yandex.ru
#####################A fájl szerkesztése: «/etc/postfix/private/sasl_passwd». Itt megadjuk az e-mail címet, amelyet a levelek küldésére fogunk használni, valamint a fiók felhasználónevét és jelszavát (a felhasználónevet és a jelszót kettősponttal elválasztva kell megadni):
nano /etc/postfix/private/sasl_passwd
#####################
asterisk@lucky.ru asterisk@lucky.ru:jelszó_asterisk
#####################A fájl szerkesztése: «/etc/postfix/generic». Itt megadjuk a kimenő cím alaptervezési szabályait (lásd: ):
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
#####################A kimenő cím alapértelmezett értéke a «/etc/hosts» és a «/etc/hostname» tartalmától, valamint attól a felhasználónevtől függ, aki a levelet küldi. Tehát, bár smtp-klienst használunk és leveleket küldünk az asterisk@lucky.ru címmel, a postfix a feladó címébe kezdetben «valami más» értéket fog behelyettesíteni, amit az ezen konfigurációs fájl szabályaival kell javítani.
Feltüntetem a «/etc/hosts» fájlom tartalmát:
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
#####################Fontos, hogy a szervernek legyen valamilyen doménneve (pont után érték), mert a mail segédprogram «keresi» a doménnevet a «/etc/hosts»-ban, és ha ezt nem találja azonnal, akkor tovább keres az elkövetkező néhány percben, majd csak utána küldi el a levelet. Tehát, ha a domén nincs megadva, a levél néhány perces késéssel fog elmenni.
Feltüntetem a «/etc/hostname» fájlom tartalmát:
cat /etc/hostname
#####################
asterisk
#####################Ezután szükséges a létrehozott konfigurációs fájlokat indexelt adatbázisokba konvertálni, ehhez a következő parancsot futtatjuk:
postmap /etc/postfix/generic && postmap /etc/postfix/private/{sasl_passwd,sender_relay}Ezután le kell tölteni és el kell helyezni a smtp.yandex.ru tanúsítványát a szerveren, ehhez futtassuk a következő parancsot:
openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25 > /etc/postfix/ca.pemDe miután a képernyőn megjelenik a technikai információ, a csapat "továbbra is lefagy". Nyomja meg a Ctrl+C billentyűt a megszakításhoz.
Most manuálisan eltávolítjuk a keletkezett fájlból az összes felesleges részletet, és csak a tanúsítványt hagyjuk meg. Valami ilyesminek kell lennie:
nano /etc/postfix/ca.pem
#####################
-----BEGIN CERTIFICATE-----
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
...
nRG0DfdqYIuPGApFORYe
-----END CERTIFICATE-----
#####################És végül indítsuk újra a postfixet:
service postfix restartTesztlevél küldése:
echo "Ez a levél törzse" | mail -s "Ez a téma" admin@lucky.ruadmin@lucky.ru — a célcím
Ezzzel befejeződik a postfix beállítása.
Bash-szkript írása
Létrehozzuk a bash-szkript tárolására szolgáló könyvtárat (itt mindenki kedve szerint):
mkdir /home/asterisk/scriptsLétrehozzuk a bash-szkript fájlt:
touch /home/asterisk/scripts/noanswer.shAdjuk meg a fájl szkriptnek a végrehajtási jogokat:
chmod +x /home/asterisk/scripts/noanswer.shHa kétségei vannak a fájl jogait illetően, a hibaelhárítás idejére teljes hozzáférést adhat a fájlhoz. De ez "nem biztonságos".
chmod 777 /home/asterisk/scripts/noanswer.shA bash-szkript szövege:
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="fontos kérdéssel"
;;
63100)
address="debian@lucky.ru"
subject="linux debian ügyek"
;;
63200)
address="windows@lucky.ru"
subject="windows-el kapcsolatos ügyek"
;;
63300)
address="freebsd@lucky.ru"
subject="freebsd ügyek"
;;
63400)
address="ubuntu@lucky.ru"
subject="linux ubuntu ügyek"
;;
63500)
address="centos@lucky.ru"
subject="linux centos ügyek"
;;
*)
address="admin@lucky.ru"
error_kod=1
;;
esac
case $error_kod in
0)
echo "Hívás elmaradt a $2 számról, aki a $subject-tel hívta." | mail -s "Hívás elmaradt $2-tól" $address
echo "Hívás elmaradt $address-tól, aki a $subject-tel hívta $2-t." | mail -s "Hívás elmaradt $2-tól" admin@lucky.ru
;;
1)
echo "Hívás elmaradt $2-től. Az ügyfélszám ismeretlen. uid=$1" | mail -s "Hívás elmaradt $2-tól" admin@lucky.ru
;;
esac
fi
#####################A szkript rövid áttekintése:
"sleep 7":
Ez az a késleltetés, amelyről korábban írtam. Az időzítésünk 7 másodperc. Bár azt hiszem, már 1 másodperc is elegendő lenne.
"res_sql="SELECT disposition FROM cdr WHERE uniqueid = '$1'"":A mysql lekérdezést külön változóba vittük, hogy megkönnyítsük a dolgot.
Ezután kérdést teszünk fel a mysql-nek, és szűrjük a kapott kimenetet. Eltávolítjuk az összes választási lehetőséget, kivéve az „ANSWERED”-et, ha egyáltalán van. Ha több „ANSWERED” érték van, csak egyet kell megtartani. A végén az „answer” változóban vagy az „ANSWERED”, vagy a „” értéket kapjuk.
Ha az „answer” változó értéke nem egyenlő az „ANSWERED”-del, akkor ez egy kihagyott hívás. A sor számától függően az esetutasítóval beállítjuk, hogy pontosan kinek kell email értesítést küldeni, és mit kell írni ebben az üzenetben (az üzenet változó része).
Ezután azt az esetet nézzük, amikor a sor Asterisk-ben van megadva, de a szkripten nincs leírva. Ebben az esetben admin@lucky.ru kap egy levelet, amely arról tájékoztatja, hogy a sor ismeretlen a szkripthez.
Ha a sor le van írva, akkor a levél a megfelelő címre kerül, és egy másolat admin@lucky.ru címre is elmegy a „uniqueid” megadásával, hogy nyomon lehessen követni az eseményeket ezzel a hívással kapcsolatban, ha szükséges.
Ezzel a szkript véget ér.
Megjegyzem, hogy a mysql-hez való csatlakozáshoz azt a felhasználónevet és jelszót használtuk, amelyet előre megtudtunk. A FreePBX-ben az Asterisk felhasználónevének mysql-ben való megismeréséhez futtassa a következő parancsot:
cat /etc/amportal.conf | grep AMPDBUSERÉs ahhoz, hogy megtudja az Asterisk felhasználó jelszavát mysql-ben, futtassa a következő parancsot:
cat /etc/amportal.conf | grep AMPDBPASSAsterisk beállítása
A FreePBX-t használjuk. A FreePBX-ben különböző típusú konfiguráló fájlok találhatók (lásd. ) egyes fájlokat a FreePBX újraindításakor felülír, míg másokat nem (így hívják őket custom), mivel ezek kifejezetten a felhasználóknak szólnak.
A „extensions_override_freepbx.conf” konfigurálási fájllal fogunk dolgozni, mivel ez a custom típushoz tartozik.
Először biztosítjuk, hogy a „/etc/asterisk/extensions.conf” fájlban csatlakoztatva van a „extensions_override_freepbx.conf” fájl. Ehhez futtassa a következő parancsot:
cat /etc/asterisk/extensions.conf | grep extensions_override_freepbx.conf
#####################
#include extensions_override_freepbx.conf
#####################Szerkesztjük a fájlt „/etc/asterisk/extensions_override_freepbx.conf” és az alábbi formátumra állítjuk:
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,)
#####################Ahogy korábban írtam, a „&” karakter végén kötelező. Mivel a bash-skripttel a CDR adatokkal dolgozunk közvetlenül az mysql adatbázisból, és ezek az adatok csak az „exten => h,2,Macro(hangupcall,)” végrehajtása után kerülnek be az mysql-ba, nem szabad megvárni a bash-skript futásának végét, hanem folytatni kell a következő lépést az Asteriskben. A bash-skriptnak pedig időzítést kell tartalmaznia a fő része végrehajtása előtt.
Ahhoz, hogy a módosítások érvényesüljenek a „/etc/asterisk/extensions_override_freepbx.conf” konfigurációs fájlban, újra kell indítani az Asterisk magját a következő parancs használatával:
/usr/sbin/asterisk -rx "core restart now"Ezt akkor kell megtenni, miután a bash-skript létrejött.
Zárás
Valószínűleg ez a 1001. módszer a „missed calls” Asteriskben való nyomon követésére. Kérjük, ossza meg a megjegyzésekben, hogyan oldja meg ezt a feladatot. És mi az Ön véleménye arról, mit lehetne továbbfejleszteni/átdolgozni/optimalizálni. Hálásak leszünk a konstruktív ötletekért.
Forrás: habr.com
