So verbinden Sie Zabbix sofort mit Asterisk

In einem frĂŒheren Artikel „Zabbix – Erweiterung der Makrogrenzen“ Ich habe Ihnen erklĂ€rt, wie Sie eine Autorisierungssitzung empfangen und in ein lokales Host-Makro ersetzen. In diesem Artikel verrate ich Ihnen, wie Sie Zabbix ohne externe Skripte und Software mit Asterisk verbinden.

Die Idee, sich mit diesen beiden Systemen anzufreunden, entstand schon vor langer Zeit, ohne dass zusĂ€tzliche Software oder Skripte installiert werden mussten. Ein kurzes Googeln ergab viele mögliche Lösungen, alles lief darauf hinaus, die Skripte (in Pyha, Bash, Python usw.) auf den Server hochzuladen, und Sie werden zufrieden sein. Ich wollte das Monitoring „out of the box“ umsetzen – ohne externe Skripte und die Installation zusĂ€tzlicher Software auf dem Server mit Monitoring und PBX.

Ich habe insgesamt 4 Arbeitstage damit verbracht, aber das Ergebnis hat sich gelohnt. Das Durcharbeiten der AMI-Schnittstelle, der Low-Level-Erkennung, der Auslöser und vor allem des Anschließens der TK-Anlage und aller anderen Einstellungen dauert jetzt etwa 15 Minuten.

Zabbix 4.4 ist verfĂŒgbar, etwa 100 StĂŒck Asterisk Version 13. Einige Telefonanlagen verfĂŒgen ĂŒber die FreePBX-WeboberflĂ€che, andere ĂŒber eine reine Konsole, eine Reihe von Tricks und die Integration ĂŒber einen WĂ€hlplan.

Empfangen von Daten von der TK-Anlage

Der erste und wichtigste Punkt, der gelöst werden muss, ist die Beschaffung von Daten ĂŒber Peers und SIP-Registrierungen. Zu diesem Zweck verfĂŒgt die TK-Anlage ĂŒber AGI-, AMI-, ARI- und SSH-Konsolenschnittstellen. Aus offensichtlichen GrĂŒnden habe ich keine zusĂ€tzlichen Module in Betracht gezogen.

Zuerst mĂŒssen wir herausfinden, was diese Agi, Ami, Ari sind ...

  • AGI – Verwendung von Skripten im WĂ€hlplan. Wird hauptsĂ€chlich fĂŒr die Anrufverwaltung verwendet.
  • AMI – kann alle notwendigen Informationen bereitstellen, funktioniert ĂŒber Port 5038, Ă€hnlich wie Telnet. Passt uns!
  • ARI – modern, modisch, JSON. Es gibt viele Möglichkeiten, das Datenformat ist fĂŒr Zabbix verstĂ€ndlich, aber fĂŒr mich gibt es keine Hauptsache: Man kann die SIP-Registrierung nicht steuern. Ein weiterer Nachteil besteht darin, dass es fĂŒr Peers nur zwei ZustĂ€nde online/offline gibt, obwohl es mehr ZustĂ€nde gibt und es sinnvoll ist, diese bei der Diagnose zu berĂŒcksichtigen.
  • SSH kann alles, aber manchmal ist es aus „SicherheitsgrĂŒnden“ nicht erlaubt. Die Überlegungen können unterschiedlich sein, ich werde nicht nĂ€her darauf eingehen.

Trotz aller MĂ€ngel deckt ARI jedoch 90 % des gesamten Überwachungsbedarfs ab.

Zabbix und Telnet – meine EnttĂ€uschung

Ich kenne AMI gut; einmal habe ich die Nachverfolgung von Verlusten in GesprĂ€chen mit Abteilungen nach Außenstellen, Anrufverwaltung usw. implementiert. Auch bei Telnet ist alles ganz klar: Verbindung öffnen, Befehle senden und Antwort lesen. Das habe ich getan, aber das Ergebnis hat mich enttĂ€uscht.

Zabbix' Telnet ist nicht dasselbe wie das der Konsole. LinuxEs ist etwas einfacher und fĂŒr die Standard-Benutzername/Passwort-Authentifizierung ausgelegt. Wenn die Authentifizierungslogik abweicht und kein Benutzername/Passwort-Paar angefordert wird, tritt ein Fehler auf. Nachdem ich erfolglos versucht hatte, die Authentifizierungsanforderung zu umgehen, begann ich, mir den Quellcode des Telnet-Moduls anzusehen.

Mir wurde klar, dass ich nicht weitermachen werde, solange es keine herkömmliche Anmelde- und Passwortabfrage gibt. Aus Spaß habe ich alles, was mit der Autorisierung zu tun hat, aus dem Code entfernt und alles neu zusammengesetzt. Funktioniert! Aber es entspricht nicht den Anforderungen. Fortfahren


Kehren wir zur Suche zurĂŒck

