Ako pripojiť Zabbix s Asterisk po vybalení z krabice

V predchádzajúcom článku „Zabbix – rozšírenie hraníc makra“ Povedal som vám, ako prijať reláciu autorizácie a nahradiť ju makrom lokálneho hostiteľa. V tomto článku vám poviem, ako prepojiť Zabbix s Asteriskom bez externých skriptov a softvéru.

Myšlienka „spriateliť sa“ s týmito dvoma systémami sa zrodila už dávno, bez inštalácie dodatočného softvéru alebo skriptov. Rýchle googlovanie prinieslo veľa možných riešení, všetko sa scvrklo na skutočnosť, že nahrajte skripty (v Pyha, Bash, Python atď.) na server a budete spokojní. Chcel som implementovať monitoring „out of the box“ – bez externých skriptov a inštalácie dodatočného softvéru na server s monitoringom a PBX.

Strávil som s tým celkovo 4 pracovné dni, no výsledok stál za to. Práca cez rozhranie AMI, nízkoúrovňová detekcia, spúšťače a hlavne pripojenie PBX a všetky ostatné nastavenia teraz trvá približne 15 minút.

K dispozícii je Zabbix 4.4, asi 100 kusov Asterisk verzie 13. Niektoré PBX sa dodávajú s webovým rozhraním FreePBX, niektoré s holou konzolou, množstvom trikov a integráciou cez dialplan.

Príjem dát z PBX

Prvým a hlavným bodom, ktorý je potrebné vyriešiť, je získavanie údajov o peeroch a registráciách SIP. Na tento účel má PBX konzolové rozhrania AGI, AMI, ARI a SSH. O dodatočných moduloch som z pochopiteľných dôvodov neuvažoval.

Najprv musíme zistiť, čo sú to agi, ami, ari...

  • AGI - používanie skriptov v dialplane. Používa sa hlavne na správu hovorov.
  • AMI – vie poskytnúť všetky potrebné informácie, funguje cez port 5038, podobne ako Telnet. Vyhovuje nám!
  • ARI - moderný, módny, JSON. Možností je veľa, formát údajov je pre Zabbix zrozumiteľný, ale pre mňa nie je hlavná vec: nemôžete ovládať registráciu sip. Ďalšou nevýhodou je, že pre rovesníkov existujú iba dva stavy online/offline, aj keď štátov je viac a je užitočné ich brať do úvahy pri diagnostike.
  • SSH môže robiť všetko, ale niekedy to nie je povolené z „bezpečnostných dôvodov“. Úvahy môžu byť rôzne, nebudem sa nimi zaoberať.

So všetkými svojimi nedostatkami však ARI pokrýva 90 % všetkých potrieb monitorovania.

Zabbix a Telnet - moje sklamanie

AMI dobre poznám, svojho času som implementoval sledovanie strát v rozhovoroch s divíziou podľa vzdialených pobočiek, správu hovorov atď. S Telnetom je tiež všetko veľmi jasné: otvorte spojenie, odošlite príkazy a prečítajte si odpoveď. Tak som to urobil, ale výsledok ma sklamal.

Telnet v Zabbix nie je rovnaký ako v konzole Linux, je trochu jednoduchší a prispôsobený pre štandardnú autorizáciu, ako je prihlasovacie meno/heslo. Ak je logika autorizácie iná a neexistuje žiadna požiadavka na pár prihlasovacie meno/heslo, dôjde k chybe. Po márnych pokusoch obísť požiadavku autorizácie bolo užitočné pozrieť sa na zdrojový kód modulu Telnet.

Uvedomil som si, že kým nebude tradičná požiadavka na prihlásenie a heslo, nepohnem sa ďalej. Len tak pre zaujímavosť som z kódu odstránil všetko, čo sa týkalo autorizácie a všetko som znova poskladal. Tvorba! Ale nespĺňa požiadavky. Pokračujte…

Vráťme sa k hľadaniu

Znova som si prečítal dokumentáciu ARI, spustil ďalšie testy - tu nie sú žiadne registrácie. Sú hody, sú rozhovory, sú nohavice, ale nie sú žiadne registrácie. V určitom okamihu som si dokonca myslel, že naozaj potrebujeme registráciu supov?

Vtipnou zhodou okolností v tomto momente prichádza od užívateľa ďalšia požiadavka s problémom s odchádzajúcimi hovormi. Problém bol v tom, že registrácia sip zamrzla a vyriešila sa jednoduchým reštartom modulu.

asterisk -rx "sip reload"

Bolo by skvelé mať prístup k AMI cez web: to by vyriešilo všetky problémy, pomyslel som si. Začínam kopať týmto smerom a doslova prvý riadok vyhľadávania vedie k oficiálnej dokumentácii Asterisk, ktorá hovorí, že existuje možnosť pre moje úlohy povolený web v súbore /etc/asterisk/manager.conf, ktorú je potrebné v sekcii nastaviť na ÁNO [všeobecné]

Potom prostredníctvom bežnej webovej žiadosti formulára http://ats:8089/mxml?action=SIPshowregistry dostaneme všetky potrebné informácie.

Pri používaní rozhrania FreePBX nemôžete túto možnosť povoliť cez web, musíte ju povoliť cez konzolu vykonaním zmien v súbore manager.conf. FreePBX ho nevymaže pri zmenách konfigurácie cez web.

Dlho som pracoval s rôznymi druhmi integrácií Asterisk, ale nikdy som nikde nevidel túto funkciu spomenutú. Prekvapilo ma, že nikto nepopisuje tento spôsob interakcie s PBX. Dokonca bolo obzvlášť užitočné hľadať informácie o tejto téme: prakticky nič alebo to bolo použité na úplne iné úlohy.

WEB AMI - aký druh beštie?

Pridanie možnosti povolený web vyplniť manažér.konf poskytuje plný prístup k správe ATS cez web. Všetky príkazy dostupné cez bežné AMI sú teraz na webe, môžete počúvať udalosti z PBX cez zásuvku. Princíp fungovania sa nelíši od konzoly AMI. Po aktivácii tejto možnosti môžete PBX kontaktovať na nasledujúcich adresách:

https://ats:8089/manager — webová stránka s jednoduchým rozhraním na testovanie a manuálne odosielanie požiadaviek. Všetky odpovede sú naformátované do čitateľného HTML. Nie je veľmi vhodné na sledovanie.
https://ats:8089/rawman — len textový výstup, formát podobný konzolovému AMI
https://ats:8089/mxml - len textový výstup vo formáte XML. Vyhovuje nám!

Ako pripojiť Zabbix s Asterisk po vybalení z krabice

Potom som si pomyslel: „Toto je riešenie! Teraz bude všetko pripravené! Easy-peezy lemon squeezey,“ no na radosť bolo priskoro. Na získanie potrebných informácií stačí použiť požiadavku GET s potrebnou akciou akčná, ktorý ako odpoveď vráti xml so zoznamom všetkých registrácií a ich stavom. To všetko je skvelé, ale na zapamätanie si relácie zo súboru cookie potrebujete autorizáciu. Keď testujete v prehliadači, nemyslíte na tento proces.

Autorizačný proces

Najprv riešime adresu http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, ako odpoveď nám server odošle súbor cookie s reláciou autorizácie. Takto vyzerá požiadavka 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

Odpoveď:

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>

Aby ste tam pracovali, potrebujete mansession_id="6f5de42c“, teda samotný autorizačný súbor cookie.
Obsah, na ktorý stačí skontrolovať odpoveď “Autentifikácia bola prijatá" Ďalej, pre všetky hovory na server PBX budeme musieť do požiadavky pridať autorizačný súbor cookie.

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

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

Prečítajte si, ako získať autorizačný súbor cookie a použiť ho v iných žiadostiach tu: “Zabbix – rozšírenie hraníc makra»

Na vytvorenie prvkov sledovania v Zabbix použijem automatickú detekciu.

Automatická detekcia

Ak chcete automaticky zisťovať registrácie a sledovať stavy partnerov, musíte kontaktovať nasledujúcu adresu: https://ats:8089/mxml?action=SIPshowregistry alebo https://ats:8089/mxml?action=SIPpeers

Ako odpoveď nám PBX vráti odpoveď 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>

V odpovedi je veľa odpadu, takže v predspracovaní ich filtrujeme podľa šablóny XPath: //response/generic[@host]
Potom začína zábava. Ak chcete pracovať s detekciou a dynamicky vytvárať prvky, odpoveď musí byť vo formáte JSON. XML nie je podporované pre automatické zisťovanie.

Na prevod XML do JSON som sa musel trochu pohrať s automatickou náhradou, na čo som si spravil skript v JS

Ako pripojiť Zabbix s Asterisk po vybalení z krabice

Zaujímavý bod: v odpovedi ATS sú všetky parametre ohraničené jednoduchými úvodzovkami a po použití šablóny //response/generic[@host] sú nahradené dvojitými.

Na vytváranie prvkov používame premenné z odpovede XML (teraz JSON)​.

Ako pripojiť Zabbix s Asterisk po vybalení z krabice

Register SIP

Na registráciu sip používame tri premenné: meno, hostiteľ, prístav. Bol som spokojný s názvom prvku [chránené e-mailom]: 5060, nenašiel som žiadne situácie, kedy by ste potrebovali použiť všetkých päť premenných.

Hlavný prvok, ktorý prijíma informácie o všetkých registráciách, Hviezdička - AMI SIPshowregistry. Raz za minútu odošle požiadavku GET https://ats:8089/mxml?action=SIPshowregistry, po ktorom sa údaje XML odozvy odovzdajú všetkým závislým prvkom na analýzu. Pre každú registráciu vytvorím na nej závislý prvok. Je to výhodné, pretože aktuálne informácie dostávame v jednej žiadosti a nie pre každú žiadosť zvlášť. Táto implementácia má významný nedostatok - zaťaženie procesora.

Pri testovaní do 100 závislých prvkov som záťaž nezaznamenal, no pri 1700 prvkoch to spôsobilo citeľné 15 sekundové zaťaženie procesora. Majte to na pamäti, ak máte veľký počet závislých prvkov.

Ako možnosť „rozložiť“ zaťaženie alebo nastaviť rôzne frekvencie dotazovania pre prvok môžete presunúť logiku spracovania na každý prvok samostatne.

Prijaté informácie neukladám do hlavného prvku. Po prvé, nevidím to potrebné, a po druhé, ak je odozva väčšia ako 64 kB, Zabbix ju preruší.

Keďže pre závislý prvok používame úplnú odpoveď XML, musíme hodnotu tohto prvku získať v predspracovaní. Cez XPath je to takto:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ štát)
Pri registračných statusoch som nepoužil textové statusy, ale previedol som ich do číselnej podoby pomocou JavaScriptu:

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

SIP Peers

Analogicky k registráciám SIP existuje hlavný prvok Asterisk - AMI SIPshowregistry, ku ktorému sa pridávajú závislé.

To vytvára dva závislé prvky:

  • Stav partnera v textovej forme
  • Čas odozvy zariadenia - ak je stav v poriadku, zapíše sa čas odozvy zariadenia, inak "-1"

Cesta k samotnému prvku je o niečo jednoduchšia XPath:

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

Pre druhý prvok som na oddelenie použil JavaScript Doba odozvy zo stavu peer, keďže sú uložené spolu:

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

Záver

Hotové riešenie môže byť zložité a nie je hneď jasné. Zvyšuje flexibilitu a prenosnosť medzi rôznymi systémami

Šťastnú a jednoduchú integráciu všetkým! Šablóna a pokyny na nastavenie GitHub.

Zdroj: hab.com

Pridať komentár