In 'n vorige artikel Ek het jou vertel hoe om 'n magtigingsessie te ontvang en dit in 'n plaaslike gasheermakro te vervang. In hierdie artikel sal ek jou vertel hoe om Zabbix met Asterisk te koppel sonder eksterne skrifte en sagteware.
Die idee om "vriende te maak" van hierdie twee stelsels is lank gelede gebore, sonder om bykomende sagteware of skrifte te installeer. 'n Vinnige googling het baie moontlike oplossings opgelewer, dit het alles neergekom op die feit dat die skrifte (in Pyha, Bash, Python, ens.) na die bediener oplaai, en jy sal gelukkig wees. Ek wou monitering "buite die boks" implementeer - sonder eksterne skrifte en bykomende sagteware op die bediener installeer met monitering en PBX.
Ek het altesaam 4 werksdae hiermee spandeer, maar die resultaat was die moeite werd. Dit neem nou ongeveer 15 minute om deur die AMI-koppelvlak, laevlakbespeuring, snellers, en die belangrikste, die koppeling van die PBX en alle ander instellings te werk.
Zabbix 4.4 is beskikbaar, ongeveer 100 stukke van Asterisk weergawe 13. Sommige PBX'e kom met die FreePBX-webkoppelvlak, sommige met 'n kaal konsole, 'n klomp truuks en integrasie via 'n skakelplan.
Ontvang data vanaf die PBX
Die eerste en hoofpunt wat opgelos moet word, is die verkryging van data oor eweknieë en SIP-registrasies. Vir hierdie doel het die PBX AGI-, AMI-, ARI- en SSH-konsole-koppelvlakke. Om ooglopende redes het ek nie addisionele modules oorweeg nie.
Eerstens moet ons uitvind wat hierdie agi, ami, ari is ...
- AGI - gebruik skrifte in die skakelplan. Word hoofsaaklik gebruik vir oproepbestuur.
- AMI - kan al die nodige inligting verskaf, werk via poort 5038, soortgelyk aan Telnet. Pas ons!
- ARI - modern, modieus, JSON. Daar is baie moontlikhede, die dataformaat is verstaanbaar vir Zabbix, maar vir my is daar geen hoofsaak nie: jy kan nie die slukkieregistrasie beheer nie. Nog 'n nadeel is dat daar vir eweknieë net twee state aanlyn/aflyn is, hoewel daar meer state is en dit nuttig is om dit in ag te neem wanneer jy diagnoseer.
- SSH kan alles doen, maar soms word dit nie toegelaat nie weens “sekuriteitsredes”. Oorwegings kan anders wees, ek gaan nie daarop in nie.
Met al sy tekortkominge dek ARI egter 90% van alle moniteringsbehoeftes.
Zabbix en Telnet - my teleurstelling
Ek ken AMI goed op 'n tyd het ek die dop van verliese geïmplementeer in gesprekke met afdeling deur afgeleë kantore, oproepbestuur, ens. Met Telnet is alles ook baie duidelik: maak die verbinding oop, stuur die opdragte en lees die antwoord. Dit is wat ek gedoen het, maar die resultaat het my teleurgestel.
Zabbix se Telnet is nie dieselfde as die konsole s'n nie. LinuxDit is effens eenvoudiger en ontwerp vir standaard aanmeld-/wagwoord-verifikasie. As die verifikasielogika anders is en daar geen aanmeld-/wagwoordpaar versoek word nie, ontstaan 'n fout. Nadat ek onsuksesvol probeer het om die verifikasievereiste te omseil, het ek na die Telnet-module se bronkode begin kyk.
Ek het besef dat totdat daar 'n tradisionele aanmeld- en wagwoordversoek is, ek nie vorentoe sal beweeg nie. Net vir die pret het ek alles wat verband hou met magtiging uit die kode verwyder en alles weer saamgestel. Werk! Maar dit voldoen nie aan die vereistes nie. Gaan voort…
Kom ons keer terug na die soektog
Ek het weer die ARI-dokumentasie gelees, addisionele toetse uitgevoer - hier is geen sluk-registrasies nie. Daar is feeste, daar is gesprekke, daar is broeke, maar daar is geen registrasies nie. Op 'n stadium het ek selfs gedink, het ons regtig aasvoëlregistrasie nodig?
Deur 'n snaakse toeval kom daar op hierdie oomblik nog 'n versoek van die gebruiker af, met 'n probleem met uitgaande oproepe. Die probleem was dat die slukkieregistrasie gevries het en opgelos is deur bloot die module te herlaai.
asterisk -rx "sip reload"Dit sal wonderlik wees om toegang tot AMI oor die web te kry: dit sal al die probleme oplos, het ek gedink. Ek begin in hierdie rigting grawe, en letterlik lei die eerste soeklyn na die amptelike Asterisk-dokumentasie, wat sê dat daar 'n opsie vir my take is webgeaktiveer in lêer /etc/asterisk/manager.conf, wat op JA gestel moet word, in die afdeling [algemeen]
Hierna, deur 'n gereelde webversoek van die vorm ons kry al die nodige inligting.
Wanneer jy die FreePBX-koppelvlak gebruik, kan jy nie hierdie opsie via die web aktiveer nie, jy moet dit deur die konsole aktiveer deur veranderinge aan die manager.conf-lêer aan te bring. FreePBX vee dit nie uit wanneer konfigurasieveranderings via die web gemaak word nie.
Ek het al lank met verskillende soorte Asterisk-integrasies gewerk, maar ek het nog nooit hierdie kenmerk iewers genoem nie. Ek was verbaas dat niemand hierdie metode van interaksie met die PBX beskryf nie. Dit was selfs veral nuttig om inligting oor hierdie onderwerp te soek: daar is feitlik niks of dit is vir heeltemal ander take gebruik.
WEB AMI - watter soort dier?
Voeg 'n opsie by webgeaktiveer om te liasseer bestuurder.conf het volle toegang tot ATS-bestuur via die web verskaf. Alle opdragte wat deur 'n gewone AMI beskikbaar is, is nou op die web, jy kan via 'n sok na gebeure vanaf die PBX luister. Die beginsel van werking verskil nie van die konsole AMI nie. Nadat u hierdie opsie geaktiveer het, kan u die PBX by die volgende adresse kontak:
- 'n webblad met 'n eenvoudige koppelvlak om versoeke te toets en met die hand te stuur. Alle antwoorde word in leesbare HTML geformateer. Nie baie geskik vir monitering nie.
- Slegs teksuitvoer, formaat soortgelyk aan konsole AMI
- Slegs teksuitvoer, in XML-formaat. Pas ons!

Toe dink ek: “Dit is die oplossing! Nou sal alles gereed wees! Easy-peezy lemon squeezey,” maar dit was te vroeg om bly te wees. Om die inligting te bekom wat ons benodig, is dit genoeg om 'n AOO-versoek te gebruik met die nodige aksie aksie, wat in reaksie xml terugstuur met 'n lys van alle registrasies en hul status. Dit is alles wonderlik, maar jy het magtiging nodig om die sessie van die koekie te onthou. As jy in die blaaier toets, dink jy nie aan hierdie proses nie.
Magtigingsproses
Eers spreek ons die adres aan , in reaksie, die bediener stuur vir ons 'n koekie met die magtigingsessie. Dit is hoe 'n HTTP-versoek lyk:
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: 1Antwoord:
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 daar te werk benodig jy mansession_id="6f5de42c", dit wil sê die magtigingskoekie self.
Inhoud wat jy net moet kyk vir die antwoord "Stawing aanvaar" Volgende, vir alle oproepe na die PBX-bediener, sal ons 'n magtigingskoekie by die versoek moet voeg.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Lees hoe om 'n magtigingskoekie te kry en gebruik dit in ander versoeke hier: "»
Om opsporingselemente in Zabbix te skep, sal ek outomatiese opsporing gebruik.
Outo-opsporing
Om registrasies outomaties op te spoor en eweknie-state op te spoor, moet jy die volgende adres kontak: of
In reaksie gee die PBX vir ons 'n XML-antwoord:
<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> Daar is baie gemors in die antwoord, so in voorverwerking filter ons dit volgens sjabloon XPath: //respons/generies[@gasheer]
Dan begin die pret. Om met opsporing te werk en elemente dinamies te skep, moet die reaksie in JSON-formaat wees. XML word nie vir outo-bespeurings ondersteun nie.
Om XML na JSON om te skakel, moes ek 'n bietjie speel met outomatiese vervanging, waarvoor ek 'n script in JS gemaak het

'n Interessante punt: in die ATS-reaksie word alle parameters omring deur enkele aanhalings, en na die toepassing van die sjabloon //respons/generies[@gasheer] hulle word deur dubbele vervang.
Om elemente te skep, gebruik ons veranderlikes van die XML-reaksie (nou JSON).

SIP-register
Vir sluk-registrasies gebruik ons drie veranderlikes: Gebruikersnaam, gasheer, hawe. Ek was tevrede met die naam van die element 111111@login.mtt.ru:5060, Ek het geen situasies gevind waar jy al vyf veranderlikes moet gebruik nie.
Die hoofelement wat inligting oor alle registrasies ontvang, Asterisk - AMI SIPshowregister. Een keer per minuut maak dit 'n GET-versoek aan , waarna die respons XML-data na alle afhanklike elemente vir ontleding deurgegee word. Vir elke registrasie skep ek 'n element wat daarvan afhanklik is. Dit is gerieflik omdat ons bygewerkte inligting in een versoek ontvang, en nie vir elke versoek afsonderlik nie. Hierdie implementering het 'n beduidende nadeel - die las op die verwerker.
Toe ek tot 100 afhanklike elemente getoets het, het ek nie die las opgemerk nie, maar met 1700 elemente het dit 'n merkbare 15 sekonde las op die verwerker gegee. Hou dit in gedagte as jy 'n groot aantal afhanklike elemente het.
As 'n opsie om die las te "verspreid" of verskillende stemfrekwensies vir 'n element in te stel, kan jy die verwerkingslogika afsonderlik na elke element skuif.
Ek stoor nie die inligting wat ontvang is in die hoofelement nie. Eerstens sien ek nie die behoefte hiervoor nie, en tweedens, as die reaksie meer as 64K is, dan sny Zabbix dit af.
Aangesien ons 'n volledige XML-reaksie vir die afhanklike element gebruik, moet ons die waarde van hierdie element in voorafverwerking kry. Deur XPath dit word so gedoen:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ staat)
Vir registrasiestatusse het ek nie teksstatusse gebruik nie, maar dit in numeriese vorm omgeskakel met JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP eweknieë
In analogie met SIP-registrasies is daar 'n hoofelement van Asterisk - AMI SIPshowregistry, waarby afhanklikes gevoeg word.
Dit skep twee afhanklike elemente:
- Portuurstatus in teksvorm
- Toestel se reaksietyd - as die status OK is, word die toestel se reaksietyd geskryf, anders "-1"
Die pad na die element self is 'n bietjie eenvoudiger XPath:
string(//respons/generies[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Vir die tweede element het ek JavaScript gebruik om te skei reaksie tyd vanaf die portuurstatus, aangesien hulle saam gestoor word:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}Gevolgtrekking
'n Out-of-the-box oplossing kan kompleks wees en nie onmiddellik duidelik nie. Verhoog buigsaamheid en oordraagbaarheid tussen verskillende stelsels
Gelukkige en maklike integrasie almal! Sjabloon en instruksies vir die opstel .
Bron: will.com
