Carane nyambungake Zabbix karo Asterisk metu saka kothak

Ing artikel sadurunge "Zabbix - ngembangake wates makro" Aku ngandhani sampeyan carane nampa sesi wewenang lan ngganti menyang makro host lokal. Ing artikel iki aku bakal pitutur marang kowe carane nyambungake Zabbix karo Asterisk tanpa skrip eksternal lan piranti lunak.

Gagasan kanggo "nggawe kanca" saka rong sistem kasebut wis suwe, tanpa nginstal piranti lunak utawa skrip tambahan. A googling cepet ngasilaken akeh solusi bisa, kabeh nggodhok mudhun kanggo kasunyatan sing upload Tulisan (ing Pyha, Bash, Python, etc.) kanggo server, lan sampeyan bakal seneng. Aku pengin ngetrapake pemantauan "metu saka kothak" - tanpa skrip eksternal lan nginstal piranti lunak tambahan ing server kanthi pemantauan lan PBX.

Aku ngginakaken total 4 apa dina karo iki, nanging asil worth iku. Nggarap antarmuka AMI, deteksi tingkat rendah, pemicu, lan sing paling penting, nyambungake PBX lan kabeh setelan liyane saiki butuh udakara 15 menit.

Zabbix 4.4 kasedhiya, kira-kira 100 potongan Asterisk versi 13. Sawetara PBXs teka karo antarmuka web FreePBX, sawetara karo console gundhul, Bunch saka trik lan integrasi liwat dialplan a.

Nampa data saka PBX

Titik pisanan lan utama sing kudu dirampungake yaiku entuk data babagan peer lan registrasi SIP. Kanggo maksud iki, PBX nduweni antarmuka konsol AGI, AMI, ARI lan SSH. Kanggo alasan sing jelas, aku ora nganggep modul tambahan.

Pisanan kita kudu ngerteni apa agi, ami, ari iki ...

  • AGI - nggunakake skrip ing dialplan. Utamane digunakake kanggo manajemen telpon.
  • AMI - bisa nyedhiyani kabeh informasi sing perlu, dianggo liwat port 5038, padha Telnet. Cocok karo kita!
  • ARI - modern, modis, JSON. Ana akeh kemungkinan, format data bisa dingerteni kanggo Zabbix, nanging kanggo aku ora ana sing utama: sampeyan ora bisa ngontrol registrasi sip. Kerugian liyane yaiku kanggo kanca-kanca mung ana rong negara online / offline, sanajan ana luwih akeh negara lan migunani kanggo njupuk nalika diagnosa.
  • SSH bisa nindakake kabeh, nanging kadhangkala ora diidini amarga "alasan keamanan". Pertimbangan bisa uga beda, aku ora bakal mlebu.

Nanging, kanthi kabeh kekurangane, ARI nyakup 90% kabeh kabutuhan pemantauan.

Zabbix lan Telnet - kuciwo

Aku ngerti AMI kanthi apik; ing sawijining wektu aku ngetrapake pelacakan kerugian ing obrolan karo divisi dening kantor terpencil, manajemen telpon, lsp. Kanthi Telnet, kabeh uga cetha banget: mbukak sambungan, ngirim printah lan maca respon. Mekaten ingkang kula tindakaken, nanging asilipun nguciwani kula.

Telnet ing Zabbix ora padha karo konsol Linux, luwih prasaja lan disesuaikan kanggo wewenang standar kayata login / sandhi. Yen logika wewenang beda, lan ora ana panjalukan kanggo login / sandhi pasangan, ana kesalahan. Sawise usaha tanpa guna kanggo ngliwati syarat wewenang, migunani kanggo ndeleng kode sumber modul Telnet.

Aku nyadari yen nganti ana panjalukan login lan sandhi tradisional, aku ora bakal maju. Mung kanggo seneng-seneng, Aku dibusak kabeh related kanggo wewenang saka kode lan reassembled kabeh. Nyambut gawe! Nanging ora nyukupi syarat. Terusna…

Ayo bali menyang panelusuran

Aku maca maneh dokumentasi ARI, nglakokake tes tambahan - ora ana registrasi sip ing kene. Ana slametan, ana obrolan, ana sungsang, nanging ora ana registrasi. Ing sawetara titik aku malah mikir, apa kita pancene kudu registrasi manuk hering?

Kanthi kebetulan sing lucu, ing wektu iki panjaluk liyane teka saka pangguna, kanthi masalah karo telpon metu. Masalahe yaiku registrasi sip wis beku lan ditanggulangi kanthi reboot modul kasebut.

asterisk -rx "sip reload"

Iku bakal apik kanggo ngakses AMI liwat web: sing bakal ngatasi kabeh masalah, Aku panginten. Aku miwiti ngeduk arah iki, lan secara harfiah baris telusuran pisanan ndadΓ©kakΓ© menyang dokumentasi Asterisk resmi, kang ngandika ana pilihan kanggo tugas-tugasku. webenabled ing file /etc/asterisk/manager.conf, sing kudu disetel menyang YES, ing bagean kasebut [umum]

Sawise iki, liwat request web biasa saka formulir http://ats:8089/mxml?action=SIPshowregistry kita entuk kabeh informasi sing dibutuhake.

Nalika nggunakake antarmuka FreePBX, sampeyan ora bisa ngaktifake pilihan iki liwat web, sampeyan kudu ngaktifake liwat console dening nggawe owah-owahan menyang manager.conf file. FreePBX ora mbusak nalika owah-owahan konfigurasi digawe liwat web.

Aku wis kerjo karo macem-macem integrasi Asterisk kanggo dangu, nanging aku wis tau ndeleng fitur iki kasebut ing ngendi wae. Aku kaget amarga ora ana sing nerangake cara sesambungan karo PBX iki. Malah luwih migunani kanggo nggoleki informasi babagan topik iki: ora ana apa-apa utawa digunakake kanggo tugas sing beda-beda.

WEB AMI - kewan apa?

Nambahake pilihan webenabled kanggo file manager.conf nyedhiyakake akses lengkap menyang manajemen ATS liwat web. Kabeh printah kasedhiya liwat AMI biasa saiki ing web, sampeyan bisa ngrungokake acara saka PBX liwat soket. Prinsip operasi ora beda karo konsol AMI. Sawise ngaktifake pilihan iki, sampeyan bisa ngubungi PBX ing alamat ing ngisor iki:

https://ats:8089/manager - kaca web kanthi antarmuka sing prasaja kanggo nguji lan ngirim panjalukan kanthi manual. Kabeh tanggapan diformat dadi HTML sing bisa diwaca. Ora cocok banget kanggo ngawasi.
https://ats:8089/rawman β€” mung output teks, format padha console AMI
https://ats:8089/mxml - mung output teks, ing format XML. Cocok karo kita!

Carane nyambungake Zabbix karo Asterisk metu saka kothak

Aku banjur mikir: β€œIki solusine! Saiki kabeh bakal siap! Meres lemon sing gampang ngelak, "nanging wis suwe banget kanggo bungah. Kanggo entuk informasi sing dibutuhake, cukup nggunakake panjaluk GET kanthi tumindak sing dibutuhake tumindak, sing nanggepi ngasilake xml kanthi dhaptar kabeh registrasi lan statuse. Iki kabeh apik, nanging sampeyan butuh wewenang kanggo ngelingi sesi saka cookie. Nalika sampeyan nyoba ing browser, sampeyan ora mikir babagan proses iki.

Proses wewenang

Pisanan kita alamat alamat http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, kanggo nanggepi, server ngirim cookie karo sesi wewenang. Iki minangka panjalukan 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

Jawaban:

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>

Kanggo bisa ana sampeyan kudu omah_id="6f5d42c", yaiku cookie wewenang dhewe.
Isi sampeyan mung kudu mriksa jawaban "Otentikasi ditampa" Sabanjure, kanggo kabeh telpon menyang server PBX, kita kudu nambah cookie wewenang kanggo panyuwunan.

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

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

Waca carane njaluk cookie wewenang lan gunakake ing panjalukan liyane ing kene: "Zabbix - ngembangaken wates makroΒ»

Kanggo nggawe unsur nelusuri ing Zabbix aku bakal nggunakake deteksi otomatis.

Deteksi otomatis

Kanggo ndeteksi registrasi lan nglacak status peer kanthi otomatis, sampeyan kudu ngubungi alamat ing ngisor iki: https://ats:8089/mxml?action=SIPshowregistry utawa https://ats:8089/mxml?action=SIPpeers

Kanggo nanggepi, PBX ngasilake respon XML:

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

Ana akeh sampah ing respon, supaya ing preprocessing kita nyaring miturut cithakan XPath: //respon/generik[@host]
Banjur kesenengan diwiwiti. Kanggo nggarap deteksi lan nggawe unsur kanthi dinamis, respon kudu ana ing format JSON. XML ora didhukung kanggo deteksi otomatis.

Kanggo ngowahi XML dadi JSON, aku kudu muter sethithik karo panggantos otomatis, sing aku nggawe skrip ing JS

Carane nyambungake Zabbix karo Asterisk metu saka kothak

Titik menarik: ing respon ATS, kabeh paramèter diubengi kuotasi siji, lan sawise nglamar cithakan //respon/generik[@host] padha diganti dening pindho.

Kanggo nggawe unsur, kita nggunakake variabel saka respon XML (saiki JSON).

Carane nyambungake Zabbix karo Asterisk metu saka kothak

Daftar SIP

Kanggo registrasi sip kita nggunakake telung variabel: jeneng panganggo, inang, port. Aku seneng karo jeneng unsur [email dilindhungi]: 5060, Aku wis ora nemu kahanan apa sampeyan kudu nggunakake kabeh limang variabel.

Unsur utama sing nampa informasi babagan kabeh registrasi, Asterisk - AMI SIPshowregistry. Sawise menit nggawe panjalukan GET kanggo https://ats:8089/mxml?action=SIPshowregistry, sawise data XML respon diterusake menyang kabeh unsur gumantung kanggo parsing. Kanggo saben registrasi aku nggawe unsur gumantung ing. Iki trep amarga kita nampa informasi paling anyar ing siji panjalukan, lan ora kanggo saben panjalukan kanthi kapisah. Implementasi iki nduweni kelemahan sing signifikan - beban ing prosesor.

Nalika nyoba nganti 100 unsur gumantung, Aku ora sok dong mirsani mbukak, nanging karo 1700 unsur, iki menehi ngelingke 15 mbukak detik ing prosesor. Elinga yen sampeyan duwe akeh unsur gumantung.

Minangka pilihan kanggo "nyebar" mbukak utawa nyetel frekuensi polling beda kanggo unsur, sampeyan bisa mindhah logika Processing kanggo saben unsur dhewe.

Aku ora nyimpen informasi sing ditampa ing unsur utama. Sepisanan, aku ora weruh perlu kanggo iki, lan sareh, yen respon luwih saka 64K, banjur Zabbix ngethok.

Awit kita nggunakake respon XML lengkap kanggo unsur gumantung, kita kudu njaluk Nilai saka unsur iki ing preprocessing. Liwat XPath rampung kaya iki:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ negara)
Kanggo status registrasi, aku ora nggunakake status teks, nanging diowahi dadi formulir numerik nggunakake JavaScript:

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

SIP kanca

Kanthi analogi karo registrasi SIP, ana unsur utama Asterisk - AMI SIPshowregistry, sing ditambahake gumantung.

Iki nggawe rong unsur gumantung:

  • Status peer ing wangun teks
  • Wektu nanggepi piranti - yen status OK, banjur wektu nanggepi piranti ditulis, yen ora "-1"

Path menyang unsur dhewe iku sethitik prasaja XPath:

string(//respon/generik[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)

Kanggo unsur kapindho aku digunakake JavaScript kanggo misahake wektu nanggepi saka status peer, amarga padha disimpen bebarengan:

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

kesimpulan

Solusi out-of-the-box bisa rumit lan ora langsung jelas. Nambah keluwesan lan portabilitas ing antarane sistem sing beda

Seneng lan gampang integrasi kabeh wong! Cithakan lan instruksi kanggo nyetel GitHub.

Source: www.habr.com

Add a comment