Iepriekšējā rakstā Es teicu, kā saņemt autorizācijas sesiju un aizstāt to ar vietējo saimniekdatora makro. Šajā rakstā es jums pastāstīšu, kā savienot Zabbix ar Asterisk bez ārējiem skriptiem un programmatūras.
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.
Zabbix Telnet nav tas pats, kas konsoles Telnet. LinuxTas ir nedaudz vienkāršāks un paredzēts standarta pieteikšanās/paroles autentifikācijai. Ja autentifikācijas loģika atšķiras un netiek pieprasīts pieteikšanās/paroles pāris, rodas kļūda. Pēc neveiksmīga mēģinājuma apiet autentifikācijas prasību es sāku pētī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 mēs saņemam visu nepieciešamo informāciju.
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:
— tīmekļa lapa ar vienkāršu interfeisu pieprasījumu pārbaudei un manuālai nosūtīšanai. Visas atbildes ir formatētas lasāmā HTML formātā. Nav īpaši piemērots monitoringam.
— tikai teksta izvade, formāts līdzīgs konsoles AMI formātam
- tikai teksta izvade XML formātā. Mums der!

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 , atbildot uz to, serveris nosūta mums sīkfailu ar autorizācijas sesiju. Lūk, kā izskatās HTTP pieprasījums:
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: 1Atbilde:
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: vai
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 111111@login.mtt.ru: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ēc kura atbildes XML dati tiek nodoti visiem atkarīgajiem elementiem parsēšanai. Katrai reģistrācijai es izveidoju no tā atkarīgu elementu. Tas ir ērti, jo mēs saņemam aktuālo informāciju vienā pieprasījumā, nevis par katru pieprasījumu atsevišķi. Šai ieviešanai ir ievērojams trūkums - procesora slodze.
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
