ÜcretsizPBX. Kuyruktaki cevapsız gelen aramalarla ilgili e-posta bildirimleri için Yıldız İşaretini yapılandırma

ÜcretsizPBX. Kuyruktaki cevapsız gelen aramalarla ilgili e-posta bildirimleri için Yıldız İşaretini yapılandırma
IP ATC Asterisk, IP telefonu alanında güçlü bir makinedir. Asterisk için oluşturulan FreePBX web arayüzü ise kurulumu büyük ölçüde basitleştirir ve sisteme giriş engelini azaltır.
IP telefonuyla ilgili herhangi bir görevi düşünebiliyorsanız, o zaman bu neredeyse kesinlikle Asterisk'te uygulanabilir. Ancak azim ve dayanıklılığa ihtiyacınız olacağından emin olabilirsiniz.

Cevapsız aramalarla ilgili e-posta bildirimleri ayarlama göreviyle karşı karşıya kaldık. Daha doğrusu, gelen bir çağrının kuyruğa girdiği ancak hiç kimsenin (temsilcilerden) bu gelen çağrıya cevap vermediği durumlar hakkında e-posta yoluyla bildirimde bulunun.

Şaşırtıcı bir şekilde, FreePBX'te bu sorunu çözmek için herhangi bir standart araç bulamadık. Bu sorunu nasıl çözdüğümüzü kesimin altında anlatacağım.

Önsöz

Sorunu doğrudan çözmeden önce elbette internette bilgi aradık ama anahtar teslim bir çözüm bulamadık (belki iyi aramadık ama ne yapabilirsiniz...).

Yıldız işaretinde doğrudan çalışmak için istediğimiz kadar çok beceri yok, bu nedenle sunulan çözüm buradatam olarak anlaşılamamış ve bir kenara atılmıştır.

Önerilen çözümü beğendim buradaişe yaramamasına rağmen. Bu nedenle yıldız işaretinde kuyruklar (harici kuyruklar) bağlamında çalışmanız gerektiğini vurguladılar. Ve Freepbx'te çalıştığımız için “extensions_override_freepbx.conf” yapılandırma dosyasında çalışmamız gerekiyor. "Cevapsız çağrıları yakalamanın" çağrıyı kapatma olayından (çağrı sonu) önce kullanışlı olduğunu fark ettik.
Tartışmayı okuduktan sonra burada, CDR'deki "Dispozisyon" değişkeninin kuyruktaki tüm aracılar tarafından filtrelenmesinin gerekli olduğu fikri ortaya çıktı. Ve okuduktan sonra bu Bilgi, sorunun çözümü için çok spesifik adımlar oluşturuldu.

Neyimiz var:

Asterisk 13.12.1 kullanan FreePBX 13.0.197 sürümü mevcuttur. İşletim sistemi sürümü SHMZ sürüm 6.6'dır (Final). Dağıtım şu temele dayanmaktadır: CentOS.

Yıldız işareti, gelen çağrıları farklı Kuyruklara dağıtan bir IVR (ses menüsü) ile yapılandırılmıştır. Her kuyruğa Ajanlar, yani operatörler atanır.

Теория

Yıldız işaretinde neler oluyor

Yıldız işareti gelen bir çağrı aldığında çağrı IVR'ye gider. Arayan kişi telefonda belirli bir numaraya basarak seçim yapar ve belirli bir sıraya alınır. Bundan sonra kuyruktaki tüm serbest temsilciler aynı anda bir çağrı alır.

Şu anda neler olduğunu ve bundan sonra ne olacağını daha iyi anlamak için CDR Raporuna dönelim (Şekil 1).

ÜcretsizPBX. Kuyruktaki cevapsız gelen aramalarla ilgili e-posta bildirimleri için Yıldız İşaretini yapılandırma
Ris.1

Kuyruğa gelen bir çağrı geldiğinde, tüm temsilciler için “Dispozisyon” değişkeninin değeri, eğer temsilciler o anda meşgul değilse “CEVAP YOK” değerine eşit oluyordu. “Eğilim” değişkeni başka değerler alabilir (bkz. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr), “CEVAPLANDI” değeri hariç. Temsilcilerden biri gelen çağrıya cevap verdiği anda bu temsilcinin “Eğilim” değişkeninin değeri “CEVAPLANDI” değerine eşit olur.
Rapor CDR'sinden, çağrı kuyruğa alındığında (Uygulama sütununda değer "Kuyruk"a eşit olur), tüm olayların aynı "benzersiz kimlik" (Sistem sütunu) ile göründüğünü görebilirsiniz.

Kısaca CDR hakkında

CDR'nin ne olduğunu ve CDR Raporunda gözlemlediğimiz verilerin tam olarak hangi noktada CDR'ye girildiğini anlamak önemlidir. İşletim sistemine göre CDR, Asterisk'in ayrıntılı bir çağrı raporu yazdığı bir veritabanıdır (bkz. https://asterisk-pbx.ru/wiki/asterisk/cf/cdr). Bizim durumumuzda bu, mysql'de bulunan asteriskcdrdb adlı bir veritabanıdır. Belirli bir "benzersiz kimliğe" sahip bir çağrı hakkındaki verilerin, herhangi bir olayın meydana gelmesinden hemen sonra değil, çağrıyı kapatma olayından (çağrının sonu) sonra asteriskcdrdb'ye girildiğini deneysel olarak tespit ettik.

Oluşturulan çözümün çalışma prensibi

Bash'ta yıldız işaretindeki bilgiden daha fazla bilgimiz olduğundan ana fikrin şu şekilde olduğu ortaya çıktı. Hangupcall olayından önce bir bash betiği çağırın. Bu betiğe 3 parametre iletin. İlk parametre CDR'den alınan verileri filtrelemek için "uniqueid"dir. Kimin geri aranacağını bilmek için ikinci parametre “CALLERID(num)” (arayanın numarası)'dır. Üçüncü parametre, çağrının hangi konuyla ilgili olduğunu ve cevapsız çağrının e-posta bildiriminin kime gönderileceğini bilmek için çağrının geldiği “NODEST” (sıra numarası) parametresidir.
Bash betiğinin mysql'deki asteriskcdrdb veritabanına bağlanması ve belirli bir "uniqueid" ile "Disposition" değişkeninin tüm değerlerini alması gerekir. Alınan verilerden şu değerleri hariç tutmanız gerekir: "CEVAP YOK", "MEŞGUL", "BAŞARISIZ", "BİLİNMİYOR". Sonuç olarak, ya "YANITLANDI" ifadesi kalacak - gelen çağrı yanıtlandı ya da hiçbir şey yapılmadı - cevapsız bir çağrı.

Daha sonra, çağrı kaçırılırsa komut dosyası bir e-posta bildirimi göndermelidir.
İleriye baktığımda önemli bir noktaya dikkat çekeceğim. Yıldız işareti komutları sırayla yürütür ve tamamlanmalarını bekler (bu genellikle mantıklıdır). Hangupcall komutu yürütülmeden önce bash betiğini çağıracağız. Dolayısıyla, betiğin doğrudan yürütüldüğü anda aradığımız "benzersiz" hakkındaki bilgiler henüz CDR'ye girilmeyecektir. Bu sorunu çözmek için bash betiğini “&” parametresiyle çağıracağız, böylece Yıldız işareti hemen bir sonraki adıma, yani kapatma çağrısına geçecektir. Ve bash betiğinin içinde, en başta, Yıldız işaretinin bizi ilgilendiren "benzersiz kimlik" ile verileri CDR'ye girmesine zaman vermek için küçük bir zaman gecikmesi ayarlayacağız.

Uygulama

Yıldız işaretini yapılandırmaya ve bir bash betiği oluşturmaya geçmeden önce, e-posta bildirimlerinin gönderilmesini yapılandırmanız gerekir. Bunun için postfix yardımcı programını kullanacağız.

Postfix'i ayarlama

Yandex'te bulunan "lucky.ru" adlı bir mail alanımız var. Postfix'i smtp-client modunda yapılandıracağız ve mektupları asterisk@lucky.ru hesabından göndereceğiz.
Çözüm şuna dayanıyor: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex.

Öncelikle paketleri kuralım/güncelleyelim/kontrol edelim:

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

Ana postfix yapılandırma dosyasının “/etc/postfix/main.cf” üzerine yazmayalım, bunun yerine yedek bir kopyasını oluşturalım:

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

“/etc/postfix/main.cf” dosyasını düzenleyip aşağıdaki forma getiriyoruz:

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

“/etc/postfix/main.cf” dosyasındaki her satıra yorum yapılamaz. Bazı satırlardaki yorumlar ayrıştırıcı tarafından algılanıp işleme gönderilmiyor ve bu da hatalara yol açıyor. Bu dosyanın içindeki yorumları reddetmek daha iyidir. Bir sonraki pencerede “tail -f /var/log/messages” komutunu çalıştırarak bunu deneyebilirsiniz.

“smtputf8_autodetect_classes = all” satırını işaretleyeceğim. Bu giriş varsayılan olarak utf-8'i içerir; bu, Kiril alfabesini hem mektubun gövdesinde hem de mektubun konusunda ek manipülasyonlar olmadan kullanmanıza olanak tanır (Bkz. http://www.postfix.org/SMTPUTF8_README.html).

Yapılandırma dosyaları için bir dizin oluşturalım:

mkdir /etc/postfix/private

“/etc/postfix/private/sender_relay” dosyasını düzenleyin. İçinde posta alanımızı kullanırken hangi smtp sunucusuna bağlanmanız gerektiğini belirtmeniz gerekir:

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

“/etc/postfix/private/sasl_passwd” dosyasını düzenleyin. İçinde, mektup göndermek için kullanacağımız e-posta adresinin yanı sıra bu hesabın kullanıcı adını ve şifresini de belirteceğiz (kullanıcı adını ve şifreyi iki nokta üst üste ile ayırarak belirtiyoruz):

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

“/etc/postfix/generic” dosyasını düzenleyin. İçinde giden adresi değiştirme kurallarını yazacağız (bkz. 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
#####################

İlk giden adres, "/etc/hosts" ve "/etc/hostname" içeriklerine ve mektubu gönderecek kullanıcının adına bağlıdır. Yani, bir smtp istemcisi kullanmamıza ve mektupları asterisk@lucky.ru adresinden göndermemize rağmen, postfix yine de başlangıçta gönderenin adresine "kendisine ait bir şey" ifadesini koyacaktır ve bu, bu yapılandırma dosyasındaki kurallar kullanılarak düzeltilmelidir.

İşte “/etc/hosts” dosyamın içeriği:

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

Sunucunun bir tür etki alanına sahip olması önemlidir (noktadan sonraki değer), çünkü posta yardımcı programı etki alanı adını "/etc/hosts" dosyasında "arar" ve eğer hemen "bulmazsa", bunu birkaç dakika daha sürdürecek ve ancak o zaman mektubu gönderecektir. Yani alan adı kayıtlı değilse mektup birkaç dakikalık gecikmeyle gönderilecektir.

İşte “/etc/hostname” dosyamın içeriği:

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

Daha sonra, oluşturulan konfigürasyon dosyalarını indekslenmiş veritabanlarına aktarmanız gerekir; bunu yapmak için aşağıdaki komutu çalıştırın:

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

Daha sonra smtp.yandex.ru sertifikasını indirip sunucuya yerleştirmemiz gerekiyor; bunu yapmak için aşağıdaki komutu çalıştırın:

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

Ancak teknik bilgiler ekranda göründükten sonra komut “askıda kalmaya devam edecek”. İptal etmek için Ctrl+C tuşlarına basın.

Şimdi ortaya çıkan dosyadaki tüm çöpleri manuel olarak kaldıralım ve sadece sertifikayı bırakalım. Bunun gibi bir şeye benzemeli:

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

Ve son olarak postfix'i yeniden başlatın:

service postfix restart

Test mektubunun gönderilmesi:

echo "Это тело письма" | mail -s "Это тема" admin@lucky.ru

admin@lucky.ru — hedef adres

Bu posfix kurulumunu tamamlar.

Bash betiği yazma

Bash betiğini saklamak için bir dizin oluşturun (burası en çok hoşunuza giden yer):

mkdir /home/asterisk/scripts

Bir bash komut dosyası oluşturun:

touch /home/asterisk/scripts/noanswer.sh

Komut dosyası dosyasına yürütme izinlerini veriyoruz:

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

Bir dosyanın hakları konusunda şüpheleriniz varsa, hata ayıklama sırasında dosyaya tam erişim verebilirsiniz. Ancak bu “güvenli değil”.

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

Bash komut dosyası metni:

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="по важному вопросу"
 ;;
 63100)
 address="debian@lucky.ru"
 subject="по вопросам linux debian"
 ;;
 63200)
 address="windows@lucky.ru"
 subject="по вопросам windows"
 ;;
 63300)
 address="freebsd@lucky.ru"
 subject="по вопросам freebsd"
 ;;
 63400)
 address="ubuntu@lucky.ru"
 subject="по вопросам linux ubuntu"
 ;;
 63500)
 address="centos@lucky.ru"
 subject="по вопросам linux centos"
 ;;
 *)
 address="admin@lucky.ru"
 error_kod=1
 ;;
 esac

 case $error_kod in
 0)
 echo "Пропущен вызов от абонента $2, звонившего $subject." | mail -s "Пропущен вызов от $2" $address
 echo "Пропущен вызов для $address от абонента $2, звонившего $subject. uid=$1" | mail -s "Пропущен вызов от $2" admin@lucky.ru
 ;;
 1)
 echo "Пропущен вызов от $2. Очередь неизвестна. uid=$1" | mail -s "Пропущен вызов от $2" admin@lucky.ru
 ;;
 esac

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

Senaryonun kısa analizi:
"uyku 7":

Bu daha önce yazdığım gecikmenin aynısı. 7 saniyeye ayarlanmış bir gecikmemiz var. Yine de bir saniyenin yeterli olduğunu düşünüyorum.

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

Kolaylık sağlamak için sorguyu mysql'de ayrı bir değişkene taşıdık.

Daha sonra MySQL'de bir sorgu yapıyoruz ve ortaya çıkan çıktıyı filtreliyoruz. Varsa “CEVAPLANDI” dışındaki tüm seçenekleri sileriz. Birden fazla “CEVAPLANDI” değeri varsa, yalnızca bir tanesi bırakılmalıdır. Sonunda “cevap” değişkeninde “CEVAPLANDI” veya “” ifadesini alacağız.
"answer" değişkeninin değeri "ANSWERED" değilse bu bir cevapsız çağrıdır. Kuyruk numarasına bağlı olarak, case ifadesini kullanarak, e-posta bildiriminin tam olarak kime gönderilmesi gerektiğini ve bu mesaja ne yazılacağını (mesajın değişken kısmı) belirleyeceğiz.

Sırada, kuyruğun Asterisk'te ayarlandığı ancak betikte tanımlanmadığı durumu ele alacağız. Bu durumda, admin@lucky.ru kuyruğun betik tarafından bilinmediğine dair bir mektup alacaktır.

Eğer kuyruk tanımlanmışsa, hedefe bir mektup ve admin@lucky.ru adresine "uniqueid" belirten bir kopyası gönderilecektir, böylece gerekirse bu çağrıdaki olayları izlemek mümkün olacaktır.

Senaryonun bittiği yer burası.

MySQL'e bağlanmak için önceden öğrendiğimiz kullanıcı adı ve şifreyi kullandığımızı unutmayın. FreePBX'te, MySQL'de Yıldız işareti kullanıcısının oturum açma bilgilerini bulmak için aşağıdaki komutu çalıştırın:

cat /etc/amportal.conf | grep AMPDBUSER

Ve mysql'de Yıldız işareti kullanıcı şifresini bulmak için aşağıdaki komutu çalıştırın:

cat /etc/amportal.conf | grep AMPDBPASS

Yıldız İşaretini Ayarlama

FreePBX kullanıyoruz. FreePBX'in farklı türde yapılandırma dosyaları vardır (bkz. https://asterisk-pbx.ru/wiki/freepbx/files), bazıları yeniden başlatıldığında FreePBX tarafından üzerine yazılır ve bazılarının üzerine yazılmaz (bunlara özel denir), çünkü bunlar kullanıcı için özel olarak tasarlanmıştır.

Özel türde olduğundan “extensions_override_freepbx.conf” yapılandırma dosyasıyla çalışacağız.

Öncelikle “/etc/asterisk/extensions.conf” dosyası içerisinde “extensions_override_freepbx.conf” dosyasının bulunduğundan emin olalım. Bunu yapmak için aşağıdaki komutu çalıştırın:

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

“/etc/asterisk/extensions_override_freepbx.conf” dosyasını düzenleyin ve aşağıdaki forma getirin:

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

Daha önce de yazdığım gibi sonunda “&” sembolü olması gerekiyor. Doğrudan mysql veritabanından alınan CDR verileri ile bash scriptinde çalışacağımız ve bu veriler ancak “exten => h,2,Macro(hangupcall,)” çalıştırıldıktan sonra mysql’e girileceği için beklememize gerek kalmıyor. bash betiğini kullanarak işlemeyi tamamlayın ve Yıldız işaretindeki bir sonraki adıma geçin. Ve bash betiğinin kendisi, ana bölümünü çalıştırmadan önce bir zaman gecikmesi içermelidir.

“/etc/asterisk/extensions_override_freepbx.conf” yapılandırma dosyasındaki değişikliklerin etkili olması için Asterisk çekirdeğini aşağıdaki komutla yeniden başlatmanız gerekir:

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

Bu, bash betiği oluşturulduktan sonra yapılmalıdır.

Sonuç

Bu muhtemelen Yıldız işaretinde "cevapsız çağrıları yakalamanın" 1001. yoludur. Bu sorunu nasıl çözeceğinizi yorumlarda paylaşın. Ve sizce ne geliştirilebilir/yeniden yapılabilir/optimize edilebilir? Yapıcı fikirlere minnettar olacağız.

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster