Hoe kinne jo Zabbix ferbine mei Asterisk út it fak

Yn it foarige artikel "Zabbix - útwreidzjen fan makrogrinzen" Ik fertelde jo hoe't jo in autorisaasjesesje kinne ûntfange en it ferfange yn in lokale hostmakro. Yn dit artikel sil ik jo fertelle hoe't jo Zabbix ferbine mei Asterisk sûnder eksterne skripts en software.

It idee om "freonen te meitsjen" fan dizze twa systemen is in lange tiid lyn berne, sûnder ekstra software of skripts te ynstallearjen. In flugge googling levere in protte mooglike oplossings, it allegear gie nei it feit dat upload de skripts (yn Pyha, Bash, Python, ensfh) nei de tsjinner, en do silst wêze bliid. Ik woe tafersjoch "út 'e doaze" ymplementearje - sûnder eksterne skripts en ekstra software ynstallearje op 'e server mei tafersjoch en PBX.

Ik brocht yn totaal 4 wurkdagen mei dit, mar it resultaat wie it wurdich. Wurkje troch de AMI-ynterface, deteksje op leech nivo, triggers, en it wichtichste, it ferbinen fan de PBX en alle oare ynstellingen duorret no sawat 15 minuten.

Zabbix 4.4 is beskikber, sawat 100 stikken fan Asterisk ferzje 13. Guon PBX's komme mei de FreePBX-webynterface, guon mei in bleate konsole, in bosk trúkjes en yntegraasje fia in dialplan.

Gegevens ûntfange fan 'e PBX

It earste en wichtichste punt dat moat wurde oplost is it krijen fan gegevens oer peers en SIP-registraasjes. Foar dit doel hat de PBX AGI, AMI, ARI en SSH konsole-ynterfaces. Om foar de hân lizzende redenen haw ik gjin ekstra modules beskôge.

Earst moatte wy útfine wat dizze agi, ami, ari binne ...

  • AGI - it brûken fan skripts yn it dialplan. Benammen brûkt foar opropbehear.
  • AMI - kin foarsjen alle nedige ynformaasje, wurket fia haven 5038, fergelykber mei Telnet. Past by ús!
  • ARI - modern, modieuze, JSON. D'r binne in protte mooglikheden, it gegevensformaat is begryplik foar Zabbix, mar foar my is d'r gjin haadsaak: jo kinne de sipregistraasje net kontrolearje. In oar neidiel is dat d'r foar leeftydsgenoaten mar twa steaten online / offline binne, hoewol d'r mear steaten binne en it is nuttich om se yn 'e rekken te nimmen by it diagnostearjen.
  • SSH kin alles dwaan, mar soms is it net tastien fanwege "feiligens redenen". Oerwagings kinne oars wêze, dêr sil ik net op yngean.

Mei al syn tekortkomingen beslacht ARI lykwols 90% fan alle tafersjochferlet.

Zabbix en Telnet - myn teloarstelling

Ik wit AMI goed yn ien kear ik ymplementearre tracking fan ferliezen yn petearen mei divyzje troch remote kantoaren, call management, etc. Mei Telnet is alles ek heul dúdlik: iepenje de ferbining, stjoer de kommando's en lês it antwurd. Dat haw ik dien, mar it resultaat stelde my teloarsteld.

Zabbix's Telnet is net itselde as dat fan 'e konsole. LinuxIt is wat ienfâldiger en ûntworpen foar standert oanmelde/wachtwurd-autentikaasje. As de autentikaasjelogika oars is en der gjin oanmelde/wachtwurd-pear oanfrege wurdt, komt der in flater foar. Nei't ik sûnder sukses besocht hie om de autentikaasje-easken te omzeilen, bin ik begûn te sjen nei de boarnekoade fan 'e Telnet-module.

Ik realisearre dat oant d'r in tradisjoneel oanmeld- en wachtwurdfersyk is, ik net foarút gean. Krekt foar de wille, ik fuorthelle alles yn ferbân mei autorisaasje út de koade en reassembled alles. Wurket! Mar it foldocht net oan de easken. Gean dyn gong…

Litte wy weromgean nei it sykjen

Ik lês de ARI-dokumintaasje opnij, rûn ekstra tests - d'r binne hjir gjin sipregistraasjes. Der binne feesten, der binne petearen, der binne broeken, mar der binne gjin registraasjes. Op in stuit tocht ik sels, hawwe wy echt registraasje fan gier nedich?

By in grappich tafal komt op dit stuit noch in fersyk fan de brûker, mei in probleem mei útgeande oproppen. It probleem wie dat de sip-registraasje friest en waard oplost troch gewoan de module opnij te starten.

asterisk -rx "sip reload"

It soe geweldich wêze om tagong te krijen ta AMI fia it web: dat soe alle problemen oplosse, tocht ik. Ik begjin te graven yn dizze rjochting, en letterlik liedt de earste sykline nei de offisjele Asterisk-dokumintaasje, dy't seit dat d'r in opsje is foar myn taken webenabled yn triem /etc/asterisk/manager.conf, dy't ynsteld wurde moat op JA, yn 'e seksje [algemien]

Nei dit, troch in gewoane weboanfraach fan it formulier http://ats:8089/mxml?action=SIPshowregistry wy krije alle nedige ynformaasje.

As jo ​​​​de FreePBX-ynterface brûke, kinne jo dizze opsje net ynskeakelje fia it web, jo moatte it fia de konsole ynskeakelje troch wizigingen te meitsjen yn it bestân manager.conf. FreePBX wisket it net as konfiguraasjewizigingen wurde makke fia it web.

Ik haw in lange tiid wurke mei ferskate soarten Asterisk-yntegraasjes, mar ik haw dizze funksje noait oeral neamd sjoen. Ik wie ferrast dat gjinien dizze metoade fan ynteraksje mei de PBX beskriuwt. It wie sels benammen nuttich om te sykjen nei ynformaasje oer dit ûnderwerp: d'r is praktysk neat of it waard brûkt foar folslein oare taken.

WEB AMI - wat foar bist?

In opsje tafoegje webenabled opslaan manager.conf levere folsleine tagong ta ATS behear fia it web. Alle kommando's beskikber fia in gewoane AMI binne no op it web, jo kinne harkje nei eveneminten fan 'e PBX fia in socket. It prinsipe fan wurking is net oars as de konsole AMI. Nei it aktivearjen fan dizze opsje kinne jo kontakt opnimme mei de PBX op de folgjende adressen:

https://ats:8089/manager - in webside mei in ienfâldige interface foar testen en manuell ferstjoeren fan oanfragen. Alle antwurden wurde opmakke yn lêsbere HTML. Net hiel geskikt foar tafersjoch.
https://ats:8089/rawman - allinich tekstútfier, opmaak fergelykber mei konsole AMI
https://ats:8089/mxml - allinich tekstútfier, yn XML-formaat. Past by ús!

Hoe kinne jo Zabbix ferbine mei Asterisk út it fak

Doe tocht ik: “Dit is de oplossing! No sil alles klear wêze! Easy-peezy citroen squeezey," mar it wie te betiid om bliid te wêzen. Om de ynformaasje te krijen dy't wy nedich binne, is it genôch om in GET-fersyk te brûken mei de nedige aksje aksje, dy't as antwurd xml jout mei in list fan alle registraasjes en harren status. Dit is allegear geweldich, mar jo hawwe autorisaasje nedich om de sesje fan it koekje te ûnthâlden. As jo ​​​​testje yn 'e browser, tinke jo net oer dit proses.

Autorisaasjeproses

Earst rjochtsje wy it adres oan http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, as antwurd, de tsjinner stjoert ús in koekje mei de autorisaasje sesje. Dit is hoe't in HTTP-fersyk derút sjocht:

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

Antwurd:

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>

Om dêr te wurkjen moatte jo mansession_id="6f5de42c", d.w.s. it autorisaasjekoekje sels.
Ynhâld dy't jo gewoan moatte kontrolearje op it antwurd "Ferifikaasje akseptearre" Folgjende, foar alle oproppen nei de PBX-tsjinner, moatte wy in autorisaasjekoekje tafoegje oan it fersyk.

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

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

Lês hoe't jo in autorisaasjekoekje krije en it brûke yn oare oanfragen hjir: "Zabbix - útwreidzjen fan makrogrinzen»

Om tracking-eleminten te meitsjen yn Zabbix sil ik autodeteksje brûke.

Auto detection

Om automatysk registraasjes te ûntdekken en peer-steaten te folgjen, moatte jo kontakt opnimme mei it folgjende adres: https://ats:8089/mxml?action=SIPshowregistry of https://ats:8089/mxml?action=SIPpeers

As antwurd jout de PBX ús in XML-antwurd werom:

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

D'r is in protte jiskefet yn it antwurd, dus yn 'e foarferwurking filterje wy it op sjabloan XPath: //antwurd/generic[@host]
Dan begjint de wille. Om mei deteksje te wurkjen en eleminten dynamysk te meitsjen, moat it antwurd yn JSON-formaat wêze. XML wurdt net stipe foar automatyske deteksjes.

Om XML nei JSON te konvertearjen, moast ik in bytsje boartsje mei autoferfanging, wêrfoar ik in skript makke yn JS

Hoe kinne jo Zabbix ferbine mei Asterisk út it fak

In nijsgjirrich punt: yn 'e ATS-antwurd wurde alle parameters omjûn troch inkele quotes, en nei it tapassen fan it sjabloan //antwurd/generic[@host] se wurde ferfongen troch dûbele.

Om eleminten te meitsjen brûke wy fariabelen út it XML-antwurd (no JSON) .

Hoe kinne jo Zabbix ferbine mei Asterisk út it fak

SIP Registry

Foar sipregistraasjes brûke wy trije fariabelen: brûkersnamme, gasthear, haven. Ik wie bliid mei de namme fan it elemint 111111@login.mtt.ru:5060, Ik haw gjin situaasjes fûn wêr't jo alle fiif fariabelen moatte brûke.

It haadelemint dat ynformaasje krijt oer alle registraasjes, Asterisk - AMI SIPshowregistry. Ien kear yn 'e minút makket it in GET-fersyk oan https://ats:8089/mxml?action=SIPshowregistry, wêrnei't it antwurd XML-gegevens wurdt trochjûn oan alle ôfhinklike eleminten foar parsing. Foar elke registraasje meitsje ik in elemint ôfhinklik fan it. Dit is handich om't wy aktuele ynformaasje krije yn ien fersyk, en net foar elk fersyk apart. Dizze útfiering hat in wichtige nadeel - de lading op 'e prosessor.

By it testen fan oant 100 ôfhinklike eleminten, haw ik de lading net opmurken, mar mei 1700 eleminten joech dit in merkber 15 twadde lading op 'e prosessor. Hâld dit yn gedachten as jo in grut oantal ôfhinklike eleminten hawwe.

As opsje foar in "fersprieden" de lading of set ferskillende polling frekwinsjes foar in elemint, kinne jo ferpleatse de ferwurking logika nei elk elemint apart.

Ik bewarje de ûntfongen ynformaasje net yn it haadelemint. As earste sjoch ik de need net foar dit, en twadde, as it antwurd mear is as 64K, dan snijt Zabbix it ôf.

Om't wy in folsleine XML-antwurd brûke foar it ôfhinklike elemint, moatte wy de wearde fan dit elemint krije yn foarferwurking. Troch XPath it is sa dien:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ steat)
Foar registraasjestatusen haw ik gjin tekststatusen brûkt, mar konvertearre se yn numerike foarm mei JavaScript:

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

SIP Peers

Troch analogy mei SIP-registraasjes is d'r in haadelemint fan Asterisk - AMI SIPshowregistry, wêrby't ôfhinklike wurde tafoege.

Dit soarget foar twa ôfhinklike eleminten:

  • Peer-status yn tekstfoarm
  • Apparaat antwurdtiid - as de status OK is, dan wurdt de antwurdtiid fan it apparaat skreaun, oars "-1"

It paad nei it elemint sels is in bytsje ienfâldiger XPath:

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

Foar it twadde elemint haw ik JavaScript brûkt om te skieden reaksjetiid fan 'e peer-status, om't se tegearre wurde opslein:

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

konklúzje

In out-of-the-box oplossing kin kompleks wêze en net direkt dúdlik. Fergruttet fleksibiliteit en portabiliteit tusken ferskate systemen

Lokkige en maklike yntegraasje elkenien! Sjabloan en ynstruksjes foar it opsetten GitHub.

Boarne: www.habr.com

Keapje betroubere hosting foar siden mei DDoS-beskerming, VPS VDS-tsjinners 🔥 Keapje betroubere websidehosting mei DDoS-beskerming, VPS VDS-tsjinners | ProHoster