FreePBX Mengkonfigurasi Asterisk untuk pemberitahuan e-mail tentang panggilan masuk yang terlewat dalam antrian

gambar
IP ATC Asterisk adalah prosesor telepon IP yang kuat. Dan antarmuka berbasis web FreePBX yang dibuat untuk Asterisk sangat menyederhanakan konfigurasi dan menurunkan ambang masuk.
Jika Anda dapat menemukan beberapa jenis tugas yang berkaitan dengan IP telephony, maka hampir pasti itu dapat diimplementasikan dalam Asterisk. Tetapi pastikan bahwa ketekunan dan ketahanan akan dituntut dari Anda.

Kami menghadapi tugas mengatur notifikasi e-mail panggilan tidak terjawab. Lebih tepatnya, untuk memberi tahu melalui email tentang kasus ketika panggilan masuk telah diantrikan, tetapi tidak ada seorang pun (dari agen) yang menjawab panggilan masuk ini.

Anehnya, kami tidak menemukan alat biasa untuk menyelesaikan masalah ini di FreePBX. Saya akan berbicara tentang bagaimana kami memecahkan masalah ini di bawah potongan.

Kata Pengantar

Sebelum menyelesaikan masalah "langsung", kami tentu mencari informasi di Internet, tetapi tidak menemukan solusi turnkey (mungkin mereka terlihat buruk, tetapi apa yang dapat Anda lakukan ...).

Tidak ada banyak keterampilan kerja langsung di Asterisk seperti yang kita inginkan, sehingga solusi yang diusulkan di sini tidak sepenuhnya dipahami dan dibuang.

Saya menyukai solusi yang diusulkan di sini , meskipun tidak berhasil. Oleh karena itu, mereka menekankan bahwa bekerja di Asterisk diperlukan dalam konteks [antrian]. Dan karena kita bekerja di Freepbx, kita perlu bekerja di file konfigurasi “extensions_override_freepbx.conf”. Kami memperhatikan bahwa akan lebih mudah untuk "menangkap panggilan tidak terjawab" sebelum acara hangupcall (mengakhiri panggilan).
Setelah membaca diskusi di sini , muncul ide bahwa kita perlu memfilter variabel "Disposisi" dalam CDR untuk semua agen dalam antrian. Dan setelah membaca informasi ini , langkah-langkah yang sangat spesifik dibentuk untuk menyelesaikan tugas.

Apa yang kita miliki:

Ada FreePBX 13.0.197 yang menggunakan Asterisk 13.12.1. Versi OS SHMZ rilis 6.6 (Final). Distribusi didasarkan pada CentOS.

Asterisk dikonfigurasikan dengan IVR (menu suara) yang menghamburkan panggilan masuk ke Antrian (antrian) yang berbeda. Agen (agen) ditugaskan untuk setiap antrian, yaitu agen.

Teori

Apa yang terjadi di Asterisk

Ketika panggilan masuk tiba di Asterisk, panggilan itu masuk ke IVR. Penelepon membuat pilihan dengan menekan nomor tertentu pada ponsel dan memasukkan antrian tertentu. Setelah itu, semua agen bebas dari antrian secara bersamaan menerima panggilan.

Untuk lebih memahami apa yang terjadi pada saat ini dan apa yang terjadi selanjutnya, kita beralih ke Laporan CDR (Gbr. 1).

gambar
Fig. 1

Ketika panggilan masuk masuk ke antrian, untuk semua agen nilai dari variabel "Disposisi" menjadi sama dengan "NO JAWABAN" jika agen tidak sibuk pada saat itu. Variabel "Disposisi" dapat mengambil nilai lain (lihat https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ), kecuali untuk nilai "JAWABAN". Dan pada saat ketika salah satu agen menjawab panggilan masuk, nilai variabel "Disposisi" agen ini menjadi sama dengan "JAWABAN".
Dari CDR Laporan, Anda dapat melihat bahwa ketika panggilan diantrekan (di kolom Aplikasi, nilainya menjadi "Antrian"), maka semua acara muncul dengan "uniqueid" yang sama (kolom Sistem).

CDR secara singkat

Penting untuk memahami apa itu CDR dan pada titik mana dalam CDR data yang kita amati dalam Laporan CDR dimasukkan. CDR, relatif terhadap sistem operasi, adalah basis data tempat Asterisk mencatat laporan panggilan terperinci (lihat https://asterisk-pbx.ru/wiki/asterisk/cf/cdr ). Dalam kasus kami, ini adalah database yang disebut asteriskcdrdb, yang terletak di mysql. Secara empiris, kami menemukan bahwa data tentang panggilan dengan "uniqueid" tertentu tidak dimasukkan ke dalam asteriskcdrdb segera setelah terjadinya suatu peristiwa, tetapi setelah acara hangupcall (akhir panggilan).

Prinsip solusi yang dibuat

Karena kita memiliki lebih banyak pengetahuan di bash daripada pengetahuan di Asterisk, ide utamanya adalah sebagai berikut. Sebelum acara hangupcall, aktifkan skrip bash. Lewati 3 parameter ke skrip ini. Parameter pertama adalah "uniqueid", untuk memfilter data yang diterima dari CDR. Parameter kedua adalah "CALLERID (num)" (nomor pemanggil) untuk mengetahui siapa yang harus dihubungi. Parameter ketiga adalah "NODEST" (nomor antrian), di mana panggilan diterima, untuk mengetahui tentang masalah apa yang ada panggilan dan kepada siapa untuk mengirim pemberitahuan email dari panggilan tidak terjawab.
Script bash harus terhubung ke database asteriskcdrdb di mysql dan mengambil semua nilai dari variabel "Disposisi" dengan "uniqueid" yang spesifik. Dari data yang diperoleh, perlu untuk mengecualikan nilai-nilai: "NO JAWABAN", "SIBUK", "GAGAL", "TIDAK DIKETAHUI". Akibatnya, "JAWABAN" akan tetap ada - mereka menjawab panggilan masuk, atau tidak sama sekali - panggilan tidak terjawab.

Selanjutnya, jika panggilan tidak terjawab, skrip harus mengirim pemberitahuan email.
Ke depan, saya perhatikan poin penting. Asterisk mengeksekusi perintah secara berurutan, menunggu eksekusi (yang umumnya logis). Dan kita akan memanggil skrip bash sebelum perintah hangupcall dieksekusi. Dengan demikian, pada saat skrip dieksekusi langsung, informasi tentang keunikan yang kami cari belum dimasukkan ke dalam CDR. Untuk mengatasi masalah ini, kami akan memanggil skrip bash dengan parameter "&" sehingga Asterisk segera melanjutkan ke langkah berikutnya, yaitu hangupcall. Dan di dalam skrip bash, di awal, kami akan menetapkan sedikit waktu tunda untuk memberi waktu bagi Asterisk untuk memasukkan data dengan "uniqueid" yang menarik bagi kami di CDR.

Berlatih

Sebelum melanjutkan untuk mengonfigurasi Asterisk dan membuat skrip bash, Anda perlu mengonfigurasi pengiriman pemberitahuan email. Untuk ini, kita akan menggunakan utilitas postfix.

Pengaturan postfix

Kami memiliki domain email "lucky.ru" yang terletak di Yandex. Kami akan mengonfigurasi postfix dalam mode smtp-client dan akan mengirim surat dari akun asterisk@lucky.ru.
Solusinya diambil dari sini: https://www.dmosk.ru/miniinstruktions.php?mini=postfix-over-yandex .

Pertama instal / perbarui / periksa paket:

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

Kami tidak akan menimpa file konfigurasi postfix utama "/etc/postfix/main.cf", tetapi cadangkan:

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

Kami mengedit file "/etc/postfix/main.cf" dan membawanya ke formulir berikut:

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

Tidak setiap baris di "/etc/postfix/main.cf" dapat dikomentari. Komentar di beberapa baris tidak ditentukan oleh parser dan diteruskan ke pemrosesan, dan ini menyebabkan kesalahan. Lebih baik menolak komentar di dalam file ini. Anda dapat bereksperimen dengan ini dengan menjalankan "tail -f / var / log / messages" di jendela berikutnya.

Saya akan menandai baris "smtputf8_autodetect_classes = all". Entri ini mencakup utf-8 secara default, yang memungkinkan Anda untuk menggunakan alfabet Sirilik baik di tubuh surat maupun di baris subjek tanpa manipulasi tambahan (Lihat http://www.postfix.org/SMTPUTF8_README.html ).

Buat direktori untuk file konfigurasi:

 mkdir /etc/postfix/private 

Kami mengedit file "/ etc / postfix / private / sender_relay". Di dalamnya, Anda perlu menentukan server smtp mana yang perlu Anda rujuk saat menggunakan domain email kami:

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

Kami mengedit file "/ etc / postfix / private / sasl_passwd". Di dalamnya kami akan menunjukkan alamat email yang akan kami gunakan untuk mengirim surat, serta nama pengguna dan kata sandi untuk akun ini (kami menentukan nama pengguna dan kata sandi melalui titik dua):

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

Mengedit file / etc / postfix / generic. Di dalamnya kita akan menuliskan aturan untuk mengganti alamat keluar (lihat 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 ##################### 

Alamat keluar awal tergantung pada konten "/ etc / hosts" dan "/ etc / hostname", serta pada nama pengguna yang akan mengirim surat. Artinya, terlepas dari kenyataan bahwa kami menggunakan klien smtp dan mengirim surat dari asterisk@lucky.ru, bagaimanapun, postfix pada awalnya akan mengganti "sesuatu sendiri" ke alamat pengirim dan ini harus diperbaiki dengan aturan dari file konfigurasi ini.

Saya akan mencantumkan konten file / etc / hosts saya:

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

Adalah penting bahwa server memiliki domain apa pun (nilai setelah periode), karena utilitas surat "mencari" nama domain di "/ etc / hosts" dan jika tidak segera "menemukannya", server akan terus melakukan ini selama beberapa menit lagi dan baru kemudian mengirim surat. Artinya, jika domain tidak terdaftar, maka surat itu akan pergi dengan penundaan selama beberapa menit.

Saya akan mencantumkan konten file / etc / hostname saya:

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

Selanjutnya, Anda perlu mentransfer file konfigurasi yang dibuat ke database yang diindeks, untuk melakukan ini, jalankan perintah berikut:

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

Selanjutnya, kita perlu mengunduh dan menempatkan sertifikat smtp.yandex.ru di server, untuk melakukan ini, jalankan perintah berikut:

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

Tetapi setelah informasi teknis muncul di layar, tim akan "terus menggantung." Tekan Ctrl + C untuk membatalkannya.

Sekarang secara manual hapus semua sampah dari file yang dihasilkan dan hanya menyisakan sertifikat. Anda harus mendapatkan sesuatu seperti ini:

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

Terakhir, restart postfix:

 service postfix restart 

Kami mengirim surat uji:

 echo "  " | mail -s " " admin@lucky.ru 

admin@lucky.ru - alamat tujuan

Ini melengkapi konfigurasi posfix.

Menulis skrip bash

Buat direktori untuk menyimpan skrip bash (di sini seseorang suka di mana):

 mkdir /home/asterisk/scripts 

Buat file skrip bash:

 touch /home/asterisk/scripts/noanswer.sh 

Kami memberikan izin file skrip untuk dijalankan:

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

Jika ada keraguan tentang hak atas file, maka selama debugging Anda dapat memberikan akses penuh ke file tersebut. Tapi itu "tidak aman."

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

Teks skrip bash:

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

Analisis singkat naskah:
"Tidur 7":

Ini adalah penundaan waktu yang sama yang saya tulis sebelumnya. Kami memiliki penundaan 7 detik. Meskipun, saya pikir, satu detik sudah cukup.

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

Kueri di mysql kami masukkan ke dalam variabel terpisah untuk kenyamanan.

Selanjutnya, kami membuat permintaan di mysql dan memfilter hasil yang dihasilkan. Kami menghapus semua opsi kecuali "JAWABAN", jika ada. Jika ada beberapa nilai "JAWABAN", maka hanya satu yang harus ditinggalkan. Pada akhirnya, dalam variabel "jawaban" kita mendapatkan "JAWABAN" atau "".
Jika nilai variabel jawaban tidak sama dengan JAWAB, maka ini adalah panggilan tidak terjawab. Bergantung pada nomor antrian, menggunakan operator kasing, kami akan menetapkan alamat kepada siapa perlu mengirim pemberitahuan email, dan apa yang harus ditulis dalam pesan ini (bagian variabel dari pesan).

Berikut ini adalah opsi ketika antrian diatur dalam Asterisk, tetapi tidak dijelaskan dalam skrip. Dalam hal ini, admin@lucky.ru akan menerima surat yang menyatakan bahwa antrian tidak diketahui oleh skrip.

Jika antrian dijelaskan, maka surat tujuan dan surat duplikat akan dikirim ke admin@lucky.ru yang menunjukkan "uniqueid", sehingga Anda dapat melacak acara pada panggilan ini, jika perlu.

Ini mengakhiri skrip.

Saya perhatikan bahwa untuk terhubung ke mysql kami menggunakan nama pengguna dan kata sandi yang kami kenali sebelumnya. Di FreePBX, untuk mengetahui login pengguna Asterisk di mysql, jalankan perintah berikut:

 cat /etc/amportal.conf | grep AMPDBUSER 

Dan untuk mengetahui kata sandi pengguna Asterisk di mysql, jalankan perintah berikut:

 cat /etc/amportal.conf | grep AMPDBPASS 

Konfigurasikan Asterisk

Kami menggunakan FreePBX. FreePBX memiliki berbagai jenis file konfigurasi (lihat https://asterisk-pbx.ru/wiki/freepbx/files ), beberapa dari mereka ditimpa oleh FreePBX saat reboot, dan beberapa tidak ditimpa (mereka disebut custom), karena mereka dirancang khusus) untuk pengguna.

Kami akan bekerja dengan file konfigurasi "extensions_override_freepbx.conf", karena ini adalah tipe kustom.

Pertama, pastikan bahwa file “extensions_override_freepbx.conf” terhubung dalam file “/etc/asterisk/extensions.conf”. Untuk melakukan ini, jalankan perintah berikut:

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

Kami mengedit file "/etc/asterisk/extensions_override_freepbx.conf" dan membawanya ke formulir berikut:

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

Seperti yang saya tulis sebelumnya, simbol "&" di akhir diperlukan. Karena kita akan bekerja dalam skrip bash dengan data CDR langsung dari database mysql, dan data ini dimasukkan dalam mysql hanya setelah mengeksekusi "exten => h, 2, Makro (hangupcall,)", kita tidak perlu menunggu selesainya skrip bash , dan lanjutkan ke langkah berikutnya di Asterisk. Dan skrip bash itu sendiri harus mengandung penundaan waktu sebelum menjalankan bagian utamanya.

Agar perubahan dalam file konfigurasi “/etc/asterisk/extensions_override_freepbx.conf” untuk mulai berlaku, Anda perlu memulai kembali kernel Asterisk dengan perintah berikut:

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

Ini perlu dilakukan setelah skrip bash dibuat.

Kesimpulan

Ini mungkin cara 1001 untuk "menangkap panggilan tidak terjawab" di Asterisk. Bagikan komentar bagaimana Anda mengatasi masalah ini. Dan apa, menurut Anda, dapat ditingkatkan / diperbaiki / dioptimalkan. Kami akan berterima kasih atas ide-ide konstruktif.

Source: https://habr.com/ru/post/id463829/


All Articles