Në artikullin e mëparshëm Tregova si të merrja seancën e autorizimit dhe ta vendosja atë në makron lokale të host-it. Në këtë artikull do të flas si të lidh Zabbix me Asterisk pa skripte dhe softuer të jashtëm.
Ideja pĂ«r tĂ« lidhur kĂ«to dy sisteme ka lindur prej kohĂ«sh, dhe kjo pa instaluar softuer dhe skripte tĂ« tjera. NjĂ« kĂ«rkim i shpejtĂ« nĂ« Google nxirrte shumĂ« mĂ«nyra zgjidhjesh, tĂ« gjitha pĂ«rfundonin me hedhjen e skripteve (nĂ« PHP, Bash, Python etj.) nĂ« server dhe do tĂ« ishim tĂ« lumtur. Mua mĂ« pelqente qĂ« tĂ« realizoja monitorimin ânga kutiaâ â pa skripte tĂ« jashtme dhe pa instaluar softuer tĂ« jashtĂ«m nĂ« serverin me monitorim dhe PBX.
Kam kaluar 4 ditë pune në këtë, por rezultati ia vlejti. Puna përmes ndërfaqes AMI, zbulesa në nivel të ulët, triggera, dhe mbi të gjitha, tani lidhja me PBX dhe të gjitha konfigurimet e tjera e marrin vetëm 15 minuta.
Kam Zabbix 4.4, rreth 100 Asterisk 13. Disa PBX vijnë me ndërfaqen e uebit FreePBX, disa me një konsol të thjeshtë, me shumë marifete dhe integrim përmes planit të thirrjeve.
Marrim të dhëna nga PBX
Pika e parë dhe kryesore që duhet zgjidhur është marrja e të dhënave për peerët dhe regjistrimet SIP. Për këtë, në PBX ekzistojnë ndërfaqet AGI, AMI, ARI dhe konsola SSH. Nuk shqyrtova module të tjera për arsye të shqipërimeve të kuptueshme.
Së pari duhet të kuptojmë çfarë përfaqësojnë këto AGI, AMI, ARI....
- AGI â pĂ«rdorimi i skripteve nĂ« planin e thirrjes. Kryesisht pĂ«rdoret pĂ«r menaxhimin e thirrjeve.
- AMI â ka aftĂ«sinĂ« pĂ«r tĂ« dhĂ«nĂ« gjith informacionin e nevojshĂ«m, punon pĂ«rmes portit 5038 nĂ« mĂ«nyrĂ« analogjike me Telnet. Na pĂ«rshtatet!
- ARI â moderne, nĂ« modĂ«, JSON. ShumĂ« mundĂ«si, formati i tĂ« dhĂ«nave nĂ« njĂ« format tĂ« kuptueshĂ«m pĂ«r Zabbix, por pĂ«r mua mungon e rĂ«ndĂ«sishmja: nuk mund tĂ« kontrolloj regjistrimin SIP. NjĂ« tjetĂ«r disavantazh Ă«shtĂ« se pĂ«r peerĂ«t ka vetĂ«m dy gjendje online/offline, kurse gjendje tĂ« tjera janĂ« dhe personalisht i dobishĂ«m pĂ«r diagnostikim.
- 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 disavantazhet e tij, ARI mbulon 90% të nevojave për monitorim.
Zabbix dhe Telnet â zhgĂ«njimi im
E kam AMI shumĂ« mirĂ«, njĂ«herĂ« kam realizuar ndjekjen e humbjeve nĂ« biseda me ndarje sipas zyrave tĂ« largĂ«ta, menaxhimin e thirrjeve etj. Me Telnet gjithçka Ă«shtĂ« jashtĂ«zakonisht e qartĂ«: hap lidhjen, dĂ«rgo komandat dhe lexon pĂ«rgjigjen. ĂfarĂ« edhe bĂ«ra, por rezultati mĂ« zhgĂ«njeu.
Telnet i Zabbix-it nuk është si në konsolën e Linux-it, është pak më i thjeshtë dhe i orientuar për autorizimin standard si login/faqe kalimi. Nëse logjika e autorizimit është ndryshe, dhe nuk ka një kërkesë për çiftin login/faqe kalimi, del një gabim. Pas përpjekjeve të kotta për të anashkaluar kërkesën për autorizim, vendosa të shikoj burimet e modulit Telnet.
E kuptova se derisa të ketë një kërkesë tradicionale për login me fjalëkalim, nuk do të përparoj. Nga kurioziteti, hoqa nga kodi gjithçka që ka të bëjë me autorizimin, rikonstruktuam gjithçka. Funksionon! Por nuk përputhet me kërkesat. Të vazhdojmë...
Kthehemi në kërkim
Rishikoja përsëri dokumentacionin për ARI, kryeva teste shtesë - nuk ka regjistrime SIP këtu. Ka peer, ka biseda, ka bridge, nuk ka regjistrime. Në një moment, madje mendova, a janë të nevojshme regjistrimet SIP?
Për një rast të çuditshëm, në këtë moment arrin një kërkesë tjetër nga përdoruesi, me problemin e thirrjeve të dalshme. Problemi ishte në ngritjen e regjistrimit SIP dhe u zgjidh me një ri-ngritje të zakonshme të modulit.
asterisk -rx "sip reload"Do të ishte shkëlqyer të kaloja tek AMI përmes uebit: kjo do të zgjidhte të gjitha problemet, mendoja unë. Fillova të gërmoj në këtë drejtim, dhe rreshti i parë i kërkimit më ç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 vendos në vlerën PO, në seksionin [general]
Pasi, përmes një kërkese të zakonshme në ueb të tipit merrim të gjithë informacionin e nevojshëm.
Kur përdorim ndërfaqen FreePBX, përmes uebit nuk mund të aktivizojmë këtë opsion, duhet ta ndezim përmes konsolës, duke bërë ndryshime në skedarin manager.conf. FreePBX nuk e fshin atë kur bëhen ndryshime të konfigurimit përmes uebit.
Sa kohë kam punuar me integrime të ndryshme Asterisk, nuk kam parë kurrë që kjo funksion të përmendet diku. Më befasoi që askush nuk e shpjegon këtë metodë ndërveprimi me ATS. Edhe vendosa të kërkoj informacion në këtë temë: praktikisht nuk ka asgjë ose është përdorur për detyra krejt të tjera.
WEB AMI â çfarĂ« Ă«shtĂ« ky kafshĂ«?
Shtimi i opsionit webenabled në skedarin manager.conf hap një qasje të plotë në menaxhimin e Asterisk përmes webit. Të gjitha komandat, të cilat janë të disponueshme përmes AMI të zakonshëm, tani janë në web, mund të dëgjosh ngjarjet nga Asterisk nëpërmjet soketit. Parimi i funksionimit nuk ndryshon nga AMI konsol. Pas aktivizimit të kësaj opsioni, Asterisk mund të adresohet në adresat e mëposhtme:
â njĂ« faqe webi me njĂ« ndĂ«rfaqe tĂ« thjeshtĂ«, pĂ«r teste dhe dĂ«rgimin manual tĂ« kĂ«rkesave. TĂ« gjitha pĂ«rgjigjet formohen nĂ« njĂ« pamje tĂ« lexueshme HTML. Nuk Ă«shtĂ« shumĂ« e pĂ«rshtatshme pĂ«r monitorim.
â vetĂ«m dalja tekstuale, formati Ă«shtĂ« i ngjashĂ«m me AMI-nĂ« konsol
â vetĂ«m dalja tekstuale, nĂ« formatin XML. Na pĂ«rshtatet!

Këtu mendoja: "Ja, zgjidhja! Tani gjithçka do të jetë gati! Lehtë si për limonin", por ishte ende herët për të gëzuar. Për të marrë informacionin që na nevojitet, mjafton të përdorim një kërkesë GET me veprimin e nevojshëm action, e cila në përgjigje kthen xml me listën e të gjitha regjistrimeve dhe gjendjeve të tyre. Kjo është shumë e mirë, por kërkohet autorizim me mbajtjen e sesionit nga cookie. Kur e teston në shfletues, nuk mendon për këtë proces.
Procesi i autorizimit
Në fillim ne i drejtohemi adresës , dhe në përgjigje, serveri na kthen një cookie me sesionin e autorizimit. Këtu është si 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 atje, nevojitet mansession_id="6f5de42c", pra, cookie e autorizimit vetë.
Përmbajtja duhet vetëm të verifikohet për praninë e përgjigjes "Autorizimi u pranuar". Më pas, për të gjitha kërkesat në serverin Asterisk, do të jetë e nevojshme të shtojmë cookie-in e autorizimit në kërkesë.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Si të merrni cookie-in e autorizimit dhe ta përdorni në kërkesat e tjera, lexoni këtu: "»
Për krijimin e elementeve të gjurmimit në Zabbix do të përdor auto zbulimin.
Auto zbulimi
Për auto zbulimin e regjistrimeve dhe gjurmimin e gjendjeve të peers-it, është e nevojshme të drejtohemi në adresën: ose
Në përgjigje, Asterisk na kthen një përgjigje XML:
...
... Në përgjigje është shumë informacion të pakuptueshëm, prandaj gjatë përpunimit ne e filtrojmë atë sipas një modeli. XPath: //response/generic[@host]
Më pas fillon pjesa më interesante. Për të punuar me zbulimin dhe për të krijuar elemente dinamike, është e nevojshme që përgjigjja të jetë në format JSON. XML nuk mbështetet në zbulime automatike.
Për të përcjellë XML në JSON, duhej të luaja pak me zëvendësimin automatik, për çka bëra një skript në JS.