Ich habe die ARI-Dokumentation noch einmal gelesen und zusĂ€tzliche Tests durchgefĂŒhrt – hier gibt es keine SIP-Registrierungen. Es gibt Feste, es gibt GesprĂ€che, es gibt Reithosen, aber es gibt keine Anmeldungen. Irgendwann dachte ich sogar, brauchen wir wirklich eine SIP-Registrierung?

Durch einen lustigen Zufall kommt in diesem Moment eine weitere Anfrage des Benutzers mit einem Problem mit ausgehenden Anrufen. Das Problem bestand darin, dass die SIP-Registrierung einfror und durch einen einfachen Neustart des Moduls behoben werden konnte.

asterisk -rx "sip reload"

Es wĂ€re toll, ĂŒber das Internet auf AMI zuzugreifen: Das wĂŒrde alle Probleme lösen, dachte ich. Ich fange an, in diese Richtung zu graben, und buchstĂ€blich fĂŒhrt die erste Suchzeile zur offiziellen Asterisk-Dokumentation, in der steht, dass es eine Option fĂŒr meine Aufgaben gibt WebfĂ€hig im Ordner /etc/asterisk/manager.conf, das im Abschnitt auf JA gesetzt werden muss [allgemein]

Danach durch eine regulÀre Webanfrage des Formulars http://ats:8089/mxml?action=SIPshowregistry wir bekommen alle nötigen Informationen.

Wenn Sie die FreePBX-Schnittstelle verwenden, können Sie diese Option nicht ĂŒber das Web aktivieren; Sie mĂŒssen sie ĂŒber die Konsole aktivieren, indem Sie Änderungen an der Datei manager.conf vornehmen. FreePBX löscht es nicht, wenn KonfigurationsĂ€nderungen ĂŒber das Web vorgenommen werden.

Ich habe lange Zeit mit verschiedenen Arten von Asterisk-Integrationen gearbeitet, aber diese Funktion wurde nirgendwo erwĂ€hnt. Ich war ĂŒberrascht, dass niemand diese Art der Interaktion mit der TK-Anlage beschreibt. Es war sogar besonders nĂŒtzlich, nach Informationen zu diesem Thema zu suchen: Es gibt praktisch nichts oder es wurde fĂŒr ganz andere Aufgaben verwendet.

WEB AMI – was fĂŒr ein Biest?

HinzufĂŒgen einer Option WebfĂ€hig einordnen manager.conf Bietet vollen Zugriff auf die ATS-Verwaltung ĂŒber das Internet. Alle ĂŒber ein regulĂ€res AMI verfĂŒgbaren Befehle sind jetzt im Web verfĂŒgbar. Sie können Ereignisse von der PBX ĂŒber einen Socket abhören. Das Funktionsprinzip unterscheidet sich nicht vom Konsolen-AMI. Nach Aktivierung dieser Option können Sie die TK-Anlage unter folgenden Adressen erreichen:

https://ats:8089/manager – eine Webseite mit einer einfachen Schnittstelle zum Testen und manuellen Senden von Anfragen. Alle Antworten werden in lesbarem HTML formatiert. Zur Überwachung wenig geeignet.
https://ats:8089/rawman – Nur Textausgabe, Format Ă€hnlich dem Konsolen-AMI
https://ats:8089/mxml - Nur Textausgabe im XML-Format. Passt uns!

So verbinden Sie Zabbix sofort mit Asterisk

Dann dachte ich: „Das ist die Lösung!“ Jetzt ist alles fertig! „Easy-peezy Lemon Squeezey“, aber es war zu frĂŒh, um sich zu freuen. Um die von uns benötigten Informationen zu erhalten, reicht es aus, eine GET-Anfrage mit der erforderlichen Aktion zu verwenden Aktion, das als Antwort XML mit einer Liste aller Registrierungen und deren Status zurĂŒckgibt. Das ist alles großartig, aber Sie benötigen eine Autorisierung, um sich die Sitzung aus dem Cookie zu merken. Wenn Sie im Browser testen, denken Sie nicht an diesen Vorgang.

Autorisierungsprozess

Zuerst gehen wir auf die Adresse ein http://ats:8089/mxml?action=login&username=zabbix&secret=zabbixAls Antwort sendet uns der Server ein Cookie mit der Autorisierungssitzung. So sieht eine HTTP-Anfrage aus:

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

Antwort:

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>

Um dort zu arbeiten, brauchen Sie mansession_id="6f5de42c", also das Autorisierungs-Cookie selbst.
Inhalt, den Sie nur nach der Antwort durchsuchen mĂŒssen.Authentifizierung akzeptiert" Als nĂ€chstes mĂŒssen wir fĂŒr alle Anrufe an den PBX-Server der Anfrage ein Autorisierungscookie hinzufĂŒgen.

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

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

Lesen Sie hier, wie Sie ein Autorisierungs-Cookie erhalten und es in anderen Anfragen verwenden: „Zabbix – Erweiterung der Makrogrenzen»

Um Tracking-Elemente in Zabbix zu erstellen, verwende ich die automatische Erkennung.

Automatische Erkennung

Um Registrierungen automatisch zu erkennen und Peer-Status zu verfolgen, mĂŒssen Sie sich an die folgende Adresse wenden: https://ats:8089/mxml?action=SIPshowregistry oder https://ats:8089/mxml?action=SIPpeers

Als Antwort sendet uns die PBX eine XML-Antwort zurĂŒ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>

Die Antwort enthĂ€lt viel MĂŒll, daher filtern wir sie in der Vorverarbeitung nach Vorlage XPath: //response/generic[@host]
Dann beginnt der Spaß. Um mit der Erkennung zu arbeiten und Elemente dynamisch zu erstellen, muss die Antwort im JSON-Format vorliegen. XML wird fĂŒr automatische Erkennungen nicht unterstĂŒtzt.

Um XML in JSON zu konvertieren, musste ich ein wenig mit der automatischen Ersetzung experimentieren, wofĂŒr ich ein Skript in JS erstellt habe

So verbinden Sie Zabbix sofort mit Asterisk

Ein interessanter Punkt: In der ATS-Antwort sind alle Parameter in einfache AnfĂŒhrungszeichen gesetzt und nach dem Anwenden der Vorlage //response/generic[@host] sie werden durch doppelte ersetzt.

Zum Erstellen von Elementen verwenden wir Variablen aus der XML-Antwort (jetzt JSON).

So verbinden Sie Zabbix sofort mit Asterisk

SIP-Registrierung

FĂŒr SIP-Registrierungen verwenden wir drei Variablen: Benutzername, Gastgeber, port . Ich war mit dem Namen des Elements zufrieden 111111@login.mtt.ru:5060, habe ich keine Situationen gefunden, in denen Sie alle fĂŒnf Variablen verwenden mĂŒssen.

Das Hauptelement, das Informationen ĂŒber alle Registrierungen erhĂ€lt, Asterisk - AMI SIPshowregistry. Einmal pro Minute stellt es eine GET-Anfrage an https://ats:8089/mxml?action=SIPshowregistryAnschließend werden die XML-Antwortdaten zur Analyse an alle abhĂ€ngigen Elemente ĂŒbergeben. FĂŒr jede Registrierung erstelle ich ein davon abhĂ€ngiges Element. Dies ist praktisch, da wir aktuelle Informationen in einer Anfrage erhalten und nicht fĂŒr jede Anfrage einzeln. Diese Implementierung hat einen erheblichen Nachteil – die Belastung des Prozessors.

Beim Testen von bis zu 100 abhĂ€ngigen Elementen habe ich die Belastung nicht bemerkt, aber bei 1700 Elementen fĂŒhrte dies zu einer spĂŒrbaren Belastung des Prozessors von 15 Sekunden. Beachten Sie dies, wenn Sie ĂŒber eine große Anzahl abhĂ€ngiger Elemente verfĂŒgen.

Als Option zum „Verteilen“ der Last oder zum Festlegen unterschiedlicher Abfragefrequenzen fĂŒr ein Element können Sie die Verarbeitungslogik auf jedes Element separat verschieben.

Ich speichere die empfangenen Informationen nicht im Hauptelement. Erstens sehe ich dafĂŒr keine Notwendigkeit, und zweitens schneidet Zabbix ab, wenn die Antwort mehr als 64 KB betrĂ€gt.

Da wir eine vollstĂ€ndige XML-Antwort fĂŒr das abhĂ€ngige Element verwenden, mĂŒssen wir den Wert dieses Elements in der Vorverarbeitung ermitteln. Durch XPath es wird so gemacht:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Zustand)
FĂŒr Registrierungsstatus habe ich keine Textstatus verwendet, sondern diese mithilfe von JavaScript in eine numerische Form umgewandelt:

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

SIP-Peers

Analog zu SIP-Registrierungen gibt es ein Hauptelement von Asterisk – AMI SIPshowregistry, zu dem abhĂ€ngige hinzugefĂŒgt werden.

Dadurch entstehen zwei abhÀngige Elemente:

  • Peer-Status in Textform
  • Antwortzeit des GerĂ€ts – wenn der Status OK ist, wird die Antwortzeit des GerĂ€ts geschrieben, andernfalls „-1“

Der Weg zum Element selbst ist etwas einfacher XPath:

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

FĂŒr das zweite Element habe ich JavaScript zum Trennen verwendet Reaktionszeit vom Peer-Status, da sie zusammen gespeichert sind:

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

Fazit

Eine sofort einsatzbereite Lösung kann komplex und nicht sofort klar sein. Erhöht die FlexibilitÀt und PortabilitÀt zwischen verschiedenen Systemen

Viel Spaß und einfache Integration euch allen! Vorlage und Anleitung zum Aufbau GitHub.

Source: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz und VPS-VDS-Servern đŸ”„ Kaufen Sie zuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster