Wéi verbënnt Zabbix mat Asterisk aus der Këscht

Am fréieren Artikel "Zabbix - Makro Grenzen erweideren" Ech hunn Iech gesot wéi Dir eng Autorisatiounssitzung kritt an se an e lokale Hostmakro ersetzt. An dësem Artikel wäert ech Iech soen wéi Dir Zabbix mat Asterisk verbënnt ouni extern Scripten a Software.

D'Iddi "Frënn ze maachen" vun dësen zwee Systemer gouf viru laanger Zäit gebuer, ouni zousätzlech Software oder Scripten z'installéieren. E séiere Googling huet vill méiglech Léisunge geliwwert, et huet alles op d'Tatsaach gekacht datt d'Skripten eropluede (an Pyha, Bash, Python, etc.) op de Server, an Dir wäert glécklech sinn. Ech wollt d'Iwwerwaachung "aus der Këscht" ëmsetzen - ouni extern Scripten an zousätzlech Software um Server mat Iwwerwaachung a PBX z'installéieren.

Ech hunn am Ganzen 4 Aarbechtsdeeg mat dësem verbruecht, awer d'Resultat war et wäert. Schafft duerch den AMI Interface, Low-Level Detectioun, Ausléiser, an am wichtegsten, d'Verbindung vun der PBX an all aner Astellungen dauert elo ongeféier 15 Minutten.

Zabbix 4.4 ass verfügbar, ongeféier 100 Stéck Asterisk Versioun 13. E puer PBXs kommen mat der FreePBX Web Interface, e puer mat enger bloer Konsole, eng Rëtsch Tricken an Integratioun iwwer en Dialplan.

Date vun der PBX kréien

Den éischten an Haaptpunkt, dee geléist muss ginn, ass d'Daten iwwer Peer a SIP-Registréierungen ze kréien. Fir dësen Zweck huet de PBX AGI, AMI, ARI an SSH Konsol Interfaces. Aus offensichtleche Grënn hunn ech keng zousätzlech Moduler ugesinn.

Als éischt musse mir erausfannen wat dës agi, ami, ari sinn ...

  • AGI - benotzt Scripten am Dialplan. Haaptsächlech fir Opruff Gestioun benotzt.
  • AMI - kann all déi néideg Informatioun ubidden, funktionnéiert iwwer Hafen 5038, ähnlech wéi Telnet. Passt bei eis!
  • ARI - modern, moudesch, JSON. Et gi vill Méiglechkeeten, d'Dateformat ass verständlech fir Zabbix, awer fir mech ass et keen Haapt Saach: Dir kënnt d'Sippregistréierung net kontrolléieren. En aneren Nodeel ass datt et fir Peer nëmmen zwee Staaten online / offline sinn, obwuel et méi Staaten sinn an et ass nëtzlech se ze berücksichtegen wann Dir diagnostizéiert.
  • SSH kann alles maachen, awer heiansdo ass et net erlaabt aus "Sécherheetsgrënn". Considératiounen kënnen ënnerschiddlech sinn, ech ginn net an hinnen.

Wéi och ëmmer, mat all senge Mängel, deckt ARI 90% vun all Iwwerwaachungsbedürfnisser.

Zabbix an Telnet - meng Enttäuschung

Ech kennen AMI gutt; op enger Zäit hunn ech Verfollegung vu Verloschter a Gespréicher mat Divisioun duerch Fernbüroen, Uruffmanagement, etc. Mat Telnet ass alles och ganz kloer: d'Verbindung opmaachen, d'Befehle schécken an d'Äntwert liesen. Dat ass wat ech gemaach hunn, awer d'Resultat huet mech enttäuscht.

Telnet an Zabbix ass net datselwecht wéi an der Linux Konsole, et ass e bësse méi einfach a personaliséiert fir Standard Autorisatioun wéi Login / Passwuert. Wann d'Autorisatiounslogik anescht ass, an et gëtt keng Ufro fir e Login-/Passwuertpaar, geschitt e Feeler. No futile Versuche fir d'Autorisatiounsfuerderung z'iwwergoen, war et nëtzlech fir de Quellcode vum Telnet Modul ze kucken.

Ech hu gemierkt datt bis et eng traditionell Login a Passwuert Ufro ass, ech wäert net weidergoen. Just for fun, Ech geläscht alles Zesummenhang mat Autorisatioun aus dem Code an nees alles. Wierker! Awer et entsprécht net den Ufuerderunge. Maach weider…

Komme mer zréck op d'Sich

Ech liesen d'ARI Dokumentatioun nach eng Kéier, hunn zousätzlech Tester gemaach - et gi keng Schlupp Aschreiwungen hei. Et gi Fester, et gi Gespréicher, et gi Brochstécker, awer et gi keng Umeldungen. Iergendwann hunn ech iwwerhaapt geduecht, brauche mir wierklech Geierregistrierung?

Duerch e witzegen Zoufall kënnt zu dësem Moment nach eng Demande vum Benotzer, mat engem Problem mat den ausgaangenen Uriff. De Problem war datt d'Sippregistréierung gefruer ass a geléist gouf andeems Dir de Modul einfach nei starten.

asterisk -rx "sip reload"

Et wier super fir AMI iwwer de Web ze kréien: dat géif all d'Problemer léisen, hunn ech geduecht. Ech fänken un an dës Richtung ze graven, a wuertwiertlech déi éischt Sichlinn féiert zu der offizieller Asterisk Dokumentatioun, déi seet datt et eng Optioun fir meng Aufgaben ass webaktivéiert am Fichier /etc/asterisk/manager.conf, déi op JO gesat muss ginn, an der Rubrik [général]

Duerno, duerch eng regulär Web Ufro vun der Form http://ats:8089/mxml?action=SIPshowregistry mir kréien all néideg Informatiounen.

Wann Dir d'FreePBX Interface benotzt, kënnt Dir dës Optioun net iwwer de Web aktivéieren; Dir musst et duerch d'Konsol aktivéieren andeems Dir Ännerungen an der manager.conf Datei maacht. FreePBX läscht et net wann d'Konfiguratiounsännerungen iwwer de Web gemaach ginn.

Ech hu laang mat verschiddenen Aarte vun Asterisk-Integratioune geschafft, awer ech hunn dës Feature ni iwwerall ernimmt gesinn. Ech war iwwerrascht datt keen dës Method fir mat der PBX ze interagéieren beschreift. Et war souguer besonnesch nëtzlech fir Informatioun iwwer dëst Thema ze sichen: et gëtt praktesch näischt oder et gouf fir ganz aner Aufgaben benotzt.

WEB AMI - wéi eng Béischt?

Eng Optioun dobäizemaachen webaktivéiert ze Fichier manager.conf gëtt voll Zougang zu ATS Gestioun iwwer de Web. All Kommandoen, déi iwwer e reguläre AMI verfügbar sinn, sinn elo um Internet, Dir kënnt Eventer vun der PBX iwwer e Socket lauschteren. De Prinzip vun der Operatioun ass net anescht wéi d'Konsol AMI. Nodeems Dir dës Optioun aktivéiert hutt, kënnt Dir de PBX op folgend Adressen kontaktéieren:

https://ats:8089/manager - eng Websäit mat engem einfachen Interface fir Testen a manuell Ufroen ze schécken. All Äntwerte sinn an liesbar HTML formatéiert. Net ganz gëeegent fir Iwwerwaachung.
https://ats:8089/rawman - Nëmmen Textausgang, Format ähnlech wéi Konsol AMI
https://ats:8089/mxml - nëmmen Textausgang, am XML-Format. Passt bei eis!

Wéi verbënnt Zabbix mat Asterisk aus der Këscht

Dunn hunn ech geduecht: "Dëst ass d'Léisung! Elo wäert alles prett sinn! Einfach peezy Zitroun squeezey," mee et war ze fréi ze freeën. Fir d'Informatioun ze kréien déi mir brauchen, ass et genuch fir eng GET Ufro mat der néideger Handlung ze benotzen Aktiounen, déi als Äntwert xml mat enger Lëscht vun all Umeldungen an hire Status zréckginn. Dëst ass alles super, awer Dir braucht Autorisatioun fir d'Sessioun vum Cookie ze erënneren. Wann Dir am Browser testen, denkt Dir net un dëse Prozess.

Autorisatioun Prozess

Als éischt adresséiere mir d'Adress http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, als Äntwert schéckt de Server eis e Cookie mat der Autorisatiounssession. Dëst ass wéi eng HTTP Ufro ausgesäit:

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

Äntwert:

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>

Fir do ze schaffen braucht Dir mansession_id="6f5de42c", dh den Autorisatiouns-Cookie selwer.
Inhalt Dir braucht just fir d'Äntwert ze kontrolléieren "Authentifikatioun ugeholl" Als nächst, fir all Uruff un de PBX-Server, musse mir en Autorisatiouns-Cookie op d'Ufro addéieren.

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

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

Liest wéi Dir en Autorisatiouns-Cookie kritt a benotzt se an aner Ufroen hei: "Zabbix - erweidert Makro Grenzen»

