Kuidas Zabbix'i koostööd Asterisk'iga "kastist vÀlja" teha

Eelnevas artiklis «Zabbix — lai suurendada makromoodulite piire» Ma rÀÀkisin, kuidas saada autentimisseanss ja sisestada see hosti kohandatud makrosse. Selles artiklis rÀÀgin, kuidas siduda Zabbix Asteriskiga ilma vĂ€listest skriptidest ja tarkvarast.

Idee „siduda“ need kaks sĂŒsteemi tekkis ammu, ilma et oleks vaja installida tĂ€iendavat tarkvara ja skripte. Kiire Google'i otsing andis vĂ€lja mitmeid lahendusi, kuid kĂ”ik viitasid sellele, et laadige serverisse skriptid (PHP-s, Bashis, Pythoni jne) ja kĂ”ik on korras. Mina soovisisin aga teostada jĂ€lgimist „karbist vĂ€lja“ — ilma vĂ€listest skriptidest ja tĂ€iendava tarkvara installimiseta serverisse, kus on jĂ€lgimine ja PBX.

KĂ€isin selle kallal kokku 4 tööpĂ€eva, kuid tulemus vÀÀris vaeva. Töö AMI liidese kaudu, madala taseme tuvastamine, kĂ€ivitajad ning mis kĂ”ige tĂ€htsam, PBX-i ĂŒhenduse ja kĂ”igi teiste seadistuste tegemine kulub nĂŒĂŒd 15 minutit.

Kasutan Zabbix 4.4 ja umbes 100 Asterisk 13 versiooniga. MÔned PBX-id tulevad koos FreePBX veebiliidesega, teised on lihtsalt konsooliga, paljude nippidega ja integreerimisega lÀbi kÔneplaani.

Saame andmeid PBX-ilt

Esimene ja peamine punkt, millega tegeleda, on teabe saamine peer'ide ja SIP registreerimise kohta. Selleks on PBX-is AGI, AMI, ARI ja SSH konsooli liidesed. TÀiendavaid mooduleid ei ole arvesse vÔetud arusaadavatel pÔhjustel.

Alustamiseks tuleb mÔista, mida need AGI, AMI, ARI 
 endast kujutavad.

  • AGI — skriptide kasutamine dialplan'is. Peamiselt kasutatakse helistamiste juhtimiseks.
  • AMI — suudab edastada kogu vajaliku teabe, töötab pordi 5038 kaudu sama moodi nagu Telnet. Meile sobib!
  • ARI — kaasaegne, moes, JSON-iline. Palju vĂ”imalusi, andmeformaat arusaadavas vormis Zabbix jaoks, kuid mulle puudub peamine: SIP registreerimist ei saa jĂ€lgida. Veel ĂŒks miinus on see, et peer'ide jaoks on vaid kaks olekut: online/offline, kuigi olekuid on rohkem ja nende arvestamine on diagnostika jaoks kasulik.
  • SSH — oskab kĂ”ike, aga vahel ei anta seda "turvakaalutluste" tĂ”ttu. Kaalutlused vĂ”ivad olla erinevad, ei hakka neid lahkama.

Siiski, kÔikide oma puuduste eest katab ARI 90% kÔikidest monitorimise vajadustest.

Zabbix ja Telnet — minu pettumus.

AMI tunnen hĂ€sti, kunagi rakendasin kadude jĂ€lgimist vestlustes kaugkontorite vahel, kĂ”nede haldamist jne. Telnet'i osas on samuti kĂ”ik selge: ava ĂŒhendus, saada kĂ€sud ja loe vastus. Nii ma ka tegin, kuid tulemus pettis mind.

Telnet Zabbixis ei ole sama, mis Linuxi konsoolis, see on veidi lihtsam ja suunatud tavalisele autoriseerimisele nagu kasutajanimi/parool. Kui autoriseerimise loogika on erinev ja kasutajanime/parooli paari kĂŒsitakse, ilmub viga. PĂ€rast mitmeid ebaĂ”nnestunud katseid autoriseerimise nĂ”uet vĂ€ltida, otsisin Telnet'i mooduli lĂ€htekoodi.

MĂ”istsin, et kuni ei tule traditsioonilist kasutajanime ja parooli kĂŒsimist, ei edene ma edasi. Huvi pĂ€rast viskasin koodist vĂ€lja kĂ”ik, mis autoriseerimisega seotud, ja ehitasin kĂ”ik ĂŒmber. Töötab! Kuid nĂ”uetele ei vasta. JĂ€tkame edasi 


Tagasi otsingusse

Lugesin ARI dokumentatsiooni veelkord, tegin tĂ€iendavaid teste — siin ei ole SIP registreerimisi. Peerid on, kĂ”ned on, sillad on, registreerimisi ei ole. Mingil hetkel mĂ”tlesin isegi, kas meil on SIP registreerimised tĂ”eliselt vajalikud?

Naljakal juhusel saabub just sel hetkel jÀrgmine pÀring kasutajalt, kes kurdab vÀljaminevate kÔnede probleeme. Probleem seisnes SIP registreerimise hangumises, mis lahendati tavalise mooduli taaskÀivitamisega.

asterisk -rx "sip reload"

Oleks tore webi kaudu pöörduda AMI poole: see lahendaks kÔik probleemid, mÔtlesin ma. Alustan selle suuna uurimist, ja esimene otsingu rida viib mind Asteriski ametlikku dokumentatsiooni, kus öeldakse, et minu vajadustele on olemas valik webenabled failis /etc/asterisk/manager.conf, mis tuleb seada vÀÀrtusele YES ja sektsiooni [general]

PÀrast seda, tavapÀrase veebipÀringu vormis http://ats:8089/mxml?action=SIPshowregistry saame kogu vajaliku teabe.

FreePBX liidese kasutamisel ei saa seda valikut veebist aktiveerida, see tuleb lubada konsooliga, muutes faili manager.conf. FreePBX ei kustuta seda muudatuste tegemisel veebis.

Olen töötanud mitmesuguste Asterisk'i integratsioonidega, kuid pole kunagi nĂ€inud, et see funktsioon kuskil mainitud oleks. Mind ĂŒllatas, et keegi ei kirjelda seda meetodit suhtlemiseks PBX-iga. Isegi kui otsisin teavet selle teema kohta, ei leidnud ma praktiliselt midagi vĂ”i oli see kasutatud tĂ€iesti muude ĂŒlesannete jaoks.

Mis asi on WEB AMI?

Valiku lisamine webenabled faili manager.conf avatakse tĂ€ieĂ”iguslik juurdepÀÀs PBX-i haldamiseks veebis. KĂ”ik kĂ€sud, mis on kergesti saadavad tavalise AMI kaudu, on nĂŒĂŒd veebis saadaval, saab kuulata PBX-i sĂŒndmusi soketi kaudu. Tööprincip ei erine tavalisest AMI-st. PĂ€rast selle valiku aktiveerimist saab PBX-ile pöörduda jĂ€rgmiste aadresside kaudu:

https://ats:8089/manager — veebileht lihtsa liidesega, testimiseks ja kĂ€sitsi pĂ€ringute saatmiseks. KĂ”ik vastused vormindatakse loetavasse HTML-vormi. JĂ€lgimiseks pole see vĂ€ga sobiv.
https://ats:8089/rawman — ainult tekstivĂ€ljund, formaat sarnaneb konsooli AMI-le
https://ats:8089/mxml — ainult tekstivĂ€ljund, XML-vormingus. Meie jaoks sobib!

Kuidas Zabbix'i koostööd Asterisk'iga "kastist vÀlja" teha

Siin mĂ”tlesin: „Noh, see on lahendus! NĂŒĂŒd on kĂ”ik valmis! Lihtne nagu maasikaĂ€pp!”, aga rÔÔmustamiseks oli veel vara. Vajalikku teavet saame kĂ€tte, kui kasutame GET-pĂ€ringut koos vajalike toimingutega. action, mis vastuseks tagastab xml-i, kus on kirjas kĂ”ik registreerimised ja nende olek. See on kĂ”ik tore, aga vajalik on autentimine, mis salvestab sessiooni cookie-s. Kui testid brauseris, ei mĂ”tle sa sellele protsessile.

Autoriseerimisprotsess

Esialgu pöördume aadressile http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, millele server vastuseks saadab autentimisseansi kĂŒpsise. Selline nĂ€eb vĂ€lja HTTP pĂ€ring:

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: et-EE,et;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

Vastus:

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

Seal töötamiseks on vajalik mansession_id="6f5de42c", st autentimiskĂŒpsis ise.
Sisuleidmisel tuleb vaid kontrollida, kas vastus "Autentimine on vastu vÔetud". Edasi, kÔikides suhtlustes ADSL serveriga peame lisama taotlusesse autentimiskuuki.

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

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

Kuidas saada autentimiskuuki ja kasutada seda teistes pĂ€ringutes, loe siit: "Zabbix — laiendame makro piire»

Zabbixis jÀlgimisobjektide loomiseks kasutan automaatset avastamist.

Automaatne avastus

Registreerimise ja peeride oleku jÀlgimise automaatseks avastamiseks on vaja pöörduda jÀrgmise aadressi poole: https://ats:8089/mxml?action=SIPshowregistry vÔi https://ats:8089/mxml?action=SIPpeers

ATS tagastab meile XML-vastuse:

...









...

Vastus sisaldab palju prĂŒgi, seetĂ”ttu filtreerime selle eeltöötluses mustri alusel. XPath: //response/generic[@host]
Edasi hakkab toimuma kĂ”ige huvitavam. Et töötada avastamisega ja dĂŒnaamiliselt luua elemente, peab vastus olema JSON-formaadis. XML ei toeta automaatset avastamist.

XML-i konverteerimiseks JSON-iks pidin natuke mÀngima automaatse asendamisega, mille jaoks tegin JS-i skripti.

Kuidas Zabbix'i koostööd Asterisk'iga "kastist vÀlja" teha

Huvitav punkt, et ATS-i vastuses on kĂ”ik parameetrid ĂŒhekordsete jutumĂ€rkidega, aga pĂ€rast mustri rakendamist //response/generic[@host] need asendatakse kahekordsetega.

Elementide loomiseks kasutame XML-i vastusest (nĂŒĂŒd JSON-ist) muutujaid.

Kuidas Zabbix'i koostööd Asterisk'iga "kastist vÀlja" teha

SIP Registry

SIP registreerimiste jaoks kasutame kolme muutuja: username, host, port. Mind rahuldas elemendi nimi 111111@login.mtt.ru:5060, olukordi, kus kÔik viis muutujat oleks vaja kasutada, ma ei leidnud.

Peamine element, mis saab kogu registreerimise teabe, Asterisk — AMI SIPshowregistry. Kord minutis saadab ta GET-pĂ€ringu. https://ats:8089/mxml?action=SIPshowregistry, mille pĂ€rast edastatakse XML vastuse andmed kĂ”igile sĂ”ltuvatele elementidele analĂŒĂŒsimiseks. Iga registreeringu element teen sĂ”ltuvana. See on mugav, kuna me saame kehtivat teavet ĂŒhe pĂ€ringu kaudu, mitte igaks eraldi. Selle teostuse suur puudus on aga koormus protsessorile.

SÔltuvate elementide testimisel kuni 100, ma ei mÀrganud koormust, kuid 1700 elemendi puhul, see andis mÀrgatava 15-sekundilise koormuse protsessorile. Pidage seda meeles, kui teil on suur hulk sÔltuvaid elemente.

Koormuse 'mahalo' vĂ”i erineva kĂŒsimise sageduse seadmiseks iga elemendi puhul, vĂ”ib töötluslogika viia iga elemendi eraldi.

Saadud teavet ma pÔhielemendis ei hoia. Esiteks, ma ei nÀe selles vajadust, ja teiseks, kui vastus on suurem kui 64K, siis Zabbix lÔikab selle Àra.

Kuna sÔltuva elemendi jaoks kasutame me tÀit XML vastust, peame eelprotsessis saama selle elemendi vÀÀrtuse. LÀbi XPath see tehakse nii:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@state)
Kuna registratsioonide staatustele ei kasutanud ma tekstilisi staatuseid, vaid tÔlisin need numbrivormingusse JavaScripti abil:

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

SIP teised

Sama nagu SIP registreerimiste puhul, on peamine element Asterisk — AMI SIPshowregistry, millele lisanduvad sĂ”ltuvad.

Siin luuakse kaks sÔltuvat elementi:

  • Pira staatus tekstivormingus
  • Seadme vastusaeg — kui staatus on OK, siis mĂ€rgitakse seadme vastusaeg, muidu "-1"

Elementi tee on juba veidi lihtsam XPath:

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

Teise elemendi puhul kasutasin JavaScripti, et eraldada vastusaeg pira staatusest, kuna need salvestatakse koos:

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

KokkuvÔte

Lahendus „karbist vĂ€lja“ vĂ”ib olla keeruline ja mitte kohe arusaadav. Suurendab paindlikkust ja ĂŒhilduvust erinevate sĂŒsteemide vahel.

Kasutage meeldivat ja sujuvat integreerimist! Mall ja seadistamise juhend on GitHub.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster