Kako spojiti Zabbix sa Asterisk iz kutije

U prethodnom članku "Zabbix - širenje makro granica" Rekao sam vam kako da primite sesiju autorizacije i da je zamenite u lokalni makro makro. U ovom članku ću vam reći kako povezati Zabbix sa Asterisk-om bez vanjskih skripti i softvera.

Ideja da se ova dva sistema „sprijateljite“ rodila se davno, bez instaliranja dodatnog softvera ili skripti. Brzo guglanje je dalo mnoga moguća rješenja, sve se svodilo na to da otpremite skripte (u Pyha, Bash, Python itd.) na server i bićete sretni. Htio sam implementirati praćenje „iz kutije“ - bez eksternih skripti i instaliranja dodatnog softvera na server sa nadzorom i PBX-om.

Na ovo sam proveo ukupno 4 radna dana, ali rezultat je bio vrijedan toga. Rad preko AMI interfejsa, detekcija niskog nivoa, trigera i što je najvažnije, povezivanje PBX-a i svih ostalih podešavanja sada traje oko 15 minuta.

Dostupan je Zabbix 4.4, oko 100 komada Asterisk verzije 13. Neke centrale dolaze sa FreePBX web interfejsom, neke sa golom konzolom, gomilom trikova i integracijom preko plana biranja.

Prijem podataka sa PBX-a

Prva i glavna stvar koju treba riješiti je pribavljanje podataka o kolegama i SIP registracijama. U tu svrhu PBX ima AGI, AMI, ARI i SSH konzolna sučelja. Iz očiglednih razloga, nisam razmatrao dodatne module.

Prvo treba da shvatimo šta su ovi agi, ami, ari...

  • AGI - korištenje skripti u dijalplanu. Uglavnom se koristi za upravljanje pozivima.
  • AMI - može pružiti sve potrebne informacije, radi preko porta 5038, slično Telnetu. Odgovara nam!
  • ARI - moderan, moderan, JSON. Postoji mnogo mogućnosti, format podataka je razumljiv za Zabbix, ali za mene ne postoji glavna stvar: ne možete kontrolirati registraciju gutljaja. Još jedan nedostatak je što za vršnjake postoje samo dva stanja online/offline, iako ima više stanja i korisno ih je uzeti u obzir prilikom postavljanja dijagnoze.
  • SSH može sve, ali ponekad nije dozvoljeno iz “sigurnosnih razloga”. Razmatranja mogu biti drugačija, neću ulaziti u njih.

Međutim, uz sve svoje nedostatke, ARI pokriva 90% svih potreba praćenja.

Zabbix i Telnet - moje razočarenje

Dobro poznajem AMI, svojevremeno sam implementirao praćenje gubitaka u razgovorima sa podjelom po udaljenim kancelarijama, upravljanje pozivima itd. Sa Telnetom je takođe sve vrlo jasno: otvorite vezu, pošaljite komande i pročitajte odgovor. To sam i uradio, ali me je rezultat razočarao.

Telnet u Zabbixu nije isti kao u Linux konzoli, malo je jednostavniji i skrojen za standardnu ​​autorizaciju kao što je prijava/lozinka. Ako je logika autorizacije drugačija i nema zahtjeva za par prijava/lozinka, dolazi do greške. Nakon uzaludnih pokušaja da se zaobiđe zahtjev za autorizaciju, bilo je korisno pogledati izvorni kod Telnet modula.

Shvatio sam da sve dok ne postoji tradicionalni zahtjev za prijavu i lozinku, neću ići naprijed. Iz zabave sam uklonio sve što se tiče autorizacije iz koda i sve ponovo sastavio. Works! Ali ne ispunjava uslove. Nastavi…

Vratimo se na pretragu

Ponovo sam pročitao ARI dokumentaciju, izvršio dodatne testove - ovdje nema registracije gutljaja. Ima gozbi, ima razgovora, ima pantalona, ​​ali nema prijava. U nekom trenutku sam čak pomislio da li nam je zaista potrebna registracija supova?

Smiješnom koincidencijom, u ovom trenutku stiže još jedan zahtjev od korisnika, sa problemom sa odlaznim pozivima. Problem je bio u tome što se registracija sip zamrznula i riješen je jednostavnim ponovnim pokretanjem modula.

asterisk -rx "sip reload"

Bilo bi sjajno pristupiti AMI-ju preko weba: to bi riješilo sve probleme, pomislio sam. Počinjem da kopam u ovom pravcu i bukvalno prva linija za pretragu vodi do službene Asterisk dokumentacije, u kojoj piše da postoji opcija za moje zadatke webenabled u fajlu /etc/asterisk/manager.conf, koje treba postaviti na DA, u odjeljku [općenito]

Nakon toga, putem redovnog web zahtjeva obrasca http://ats:8089/mxml?action=SIPshowregistry dobijamo sve potrebne informacije.

Kada koristite FreePBX sučelje, ne možete omogućiti ovu opciju putem weba; potrebno je da je omogućite preko konzole tako što ćete napraviti promjene u datoteci manager.conf. FreePBX ga ne briše kada se promjene konfiguracije izvrše putem weba.

Radio sam sa raznim vrstama Asterisk integracija dugo vremena, ali nikada nisam vidio da se ova funkcija pominje nigdje. Bio sam iznenađen što niko ne opisuje ovaj način interakcije sa PBX-om. Čak je bilo posebno korisno tražiti informacije o ovoj temi: praktički nema ničega ili je korišteno za potpuno različite zadatke.

WEB AMI - kakva zvijer?

Dodavanje opcije webenabled da fajl manager.conf omogućio potpun pristup upravljanju ATS-om putem weba. Sve komande dostupne preko običnog AMI-ja su sada na webu, možete slušati događaje sa PBX-a preko utičnice. Princip rada se ne razlikuje od AMI konzole. Nakon aktivacije ove opcije možete kontaktirati PBX na sljedeće adrese:

https://ats:8089/manager — web stranica sa jednostavnim sučeljem za testiranje i ručno slanje zahtjeva. Svi odgovori su formatirani u čitljiv HTML. Nije baš pogodno za praćenje.
https://ats:8089/rawman — samo izlaz teksta, format sličan konzolnom AMI
https://ats:8089/mxml - samo tekstualni izlaz, u XML formatu. Odgovara nam!

Kako spojiti Zabbix sa Asterisk iz kutije

Onda sam pomislio: „Ovo je rešenje! Sada će sve biti spremno! Easy-peezy lemon squeezey”, ali bilo je prerano za radovanje. Da bismo dobili informacije koje su nam potrebne, dovoljno je koristiti GET zahtjev sa potrebnom radnjom akcija, koji kao odgovor vraća xml sa listom svih registracija i njihovim statusom. Ovo je sve super, ali vam je potrebna autorizacija da zapamtite sesiju iz kolačića. Kada testirate u pretraživaču, ne razmišljate o ovom procesu.

Proces autorizacije

Prvo adresiramo adresu http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, kao odgovor, server nam šalje kolačić sa sesijom autorizacije. Ovako izgleda HTTP zahtjev:

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

Odgovor:

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>

Da biste tamo radili, trebate mansession_id="6f5de42c“, odnosno sam autorizacijski kolačić.
Sadržaj koji samo trebate provjeriti za odgovor "Autentifikacija prihvaćena" Zatim, za sve pozive prema PBX serveru, morat ćemo zahtjevu dodati autorizacijski kolačić.

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

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

Ovdje pročitajte kako dobiti autorizacijski kolačić i koristiti ga u drugim zahtjevima: “Zabbix - širenje makro granica»

Za kreiranje elemenata za praćenje u Zabbixu koristit ću automatsku detekciju.

Auto detekcija

Za automatsko otkrivanje registracija i praćenje stanja peer-a, trebate kontaktirati sljedeću adresu: https://ats:8089/mxml?action=SIPshowregistry ili https://ats:8089/mxml?action=SIPpeers

Kao odgovor, PBX nam vraća XML odgovor:

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

Ima puno smeća u odgovoru, pa ga u predprocesiranju filtriramo po šablonu XPath: //response/generic[@host]
Tada počinje zabava. Da biste radili s otkrivanjem i dinamički kreirali elemente, odgovor mora biti u JSON formatu. XML nije podržan za automatsku detekciju.

Da bih pretvorio XML u JSON, morao sam se malo poigrati sa auto zamjenom, za koji sam napravio skriptu u JS-u

Kako spojiti Zabbix sa Asterisk iz kutije

Zanimljiva stvar: u ATS odgovoru svi parametri su okruženi jednostrukim navodnicima, a nakon primjene predloška //response/generic[@host] zamjenjuju se dvostrukim.

Za kreiranje elemenata koristimo varijable iz XML odgovora (sada JSON)​.

Kako spojiti Zabbix sa Asterisk iz kutije

SIP registar

Za registraciju sip koristimo tri varijable: korisničko ime, domaćin, luka. Bio sam zadovoljan imenom elementa [email zaštićen]: 5060, nisam našao nijednu situaciju u kojoj trebate koristiti svih pet varijabli.

Glavni element koji prima informacije o svim registracijama, Asterisk - AMI SIPshowregistry. Jednom u minuti šalje GET zahtjev za https://ats:8089/mxml?action=SIPshowregistry, nakon čega se XML podaci odgovora prosljeđuju svim zavisnim elementima za raščlanjivanje. Za svaku registraciju kreiram element koji ovisi o tome. Ovo je zgodno jer dobijamo ažurne informacije u jednom zahtjevu, a ne za svaki zahtjev posebno. Ova implementacija ima značajan nedostatak - opterećenje procesora.

Prilikom testiranja do 100 zavisnih elemenata nisam primijetio opterećenje, ali kod 1700 elemenata to je dalo primjetno opterećenje procesora od 15 sekundi. Imajte to na umu ako imate veliki broj zavisnih elemenata.

Kao opciju da „rasprostirate“ opterećenje ili postavite različite frekvencije prozivanja za element, možete premjestiti logiku obrade na svaki element posebno.

Primljene informacije ne pohranjujem u glavni element. Prvo, ne vidim potrebu za ovim, a drugo, ako je odgovor veći od 64K, onda ga Zabbix prekida.

Pošto koristimo puni XML odgovor za zavisni element, potrebno je da dobijemo vrijednost ovog elementa u prethodnoj obradi. Kroz XPath radi se ovako:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ država)
Za statuse registracije nisam koristio tekstualne statuse, već sam ih konvertovao u numerički oblik koristeći JavaScript:

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

SIP Peers

Po analogiji sa SIP registracijama, postoji glavni element Asterisk - AMI SIPshowregistry, kojem se dodaju zavisni.

Ovo stvara dva zavisna elementa:

  • Status vršnjaka u tekstualnom obliku
  • Vrijeme odziva uređaja - ako je status OK, tada se upisuje vrijeme odgovora uređaja, u suprotnom “-1”

Put do samog elementa je malo jednostavniji XPath:

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

Za drugi element koristio sam JavaScript za razdvajanje vrijeme odziva iz ravnopravnog statusa, pošto su pohranjeni zajedno:

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

zaključak

Rješenje izvan kutije može biti složeno i nije odmah jasno. Povećava fleksibilnost i prenosivost između različitih sistema

Sretna i laka integracija svima! Šablon i upute za postavljanje GitHub.

izvor: www.habr.com

Dodajte komentar