Kako odmah spojiti Zabbix sa Asterisk

U prethodnom članku "Zabbix - širenje granica makroa" Rekao sam vam kako primiti autorizacijsku sesiju i zamijeniti je u lokalnom makrou hosta. U ovom članku ću vam reći kako povezati Zabbix sa Asterisk bez vanjskih skripti i softvera.

Ideja da se ova dva sustava “sprijatelji” rodila se davno, bez instaliranja dodatnog softvera ili skripti. Brzo googlanje dalo je mnogo mogućih rješenja, a sve se svelo na činjenicu da uploadate skripte (u Pyha, Bash, Python, itd.) na server, i bit ćete sretni. Želio sam implementirati nadzor "iz kutije" - bez vanjskih skripti i instaliranja dodatnog softvera na poslužitelju s nadzorom i PBX-om.

Proveo sam ukupno 4 radna dana s ovim, ali rezultat je bio vrijedan toga. Rad kroz AMI sučelje, detekciju niske razine, okidače i što je najvažnije, povezivanje PBX-a i sve ostale postavke sada traju oko 15 minuta.

Dostupan je Zabbix 4.4, oko 100 komada Asterisk verzije 13. Neki PBX-ovi dolaze s FreePBX web sučeljem, neki s golom konzolom, hrpom trikova i integracijom putem dialplana.

Primanje podataka s PBX-a

Prva i glavna točka koju treba riješiti je dobivanje podataka o peerovima i SIP registracijama. U tu svrhu PBX ima AGI, AMI, ARI i SSH konzolna sučelja. Iz očitih razloga nisam razmatrao dodatne module.

Prvo moramo otkriti što su to agi, ami, ari...

  • AGI - korištenje skripti u dialplanu. 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 nema glavne stvari: ne možete kontrolirati sip registraciju. Drugi nedostatak je što za vršnjake postoje samo dva stanja online/offline, iako ih ima više i korisno ih je uzeti u obzir prilikom dijagnosticiranja.
  • SSH može sve, ali ponekad nije dopušteno zbog “sigurnosnih razloga”. Razmatranja mogu biti različita, neću ulaziti u njih.

No, uz sve svoje nedostatke, ARI pokriva 90% svih potreba praćenja.

Zabbix i Telnet - moje razočarenje

Dobro poznajem AMI, svojedobno sam implementirao praćenje gubitaka u razgovorima s podjelom po udaljenim uredima, upravljanje pozivima itd. S Telnetom je također sve vrlo jasno: otvorite vezu, pošaljite naredbe i pročitajte odgovor. To sam i učinio, ali rezultat me razočarao.

Telnet u Zabbixu nije isti kao u Linux konzoli, malo je jednostavniji i prilagođen standardnoj autorizaciji kao što je login/password. Ako je logika autorizacije drugačija i nema zahtjeva za par prijava/lozinka, dolazi do pogreške. Nakon uzaludnih pokušaja zaobilaženja zahtjeva autorizacije, bilo je korisno pogledati izvorni kod Telnet modula.

Shvatio sam da dok ne postoji tradicionalni zahtjev za prijavu i lozinku, neću krenuti naprijed. Za šalu sam maknuo sve vezano uz autorizaciju iz koda i sve ponovno sastavio. Djela! Ali ne ispunjava uvjete. Samo naprijed…

Vratimo se na pretragu

Ponovno sam pročitao ARI dokumentaciju, proveo dodatne testove - ovdje nema registracija gutljaja. Ima gozbi, ima razgovora, ima hlača, ali nema prijava. U nekom sam trenutku čak pomislio, treba li nam stvarno registracija supova?

Smiješnom slučajnošću, u ovom trenutku stiže još jedan zahtjev od korisnika, s problemom odlaznih poziva. Problem je bio u tome što se sip registracija zamrzavala i riješio se jednostavnim ponovnim pokretanjem modula.

asterisk -rx "sip reload"

Bilo bi sjajno pristupiti AMI-ju preko weba: to bi riješilo sve probleme, mislio sam. Počinjem kopati u ovom smjeru, i doslovno prvi redak pretraživanja vodi do službene dokumentacije za Asterisk, koja kaže da postoji opcija za moje zadatke webenabled u spisu /etc/asterisk/manager.conf, koji je potrebno postaviti na YES, u odjeljku [Općenito]

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

Kada koristite FreePBX sučelje, ne možete omogućiti ovu opciju putem weba; trebate je omogućiti putem konzole unošenjem promjena u datoteku manager.conf. FreePBX ga ne briše kada se konfiguracijske promjene izvrše putem weba.

Dugo sam radio s raznim vrstama integracija sa Asteriskom, ali nikada nisam vidio da se ta značajka igdje spominje. Iznenadilo me da nitko ne opisuje ovu metodu interakcije s PBX-om. Čak je bilo posebno korisno potražiti informacije o ovoj temi: nema praktički ništa ili je korišteno za sasvim druge zadatke.

WEB AMI - kakva zvijer?

Dodavanje opcije webenabled podnijeti upravitelj.konf omogućio potpuni pristup upravljanju ATS-om putem weba. Sve naredbe dostupne putem običnog AMI-ja sada su na webu, možete slušati događaje s PBX-a putem utičnice. Princip rada se ne razlikuje od AMI konzole. Nakon aktiviranja ove opcije PBX možete kontaktirati na sljedeće adrese:

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

Kako odmah spojiti Zabbix sa Asterisk

Tada sam pomislio: “Ovo je rješenje! Sada će sve biti spremno! Easy-peezy lemon squeezey”, ali bilo je prerano za veselje. Za dobivanje informacija koje su nam potrebne dovoljno je koristiti GET zahtjev s potrebnom radnjom akcijski, koji kao odgovor vraća xml s popisom svih registracija i njihovim statusom. Sve je to super, ali potrebna vam je autorizacija da zapamtite sesiju iz kolačića. Kada testirate u pregledniku, ne razmišljate o ovom procesu.

Proces autorizacije

Prvo adresiramo adresu http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, kao odgovor, poslužitelj 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>

Za rad tamo 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 poslužitelju, zahtjevu ćemo morati 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 granica makroa»

Za stvaranje elemenata praćenja u Zabbixu koristit ću automatsko otkrivanje.

Automatsko otkrivanje

Za automatsko otkrivanje registracija i praćenje peer stanja, morate se obratiti na 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>

U odgovoru ima puno smeća, pa ga u predobradi filtriramo prema predlošku XPath: //odgovor/generički[@host]
Tada počinje zabava. Za rad s otkrivanjem i dinamičku izradu elemenata, odgovor mora biti u JSON formatu. XML nije podržan za automatske detekcije.

Da bih pretvorio XML u JSON, morao sam se malo poigrati s automatskom zamjenom, za koju sam napravio skriptu u JS-u

Kako odmah spojiti Zabbix sa Asterisk

Zanimljiva točka: u ATS odgovoru, svi parametri su okruženi jednostrukim navodnicima, a nakon primjene predloška //odgovor/generički[@host] zamjenjuju se dvostrukim.

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

Kako odmah spojiti Zabbix sa Asterisk

SIP registar

Za sip registracije koristimo tri varijable: korisničko ime, domaćin, luka. Bio sam zadovoljan nazivom elementa [e-pošta zaštićena]: 5060, nisam pronašao nijednu situaciju u kojoj trebate koristiti svih pet varijabli.

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

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

Kao opciju za "raspoređivanje" opterećenja ili postavljanje različitih frekvencija prozivanja za element, možete premjestiti logiku obrade na svaki element zasebno.

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

Budući da koristimo potpuni XML odgovor za zavisni element, moramo dobiti vrijednost ovog elementa u pretprocesiranju. 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 pretvorio u numerički oblik koristeći JavaScript:

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

SIP vršnjaci

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, ispisuje se vrijeme odziva uređaja, u suprotnom “-1”

Sam put do elementa malo je jednostavniji XPath:

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

Za drugi element koristio sam JavaScript za odvajanje vrijeme odziva iz ravnopravnog statusa, budući da su pohranjeni zajedno:

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

Zaključak

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

Sretna i laka integracija svima! Predložak i upute za postavljanje GitHub.

Izvor: www.habr.com

Dodajte komentar