In het vorige artikel Ik heb je verteld hoe je een autorisatiesessie kunt ontvangen en deze kunt vervangen door een lokale hostmacro. In dit artikel vertel ik je hoe je Zabbix met Asterisk kunt verbinden zonder externe scripts en software.
Het idee om “vrienden te maken” van deze twee systemen ontstond lang geleden, zonder extra software of scripts te installeren. Even googlen leverde veel mogelijke oplossingen op, het kwam er allemaal op neer dat je de scripts (in Pyha, Bash, Python, etc.) uploadt naar de server, en je zult blij zijn. Ik wilde monitoring “out of the box” implementeren - zonder externe scripts en het installeren van extra software op de server met monitoring en PBX.
Ik ben hier in totaal 4 werkdagen mee bezig geweest, maar het resultaat was het waard. Het werken via de AMI-interface, low-level detectie, triggers en vooral het verbinden van de PBX en alle andere instellingen duurt nu ongeveer 15 minuten.
Zabbix 4.4 is beschikbaar, ongeveer 100 stuks Asterisk versie 13. Sommige telefooncentrales worden geleverd met de FreePBX-webinterface, andere met een kale console, een heleboel trucjes en integratie via een belplan.
Gegevens ontvangen van de PBX
Het eerste en belangrijkste punt dat moet worden opgelost, is het verkrijgen van gegevens over peers en SIP-registraties. Voor dit doel beschikt de PBX over AGI-, AMI-, ARI- en SSH-console-interfaces. Om voor de hand liggende redenen heb ik geen aanvullende modules overwogen.
Eerst moeten we uitzoeken wat deze agi, ami, ari zijn...
- AGI - gebruik van scripts in het dialplan. Wordt voornamelijk gebruikt voor oproepbeheer.
- AMI - kan alle benodigde informatie verstrekken, werkt via poort 5038, vergelijkbaar met Telnet. Past bij ons!
- ARI - modern, modieus, JSON. Er zijn veel mogelijkheden, het dataformaat is begrijpelijk voor Zabbix, maar voor mij is er geen hoofdzaak: je hebt geen controle over de sip-registratie. Een ander nadeel is dat er voor peers slechts twee toestanden online/offline zijn, hoewel er meer toestanden zijn en het nuttig is om hiermee rekening te houden bij het stellen van de diagnose.
- SSH kan alles, maar soms mag het vanwege “veiligheidsredenen” niet. Overwegingen kunnen verschillend zijn, daar ga ik niet op in.
Met al zijn tekortkomingen dekt ARI echter 90% van alle monitoringbehoeften.
Zabbix en Telnet - mijn teleurstelling
Ik ken AMI goed; ooit heb ik het bijhouden van verliezen geïmplementeerd in gesprekken met afdelingen op afstand, oproepbeheer, enz. Bij Telnet is alles ook heel duidelijk: open de verbinding, stuur de commando's en lees het antwoord. Dat heb ik gedaan, maar het resultaat stelde mij teleur.
De Telnet-interface van Zabbix is niet hetzelfde als die van de console. LinuxHet is iets eenvoudiger en ontworpen voor standaard authenticatie met gebruikersnaam en wachtwoord. Als de authenticatielogica anders is en er geen gebruikersnaam/wachtwoordcombinatie wordt gevraagd, treedt er een fout op. Nadat ik tevergeefs had geprobeerd de authenticatievereiste te omzeilen, ben ik de broncode van de Telnet-module gaan bestuderen.
Ik realiseerde me dat ik pas verder ga als er een traditioneel login- en wachtwoordverzoek is. Voor de lol heb ik alles met betrekking tot autorisatie uit de code verwijderd en alles opnieuw opgebouwd. Werken! Maar het voldoet niet aan de eisen. Doe Maar…
Laten we terugkeren naar de zoektocht
Ik heb de ARI-documentatie opnieuw gelezen en aanvullende tests uitgevoerd - er zijn hier geen slokjesregistraties. Er zijn feesten, er zijn gesprekken, er zijn rijbroeken, maar er zijn geen inschrijvingen. Op een gegeven moment dacht ik zelfs: hebben we echt gierregistratie nodig?
Door een grappig toeval komt er op dit moment een ander verzoek binnen van de gebruiker, met een probleem met uitgaande oproepen. Het probleem was dat de sip-registratie vastliep en werd opgelost door simpelweg de module opnieuw op te starten.
asterisk -rx "sip reload"Het zou geweldig zijn om via internet toegang te krijgen tot AMI: dat zou alle problemen oplossen, dacht ik. Ik begin in deze richting te graven, en letterlijk leidt de eerste zoekregel naar de officiële Asterisk-documentatie, waarin staat dat er een optie is voor mijn taken geschikt voor internet in bestand /etc/asterisk/manager.conf, die moet worden ingesteld op JA, in de sectie [algemeen]
Hierna via een regelmatig webverzoek van het formulier we krijgen alle benodigde informatie.
Wanneer u de FreePBX-interface gebruikt, kunt u deze optie niet via internet inschakelen; u moet deze via de console inschakelen door wijzigingen aan te brengen in het manager.conf-bestand. FreePBX wist het niet wanneer configuratiewijzigingen via internet worden aangebracht.
Ik heb lange tijd met verschillende soorten Asterisk-integraties gewerkt, maar ik heb deze functie nog nooit ergens genoemd zien worden. Ik was verrast dat niemand deze methode van interactie met de PBX beschrijft. Het was zelfs bijzonder nuttig om informatie over dit onderwerp te zoeken: er is praktisch niets of het werd voor totaal andere taken gebruikt.
WEB AMI - wat voor soort beest?
Een optie toevoegen geschikt voor internet indienen manager.conf bood volledige toegang tot ATS-beheer via internet. Alle commando's die beschikbaar zijn via een reguliere AMI staan nu op internet, via een socket kunt u gebeurtenissen vanuit de PBX beluisteren. Het werkingsprincipe verschilt niet van de console AMI. Nadat u deze optie heeft geactiveerd, kunt u de PBX bereiken op de volgende adressen:
— een webpagina met een eenvoudige interface voor het testen en handmatig verzenden van verzoeken. Alle antwoorden worden opgemaakt in leesbare HTML. Niet erg geschikt voor monitoring.
- alleen tekstuitvoer, formaat vergelijkbaar met console-AMI
- alleen tekstuitvoer, in XML-formaat. Past bij ons!

Toen dacht ik: “Dit is de oplossing! Nu zal alles klaar zijn! Easy-peezy citroenknijper, 'maar het was te vroeg om zich te verheugen. Om de informatie te verkrijgen die we nodig hebben, volstaat het om een GET-verzoek te gebruiken met de nodige actie actie, die als reactie xml retourneert met een lijst van alle registraties en hun status. Dit is allemaal geweldig, maar je hebt toestemming nodig om de sessie uit de cookie te onthouden. Wanneer u in de browser test, denkt u niet aan dit proces.
Autorisatieproces
Eerst adresseren we het adres Als reactie hierop stuurt de server ons een cookie met de autorisatiesessie. Zo ziet een HTTP-verzoek eruit:
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 werken heb je nodig landhuis_id="6f5de42c", d.w.z. de autorisatiecookie zelf.
Inhoud die u alleen maar hoeft te controleren voor het antwoord "Authenticatie geaccepteerd" Vervolgens moeten we voor alle oproepen naar de PBX-server een autorisatiecookie aan het verzoek toevoegen.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Hoe u een autorisatiecookie kunt verkrijgen en deze bij andere verzoeken kunt gebruiken, leest u hier: “»
Om trackingelementen in Zabbix te maken, gebruik ik automatische detectie.
Automatische detectie
Om automatisch registraties te detecteren en peer-statussen te volgen, moet u contact opnemen met het volgende adres: of
Als reactie stuurt de PBX ons een 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> Er zit veel rommel in het antwoord, dus bij de voorverwerking filteren we het op sjabloon XPath: //reactie/algemeen[@host]
Dan begint het plezier. Om met detectie te kunnen werken en elementen dynamisch te kunnen maken, moet het antwoord de JSON-indeling hebben. XML wordt niet ondersteund voor automatische detecties.
Om XML naar JSON te converteren moest ik een beetje spelen met automatische vervanging, waarvoor ik een script in JS maakte

Een interessant punt: in het ATS-antwoord worden alle parameters omgeven door enkele aanhalingstekens, en na toepassing van de sjabloon //reactie/algemeen[@host] ze worden vervangen door dubbele exemplaren.
Om elementen te maken, gebruiken we variabelen uit het XML-antwoord (nu JSON).

SIP-register
Voor sip-registraties gebruiken we drie variabelen: gebruikersnaam, gastheer, port. Ik was blij met de naam van het element 111111@login.mtt.ru:5060, heb ik geen situaties gevonden waarin je alle vijf de variabelen moet gebruiken.
Het belangrijkste element dat informatie ontvangt over alle registraties, Asterisk - AMI SIPshowregister. Eén keer per minuut wordt er een GET-verzoek ingediend , waarna de antwoord-XML-gegevens ter parsering aan alle afhankelijke elementen worden doorgegeven. Voor elke registratie maak ik een element aan dat daarvan afhankelijk is. Handig omdat wij in één verzoek actuele informatie ontvangen, en niet per verzoek afzonderlijk. Deze implementatie heeft een aanzienlijk nadeel: de belasting van de processor.
Bij het testen van maximaal 100 afhankelijke elementen merkte ik de belasting niet op, maar met 1700 elementen gaf dit een merkbare belasting van 15 seconden op de processor. Houd hier rekening mee als u een groot aantal afhankelijke elementen heeft.
Als optie om de belasting te ‘spreiden’ of verschillende pollingfrequenties voor een element in te stellen, kunt u de verwerkingslogica afzonderlijk naar elk element verplaatsen.
Ik bewaar de ontvangen informatie niet in het hoofdelement. Ten eerste zie ik de noodzaak hiervan niet, en ten tweede: als de respons meer dan 64K bedraagt, onderbreekt Zabbix het.
Omdat we een volledig XML-antwoord gebruiken voor het afhankelijke element, moeten we de waarde van dit element tijdens de voorverwerking verkrijgen. Door XPath het is zo gedaan:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ staat)
Voor registratiestatussen heb ik geen tekststatussen gebruikt, maar deze met JavaScript naar numerieke vorm omgezet:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP-collega's
Naar analogie met SIP-registraties is er een hoofdelement van Asterisk - AMI SIPshowregistry, waaraan afhankelijke elementen worden toegevoegd.
Hierdoor ontstaan twee afhankelijke elementen:
- Peer-status in tekstvorm
- Reactietijd apparaat - als de status OK is, wordt de reactietijd van het apparaat geschreven, anders "-1"
Het pad naar het element zelf is iets eenvoudiger XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Voor het tweede element heb ik JavaScript gebruikt om te scheiden reactietijd van de peer-status, omdat ze samen worden opgeslagen:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}Conclusie
Een out-of-the-box oplossing kan complex zijn en niet meteen duidelijk. Verhoogt de flexibiliteit en draagbaarheid tussen verschillende systemen
Fijne en gemakkelijke integratie allemaal! Sjabloon en instructies voor het instellen .
Bron: www.habr.com
