Hur man kopplar Zabbix med Asterisk ur kartongen

I en tidigare artikel "Zabbix - expanderande makrogrÀnser" Jag berÀttade för dig hur du tar emot en auktoriseringssession och ersÀtter den med ett lokalt vÀrdmakro. I den hÀr artikeln kommer jag att berÀtta hur du ansluter Zabbix med Asterisk utan externa skript och programvara.

Idén att "bli vÀnner" med dessa tvÄ system föddes för lÀnge sedan, utan att installera ytterligare programvara eller skript. En snabb googling gav mÄnga möjliga lösningar, det hela gick ut pÄ att ladda upp skripten (i Pyha, Bash, Python, etc.) till servern, och du kommer att bli nöjd. Jag ville implementera övervakning "out of the box" - utan externa skript och installera ytterligare programvara pÄ servern med övervakning och PBX.

Jag tillbringade totalt 4 arbetsdagar med detta, men resultatet var vÀrt det. Arbetet genom AMI-grÀnssnittet, lÄgnivÄdetektering, triggers och viktigast av allt, att ansluta PBX och alla andra instÀllningar tar nu cirka 15 minuter.

Zabbix 4.4 Àr tillgÀnglig, cirka 100 stycken av Asterisk version 13. Vissa PBX:er kommer med FreePBX-webbgrÀnssnittet, vissa med en blottad konsol, en massa knep och integration via en uppringningsplan.

Tar emot data frÄn telefonvÀxeln

Den första och viktigaste punkten som mÄste lösas Àr att fÄ fram data om peers och SIP-registreringar. För detta ÀndamÄl har telefonvÀxeln AGI-, AMI-, ARI- och SSH-konsolgrÀnssnitt. Av förklarliga skÀl övervÀgde jag inte ytterligare moduler.

Först mÄste vi ta reda pÄ vad dessa agi, ami, ari Àr...

  • AGI - anvĂ€nder skript i uppringningsplanen. AnvĂ€nds frĂ€mst för samtalshantering.
  • AMI - kan tillhandahĂ„lla all nödvĂ€ndig information, fungerar via port 5038, liknande Telnet. Passar oss!
  • ARI - modern, moderiktig, JSON. Det finns mĂ„nga möjligheter, dataformatet Ă€r förstĂ„eligt för Zabbix, men för mig Ă€r det inget huvudsakligt: ​​du kan inte styra sippregistreringen. En annan nackdel Ă€r att det för kamrater bara finns tvĂ„ tillstĂ„nd online/offline, Ă€ven om det finns fler tillstĂ„nd och det Ă€r anvĂ€ndbart att ta hĂ€nsyn till dem vid diagnostisering.
  • SSH kan göra allt, men ibland Ă€r det inte tillĂ„tet pĂ„ grund av "sĂ€kerhetsskĂ€l". ÖvervĂ€ganden kan vara olika, jag gĂ„r inte in pĂ„ dem.

Men med alla sina brister tÀcker ARI 90 % av alla övervakningsbehov.

Zabbix och Telnet - min besvikelse

Jag kĂ€nner till AMI vĂ€l; vid ett tillfĂ€lle implementerade jag spĂ„rning av förluster i konversationer med division av fjĂ€rrkontor, samtalshantering, etc. Med Telnet Ă€r allt ocksĂ„ vĂ€ldigt tydligt: ​​öppna anslutningen, skicka kommandona och lĂ€s svaret. Det var vad jag gjorde, men resultatet gjorde mig besviken.

Zabbix Telnet Àr inte detsamma som konsolens. LinuxDet Àr nÄgot enklare och utformat för standardinloggning/lösenordsautentisering. Om autentiseringslogiken Àr annorlunda och inget inloggning/lösenordspar begÀrs uppstÄr ett fel. Efter att ha försökt kringgÄ autentiseringskravet utan framgÄng började jag titta pÄ Telnet-modulens kÀllkod.

Jag insĂ„g att tills det finns en traditionell inloggnings- och lösenordsbegĂ€ran kommer jag inte att gĂ„ vidare. Bara för skojs skull tog jag bort allt relaterat till auktorisering frĂ„n koden och satte ihop allt igen. Arbetar! Men den uppfyller inte kraven. VarsĂ„god


