Cara menyambungkan Zabbix dengan Asterisk di luar kotak

Dalam artikel sebelum ini "Zabbix - mengembangkan sempadan makro" Saya memberitahu anda cara menerima sesi kebenaran dan menggantikannya kepada makro hos tempatan. Dalam artikel ini saya akan memberitahu anda cara menyambungkan Zabbix dengan Asterisk tanpa skrip dan perisian luaran.

Idea untuk "berteman" kedua-dua sistem ini telah lama lahir, tanpa memasang perisian atau skrip tambahan. Googling pantas menghasilkan banyak penyelesaian yang mungkin, semuanya berpunca daripada fakta bahawa memuat naik skrip (dalam Pyha, Bash, Python, dll.) ke pelayan, dan anda akan gembira. Saya mahu melaksanakan pemantauan "di luar kotak" - tanpa skrip luaran dan memasang perisian tambahan pada pelayan dengan pemantauan dan PBX.

Saya menghabiskan 4 hari bekerja dengan ini, tetapi hasilnya berbaloi. Bekerja melalui antara muka AMI, pengesanan peringkat rendah, pencetus, dan yang paling penting, menyambungkan PBX dan semua tetapan lain kini mengambil masa kira-kira 15 minit.

Zabbix 4.4 tersedia, kira-kira 100 keping Asterisk versi 13. Sesetengah PBX disertakan dengan antara muka web FreePBX, sesetengahnya dengan konsol kosong, sekumpulan helah dan penyepaduan melalui pelan dail.

Menerima data daripada PBX

Perkara pertama dan utama yang perlu diselesaikan ialah mendapatkan data mengenai rakan sebaya dan pendaftaran SIP. Untuk tujuan ini, PBX mempunyai antara muka konsol AGI, AMI, ARI dan SSH. Atas sebab yang jelas, saya tidak mempertimbangkan modul tambahan.

Mula-mula kita perlu memikirkan apakah agi, ami, ari ini...

  • AGI - menggunakan skrip dalam pelan dail. Terutamanya digunakan untuk pengurusan panggilan.
  • AMI - boleh memberikan semua maklumat yang diperlukan, berfungsi melalui port 5038, serupa dengan Telnet. Sesuai dengan kita!
  • ARI - moden, bergaya, JSON. Terdapat banyak kemungkinan, format data boleh difahami untuk Zabbix, tetapi bagi saya tidak ada perkara utama: anda tidak boleh mengawal pendaftaran sip. Kelemahan lain ialah untuk rakan sebaya hanya terdapat dua negeri dalam talian/luar talian, walaupun terdapat lebih banyak negeri dan adalah berguna untuk mengambil kiranya semasa mendiagnosis.
  • SSH boleh melakukan segala-galanya, tetapi kadangkala ia tidak dibenarkan kerana "sebab keselamatan". Pertimbangan mungkin berbeza, saya tidak akan membahasnya.

Walau bagaimanapun, dengan segala kekurangannya, ARI meliputi 90% daripada semua keperluan pemantauan.

Zabbix dan Telnet - kekecewaan saya

Saya mengenali AMI dengan baik; pada satu masa saya melaksanakan penjejakan kerugian dalam perbualan dengan bahagian oleh pejabat terpencil, pengurusan panggilan, dsb. Dengan Telnet, semuanya juga sangat jelas: buka sambungan, hantar arahan dan baca respons. Itulah yang saya lakukan, tetapi hasilnya mengecewakan saya.

Telnet dalam Zabbix tidak sama seperti dalam konsol Linux, ia lebih ringkas dan disesuaikan untuk kebenaran standard seperti log masuk/kata laluan. Jika logik kebenaran berbeza, dan tiada permintaan untuk pasangan log masuk/kata laluan, ralat berlaku. Selepas percubaan sia-sia untuk memintas keperluan kebenaran, adalah berguna untuk melihat kod sumber modul Telnet.

Saya menyedari bahawa sehingga terdapat permintaan log masuk dan kata laluan tradisional, saya tidak akan bergerak ke hadapan. Hanya untuk keseronokan, saya mengalih keluar semua yang berkaitan dengan kebenaran daripada kod dan membina semula semuanya. Berfungsi! Tetapi ia tidak memenuhi syarat. Teruskan…

Mari kita kembali kepada pencarian

Saya membaca semula dokumentasi ARI sekali lagi, menjalankan ujian tambahan - tiada pendaftaran sedutan di sini. Ada kenduri, ada sembang, ada sungsang, tapi tak ada pendaftaran. Pada satu ketika saya terfikir, adakah kita benar-benar memerlukan pendaftaran burung nasar?

Secara kebetulan yang lucu, pada masa ini permintaan lain tiba daripada pengguna, dengan masalah dengan panggilan keluar. Masalahnya ialah pendaftaran sedutan membeku dan diselesaikan dengan hanya but semula modul.

asterisk -rx "sip reload"

Adalah bagus untuk mengakses AMI melalui web: itu akan menyelesaikan semua masalah, saya fikir. Saya mula menggali ke arah ini, dan secara literal baris carian pertama membawa kepada dokumentasi Asterisk rasmi, yang mengatakan bahawa terdapat pilihan untuk tugas saya didayakan web dalam fail /etc/asterisk/manager.conf, yang perlu ditetapkan kepada YA, dalam bahagian [umum]

Selepas ini, melalui permintaan web biasa borang http://ats:8089/mxml?action=SIPshowregistry kami mendapat semua maklumat yang diperlukan.

Apabila menggunakan antara muka FreePBX, anda tidak boleh mendayakan pilihan ini melalui web; anda perlu mendayakannya melalui konsol dengan membuat perubahan pada fail manager.conf. FreePBX tidak memadamnya apabila perubahan konfigurasi dibuat melalui web.

Saya telah bekerja dengan pelbagai jenis integrasi Asterisk untuk masa yang lama, tetapi saya tidak pernah melihat ciri ini disebut di mana-mana sahaja. Saya terkejut kerana tiada siapa yang menerangkan kaedah berinteraksi dengan PBX ini. Malah amat berguna untuk mencari maklumat mengenai topik ini: hampir tiada apa-apa atau ia digunakan untuk tugasan yang sama sekali berbeza.

WEB AMI - jenis binatang apa?

Menambah pilihan didayakan web untuk memfailkan pengurus.conf menyediakan akses penuh kepada pengurusan ATS melalui web. Semua arahan yang tersedia melalui AMI biasa kini berada di web, anda boleh mendengar acara daripada PBX melalui soket. Prinsip operasi tidak berbeza dengan konsol AMI. Selepas mengaktifkan pilihan ini, anda boleh menghubungi PBX di alamat berikut:

https://ats:8089/manager β€” halaman web dengan antara muka mudah untuk ujian dan menghantar permintaan secara manual. Semua respons diformatkan ke dalam HTML yang boleh dibaca. Tidak begitu sesuai untuk pemantauan.
https://ats:8089/rawman β€” output teks sahaja, format serupa dengan konsol AMI
https://ats:8089/mxml - output teks sahaja, dalam format XML. Sesuai dengan kita!

Cara menyambungkan Zabbix dengan Asterisk di luar kotak

Kemudian saya berfikir: β€œInilah penyelesaiannya! Sekarang semuanya akan siap! Perah limau yang mudah kencing,” tetapi masih terlalu awal untuk bergembira. Untuk mendapatkan maklumat yang kami perlukan, cukup menggunakan permintaan GET dengan tindakan yang diperlukan tindakan, yang sebagai tindak balas mengembalikan xml dengan senarai semua pendaftaran dan statusnya. Ini semua bagus, tetapi anda memerlukan kebenaran untuk mengingati sesi daripada kuki. Apabila anda menguji dalam penyemak imbas, anda tidak memikirkan proses ini.

Proses kebenaran

Mula-mula kita alamat alamat http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, sebagai tindak balas, pelayan menghantar kami kuki dengan sesi kebenaran. Inilah rupa permintaan HTTP:

https://ats:8089/mxml?action=login&username=zabbix&secret=zabbix

Host: ats:8089
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Jawapan:

GET: HTTP/1.1 200 OK
Server: Asterisk/13.29.2
Date: Thu, 18 Jun 2020 17:41:19 GMT
Cache-Control: no-cache, no-store
Content-type: text/xml
Set-Cookie: mansession_id="6f5de42c"; Version=1; Max-Age=600
Pragma: SuppressEvents
Content-Length: 146

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" message="Authentication accepted"/>
</response>
</ajax-response>

Untuk bekerja di sana anda perlukan id_mansession="6f5de42c", iaitu kuki kebenaran itu sendiri.
Kandungan yang anda hanya perlu semak jawapannya "Pengesahan diterima" Seterusnya, untuk semua panggilan ke pelayan PBX, kami perlu menambah kuki kebenaran pada permintaan itu.

https://ats:8089/mxml?action=SIPpeers

Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"

Baca cara mendapatkan kuki kebenaran dan gunakannya dalam permintaan lain di sini: β€œZabbix - memperluaskan sempadan makroΒ»

Untuk mencipta elemen penjejakan dalam Zabbix saya akan menggunakan pengesanan automatik.

Pengesanan automatik

Untuk mengesan pendaftaran secara automatik dan menjejaki keadaan rakan sebaya, anda perlu menghubungi alamat berikut: https://ats:8089/mxml?action=SIPshowregistry atau https://ats:8089/mxml?action=SIPpeers

Sebagai tindak balas, PBX mengembalikan respons XML kepada kami:

<ajax-response>
<response type="object" id="unknown">
<generic response="Success" eventlist="start" message="Registrations will follow"/>
</response>
...
<response type="object" id="unknown">
<generic event="RegistryEntry" host="login.mtt.ru" port="5060" username="111111" domain="login.mtt.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="222222" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="333333" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
...
</ajax-response>

Terdapat banyak sampah dalam tindak balas, jadi dalam prapemprosesan kami menapisnya mengikut templat XPath: //respons/generic[@host]
Kemudian keseronokan bermula. Untuk bekerja dengan pengesanan dan mencipta elemen secara dinamik, respons mestilah dalam format JSON. XML tidak disokong untuk pengesanan automatik.

Untuk menukar XML kepada JSON, saya terpaksa bermain sedikit dengan penggantian automatik, yang mana saya membuat skrip dalam JS

Cara menyambungkan Zabbix dengan Asterisk di luar kotak

Perkara yang menarik: dalam respons ATS, semua parameter dikelilingi oleh petikan tunggal, dan selepas menggunakan templat //respons/generic[@host] mereka digantikan dengan yang berganda.

Untuk mencipta elemen, kami menggunakan pembolehubah daripada respons XML (kini JSON).

Cara menyambungkan Zabbix dengan Asterisk di luar kotak

Pendaftaran SIP

Untuk pendaftaran sip kami menggunakan tiga pembolehubah: nama pengguna, tuan rumah, pelabuhan. Saya gembira dengan nama unsur tersebut [e-mel dilindungi]: 5060, saya tidak menemui sebarang situasi di mana anda perlu menggunakan kesemua lima pembolehubah.

Elemen utama yang menerima maklumat tentang semua pendaftaran, Asterisk - AMI SIPshowregistry. Sekali seminit ia membuat permintaan GET untuk https://ats:8089/mxml?action=SIPshowregistry, selepas itu data XML respons dihantar kepada semua elemen bergantung untuk penghuraian. Untuk setiap pendaftaran saya mencipta elemen bergantung padanya. Ini mudah kerana kami menerima maklumat terkini dalam satu permintaan, dan bukan untuk setiap permintaan secara berasingan. Pelaksanaan ini mempunyai kelemahan yang ketara - beban pada pemproses.

Apabila menguji sehingga 100 elemen bergantung, saya tidak perasan beban itu, tetapi dengan 1700 elemen, ini memberikan beban 15 saat yang ketara pada pemproses. Ingat ini jika anda mempunyai sejumlah besar elemen bergantung.

Sebagai pilihan untuk "menyebarkan" beban atau menetapkan frekuensi pengundian yang berbeza untuk elemen, anda boleh mengalihkan logik pemprosesan ke setiap elemen secara berasingan.

Saya tidak menyimpan maklumat yang diterima dalam elemen utama. Pertama, saya tidak nampak keperluan untuk ini, dan kedua, jika respons lebih daripada 64K, maka Zabbix memotongnya.

Oleh kerana kami menggunakan respons XML penuh untuk elemen bergantung, kami perlu mendapatkan nilai elemen ini dalam prapemprosesan. Melalui XPath ia dilakukan seperti ini:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ negeri)
Untuk status pendaftaran, saya tidak menggunakan status teks, tetapi menukarnya ke dalam bentuk angka menggunakan JavaScript:

switch(value) {
  case 'Registered':
    return 1;
  case 'Unregistered':
    return 0;
  default:
    return -1;
}

SIP Rakan Sebaya

Dengan analogi dengan pendaftaran SIP, terdapat elemen utama Asterisk - AMI SIPshowregistry, yang mana yang bergantung ditambahkan.

Ini mewujudkan dua elemen bergantung:

  • Status rakan sebaya dalam bentuk teks
  • Masa respons peranti - jika statusnya OK, maka masa respons peranti ditulis, jika tidak, "-1"

Laluan ke elemen itu sendiri sedikit lebih mudah XPath:

string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)

Untuk elemen kedua saya menggunakan JavaScript untuk memisahkan masa tindak balas daripada status rakan sebaya, kerana ia disimpan bersama:

if(value.substring(0,2) == 'OK'){
	return value.match(/(d+)/gm);
}
else {
	return -1;
}

Kesimpulan

Penyelesaian di luar kotak boleh menjadi rumit dan tidak serta-merta jelas. Meningkatkan fleksibiliti dan mudah alih antara sistem yang berbeza

Penyepaduan yang gembira dan mudah semua orang! Templat dan arahan untuk menyediakan GitHub.

Sumber: www.habr.com

Tambah komen