Në artikullin e mëparshëm Unë tregova se si të merrni një seancë autorizimi dhe ta vendosni atë në makron lokale të hostit. Në këtë artikull do të flas si të lidhni Zabbix me Asterisk pa skripte dhe software të jashtëm.
Ideja për të "lidhur" këto dy sisteme ka lindur prej kohësh, pa instaluar software shtesë dhe skripte. Një kërkim i shpejtë në Google tregonte shumë zgjidhje, të gjitha duke u përqendruar në dërgimin e skripteve (në PHP, Bash, Python, etj.) në server dhe do të keni lumturi. Ndërsa unë doja të realizoja monitorimin "nga kutia" - pa skripte të jashtme dhe pa instaluar software shtesë në serverin e monitorimit dhe në PBX.
Kam punuar me këtë për gjithsej 4 ditë pune, por rezultati e justifikon. Puna përmes ndërfaqes AMI, zbulimi në nivele të ulëta, triggere, dhe më e rëndësishmja, tani lidhja me PBX dhe të gjitha konfigurimet tjera zënë rreth 15 minuta.
Kam Zabbix 4.4 në dispozicion, rreth 100 pajisje Asterisk versioni 13. Disa PBX vijnë me një ndërfaqe web FreePBX, disa me konsolë të bosh dhe një mori hileve dhe integrimesh përmes planit të telefonatave.
Merrni të dhëna nga PBX
Pika dhe pika kryesore që duhet zgjidhur është marrja e të dhënave për piratët dhe regjistrimet SIP. Për këtë, në ATS ekzistojnë ndërfaqet AGI, AMI, ARI dhe konsola SSH. Modulet shtesë, për arsye të qarta, nuk i kam shqyrtuar.
Fillimisht duhet të kuptojmë se çfarë përfaqësojnë këto AGI, AMI, ARI...
- AGI â pĂ«rdorimi i skenarĂ«ve nĂ« planin e thirrjeve. PĂ«rdoret kryesisht pĂ«r menaxhimin e thirrjeve.
- AMI â mund tĂ« ofrojĂ« tĂ« gjithĂ« informacionin e nevojshĂ«m, punon pĂ«rmes portit 5038, ngjashĂ«m me Telnet. Na pĂ«rshtatet!
- ARI â moderne, e modĂ«s, nĂ« formatin JSON. Ka shumĂ« mundĂ«si, format tĂ« dhĂ«nash nĂ« njĂ« formĂ« tĂ« kuptueshme pĂ«r Zabbix, por pĂ«r mua mungon e rĂ«ndĂ«sishmja: nuk mund tĂ« kontrollosh regjistrimin SIP. NjĂ« tjetĂ«r mangĂ«si Ă«shtĂ« se pĂ«r piratĂ«t ka vetĂ«m dy gjendje online/offline, megjithatĂ« ka mĂ« shumĂ« gjendje dhe Ă«shtĂ« e dobishme t'i konsiderosh ato gjatĂ« diagnostikimit.
- SSH â mund tĂ« bĂ«jĂ« gjithçka, por ndonjĂ«herĂ« nuk jepet pĂ«r shkak tĂ« "arsyeve tĂ« sigurisĂ«". Arsyet mund tĂ« jenĂ« tĂ« ndryshme, nuk do t'i shqyrtoj.
Megjithatë, me të gjitha mangësitë e tij, ARI mbulon 90% të të gjitha nevojave për mbikëqyrje.
Zabbix dhe Telnet â zhgĂ«njimi im
E di mirë AMI-në, në kohën time kam zbatuar ndjekjen e humbjeve në biseda me pjesëtim të zyrave të largëta, menaxhimin e telefonatave etj. Me Telnet gjithashtu është tepër e qartë: hap lidhjen, dërgo komanda dhe lexoni përgjigjen. Kështu bëra, por rezultati më zhgënjeu.
Telnet-i i Zabbix-it nuk është si në konsolën Linux, ai është pak më i thjeshtë dhe i fokosur në autentifikimin standard si përdorues/fjalëkalim. Nëse logjika e autentifikimit është ndryshe dhe nuk ka një pyetje për çiftin përdorues/fjalëkalim, del një gabim. Pas përpjekjeve të kota për të anashkaluar kërkesën për autentifikim, fillova të shikoj burimin e modulit Telnet.
E kuptova se derisa të mos ketë një kërkesë tradicionale për përdorues me fjalëkalim, nuk do të përparoj më tej. Nga kurioziteti, hoqa nga kodi gjithçka që kishte të bënte me autentifikimin, e ricompiluam gjithçka. Funksionon! Por nuk përputhet me kërkesat. Shkruajmë më tej...
Kthehemi në kërkim
E lexova pĂ«rsĂ«ri dokumentacionin pĂ«r ARI, kryeva teste shtesĂ« â nuk ka regjistrime SIP kĂ«tu. Ka peer, ka biseda, ka bridge, por nuk ka regjistrimesh. NĂ« njĂ« moment, madje mendoja, a janĂ« aq tĂ« nevojshme pĂ«r ne regjistrimet SIP?
Në një rast qesharak, në këtë moment vjen një kërkesë e re nga përdoruesi, me një problem në thirrjet dalëse. Problemi ishte me bllokimin e regjistrimit SIP dhe u zgjidh me një rinisje të zakonshme të modulit.
asterisk -rx "sip reload"Do të ishte e shkëlqyer të kisha akses në AMI përmes uebit: do të zgjidhte të gjitha problemet, mendoj unë. Filloj të kërkoj në këtë drejtim, dhe literalisht rreshti i parë i kërkimit çon në dokumentacionin zyrtar të Asterisk, ku thuhet se për detyrat e mia ka një opsion webenabled në skedarin /etc/asterisk/manager.conf, të cilin duhet ta vendosni në vlerën YES, në seksionin [general]
Pas kësaj, nëpërmjet një kërkese të zakonshme në ueb si ne marrim të gjitha informacionet e nevojshme.
Kur përdorni ndërfaqen FreePBX, nuk mund ta aktivizoni këtë opsion përmes uebit, duhet ta aktivizoni përmes konsolës duke bërë ndryshime në skedarin manager.conf. FreePBX nuk e fshin atë gjatë ndryshimeve të konfigurimit përmes uebit.
Kurse kam punuar me lloje të ndryshme integrimesh Asterisk, nunca nuk kam parë që kjo funksion të përmendet ndokund. Më befasoi që askush nuk e përshkruan këtë metodë ndërlidhjeje me ATS-në. Edhe pse kërkova informacion mbi këtë temë: praktikisht nuk ka asgjë, ose është përdorur për qëllime krejt të tjera.
ĂfarĂ« Ă«shtĂ« WEB AMI?
Shtimi i opsionit webenabled në skedarin manager.conf hapte një qasje të plotë në menaxhimin e ATS-së përmes webit. Të gjitha komandat, të disponueshme përmes AMI-t tradicional, tani janë në web, mund të dëgjosh ngjarje nga ATS përmes soketeve. Parimi i funksionimit nuk ndryshon nga AMI konsol.
â faqja e webit me njĂ« ndĂ«rfaqe tĂ« thjeshtĂ«, pĂ«r teste dhe dĂ«rgimin manual tĂ« kĂ«rkesave. TĂ« gjitha pĂ«rgjigjet formatohen nĂ« njĂ« format HTML tĂ« lexueshĂ«m. PĂ«r monitorim, nuk Ă«shtĂ« shumĂ« e pĂ«rshtatshme.
â vetĂ«m dalja tekstuale, formati Ă«shtĂ« i ngjashĂ«m me AMI-nĂ« konsolore.
â vetĂ«m dalja tekstuale, nĂ« format XML. Na pĂ«rshtatet!

Këtu mendova: «Ja është zgjidhja! Tani gjithçka do të jetë gati! E lehtë si limoni», por ende nuk ishte koha për të kënaqur. Për të marrë informacionin që na nevojitet, mjafton të përdorim një kërkesë GET me veprimin e nevojshëm veprim, i cili në përgjigje kthen xml me një listë të gjitha regjistrimeve dhe gjendjes së tyre. Kjo është shumë mirë, por kërkohet autorizim me ruajtjen e sesionit nga cookie. Kur teston në shfletues, nuk mendon për këtë proces.
Procesi i autorizimit
Në fillim ankohemi në adresën , dhe në përgjigje serveri na dërgon një cookie me sesionin e autorizimit. Kështu duket kërkesa 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: sq-SQ,sq;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: 1Përgjigja:
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 Për të punuar aty nevojitet mansession_id="6f5de42c", dmth cookie e autorizimit.
Përmbajtja duhet vetëm të kontrollohet për praninë e përgjigjes «Autentikimi është pranuar». Më pas, për të gjitha kërkesat ndaj serverit të ATS, do të nevojitet të shtojmë në kërkesë cookies për autorizim.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Si të merrni cookie për autorizim dhe ta përdorni në kërkesa të tjera lexoni këtu: «»
Për krijimin e elementeve të gjurmimit në Zabbix do të përdor auto-zbulim.
Auto-zbulim
Për auto-zbulimin e regjistrimeve dhe gjurmimin e gjendjeve të peer-ve, duhet të drejtoheni në adresën: ose
Në përgjigje, ATS na kthen një përgjigje XML:
...
... Në përgjigje ka shumë mbeturina, prandaj në paraprocesim i filtrojmë ato sipas modelit XPath: //response/generic[@host]
Më pas fillon gjëja më interesante. Për të punuar me zbulimin dhe krijimin dinamik të elementeve, duhet që përgjigjja të jetë në formatin JSON. XML nuk mbështetet në zbulimet automatike.
Për të konvertuar XML në JSON duhej të luaja pak me zëvendësimin automatik, për të cilin kam bërë një skript në JS

Një pikë interesante është se, në përgjigjen e PBX, të gjitha parametrat rrethohen me thonj të vetëm, ndërsa pas aplikimit të modelit //response/generic[@host] ato zëvendësohen me dyfish.
Për të krijuar elemente, ne përdorim variablat nga përgjigjja XML (tani JSON).

Regjistri SIP
Për regjistrimet SIP, përdorim tre variabla: username, host, port. Më pëlqente emri i elementit. 111111@login.mtt.ru:5060, nuk kam hasur situata ku është e nevojshme të përdoren të gjithë pesë variablat.
Elementi kryesor, qĂ« merr informacionin pĂ«r tĂ« gjitha regjistrimet, Asterisk â AMI SIPshowregistry. Ădo minutĂ« ai bĂ«n njĂ« kĂ«rkesĂ« GET te , pas sĂ« cilĂ«s tĂ« dhĂ«nat e pĂ«rgjigjes XML u kalohen tĂ« gjitha elementeve tĂ« varura pĂ«r analizĂ«. Elementi pĂ«r çdo regjistrim e krijoj tĂ« varur prej tij. Kjo Ă«shtĂ« e dobishme, sepse informacionin aktual e marrim me njĂ« kĂ«rkesĂ«, e jo pĂ«r secilin veçmas. Kjo realizim ka njĂ« minus tĂ« rĂ«ndĂ«sishĂ«m â ngarkesĂ« nĂ« procesor.
Gjatë testimit me deri në 100 elemente të varura, nuk e vërejta ngarkesën, por me 1700 elemente, kjo jepte një ngarkesë të dukshme prej 15 sekondash në procesor. Keni parasysh këtë, nëse keni një numër të madh elementesh të varura.
Si një opsion për 'shpërndarjen' e ngarkesës ose për të vendosur frekuenca të ndryshme të pyetjes së elementit, mund të nxjerrim logjikën e përpunimit në secilin element veçmas.
Informacioni i marrë nuk e ruaj në elementin kryesor. Së pari, nuk e shoh këtë si të nevojshme, dhe së dyti, nëse përgjigjja është më e madhe se 64K, atëherë Zabbix e prerë atë.
Pasi që për elementin e varur përdorim përgjigjen e plotë XML, na nevojitet të marrim vlerën e këtij elementi në përpunim paraprak. Përmes XPath kështu bëhet:
string(//response/generic[@event='RegistryEntry'][@username='{#SIP_REGISTRY_USERNAME}'][@host='{#SIP_REGISTRY_HOST}'][@port='{#SIP_REGISTRY_PORT}']/@state)
Për statuset e regjistrimeve, nuk kam përdorur statuset tekstuale, por i kam konvertuar ato në format numerik me JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP Peers
Sikurse regjistrimet SIP, ka elementin kryesor Asterisk â AMI SIPshowregistry, tĂ« cilit i shtohen tĂ« varur.
Këtu krijohen dy elementë të varur:
- Statusi i peer-it në format tekstual
- Koha e pĂ«rgjigjes sĂ« pajisjes â nĂ«se statusi Ă«shtĂ« OK, atĂ«herĂ« shkruhet koha e pĂ«rgjigjes sĂ« pajisjes, nd otherwise '-1'
Vërtet, rruga deri te elementi është pak më e thjeshtë XPath:
string(//response/generic[@objectname='{#SIP_PEER_OBEJECTNAME']}/@status)
Për elementin e dytë përdora JavaScript, për të ndarë kohën e përgjigjes nga statusi i peer-it, për shkak se ato ruhen së bashku:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}Përfundimi
Zgjidhja "nga kutia" mund të jetë e komplikuar dhe jo menjëherë e qartë. Rritet fleksibiliteti dhe portabiliteti mes sistemeve të ndryshme.
Të gjithë ju uroj një integrim të këndshëm dhe të lehtë! Shablloni dhe udhëzimi për konfigurimin në .
Burimi: habr.com