LÄt oss ÄtergÄ till sökningen

Jag lÀste ARI-dokumentationen igen, körde ytterligare tester - det finns inga sip-registreringar hÀr. Det finns fester, det Àr samtal, det finns ridbyxor, men det finns inga anmÀlningar. NÄgon gÄng tÀnkte jag till och med, behöver vi verkligen gamregistrering?

Av en rolig slump kommer i detta ögonblick ytterligare en förfrÄgan frÄn anvÀndaren, med ett problem med utgÄende samtal. Problemet var att sip-registreringen höll pÄ att frysa och löstes genom att helt enkelt starta om modulen.

asterisk -rx "sip reload"

Det skulle vara bra att fÄ tillgÄng till AMI över webben: det skulle lösa alla problem, tÀnkte jag. Jag börjar grÀva i den hÀr riktningen, och bokstavligen leder den första sökraden till den officiella Asterisk-dokumentationen, som sÀger att det finns ett alternativ för mina uppgifter webbaktiverad i fil /etc/asterisk/manager.conf, som mÄste stÀllas in pÄ JA, i avsnittet [allmÀn]

Efter detta, genom en vanlig webbförfrÄgan av formulÀret http://ats:8089/mxml?action=SIPshowregistry vi fÄr all nödvÀndig information.

NÀr du anvÀnder FreePBX-grÀnssnittet kan du inte aktivera det hÀr alternativet via webben, du mÄste aktivera det via konsolen genom att göra Àndringar i filen manager.conf. FreePBX raderar det inte nÀr konfigurationsÀndringar görs via webben.

Jag har arbetat med olika typer av Asterisk-integrationer under lÄng tid, men jag har aldrig sett den hÀr funktionen nÀmnts nÄgonstans. Jag blev förvÄnad över att ingen beskriver denna metod för att interagera med PBX. Det var till och med sÀrskilt anvÀndbart att leta efter information om detta Àmne: det finns praktiskt taget ingenting eller sÄ anvÀndes det för helt andra uppgifter.

WEB AMI - vilken sorts best?

LÀgger till ett alternativ webbaktiverad att arkivera manager.conf gav full tillgÄng till ATS-hantering via webben. Alla kommandon som Àr tillgÀngliga via en vanlig AMI finns nu pÄ webben, du kan lyssna pÄ hÀndelser frÄn telefonvÀxeln via ett uttag. Funktionsprincipen skiljer sig inte frÄn konsolens AMI. Efter att ha aktiverat detta alternativ kan du kontakta telefonvÀxeln pÄ följande adresser:

https://ats:8089/manager — en webbsida med ett enkelt grĂ€nssnitt för att testa och manuellt skicka förfrĂ„gningar. Alla svar Ă€r formaterade till lĂ€sbar HTML. Inte sĂ€rskilt lĂ€mplig för övervakning.
https://ats:8089/rawman — Endast textutmatning, format som liknar konsolens AMI
https://ats:8089/mxml - Endast textutmatning, i XML-format. Passar oss!

Hur man kopplar Zabbix med Asterisk ur kartongen

DĂ„ tĂ€nkte jag: ”Det hĂ€r Ă€r lösningen! Nu ska allt vara klart! LĂ€ttpeezy citronpress”, men det var för tidigt att glĂ€djas. För att fĂ„ den information vi behöver rĂ€cker det att anvĂ€nda en GET-förfrĂ„gan med nödvĂ€ndig Ă„tgĂ€rd handling, som som svar returnerar xml med en lista över alla registreringar och deras status. Det hĂ€r Ă€r bra, men du behöver auktorisering för att komma ihĂ„g sessionen frĂ„n cookien. NĂ€r du testar i webblĂ€saren tĂ€nker du inte pĂ„ den hĂ€r processen.

Auktoriseringsprocess

Först tar vi upp adressen http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, som svar skickar servern oss en cookie med auktoriseringssessionen. SÄ hÀr ser en HTTP-förfrÄgan ut:

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

Svar:

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>

För att arbeta dÀr behöver du mansession_id="6f5de42c", det vill sÀga sjÀlva auktoriseringscookien.
InnehÄll du behöver bara kolla efter svaret "Autentisering accepteras" DÀrefter, för alla samtal till PBX-servern, mÄste vi lÀgga till en auktoriseringscookie till begÀran.

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

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

LÀs hur du fÄr en auktoriseringscookie och anvÀnder den i andra förfrÄgningar hÀr: "Zabbix - expanderande makrogrÀnser»

För att skapa spÄrningselement i Zabbix kommer jag att anvÀnda autodetektering.

Automatisk upptÀckt

För att automatiskt upptÀcka registreringar och spÄra peer-tillstÄnd mÄste du kontakta följande adress: https://ats:8089/mxml?action=SIPshowregistry eller https://ats:8089/mxml?action=SIPpeers

Som svar returnerar PBX:en ett XML-svar:

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

Det Àr mycket skrÀp i svaret, sÄ i förbearbetningen filtrerar vi det efter mall XPath: //respons/generic[@host]
Sedan börjar det roliga. För att arbeta med detektering och dynamiskt skapa element mÄste svaret vara i JSON-format. XML stöds inte för automatisk upptÀckt.

För att konvertera XML till JSON var jag tvungen att leka lite med automatisk ersÀttning, för vilket jag gjorde ett script i JS

Hur man kopplar Zabbix med Asterisk ur kartongen

En intressant punkt: i ATS-svaret Àr alla parametrar omgivna av enstaka citattecken och efter applicering av mallen //respons/generic[@host] de ersÀtts med dubbla.

För att skapa element anvĂ€nder vi variabler frĂ„n XML-svaret (nu JSON)​.

Hur man kopplar Zabbix med Asterisk ur kartongen

SIP-registret

För sip-registreringar anvÀnder vi tre variabler: AnvÀndarnamn, vÀrd, port. Jag var nöjd med namnet pÄ elementet 111111@login.mtt.ru:5060, Jag har inte hittat nÄgra situationer dÀr du behöver anvÀnda alla fem variablerna.

Huvudelementet som fÄr information om alla registreringar, Asterisk - AMI SIPshowregistry. En gÄng i minuten gör den en GET-förfrÄgan till https://ats:8089/mxml?action=SIPshowregistry, varefter XML-svarsdata skickas till alla beroende element för analys. För varje registrering skapar jag ett element som Àr beroende av det. Detta Àr bekvÀmt eftersom vi fÄr uppdaterad information i en förfrÄgan och inte för varje förfrÄgan separat. Denna implementering har en betydande nackdel - belastningen pÄ processorn.

NÀr jag testade upp till 100 beroende element mÀrkte jag inte belastningen, men med 1700 element gav detta en mÀrkbar 15 sekunders belastning pÄ processorn. TÀnk pÄ detta om du har ett stort antal beroende element.

Som ett alternativ för att "sprida ut" lasten eller stÀlla in olika avfrÄgningsfrekvenser för ett element, kan du flytta bearbetningslogiken till varje element separat.

Jag lagrar inte den mottagna informationen i huvudelementet. För det första ser jag inte behovet av detta, och för det andra, om svaret Àr mer Àn 64K, sÄ avbryter Zabbix det.

Eftersom vi anvÀnder ett fullstÀndigt XML-svar för det beroende elementet, mÄste vi fÄ vÀrdet av detta element i förbearbetningen. Genom XPath det Àr gjort sÄ hÀr:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ stat)
För registreringsstatusar anvÀnde jag inte textstatus, utan konverterade dem till numerisk form med JavaScript:

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

SIP-kamrater

I analogi med SIP-registreringar finns det ett huvudelement i Asterisk - AMI SIPshowregistry, till vilket beroende lÀggs till.

Detta skapar tvÄ beroende element:

  • Peer-status i textform
  • Enhetens svarstid - om statusen Ă€r OK skrivs enhetens svarstid, annars "-1"

VÀgen till sjÀlva elementet Àr lite enklare XPath:

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

För det andra elementet anvÀnde jag JavaScript för att separera respons tid frÄn peer-statusen, eftersom de lagras tillsammans:

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

Slutsats

En fĂ€rdig lösning kan vara komplex och inte direkt tydlig. Ökar flexibiliteten och portabiliteten mellan olika system

Glad och enkel integration alla! Mall och instruktioner för installation GitHub.

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster