IepriekÅ”ÄjÄ rakstÄ
Ideja āsadraudzÄtiesā ar Ŕīm divÄm sistÄmÄm radÄs jau sen, neinstalÄjot papildu programmatÅ«ru vai skriptus. Ätra googlÄÅ”ana radÄ«ja daudzus iespÄjamos risinÄjumus, viss ir saistÄ«ts ar faktu, ka augÅ”upielÄdÄjiet skriptus (Pyha, Bash, Python utt.) serverÄ«, un jÅ«s bÅ«siet laimÄ«gs. Es gribÄju ieviest uzraudzÄ«bu āno kastesā - bez ÄrÄjiem skriptiem un papildu programmatÅ«ras instalÄÅ”anas serverÄ« ar uzraudzÄ«bu un PBX.
KopÄ ar Å”o pavadÄ«ju 4 darba dienas, bet rezultÄts bija tÄ vÄrts. Darbs, izmantojot AMI interfeisu, zema lÄ«meÅa noteikÅ”anu, trigerus un, pats galvenais, PBX un visu citu iestatÄ«jumu pievienoÅ”ana tagad aizÅem apmÄram 15 minÅ«tes.
Ir pieejams Zabbix 4.4, aptuveni 100 Asterisk 13. versijas gabali. Dažiem PBX ir FreePBX tÄ«mekļa saskarne, daži ar tukÅ”u konsoli, virkni triku un integrÄciju, izmantojot iezvanes plÄnu.
Datu saÅemÅ”ana no PBX
Pirmais un galvenais jautÄjums, kas jÄatrisina, ir datu iegÅ«Å”ana par vienaudžiem un SIP reÄ£istrÄciju. Å im nolÅ«kam PBX ir AGI, AMI, ARI un SSH konsoles saskarnes. AcÄ«mredzamu iemeslu dÄļ es neapsvÄru papildu moduļus.
Vispirms jÄsaprot, kas ir Å”ie agi, ami, ari...
- AGI - skriptu izmantoÅ”ana iezvanes plÄnÄ. GalvenokÄrt izmanto zvanu pÄrvaldÄ«bai.
- AMI - var sniegt visu nepiecieÅ”amo informÄciju, darbojas caur portu 5038, lÄ«dzÄ«gi kÄ Telnet. Mums der!
- ARI - moderns, moderns, JSON. Ir daudz iespÄju, datu formÄts ir saprotams Zabbix, bet man nav galvenais: jÅ«s nevarat kontrolÄt sip reÄ£istrÄciju. VÄl viens trÅ«kums ir tas, ka vienaudžiem ir tikai divi stÄvokļi tieÅ”saistÄ/bezsaistÄ, lai gan stÄvokļu ir vairÄk un ir lietderÄ«gi tos Åemt vÄrÄ, veicot diagnostiku.
- SSH var darÄ«t visu, bet dažreiz tas nav atļauts "droŔības apsvÄrumu dÄļ". ApsvÄrumi var bÅ«t dažÄdi, es tajos neiedziļinÄÅ”os.
TomÄr ar visiem saviem trÅ«kumiem ARI sedz 90% no visÄm uzraudzÄ«bas vajadzÄ«bÄm.
Zabbix un Telnet - mana vilÅ”anÄs
Labi pÄrzinu AMI, savulaik ieviesu zaudÄjumu izsekoÅ”anu sarunÄs ar sadalÄ«Å”anu pa attÄliem birojiem, zvanu pÄrvaldÄ«bu u.c. Ar Telnet viss ir arÄ« ļoti skaidrs: atveriet savienojumu, nosÅ«tiet komandas un izlasiet atbildi. TÄ es arÄ« izdarÄ«ju, bet rezultÄts mani pievÄ«la.
Telnet Zabbix nav tas pats, kas Linux konsolÄ, tas ir nedaudz vienkÄrÅ”Äks un pielÄgots standarta autorizÄcijai, piemÄram, pieteikÅ”anÄs/parolei. Ja autorizÄcijas loÄ£ika atŔķiras un nav pieteikÅ”anÄs/paroles pÄra pieprasÄ«juma, rodas kļūda. PÄc veltÄ«giem mÄÄ£inÄjumiem apiet autorizÄcijas prasÄ«bu, bija lietderÄ«gi apskatÄ«t Telnet moduļa pirmkodu.
Sapratu, ka kamÄr nebÅ«s tradicionÄlÄ pieteikÅ”anÄs un paroles pieprasÄ«Å”ana, tikmÄr uz priekÅ”u nevirzÄ«Å”os. Prieka pÄc izÅÄmu no koda visu, kas saistÄ«ts ar autorizÄciju, un visu saliku no jauna. Darbojas! Bet tas neatbilst prasÄ«bÄm. Uz priekÅ”uā¦
AtgriezÄ«simies pie meklÄjumiem
VÄlreiz pÄrlasÄ«ju ARI dokumentÄciju, veicu papildu pÄrbaudes - Å”eit nav sip reÄ£istrÄcijas. Ir dzÄ«res, ir sarunas, ir bridžas, bet nav reÄ£istrÄcijas. KÄdÄ brÄ«dÄ« es pat domÄju, vai mums tieÅ”Äm ir vajadzÄ«ga grifu reÄ£istrÄcija?
SmieklÄ«gas sakritÄ«bas dÄļ Å”ajÄ brÄ«dÄ« no lietotÄja pienÄk vÄl viens pieprasÄ«jums ar problÄmu ar izejoÅ”ajiem zvaniem. ProblÄma bija tÄda, ka sip reÄ£istrÄcija sastinga un tika atrisinÄta, vienkÄrÅ”i pÄrstartÄjot moduli.
asterisk -rx "sip reload"
BÅ«tu lieliski piekļūt AMI, izmantojot tÄ«mekli: tas atrisinÄtu visas problÄmas, es domÄju. Es sÄku rakt Å”ajÄ virzienÄ, un burtiski pirmÄ meklÄÅ”anas rindiÅa ved uz oficiÄlo Asterisk dokumentÄciju, kurÄ teikts, ka maniem uzdevumiem ir iespÄja Webabled failÄ /etc/asterisk/manager.conf, kas sadaÄ¼Ä jÄiestata uz JÄ [vispÄrÄ«gi]
PÄc tam, izmantojot parasto veidlapas tÄ«mekļa pieprasÄ«jumu
Izmantojot FreePBX saskarni, Å”o opciju nevar iespÄjot, izmantojot tÄ«mekli; tÄ ir jÄiespÄjo, izmantojot konsoli, veicot izmaiÅas failÄ manager.conf. FreePBX to neizdzÄÅ”, ja konfigurÄcijas izmaiÅas tiek veiktas, izmantojot tÄ«mekli.
Es ilgu laiku esmu strÄdÄjis ar dažÄda veida Asterisk integrÄcijÄm, taÄu es nekad neesmu redzÄjis Å”o funkciju nekur pieminÄtu. Es biju pÄrsteigts, ka neviens neapraksta Å”o mijiedarbÄ«bas metodi ar PBX. Pat Ä«paÅ”i noderÄ«gi bija meklÄt informÄciju par Å”o tÄmu: praktiski nekÄ nav vai arÄ« tÄ tika izmantota pavisam citiem uzdevumiem.
WEB AMI - kÄds zvÄrs?
Opcijas pievienoÅ”ana Webabled uz failu vadÄ«tÄjs.conf nodroÅ”inÄja pilnÄ«gu piekļuvi ATS pÄrvaldÄ«bai, izmantojot tÄ«mekli. Visas komandas, kas pieejamas, izmantojot parasto AMI, tagad ir tÄ«meklÄ«, jÅ«s varat klausÄ«ties notikumus no PBX, izmantojot ligzdu. DarbÄ«bas princips neatŔķiras no konsoles AMI. PÄc Ŕīs opcijas aktivizÄÅ”anas varat sazinÄties ar PBX Å”ÄdÄs adresÄs:
Tad es domÄju: āTas ir risinÄjums! Tagad viss bÅ«s gatavs! Easy-peezy citrona squeezeyā, bet bija pÄragri priecÄties. Lai iegÅ«tu mums nepiecieÅ”amo informÄciju, pietiek izmantot GET pieprasÄ«jumu ar nepiecieÅ”amo darbÄ«bu rÄ«cÄ«ba, kas atbildÄ atgriež xml ar visu reÄ£istrÄciju sarakstu un to statusu. Tas viss ir lieliski, taÄu jums ir nepiecieÅ”ama atļauja, lai atcerÄtos sesiju no sÄ«kfaila. PÄrbaudot pÄrlÅ«kprogrammÄ, jÅ«s nedomÄjat par Å”o procesu.
AutorizÄcijas process
Vispirms mÄs uzrunÄjam adresi
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
Atbilde:
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>
Lai tur strÄdÄtu, vajag savrupmÄjas_id="6f5de42c", t.i., pats autorizÄcijas sÄ«kfails.
Saturs, kas jums vienkÄrÅ”i jÄpÄrbauda, āāāāvai ir atbilde "AutentifikÄcija pieÅemta" PÄc tam visiem zvaniem uz PBX serveri mums pieprasÄ«jumam bÅ«s jÄpievieno autorizÄcijas sÄ«kfails.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"
KÄ iegÅ«t autorizÄcijas sÄ«kfailu un izmantot to citos pieprasÄ«jumos, lasiet Å”eit: "
Lai izveidotu izsekoÅ”anas elementus programmÄ Zabbix, es izmantoÅ”u automÄtisko noteikÅ”anu.
AutomÄtiskÄ noteikÅ”ana
Lai automÄtiski noteiktu reÄ£istrÄcijas un izsekotu vienÄdranga stÄvokļus, jums jÄsazinÄs ar Å”o adresi:
Atbildot uz to, PBX atgriež mums XML atbildi:
<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>
AtbildÄ ir daudz atkritumu, tÄpÄc priekÅ”apstrÄdÄ mÄs to filtrÄjam pÄc veidnes XPath: //response/generic[@host]
Tad sÄkas jautrÄ«ba. Lai strÄdÄtu ar noteikÅ”anu un dinamiski izveidotu elementus, atbildei ir jÄbÅ«t JSON formÄtÄ. XML netiek atbalstÄ«ts automÄtiskai noteikÅ”anai.
Lai pÄrveidotu XML uz JSON, man bija nedaudz jÄpaspÄlÄjas ar automÄtisko nomaiÅu, kam es izveidoju skriptu JS valodÄ
Interesants punkts: ATS atbildÄ visus parametrus ieskauj atseviŔķas pÄdiÅas, un pÄc veidnes lietoÅ”anas //response/generic[@host] tos aizstÄj ar dubultiem.
Lai izveidotu elementus, mÄs izmantojam mainÄ«gos no XML atbildes (tagad JSON).
SIP reģistrs
Sip reÄ£istrÄcijai mÄs izmantojam trÄ«s mainÄ«gos: lietotÄjvÄrds, saimnieks, osta. Es biju apmierinÄts ar elementa nosaukumu [e-pasts aizsargÄts]: 5060, Es neesmu atradis nevienu situÄciju, kurÄ bÅ«tu jÄizmanto visi pieci mainÄ«gie.
Galvenais elements, kas saÅem informÄciju par visÄm reÄ£istrÄcijÄm, ZvaigznÄ«te ā AMI SIPshowregistry. Reizi minÅ«tÄ tas veic GET pieprasÄ«jumu
PÄrbaudot lÄ«dz 100 atkarÄ«giem elementiem, noslodzi nemanÄ«ju, bet ar 1700 elementiem tas deva manÄmu 15 sekunžu slodzi procesoram. Paturiet to prÄtÄ, ja jums ir liels skaits atkarÄ«go elementu.
KÄ iespÄju āizkliedÄtā slodzi vai iestatÄ«t elementam dažÄdas aptaujas frekvences, varat pÄrvietot apstrÄdes loÄ£iku katram elementam atseviŔķi.
Es neglabÄju saÅemto informÄciju galvenajÄ elementÄ. PirmkÄrt, es neredzu tam vajadzÄ«bu, un, otrkÄrt, ja atbilde ir lielÄka par 64 K, tad Zabbix to pÄrtrauc.
TÄ kÄ atkarÄ«gajam elementam mÄs izmantojam pilnu XML atbildi, mums ir jÄiegÅ«st Ŕī elementa vÄrtÄ«ba priekÅ”apstrÄdÄ. Caur XPath tas tiek darÄ«ts Å”Ädi:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ Valsts)
ReÄ£istrÄcijas statusiem es neizmantoju teksta statusus, bet konvertÄju tos ciparu formÄ, izmantojot JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP Peers
PÄc analoÄ£ijas ar SIP reÄ£istrÄciju ir galvenais Asterisk elements - AMI SIPshowregistry, kuram tiek pievienoti atkarÄ«gie.
TÄdÄjÄdi tiek izveidoti divi atkarÄ«gi elementi:
- Vienaudžu statuss teksta formÄ
- IerÄ«ces reakcijas laiks - ja statuss ir OK, tiek rakstÄ«ts ierÄ«ces reakcijas laiks, pretÄjÄ gadÄ«jumÄ ā-1ā
CeļŔ uz paÅ”u elementu ir nedaudz vienkÄrÅ”Äks XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@statuss)
Otrajam elementam atdalÄ«Å”anai izmantoju JavaScript reakcijas laiks no vienÄdranga statusa, jo tie tiek glabÄti kopÄ:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}
SecinÄjums
Izgatavots risinÄjums var bÅ«t sarežģīts un ne uzreiz skaidrs. Palielina elastÄ«bu un pÄrnesamÄ«bu starp dažÄdÄm sistÄmÄm
LaimÄ«gu un vieglu integrÄciju visiem! Veidne un instrukcijas iestatÄ«Å”anai
Avots: www.habr.com