Ankstesniame straipsnyje Aš jums pasakiau, kaip gauti autorizacijos seansą ir pakeisti jį į vietinę prieglobos makrokomandą. Šiame straipsnyje aš jums pasakysiu, kaip prijungti „Zabbix“ su „Asterisk“ be išorinių scenarijų ir programinės įrangos.
Idėja „susidraugauti“ su šiomis dviem sistemomis gimė jau seniai, neįdiegiant papildomos programinės įrangos ar scenarijų. Greitas googlinimas davė daug galimų sprendimų, viskas susivedė į tai, kad įkelkite scenarijus (Pyha, Bash, Python ir kt.) į serverį ir būsite laimingi. Norėjau įdiegti stebėjimą „iš dėžutės“ - be išorinių scenarijų ir įdiegiant papildomą programinę įrangą serveryje su stebėjimu ir PBX.
Iš viso su tuo praleidau 4 darbo dienas, bet rezultatas buvo to vertas. Darbas per AMI sąsają, žemo lygio aptikimas, trigeriai ir, svarbiausia, PBX ir visų kitų nustatymų prijungimas dabar trunka apie 15 minučių.
Galima įsigyti „Zabbix 4.4“, apie 100 „Asterisk“ 13 versijos vienetų. Kai kurie PBX turi „FreePBX“ žiniatinklio sąsają, kai kuriuose – plika konsolė, daugybė gudrybių ir integracija per telefono planą.
Duomenų priėmimas iš PBX
Pirmas ir pagrindinis dalykas, kurį reikia išspręsti, yra duomenų apie bendraamžius ir SIP registracijas gavimas. Tam tikslui PBX turi AGI, AMI, ARI ir SSH konsolių sąsajas. Dėl akivaizdžių priežasčių papildomų modulių nesvarsčiau.
Pirmiausia turime išsiaiškinti, kas yra šie agi, ami, ari...
- AGI - naudojant scenarijus rinkimo plane. Daugiausia naudojamas skambučių valdymui.
- AMI – gali suteikti visą reikiamą informaciją, veikia per 5038 prievadą, panašiai kaip Telnet. Mums tinka!
- ARI – modernus, madingas, JSON. Yra daug galimybių, duomenų formatas Zabbix suprantamas, bet man nėra pagrindinio dalyko: jūs negalite kontroliuoti gurkšnelių registracijos. Kitas trūkumas yra tas, kad bendraamžiams yra tik dvi būsenos prisijungus / neprisijungus, nors būsenų yra daugiau ir į jas pravartu atsižvelgti diagnozuojant.
- SSH gali padaryti viską, bet kartais tai neleidžiama dėl „saugumo priežasčių“. Svarstymai gali būti skirtingi, aš į juos nesileisiu.
Tačiau su visais trūkumais ARI patenkina 90 % visų stebėjimo poreikių.
Zabbix ir Telnet – mano nusivylimas
Gerai pažįstu AMI kažkada diegiau nuostolių sekimą pokalbiuose su padaliniais nuotoliniu būdu, skambučių valdymą ir pan. Su Telnet viskas taip pat labai aišku: atidarykite ryšį, išsiųskite komandas ir perskaitykite atsakymą. Taip ir padariau, bet rezultatas mane nuvylė.
„Zabbix“ „Telnet“ nėra tas pats, kas konsolės. LinuxJis šiek tiek paprastesnis ir skirtas standartiniam prisijungimo / slaptažodžio autentifikavimui. Jei autentifikavimo logika skiriasi ir neprašoma prisijungimo / slaptažodžio poros, įvyksta klaida. Nesėkmingai pabandęs apeiti autentifikavimo reikalavimą, pradėjau tyrinėti „Telnet“ modulio šaltinio kodą.
Supratau, kad kol nebus tradicinio prisijungimo ir slaptažodžio prašymo, į priekį nejudėsiu. Dėl pramogos pašalinau iš kodo viską, kas susiję su autorizavimu, ir viską perkūriau. Veikia! Bet jis neatitinka reikalavimų. Pirmyn…
Grįžkime prie paieškos
Dar kartą perskaičiau ARI dokumentaciją, atlikau papildomus testus - čia nėra gurkšnelių registracijų. Yra vaišės, yra pokalbiai, yra bridžai, bet nėra registracijų. Kažkuriuo metu net pagalvojau, ar tikrai reikia grifų registracijos?
Juokingo sutapimo dėka šiuo metu iš vartotojo gaunama dar viena užklausa su išeinančių skambučių problema. Problema buvo ta, kad sip registracija užšaldė ir buvo išspręsta tiesiog perkraunant modulį.
asterisk -rx "sip reload"Būtų puiku pasiekti AMI internetu: tai išspręstų visas problemas, pagalvojau. Pradedu kasti šia kryptimi ir pažodžiui pirmoji paieškos eilutė veda į oficialią Asterisk dokumentaciją, kurioje sakoma, kad yra galimybė atlikti mano užduotis internetinis faile /etc/asterisk/manager.conf, kurį skiltyje reikia nustatyti į TAIP [bendras]
Po to per įprastą formos žiniatinklio užklausą gauname visą reikiamą informaciją.
Kai naudojate „FreePBX“ sąsają, negalite įjungti šios parinkties per žiniatinklį, atlikdami pakeitimus faile manager.conf. „FreePBX“ jo neištrina, kai tinkle atliekami konfigūracijos pakeitimai.
Ilgą laiką dirbau su įvairiomis Asterisk integracijomis, bet niekur nemačiau šios funkcijos paminėtos. Nustebau, kad niekas neaprašo šio bendravimo su PBX būdo. Netgi buvo ypač naudinga ieškoti informacijos šia tema: praktiškai nieko nėra arba ji buvo naudojama visai kitokioms užduotims.
WEB AMI – koks žvėris?
Parinkties pridėjimas internetinis į failą manager.conf suteikė visišką prieigą prie ATS valdymo per internetą. Visos komandos, pasiekiamos per įprastą AMI, dabar yra žiniatinklyje, galite klausytis įvykių iš PBX per lizdą. Veikimo principas nesiskiria nuo konsolės AMI. Suaktyvinę šią parinktį, galite susisiekti su PBX šiais adresais:
— tinklalapis su paprasta sąsaja, skirta tikrinti ir rankiniu būdu siųsti užklausas. Visi atsakymai suformatuoti į skaitomą HTML. Nelabai tinka stebėjimui.
— tik teksto išvestis, formatas panašus į konsolės AMI
- tik teksto išvestis, XML formatu. Mums tinka!

Tada pagalvojau: „Štai sprendimas! Dabar viskas bus paruošta! Easy-peezy citrinos squeezey“, bet dar anksti džiaugtis. Norint gauti reikiamą informaciją, pakanka naudoti GET užklausą su reikiamais veiksmais veiksmas, kuris atsakydamas grąžina xml su visų registracijų sąrašu ir jų būsena. Visa tai puiku, bet jums reikia leidimo, kad prisimintumėte seansą iš slapuko. Kai bandote naršyklėje, apie šį procesą negalvojate.
Autorizacijos procesas
Pirmiausia nurodome adresą , atsakydamas, serveris atsiunčia mums slapuką su autorizacijos seansu. Štai kaip atrodo HTTP užklausa:
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: 1Atsakymas:
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> Norint ten dirbti reikia dvaro_id="6f5de42c“, t. y. pats autorizacijos slapukas.
Turinys, kurio jums tereikia patikrinti, ar yra atsakymas "Autentifikavimas priimtas“ Toliau, visiems skambučiams į PBX serverį, prie užklausos turėsime pridėti autorizacijos slapuką.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"Skaitykite, kaip gauti autorizacijos slapuką ir naudoti jį kitose užklausose: „»
Norėdami sukurti stebėjimo elementus „Zabbix“, naudosiu automatinį aptikimą.
Automatinis aptikimas
Norėdami automatiškai aptikti registracijas ir stebėti bendraamžių būsenas, turite susisiekti šiuo adresu: arba
Atsakydamas PBX grąžina mums XML atsakymą:
<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> Atsakyme yra daug šiukšlių, todėl išankstinio apdorojimo metu mes jį filtruojame pagal šabloną XPath: //response/generic[@host]
Tada prasideda linksmybės. Norint dirbti su aptikimu ir dinamiškai kurti elementus, atsakymas turi būti JSON formatu. XML nepalaikomas automatiniam aptikimui.
Norėdami konvertuoti XML į JSON, turėjau šiek tiek pažaisti su automatiniu pakeitimu, kuriam sukūriau scenarijų JS

Įdomus momentas: ATS atsakyme visi parametrai yra apsupti vienkartinėmis kabutėmis, o pritaikius šabloną //response/generic[@host] jie pakeičiami dvigubais.
Norėdami sukurti elementus, naudojame kintamuosius iš XML atsako (dabar JSON).

SIP registras
Sip registracijai naudojame tris kintamuosius: Nick, kariuomenė, uostas. Likau patenkinta elemento pavadinimu 111111@login.mtt.ru:5060, neradau situacijų, kai reikėtų naudoti visus penkis kintamuosius.
Pagrindinis elementas, kuris gauna informaciją apie visas registracijas, Žvaigždutė – AMI SIPshowregistry. Kartą per minutę jis pateikia GET užklausą , po kurio atsakymo XML duomenys perduodami visiems priklausomiems elementams analizuoti. Kiekvienai registracijai, kuri priklauso nuo jos, sukuriu elementą. Tai patogu, nes naujausią informaciją gauname vienoje užklausoje, o ne kiekvienai užklausai atskirai. Šis įgyvendinimas turi reikšmingą trūkumą - procesoriaus apkrovą.
Bandydamas iki 100 priklausomų elementų, apkrovos nepastebėjau, bet su 1700 elementų tai davė pastebimą 15 sekundžių apkrovą procesoriui. Turėkite tai omenyje, jei turite daug priklausomų elementų.
Jei norite „išskirstyti“ apkrovą arba nustatyti skirtingus elemento apklausos dažnius, galite perkelti apdorojimo logiką kiekvienam elementui atskirai.
Aš nekaupiu gautos informacijos pagrindiniame elemente. Pirma, nematau to poreikio, ir, antra, jei atsakymas yra didesnis nei 64 tūkst., „Zabbix“ jį nutraukia.
Kadangi priklausomam elementui naudojame visą XML atsaką, išankstinio apdorojimo metu turime gauti šio elemento vertę. Per XPath tai daroma taip:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ valstija)
Registracijos būsenoms nenaudojau tekstinių būsenų, o konvertavau jas į skaitinę formą naudodamas JavaScript:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP bendraamžiai
Pagal analogiją su SIP registracijomis yra pagrindinis Asterisk elementas - AMI SIPshowregistry, prie kurio pridedami priklausomi.
Tai sukuria du priklausomus elementus:
- Bendraamžių būsena teksto forma
- Įrenginio atsako laikas – jei būsena gera, įrašomas įrenginio reakcijos laikas, kitu atveju „-1“
Kelias iki paties elemento yra šiek tiek paprastesnis XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Antram elementui atskirti naudojau „JavaScript“. atsakymo laikas nuo lygiavertės būsenos, nes jie saugomi kartu:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}išvada
Paruoštas sprendimas gali būti sudėtingas ir ne iš karto aiškus. Padidina lankstumą ir perkeliamumą tarp skirtingų sistemų
Laimingos ir lengvos integracijos visiems! Šablonas ir nustatymo instrukcijos .
Šaltinis: www.habr.com
