Jinsi ya kuunganisha Zabbix na Nyota nje ya boksi

Katika makala iliyopita "Zabbix - kupanua mipaka ya jumla" Nilikuambia jinsi ya kupokea kikao cha uidhinishaji na kukibadilisha kuwa mwenyeji mkuu wa ndani. Katika makala hii nitakuambia jinsi ya kuunganisha Zabbix na Asterisk bila maandiko ya nje na programu.

Wazo la "kufanya marafiki" wa mifumo hii miwili ilizaliwa muda mrefu uliopita, bila kufunga programu au maandiko ya ziada. Utafutaji wa haraka ulitoa suluhisho nyingi zinazowezekana, yote yalipungua hadi ukweli kwamba pakia hati (katika Pyha, Bash, Python, nk) kwa seva, na utafurahiya. Nilitaka kutekeleza ufuatiliaji "nje ya boksi" - bila hati za nje na kusakinisha programu ya ziada kwenye seva na ufuatiliaji na PBX.

Nilitumia jumla ya siku 4 za kazi na hii, lakini matokeo yalikuwa ya thamani yake. Kufanya kazi kupitia kiolesura cha AMI, ugunduzi wa kiwango cha chini, vichochezi, na muhimu zaidi, kuunganisha PBX na mipangilio mingine yote sasa inachukua kama dakika 15.

Zabbix 4.4 inapatikana, takriban vipande 100 vya toleo la 13 la kinyota. Baadhi ya PBX huja na kiolesura cha wavuti cha FreePBX, zingine zikiwa na koni tupu, rundo la hila na ushirikiano kupitia dialplan.

Kupokea data kutoka kwa PBX

Jambo la kwanza na kuu linalohitaji kutatuliwa ni kupata data kuhusu usajili wa wenzao na usajili wa SIP. Kwa kusudi hili, PBX ina miingiliano ya kiweko cha AGI, AMI, ARI na SSH. Kwa sababu za wazi, sikuzingatia moduli za ziada.

Kwanza tunahitaji kujua hawa agi, ami, ari ni nini...

  • AGI - kwa kutumia maandishi kwenye dialplan. Inatumika sana kwa usimamizi wa simu.
  • AMI - inaweza kutoa taarifa zote muhimu, inafanya kazi kupitia bandari 5038, sawa na Telnet. Inatufaa!
  • ARI - kisasa, mtindo, JSON. Kuna uwezekano mwingi, muundo wa data unaeleweka kwa Zabbix, lakini kwangu hakuna jambo kuu: huwezi kudhibiti usajili wa sip. Ubaya mwingine ni kwamba kwa wenzako kuna majimbo mawili tu mkondoni/nje ya mtandao, ingawa kuna majimbo mengi na ni muhimu kuyazingatia wakati wa kugundua.
  • SSH inaweza kufanya kila kitu, lakini wakati mwingine hairuhusiwi kwa sababu ya "sababu za usalama". Mawazo yanaweza kuwa tofauti, sitaingia ndani yao.

Hata hivyo, pamoja na mapungufu yake yote, ARI inashughulikia 90% ya mahitaji yote ya ufuatiliaji.

Zabbix na Telnet - tamaa yangu

Ninajua AMI vizuri; wakati mmoja nilitekeleza ufuatiliaji wa hasara katika mazungumzo na mgawanyiko wa ofisi za mbali, usimamizi wa simu, nk. Kwa Telnet, kila kitu pia ni wazi sana: fungua uunganisho, tuma amri na usome majibu. Ndivyo nilivyofanya, lakini matokeo yalinikatisha tamaa.

Telnet katika Zabbix si sawa na katika kiweko cha Linux, ni rahisi zaidi na iliyoundwa kwa ajili ya uidhinishaji wa kawaida kama vile kuingia/nenosiri. Ikiwa mantiki ya uidhinishaji ni tofauti, na hakuna ombi la jozi la kuingia/nenosiri, hitilafu hutokea. Baada ya majaribio ya bure ya kupita hitaji la uidhinishaji, ilikuwa muhimu kuangalia msimbo wa chanzo wa moduli ya Telnet.

Niligundua kuwa hadi kuna ombi la jadi la kuingia na nenosiri, sitasonga mbele. Kwa kujifurahisha tu, niliondoa kila kitu kinachohusiana na idhini kutoka kwa msimbo na kuunganisha kila kitu. Kazi! Lakini haikidhi mahitaji. Endelea…

Hebu turudi kwenye utafutaji

Nilisoma tena hati za ARI, nikafanya majaribio ya ziada - hakuna usajili wa sip hapa. Kuna sikukuu, kuna mazungumzo, kuna breeches, lakini hakuna usajili. Wakati fulani hata nilifikiria, je, tunahitaji usajili wa tai?

Kwa bahati mbaya ya kuchekesha, kwa wakati huu ombi lingine huwasili kutoka kwa mtumiaji, na shida na simu zinazotoka. Shida ilikuwa kwamba usajili wa sip ulikuwa wa kufungia na ulitatuliwa kwa kuanzisha tena moduli.

asterisk -rx "sip reload"

Itakuwa nzuri kupata AMI kwenye wavuti: hiyo ingesuluhisha shida zote, nilifikiria. Ninaanza kuchimba katika mwelekeo huu, na kwa kweli mstari wa kwanza wa utaftaji unaongoza kwa hati rasmi ya kinyota, ambayo inasema kwamba kuna chaguo kwa kazi zangu. imewashwa katika faili /etc/asterisk/manager.conf, ambayo inahitaji kuwekwa kwa NDIYO, katika sehemu [jumla]

Baada ya hayo, kupitia ombi la kawaida la wavuti la fomu http://ats:8089/mxml?action=SIPshowregistry tunapata taarifa zote muhimu.

Unapotumia kiolesura cha FreePBX, huwezi kuwezesha chaguo hili kupitia wavuti; unahitaji kuiwasha kupitia kiweko kwa kufanya mabadiliko kwenye faili ya manager.conf. FreePBX haifuti wakati mabadiliko ya usanidi yanafanywa kupitia wavuti.

Nimefanya kazi na aina anuwai za miunganisho ya kinyota kwa muda mrefu, lakini sijawahi kuona kipengele hiki kikitajwa popote. Nilishangaa kuwa hakuna mtu anayeelezea njia hii ya kuingiliana na PBX. Ilikuwa muhimu sana kutafuta habari juu ya mada hii: hakuna chochote au ilitumika kwa kazi tofauti kabisa.

WEB AMI - ni aina gani ya mnyama?

Kuongeza chaguo imewashwa faili meneja.conf ilitoa ufikiaji kamili kwa usimamizi wa ATS kupitia wavuti. Amri zote zinazopatikana kupitia AMI ya kawaida sasa ziko kwenye wavuti, unaweza kusikiliza matukio kutoka kwa PBX kupitia soketi. Kanuni ya operesheni sio tofauti na AMI ya console. Baada ya kuwezesha chaguo hili, unaweza kuwasiliana na PBX kwa anwani zifuatazo:

https://ats:8089/manager - ukurasa wa wavuti wenye kiolesura rahisi cha majaribio na kutuma maombi kwa mikono. Majibu yote yamepangwa kuwa HTML inayoweza kusomeka. Haifai sana kwa ufuatiliaji.
https://ats:8089/rawman β€” pato la maandishi pekee, umbizo sawa na console AMI
https://ats:8089/mxml - pato la maandishi pekee, katika umbizo la XML. Inatufaa!

Jinsi ya kuunganisha Zabbix na Nyota nje ya boksi

Kisha nikafikiri: β€œHili ndilo suluhisho! Sasa kila kitu kitakuwa tayari! Lemon-peezy squeezey,” lakini ilikuwa mapema mno kushangilia. Ili kupata maelezo tunayohitaji, inatosha kutumia ombi la GET na hatua inayohitajika hatua, ambayo kwa kujibu hurejesha xml na orodha ya usajili wote na hali zao. Hii yote ni nzuri, lakini unahitaji idhini ya kukumbuka kikao kutoka kwa kuki. Unapojaribu kwenye kivinjari, haufikiri juu ya mchakato huu.

Mchakato wa idhini

Kwanza tunashughulikia anwani http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, kwa kujibu, seva hututumia kuki na kipindi cha uidhinishaji. Hivi ndivyo ombi la HTTP linavyoonekana:

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

Jibu:

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>

Kufanya kazi huko unahitaji kitambulisho_cha_nyumba="6f5de42c", yaani, kidakuzi chenyewe cha uidhinishaji.
Maudhui unahitaji tu kuangalia jibu "Uthibitishaji umekubaliwa" Ifuatayo, kwa simu zote kwa seva ya PBX, tutahitaji kuongeza kidakuzi cha uidhinishaji kwa ombi.

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

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

Soma jinsi ya kupata kidakuzi cha idhini na uitumie katika maombi mengine hapa: "Zabbix - kupanua mipaka ya jumlaΒ»

Ili kuunda vipengele vya ufuatiliaji katika Zabbix nitatumia ugunduzi wa kiotomatiki.

Utambuzi wa kiotomatiki

Ili kugundua usajili na kufuatilia hali kiotomatiki, unahitaji kuwasiliana na anwani ifuatayo: https://ats:8089/mxml?action=SIPshowregistry au https://ats:8089/mxml?action=SIPpeers

Kwa kujibu, PBX inaturudishia jibu la XML:

<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>

Kuna takataka nyingi katika majibu, kwa hivyo katika usindikaji wa awali tunachuja kwa kiolezo XPath: //response/generic[@mwenyeji]
Kisha furaha huanza. Ili kufanya kazi na utambuzi na kuunda vipengee kwa nguvu, jibu lazima liwe katika umbizo la JSON. XML haitumiki kwa utambuzi wa kiotomatiki.

Ili kubadilisha XML kuwa JSON, ilibidi nicheze kidogo na uingizwaji otomatiki, ambayo nilitengeneza hati katika JS.

Jinsi ya kuunganisha Zabbix na Nyota nje ya boksi

Jambo la kufurahisha: katika majibu ya ATS, vigezo vyote vimezungukwa na nukuu moja, na baada ya kutumia kiolezo. //response/generic[@mwenyeji] hubadilishwa na mbili.

Ili kuunda vipengee, tunatumia vigeu kutoka kwa majibu ya XML (sasa ni JSON).

Jinsi ya kuunganisha Zabbix na Nyota nje ya boksi

Usajili wa SIP

Kwa usajili wa sip tunatumia vigezo vitatu: username, jeshi, bandari. Nilifurahi na jina la kipengele [barua pepe inalindwa]: 5060, sijapata hali yoyote ambapo unahitaji kutumia anuwai zote tano.

Kipengele kikuu kinachopokea habari kuhusu usajili wote, Asterisk - AMI SIPshowregistry. Mara moja kwa dakika hufanya ombi la GET https://ats:8089/mxml?action=SIPshowregistry, baada ya hapo data ya majibu ya XML hupitishwa kwa vipengele vyote tegemezi kwa uchanganuzi. Kwa kila usajili mimi huunda kipengee kinachoitegemea. Hii ni rahisi kwa sababu tunapokea taarifa za hivi punde katika ombi moja, na si kwa kila ombi kivyake. Utekelezaji huu una shida kubwa - mzigo kwenye processor.

Wakati wa kupima hadi vipengele 100 vinavyotegemea, sikuona mzigo, lakini kwa vipengele 1700, hii ilitoa mzigo unaoonekana wa sekunde 15 kwenye processor. Kumbuka hili ikiwa una idadi kubwa ya vipengele tegemezi.

Kama chaguo la "kueneza" mzigo au kuweka masafa tofauti ya upigaji kura kwa kipengele, unaweza kuhamisha mantiki ya uchakataji kwa kila kipengele kando.

Sihifadhi habari iliyopokelewa katika kipengele kikuu. Kwanza, sioni haja ya hili, na pili, ikiwa majibu ni zaidi ya 64K, basi Zabbix huikata.

Kwa kuwa tunatumia jibu kamili la XML kwa kipengele tegemezi, tunahitaji kupata thamani ya kipengele hiki katika kuchakata mapema. Kupitia XPath imefanywa kama hii:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT})"]/@ jimbo)
Kwa hali za usajili, sikutumia hali za maandishi, lakini nilizibadilisha kuwa fomu ya nambari kwa kutumia JavaScript:

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

SIP Wenzake

Kwa mlinganisho na usajili wa SIP, kuna kipengele kikuu cha Asterisk - AMI SIPshowregistry, ambayo tegemezi huongezwa.

Hii inaunda vitu viwili tegemezi:

  • Hali ya rika katika umbo la maandishi
  • Muda wa majibu ya kifaa - ikiwa hali ni sawa, basi wakati wa majibu ya kifaa huandikwa, vinginevyo "-1"

Njia ya kipengele yenyewe ni rahisi kidogo XPath:

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

Kwa kipengele cha pili nilitumia JavaScript kutenganisha wakati wa kujibu kutoka kwa hali ya rika, kwani zimehifadhiwa pamoja:

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

Hitimisho

Suluhisho la nje ya sanduku linaweza kuwa ngumu na sio wazi mara moja. Huongeza kubadilika na kubebeka kati ya mifumo tofauti

Furaha na ushirikiano rahisi kila mtu! Kiolezo na maagizo ya kusanidi GitHub.

Chanzo: mapenzi.com

Kuongeza maoni