Cumu cunnette Zabbix cù Asterisk fora di a scatula

In l'articulu precedente "Zabbix - espansione di i limiti macro" Vi aghju dettu cumu per riceve una sessione d'autorizazione è rimpiazzà in una macro host locale. In questu articulu vi dicu cumu cunnette Zabbix cù Asterisk senza script esterni è software.

L'idea di "fà amici" di sti dui sistemi hè natu assai tempu fà, senza installà software supplementu o script. Un googling rapidu hà datu parechje soluzioni pussibuli, tuttu hè riduciutu à u fattu chì caricate i scripts (in Pyha, Bash, Python, etc.) à u servitore, è sarete felice. Vuliu implementà u monitoraghju "fora di a scatula" - senza script esterni è installendu software supplementu nantu à u servitore cù monitoraghju è PBX.

Aghju passatu un totale di 4 ghjorni di travagliu cù questu, ma u risultatu valeva a pena. U travagliu attraversu l'interfaccia AMI, a rilevazione di livellu bassu, i triggers, è u più impurtante, cunnette u PBX è tutti l'altri paràmetri avà dura circa 15 minuti.

Zabbix 4.4 hè dispunibule, circa 100 pezzi di a versione Asterisk 13. Certi PBX venenu cù l'interfaccia web FreePBX, alcuni cù una cunsola nuda, una mansa di trucchi è integrazione via un dialplan.

Riceve dati da u PBX

U primu è u puntu principale chì deve esse risoltu hè di ottene dati nantu à i pari è e registrazioni SIP. Per questu scopu, u PBX hà interfacce di cunsola AGI, AMI, ARI è SSH. Per ragioni evidenti, ùn aghju micca cunsideratu moduli supplementari.

Prima ci vole à capisce ciò chì sò questi agi, ami, ari...

  • AGI - usendu script in u dialplan. Adupratu principalmente per a gestione di e chjama.
  • AMI - pò furnisce tutte l'infurmazioni necessarii, travaglia attraversu u portu 5038, simili à Telnet. ci cunvene!
  • ARI - mudernu, di moda, JSON. Ci hè parechje pussibulità, u formatu di dati hè cumprendi per Zabbix, ma per mè ùn ci hè micca cosa principale: ùn pudete micca cuntrullà a registrazione sip. Un altru svantaghju hè chì per i pari ci sò solu dui stati in linea / offline, ancu s'ellu ci sò più stati è hè utile per piglià in contu quandu u diagnosticu.
  • SSH pò fà tuttu, ma qualchì volta ùn hè micca permessu per "ragioni di sicurità". Cunsiderazioni ponu esse diverse, ùn entreraghju micca in elli.

Tuttavia, cù tutti i so difetti, ARI copre 90% di tutti i bisogni di monitoraghju.

Zabbix è Telnet - a mo delusione

Cunnoscu bè l'AMI; in un tempu aghju implementatu u seguimentu di perdite in conversazioni cù divisioni per uffizii remoti, gestione di chjama, etc. Cù Telnet, tuttu hè ancu assai chjaru: apre a cunnessione, mandate i cumandamenti è leghje a risposta. Hè ciò chì aghju fattu, ma u risultatu m'hà disappuntu.

Telnet in Zabbix ùn hè micca listessu chì in a cunsola Linux, hè un pocu più simplice è adattatu per l'autorizazione standard cum'è login / password. Se a logica di l'autorizazione hè diversa, è ùn ci hè micca una dumanda per una coppia di login / password, un errore accade. Dopu tentativi inutili di scaccià u requisitu di l'autorizazione, era utile per fighjà u codice fonte di u modulu Telnet.

Aghju realizatu chì finu à chì ci hè una dumanda tradiziunale di login è password, ùn aghju micca avanzà. Solu per divertimentu, aghju sguassatu tuttu ciò chì hè ligatu à l'autorizazione da u codice è hà riunitu tuttu. Opere! Ma ùn risponde micca à i requisiti. Avanti…

Riturnemu à a ricerca

Rilettu a documentazione ARI di novu, eseguiu testi supplementari - ùn ci sò micca registrazioni sip quì. Ci sò feste, ci sò cunversazione, ci sò calzoni, ma ùn ci hè micca iscrizzione. À un certu puntu aghju ancu pensatu, avemu veramente bisognu di iscrizzione di vulture ?

Per una coincidenza divertente, in questu mumentu una altra dumanda arriva da l'utilizatore, cù un prublema cù e chjama in uscita. U prublema era chì a registrazione di u sip era congelata è hè stata risolta da solu rebooting u modulu.

asterisk -rx "sip reload"

Saria bellu accede à l'AMI nantu à u web: chì risolve tutti i prublemi, pensu. Cuminciu à scavà in questa direzzione, è literalmente a prima linea di ricerca porta à a documentazione ufficiale Asterisk, chì dice chì ci hè una opzione per i mo compiti. web attivatu in u schedariu /etc/asterisk/manager.conf, chì deve esse stabilitu à SI, in a sezione [generale]

Dopu questu, attraversu una dumanda web regulare di a forma http://ats:8089/mxml?action=SIPshowregistry avemu tutte l'infurmazioni necessarii.

Quandu aduprate l'interfaccia FreePBX, ùn pudete micca attivà sta opzione via u web; avete bisognu di attivà per mezu di a cunsola facendu cambiamenti à u schedariu manager.conf. FreePBX ùn l'elimina micca quandu i cambiamenti di cunfigurazione sò fatti via u web.

Aghju travagliatu cù varii tipi di integrazioni Asterisk per un bellu pezzu, ma ùn aghju mai vistu sta funzione citata in ogni locu. Eru surprised chì nimu ùn descrive stu metudu di interazzione cù u PBX. Era ancu soprattuttu utile per circà l'infurmazioni nantu à questu tema: ùn ci hè praticamente nunda o hè stata utilizata per compiti completamente differenti.

WEB AMI - chì tipu di bestia?

Aghjunghjendu una opzione web attivatu à schedariu manager.conf furnisce un accessu cumpletu à a gestione ATS via u web. Tutti i cumandamenti dispunibuli attraversu una AMI regulare sò avà nantu à u web, pudete sente l'avvenimenti da u PBX via un socket. U principiu di funziunamentu ùn hè micca sfarente da a cunsola AMI. Dopu avè attivatu sta opzione, pudete cuntattà u PBX à i seguenti indirizzi:

https://ats:8089/manager - una pagina web cù una interfaccia simplice per pruvà è mandà manualmente richieste. Tutte e risposte sò furmatu in HTML leggibile. Ùn hè micca assai adattatu per u monitoraghju.
https://ats:8089/rawman - solu output di testu, furmatu simile à a cunsola AMI
https://ats:8089/mxml - solu output di testu, in furmatu XML. ci cunvene!

Cumu cunnette Zabbix cù Asterisk fora di a scatula

Allora aghju pensatu: "Questa hè a suluzione! Avà tuttu serà prontu! Easy-peezy lemon squeezey ", ma era troppu prestu per rallegrassi. Per ottene l'infurmazioni chì avemu bisognu, hè abbastanza à utilizà una dumanda GET cù l'azzione necessaria azzione, chì in risposta torna xml cù una lista di tutti i registrazioni è u so statutu. Questu hè tuttu grande, ma avete bisognu di l'autorizazione per ricurdà a sessione da a cookie. Quandu teste in u navigatore, ùn pensate micca à stu prucessu.

Prucessu d'autorizazione

Prima avemu indirizzatu l'indirizzu http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, in risposta, u servitore ci manda una cookie cù a sessione d'autorizazione. Eccu ciò chì pare una dumanda HTTP:

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

Risposta:

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>

Per travaglià quì avete bisognu mansession_id="6f5de42c", vale à dì u cookie d'autorizazione stessu.
Cuntenutu chì vi basta à verificà a risposta "Autentificazione accettata" Dopu, per tutte e chjama à u servitore PBX, avemu bisognu di aghjunghje una cookie d'autorizazione à a dumanda.

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

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

Leghjite cumu uttene una cookie d'autorizazione è aduprà in altre richieste quì: "Zabbix - expanding macro frontieres»

Per creà elementi di seguimentu in Zabbix, aduprà a rilevazione automatica.

Rilevazione automatica

Per detectà automaticamente e registrazioni è seguità i stati peer, avete bisognu di cuntattà l'indirizzu seguente: https://ats:8089/mxml?action=SIPshowregistry o https://ats:8089/mxml?action=SIPpeers

In risposta, u PBX ci torna una risposta XML:

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

Ci hè assai basura in a risposta, cusì in preprocessing filtrà per mudellu XPath: //risposta/generic[@host]
Allora u divertimentu principia. Per travaglià cù a deteczione è creà elementi dinamicamente, a risposta deve esse in formatu JSON. XML ùn hè micca supportatu per a rilevazione automatica.

Per cunvertisce XML à JSON, aghju avutu à ghjucà un pocu cù sustituzione auto, per quale aghju fattu un script in JS

Cumu cunnette Zabbix cù Asterisk fora di a scatula

Un puntu interessante: in a risposta ATS, tutti i paràmetri sò circundati da quotes singuli, è dopu applicà u mudellu. //risposta/generic[@host] sò rimpiazzati da doppiu.

Per creà elementi, usemu variàbili da a risposta XML (avà JSON).

Cumu cunnette Zabbix cù Asterisk fora di a scatula

Registru SIP

Per i registrazioni sip usemu trè variabili: gatti, òspite, portu. Eru felice cù u nome di l'elementu [email prutettu]: 5060, Ùn aghju micca truvatu situazioni induve avete bisognu di utilizà tutte e cinque variàbili.

L'elementu principale chì riceve infurmazione nantu à tutte e registrazioni, Asterisk - AMI SIPshowregistry. Una volta un minutu face una dumanda GET à https://ats:8089/mxml?action=SIPshowregistry, dopu chì a risposta XML data hè passata à tutti l'elementi dipendenti per l'analisi. Per ogni registrazione, aghju creatu un elementu dipendente da ellu. Questu hè cunvenutu perchè ricevemu infurmazione aghjurnata in una dumanda, è micca per ogni dumanda separatamente. Questa implementazione hà un inconveniente significativu - a carica nantu à u processatore.

Quandu hà pruvatu à 100 elementi dipendente, ùn aghju micca nutatu a carica, ma cù l'elementi 1700, questu hà datu una carica di 15 secondi notevuli nantu à u processatore. Mantene questu in mente si avete un gran numaru di elementi dipendente.

Cum'è una opzione per "sparghje" a carica o stabilisce frequenze di polling differenti per un elementu, pudete spustà a logica di trasfurmazioni à ogni elementu separatamente.

Ùn aghju micca guardatu l'infurmazioni ricevuti in l'elementu principale. Prima, ùn vecu micca a necessità di questu, è secondu, se a risposta hè più di 64K, allora Zabbix taglia.

Siccomu usemu una risposta XML cumpleta per l'elementu dipendente, avemu bisognu di ottene u valore di questu elementu in preprocessing. À traversu XPath hè fattu cusì:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ statu)
Per i stati di registrazione, ùn aghju micca utilizatu stati di testu, ma i cunvertisce in forma numerica cù JavaScript:

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

SIP Peers

Per analogia cù i registrazioni SIP, ci hè un elementu principalu di Asterisk - AMI SIPshowregistry, à quale sò aghjuntu quelli dipendenti.

Questu crea dui elementi dipendenti:

  • Status peer in forma di testu
  • Tempu di risposta di u dispusitivu - se u statutu hè OK, u tempu di risposta di u dispusitivu hè scrittu, altrimenti "-1"

A strada di l'elementu stessu hè un pocu più simplice XPath:

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

Per u sicondu elementu aghju utilizatu JavaScript per separà tempu di risposta da u status peer, postu chì sò almacenati inseme:

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

cunchiusioni

Una suluzione out-of-the-box pò esse cumplessu è micca immediatamente chjaru. Aumenta a flessibilità è a portabilità trà i diversi sistemi

Integrazione felice è faciule à tutti! Template è struzzioni per a stallazione GitHub.

Source: www.habr.com

Add a comment