Paano ikonekta ang Zabbix sa Asterisk sa labas ng kahon

Sa isang nakaraang artikulo "Zabbix - pagpapalawak ng mga hangganan ng macro" Sinabi ko sa iyo kung paano makatanggap ng session ng pahintulot at palitan ito ng lokal na host macro. Sa artikulong ito sasabihin ko sa iyo kung paano ikonekta ang Zabbix sa Asterisk nang walang mga panlabas na script at software.

Ang ideya na "makipagkaibigan" sa dalawang sistemang ito ay ipinanganak nang matagal na ang nakalipas, nang hindi nag-i-install ng karagdagang software o mga script. Ang isang mabilis na pag-googling ay nagbunga ng maraming posibleng solusyon, ang lahat ay nauwi sa katotohanang mag-upload ng mga script (sa Pyha, Bash, Python, atbp.) sa server, at ikaw ay magiging masaya. Nais kong ipatupad ang pagsubaybay "sa labas ng kahon" - nang walang mga panlabas na script at pag-install ng karagdagang software sa server na may pagsubaybay at PBX.

Gumugol ako ng kabuuang 4 na araw ng trabaho dito, ngunit sulit ang resulta. Ang pagtatrabaho sa pamamagitan ng interface ng AMI, low-level detection, trigger, at higit sa lahat, ang pagkonekta sa PBX at lahat ng iba pang setting ay tumatagal na ng humigit-kumulang 15 minuto.

Available ang Zabbix 4.4, mga 100 piraso ng Asterisk na bersyon 13. Ang ilang mga PBX ay may kasamang FreePBX web interface, ang ilan ay may hubad na console, isang grupo ng mga trick at pagsasama sa pamamagitan ng isang dialplan.

Pagtanggap ng data mula sa PBX

Ang una at pangunahing punto na kailangang lutasin ay ang pagkuha ng data tungkol sa mga kapantay at pagpaparehistro ng SIP. Para sa layuning ito, ang PBX ay may mga interface ng AGI, AMI, ARI at SSH console. Para sa mga malinaw na kadahilanan, hindi ko isinasaalang-alang ang mga karagdagang module.

Una kailangan nating malaman kung ano ang mga agi, ami, ari na ito...

  • AGI - gamit ang mga script sa dialplan. Pangunahing ginagamit para sa pamamahala ng tawag.
  • AMI - maaaring magbigay ng lahat ng kinakailangang impormasyon, gumagana sa pamamagitan ng port 5038, katulad ng Telnet. Bagay sa amin!
  • ARI - moderno, sunod sa moda, JSON. Mayroong maraming mga posibilidad, ang format ng data ay nauunawaan para sa Zabbix, ngunit para sa akin walang pangunahing bagay: hindi mo makokontrol ang pagpaparehistro ng sip. Ang isa pang kawalan ay na para sa mga kapantay mayroon lamang dalawang estado online/offline, bagama't mayroong higit pang mga estado at kapaki-pakinabang na isaalang-alang ang mga ito kapag nag-diagnose.
  • Magagawa ng SSH ang lahat, ngunit minsan hindi ito pinapayagan dahil sa "mga kadahilanang pang-seguridad". Maaaring iba ang mga pagsasaalang-alang, hindi ko sila papasok.

Gayunpaman, sa lahat ng mga pagkukulang nito, sinasaklaw ng ARI ang 90% ng lahat ng pangangailangan sa pagsubaybay.

Zabbix at Telnet - ang aking pagkabigo

Kilalang-kilala ko ang AMI; minsan ay nagpatupad ako ng pagsubaybay sa mga pagkalugi sa mga pag-uusap sa paghahati ng mga malalayong opisina, pamamahala ng tawag, atbp. Sa Telnet, ang lahat ay napakalinaw din: buksan ang koneksyon, ipadala ang mga utos at basahin ang tugon. Iyon ang ginawa ko, ngunit ang resulta ay nabigo sa akin.

Ang Telnet sa Zabbix ay hindi katulad ng sa Linux console, ito ay medyo mas simple at iniakma para sa karaniwang awtorisasyon tulad ng pag-login/password. Kung iba ang lohika ng awtorisasyon, at walang kahilingan para sa isang pares ng pag-login/password, magkakaroon ng error. Pagkatapos ng walang saysay na mga pagtatangka na i-bypass ang kinakailangan sa awtorisasyon, kapaki-pakinabang na tingnan ang source code ng Telnet module.

Napagtanto ko na hanggang sa may tradisyonal na kahilingan sa pag-login at password, hindi ako susulong. Para lang masaya, inalis ko sa code ang lahat na may kaugnayan sa awtorisasyon at muling pinagsama ang lahat. Gumagana! Ngunit hindi ito nakakatugon sa mga kinakailangan. Sige lang…

Balik tayo sa paghahanap

Muli kong binasa ang dokumentasyon ng ARI, nagpatakbo ng mga karagdagang pagsubok - walang mga pagrerehistro ng paghigop dito. May mga handaan, may mga pag-uusap, may mga pigi, ngunit walang pagpaparehistro. Minsan nga naisip ko, kailangan ba talaga ng vulture registration?

Sa pamamagitan ng isang nakakatawang pagkakataon, sa sandaling ito ay dumating ang isa pang kahilingan mula sa gumagamit, na may problema sa mga papalabas na tawag. Ang problema ay ang pagpaparehistro ng paghigop ay nagyeyelo at nalutas sa pamamagitan lamang ng pag-reboot ng module.

asterisk -rx "sip reload"

Magiging mahusay na ma-access ang AMI sa web: na malulutas ang lahat ng mga problema, naisip ko. Nagsisimula akong maghukay sa direksyong ito, at literal na ang unang linya ng paghahanap ay humahantong sa opisyal na dokumentasyon ng Asterisk, na nagsasabing mayroong isang opsyon para sa aking mga gawain naka-web sa file /etc/asterisk/manager.conf, na kailangang itakda sa YES, sa seksyon [pangkalahatan]

Pagkatapos nito, sa pamamagitan ng regular na web request ng form http://ats:8089/mxml?action=SIPshowregistry nakukuha namin ang lahat ng kinakailangang impormasyon.

Kapag ginagamit ang interface ng FreePBX, hindi mo maaaring paganahin ang opsyong ito sa pamamagitan ng web, kailangan mong paganahin ito sa pamamagitan ng console sa pamamagitan ng paggawa ng mga pagbabago sa manager.conf file. Hindi ito binubura ng FreePBX kapag ang mga pagbabago sa pagsasaayos ay ginawa sa pamamagitan ng web.

Nagtrabaho ako sa iba't ibang uri ng pagsasama ng Asterisk sa loob ng mahabang panahon, ngunit hindi ko nakita ang tampok na ito na binanggit kahit saan. Nagulat ako na walang naglalarawan sa pamamaraang ito ng pakikipag-ugnayan sa PBX. Ito ay lalong kapaki-pakinabang upang maghanap ng impormasyon sa paksang ito: halos wala o ginamit ito para sa ganap na magkakaibang mga gawain.

WEB AMI - anong uri ng hayop?

Pagdaragdag ng opsyon naka-web mag-file manager.conf nagbigay ng ganap na access sa pamamahala ng ATS sa pamamagitan ng web. Ang lahat ng mga utos na magagamit sa pamamagitan ng isang regular na AMI ay nasa web na ngayon, maaari kang makinig sa mga kaganapan mula sa PBX sa pamamagitan ng isang socket. Ang prinsipyo ng pagpapatakbo ay hindi naiiba sa console AMI. Pagkatapos i-activate ang opsyong ito, maaari kang makipag-ugnayan sa PBX sa mga sumusunod na address:

https://ats:8089/manager β€” isang web page na may simpleng interface para sa pagsubok at manu-manong pagpapadala ng mga kahilingan. Ang lahat ng mga tugon ay naka-format sa nababasang HTML. Hindi masyadong angkop para sa pagsubaybay.
https://ats:8089/rawman β€” text output lang, format na katulad ng console AMI
https://ats:8089/mxml - text output lamang, sa XML na format. Bagay sa amin!

Paano ikonekta ang Zabbix sa Asterisk sa labas ng kahon

Pagkatapos ay naisip ko: β€œIto na ang solusyon! Ngayon ang lahat ay magiging handa! Easy-peezy lemon squeezey,” ngunit masyado pang maaga para magsaya. Upang makuha ang impormasyong kailangan namin, sapat na na gumamit ng kahilingan sa GET kasama ang kinakailangang aksyon aksyon, na bilang tugon ay nagbabalik ng xml na may listahan ng lahat ng mga pagpaparehistro at ang kanilang katayuan. Ang lahat ng ito ay mahusay, ngunit kailangan mo ng pahintulot upang matandaan ang session mula sa cookie. Kapag sumubok ka sa browser, hindi mo iniisip ang prosesong ito.

Proseso ng awtorisasyon

Una naming tugunan ang address http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, bilang tugon, pinadalhan kami ng server ng cookie na may session ng pahintulot. Ito ang hitsura ng isang kahilingan sa 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

Sagot:

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>

Upang magtrabaho doon kailangan mo mansession_id="6f5de42c", ibig sabihin, ang cookie ng awtorisasyon mismo.
Nilalaman na kailangan mo lang suriin para sa sagot "Tinanggap ang pagpapatunay" Susunod, para sa lahat ng mga tawag sa PBX server, kakailanganin naming magdagdag ng cookie ng pahintulot sa kahilingan.

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

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

Basahin kung paano makakuha ng cookie ng awtorisasyon at gamitin ito sa iba pang mga kahilingan dito: β€œZabbix - pagpapalawak ng mga hangganan ng macroΒ»

Upang lumikha ng mga elemento ng pagsubaybay sa Zabbix gagamit ako ng auto detection.

Auto detection

Upang awtomatikong matukoy ang mga pagpaparehistro at subaybayan ang mga peer state, kailangan mong makipag-ugnayan sa sumusunod na address: https://ats:8089/mxml?action=SIPshowregistry o https://ats:8089/mxml?action=SIPpeers

Bilang tugon, ibinabalik sa amin ng PBX ang isang XML na tugon:

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

Mayroong maraming basura sa tugon, kaya sa preprocessing ay sinasala namin ito ayon sa template XPath: //response/generic[@host]
Pagkatapos ay magsisimula ang saya. Upang gumana sa pagtuklas at dynamic na gumawa ng mga elemento, ang tugon ay dapat nasa JSON na format. Hindi sinusuportahan ang XML para sa mga auto detection.

Upang i-convert ang XML sa JSON, kailangan kong maglaro ng kaunti sa pagpapalit ng auto, kung saan gumawa ako ng script sa JS

Paano ikonekta ang Zabbix sa Asterisk sa labas ng kahon

Isang kawili-wiling punto: sa tugon ng ATS, ang lahat ng mga parameter ay napapalibutan ng mga solong quote, at pagkatapos ilapat ang template //response/generic[@host] pinalitan sila ng doble.

Upang lumikha ng mga elemento, gumagamit kami ng mga variable mula sa tugon ng XML (JSON na ngayon).

Paano ikonekta ang Zabbix sa Asterisk sa labas ng kahon

SIP Registry

Para sa pagrerehistro ng sip ay gumagamit kami ng tatlong variable: username, marami, port. Natuwa ako sa pangalan ng elemento [protektado ng email]: 5060, Wala akong nakitang anumang sitwasyon kung saan kailangan mong gamitin ang lahat ng limang variable.

Ang pangunahing elemento na tumatanggap ng impormasyon tungkol sa lahat ng pagpaparehistro, Asterisk - AMI SIPshowregistry. Minsan sa isang minuto ito ay gumagawa ng isang GET na kahilingan sa https://ats:8089/mxml?action=SIPshowregistry, pagkatapos nito ay ipinapasa ang data ng XML ng tugon sa lahat ng mga umaasa na elemento para sa pag-parse. Para sa bawat pagpaparehistro lumikha ako ng isang elemento na nakadepende dito. Maginhawa ito dahil nakakatanggap kami ng napapanahong impormasyon sa isang kahilingan, at hindi para sa bawat kahilingan nang hiwalay. Ang pagpapatupad na ito ay may isang makabuluhang disbentaha - ang pag-load sa processor.

Kapag sumusubok ng hanggang sa 100 umaasa na elemento, hindi ko napansin ang pagkarga, ngunit may 1700 elemento, nagbigay ito ng kapansin-pansing 15 segundong pagkarga sa processor. Isaisip ito kung mayroon kang malaking bilang ng mga umaasa na elemento.

Bilang opsyon na "ipakalat" ang pag-load o magtakda ng iba't ibang frequency ng botohan para sa isang elemento, maaari mong ilipat nang hiwalay ang processing logic sa bawat elemento.

Hindi ko iniimbak ang natanggap na impormasyon sa pangunahing elemento. Una, hindi ko nakikita ang pangangailangan para dito, at pangalawa, kung ang tugon ay higit sa 64K, pagkatapos ay pinutol ito ng Zabbix.

Dahil gumagamit kami ng buong XML na tugon para sa umaasa na elemento, kailangan naming makuha ang halaga ng elementong ito sa preprocessing. Sa pamamagitan ng XPath ito ay ginawa tulad nito:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ estado)
Para sa mga status ng pagpaparehistro, hindi ako gumamit ng mga text status, ngunit na-convert ang mga ito sa numeric form gamit ang JavaScript:

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

SIP mga kapantay

Sa pamamagitan ng pagkakatulad sa mga pagpaparehistro ng SIP, mayroong isang pangunahing elemento ng Asterisk - AMI SIPshowregistry, kung saan idinagdag ang mga umaasa.

Lumilikha ito ng dalawang umaasa na elemento:

  • Peer status sa text form
  • Oras ng pagtugon ng device - kung OK ang status, isusulat ang oras ng pagtugon ng device, kung hindi, "-1"

Ang landas sa elemento mismo ay medyo mas simple XPath:

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

Para sa pangalawang elemento gumamit ako ng JavaScript upang paghiwalayin oras ng pagtugon mula sa katayuan ng peer, dahil nakaimbak ang mga ito nang magkasama:

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

Konklusyon

Ang isang out-of-the-box na solusyon ay maaaring kumplikado at hindi agad malinaw. Pinapataas ang flexibility at portability sa pagitan ng iba't ibang system

Masaya at madaling pagsasama sa lahat! Template at mga tagubilin para sa pag-set up GitHub.

Pinagmulan: www.habr.com

Magdagdag ng komento