Një pikë interesante është se në përgjigjen e PBX-it, të gjitha parametrat janë rrethuar me thonjëza të vetme, ndërsa pas aplikimit të modelit //response/generic[@host] ato zëvendësohen me thonjëza të dyfishta.
Për të krijuar elemente, përdorim variablat nga përgjigja XML (tani JSON).

SIP Registry
Për regjistrimet SIP, përdorim tre variabla: username, host, port. Më pëlqente emri i elementit 111111@login.mtt.ru:5060, nuk kam gjetur situata kur duhet të përdorim të Pesë variabla.
Elementi kryesor, i cili merr informacion pĂ«r tĂ« gjitha regjistrimet, Asterisk â AMI SIPshowregistry. Ădo minutĂ« ai bĂ«n njĂ« kĂ«rkesĂ« GET pĂ«r , pas sĂ« cilĂ«s tĂ« dhĂ«nat e pĂ«rgjigjes XML i kalohen tĂ« gjithĂ« elementeve tĂ« varur pĂ«r analizĂ«. Elementi pĂ«r çdo regjistrim e krijoj tĂ« varur nga ai. Kjo Ă«shtĂ« e pĂ«rshtatshme, sepse informacionin aktual e marrim me njĂ« kĂ«rkesĂ«, dhe jo pĂ«r secilin veçmas. Kjo realizim ka njĂ« disavantazh tĂ« rĂ«ndĂ«sishĂ«m â ngarkesĂ«n nĂ« procesor.
Gjatë testimeve deri në 100 elemente të varura, nuk e vura re ngarkesën, por me 1700 elemente, kjo jepte një ngarkesë të dukshme prej 15 sekondash në procesor. Mbani parasysh këtë nëse keni një numër të madh elementesh të varura.
Si një variant për "shkëputjen" e ngarkesës ose për vendosjen e frekuencës së ndryshme të sondazhit të elementit, mund të nxjerrim logjikën e procesimit në çdo element veçmas.
Informacionet e marra nuk i ruaj në elementin kryesor. Së pari, nuk e shoh nevojën për këtë, dhe së dyti, nëse përgjigjja është më e madhe se 64K, Zabbix e prerë atë.
Pasi për elementin e varur përdorim përgjigjen e plotë XML, duhet të marrim vlerën e këtij elementi në preprocessimin. 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 përdora statuset tekstuale, por i konvertova ato në numra me JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP Peers
Sipas analogjisĂ« me regjistrimet SIP, ka elementin kryesor Asterisk â AMI SIPshowregistry, nĂ« tĂ« cilin shtohen elemente tĂ« varura.
Këtu krijohen dy elemente të varura:
- Statusi i peer-it në formë teksti
- Koha e pĂ«rgjigjes sĂ« pajisjes â nĂ«se statusi Ă«shtĂ« OK, atĂ«herĂ« shkruhet koha e pĂ«rgjigjes sĂ« pajisjes, pĂ«rndryshe «-1»
Vija e vetme deri në element është më e thjeshtë XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Për elementin e dytë përdora JavaScript për të ndarë koha e përgjigjes nga statusi i peer-it, pasi ato ruhen së bashku:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}Përfundim
Zgjidhja "nga kutia" mund të jetë komplekse dhe jo menjëherë e qartë. Rritet fleksibiliteti dhe transportueshmëria midis sistemeve të ndryshme
Të gjithë një integrim të këndshëm dhe të lehtë! Shablloni dhe udhëzimi për konfigurimin në .
Burimi: habr.com