Fir Tracking Elementer an Zabbix ze kreéieren wäert ech automatesch Detektioun benotzen.

Auto Detektioun

Fir automatesch Enregistrementer z'entdecken an Peer Staaten ze verfollegen, musst Dir déi folgend Adress kontaktéieren: https://ats:8089/mxml?action=SIPshowregistry oder https://ats:8089/mxml?action=SIPpeers

Als Äntwert gëtt de PBX eis eng XML Äntwert zréck:

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

Et gëtt vill Gerempels an der Äntwert, also an der Virveraarbechtung filtere mir et no Schabloun XPath: //Äntwert/generesch[@host]
Da fänkt de Spaass un. Fir mat Detektioun ze schaffen an dynamesch Elementer ze kreéieren, muss d'Äntwert am JSON-Format sinn. XML gëtt net fir automatesch Detektiounen ënnerstëtzt.

Fir XML op JSON ze konvertéieren, hunn ech e bëssen mam Auto Ersatz gespillt, fir deen ech e Skript am JS gemaach hunn

Wéi verbënnt Zabbix mat Asterisk aus der Këscht

En interessante Punkt: an der ATS Äntwert sinn all Parameter vun eenzelen Zitater ëmgi, an no der Uwendung vun der Schabloun //Äntwert/generesch[@host] si ginn duerch duebel ersat.

Fir Elementer ze kreéieren benotze mir Variablen aus der XML Äntwert (elo JSON) .

Wéi verbënnt Zabbix mat Asterisk aus der Këscht

SIP Registry

Fir Schlupp Aschreiwunge benotze mir dräi Variabelen: Benotzernumm, Provider, port. Ech war frou mam Numm vum Element [Email geschützt]: 5060, Ech hu keng Situatiounen fonnt wou Dir all fënnef Variabelen benotze musst.

Den Haaptelement dat Informatioun iwwer all Umeldungen kritt, Asterisk - AMI SIPshowregistry. Eemol pro Minutt mécht et eng GET Ufro un https://ats:8089/mxml?action=SIPshowregistry, no deem d'Äntwert XML Daten un all ofhängeg Elementer fir d'Parsing weiderginn. Fir all Aschreiwung schafen ech en Element ofhängeg vun et. Dëst ass bequem well mir aktuell Informatioun an enger Ufro kréien, an net fir all Ufro separat. Dës Ëmsetzung huet e wesentlechen Nodeel - d'Laascht op de Prozessor.

Wann ech bis zu 100 ofhängeg Elementer testen, hunn ech d'Laascht net gemierkt, awer mat 1700 Elementer huet dëst eng merkbar 15 Sekonn Laascht op de Prozessor ginn. Halen dëst am Kapp wann Dir eng grouss Zuel vun ofhängeg Elementer hunn.

Als Optioun fir d'Laascht "ausbreeden" oder verschidde Pollingfrequenzen fir en Element ze setzen, kënnt Dir d'Veraarbechtungslogik op all Element separat réckelen.

Ech späicheren déi kritt Informatioun net am Haaptelement. Éischtens, ech gesinn net de Besoin fir dëst, an zweetens, wann d'Äntwert méi wéi 64K ass, da schneid Zabbix et of.

Well mir eng voll XML Äntwert fir dat ofhängegt Element benotzen, musse mir de Wäert vun dësem Element an der Virveraarbechtung kréien. Duerch XPath dëst gëtt esou gemaach:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Staat)
Fir Umeldungsstatusen hunn ech keng Textstatuse benotzt, awer se an numeresch Form ëmgewandelt mat JavaScript:

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

SIP Peers

Analogie mat SIP Aschreiwungen gëtt et en Haaptelement vun der Asterisk - AMI SIPshowregistry, op déi ofhängeg bäigefüügt ginn.

Dëst erstellt zwee ofhängeg Elementer:

  • Peer Status an Textform
  • Apparat Äntwert Zäit - wann de Status OK ass, da gëtt d'Apparat Äntwert Zäit geschriwwe, soss "-1"

De Wee zum Element selwer ass e bësse méi einfach XPath:

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

Fir dat zweet Element hunn ech JavaScript benotzt fir ze trennen Äntwert Zäit vum Peer-Status, well se zesumme gelagert sinn:

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

Konklusioun

Eng out-of-the-box Léisung kann komplex sinn an net direkt kloer. Erhéicht Flexibilitéit a Portabilitéit tëscht verschiddene Systemer

Glécklech an einfach Integratioun jiddereen! Schabloun an Uweisunge fir Ariichten GitHub.

Source: will.com

Setzt e Commentaire