
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 PengantarSebelum 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.
TeoriApa yang terjadi di AsteriskKetika 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).
Fig. 1Ketika 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 singkatPenting 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 dibuatKarena 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.
BerlatihSebelum melanjutkan untuk mengonfigurasi Asterisk dan membuat skrip bash, Anda perlu mengonfigurasi pengiriman pemberitahuan email. Untuk ini, kita akan menggunakan utilitas postfix.
Pengaturan postfixKami 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
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
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
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
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
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
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
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 bashBuat 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
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 AsteriskKami 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
Kami mengedit file "/etc/asterisk/extensions_override_freepbx.conf" dan membawanya ke formulir berikut:
nano /etc/asterisk/extensions_override_freepbx.conf
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.
KesimpulanIni 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.