Zabbix-i Asterisk ilə qutudan necə bağlamaq olar

Bir əvvəlki məqalədə "Zabbix - genişlənən makro sərhədlər" Mən sizə avtorizasiya sessiyasını necə qəbul edəcəyinizi və onu yerli host makrosuna necə əvəz edəcəyinizi söylədim. Bu yazıda sizə Zabbix-i Asterisk ilə xarici skriptlər və proqram təminatı olmadan necə birləşdirəcəyini söyləyəcəyəm.

Bu iki sistemlə “dostlaşmaq” ideyası çoxdan, əlavə proqram təminatı və ya skript quraşdırmadan yaranıb. Sürətli axtarış bir çox mümkün həll yollarını verdi, hamısı skriptləri (Pyha, Bash, Python və s.) serverə yükləməklə nəticələndi və siz xoşbəxt olacaqsınız. Xarici skriptlər olmadan və monitorinq və PBX ilə serverə əlavə proqram quraşdırmadan "qutudan kənar" monitorinq həyata keçirmək istədim.

Bununla cəmi 4 iş günü sərf etdim, amma nəticə buna dəyərdi. AMI interfeysi ilə işləmək, aşağı səviyyəli aşkarlama, tetikleyiciler və ən əsası, PBX və bütün digər parametrləri birləşdirmək indi təxminən 15 dəqiqə çəkir.

Zabbix 4.4 mövcuddur, təxminən 100 ədəd Asterisk versiyası 13. Bəzi ATS-lər FreePBX veb interfeysi, bəziləri isə çılpaq konsol, bir sıra fəndlər və dialplan vasitəsilə inteqrasiya ilə gəlir.

ATS-dən məlumatların qəbulu

Həll edilməli olan ilk və əsas məqam həmyaşıdlar və SIP qeydiyyatları haqqında məlumatların əldə edilməsidir. Bu məqsədlə ATS-də AGI, AMI, ARI və SSH konsol interfeysləri mövcuddur. Məlum səbəblərdən əlavə modulları nəzərə almadım.

Əvvəlcə bu agi, ami, ari nə olduğunu anlamalıyıq...

  • AGI - dialplanda skriptlərdən istifadə. Əsasən zənglərin idarə edilməsi üçün istifadə olunur.
  • AMI - bütün lazımi məlumatları verə bilər, Telnet-ə bənzər port 5038 vasitəsilə işləyir. Bizə yaraşır!
  • ARI - müasir, dəbli, JSON. Çox imkanlar var, məlumat formatı Zabbix üçün başa düşüləndir, amma mənim üçün əsas şey yoxdur: siz qurtumların qeydiyyatını idarə edə bilməzsiniz. Digər bir çatışmazlıq ondan ibarətdir ki, həmyaşıdlar üçün onlayn/offlayn yalnız iki ştat var, baxmayaraq ki, daha çox ştat var və diaqnoz qoyarkən onları nəzərə almaq faydalıdır.
  • SSH hər şeyi edə bilər, lakin bəzən "təhlükəsizlik səbəbi ilə" icazə verilmir. Mülahizələr fərqli ola bilər, mən onlara daxil olmayacağam.

Bununla belə, bütün çatışmazlıqları ilə ARI bütün monitorinq ehtiyaclarının 90%-ni əhatə edir.

Zabbix və Telnet - mənim məyusluğum

Mən AMİ-ni yaxşı tanıyıram, bir vaxtlar uzaq ofislər tərəfindən bölmə ilə söhbətlərdə itkilərin izlənməsini, zənglərin idarə edilməsini və s. Telnet ilə də hər şey çox aydındır: əlaqəni açın, əmrləri göndərin və cavabı oxuyun. Mən belə etdim, amma nəticə məni məyus etdi.

Zabbix-dəki Telnet Linux konsolunda olduğu kimi deyil, bir az daha sadədir və giriş/parol kimi standart avtorizasiya üçün uyğunlaşdırılmışdır. Avtorizasiya məntiqi fərqlidirsə və giriş/parol cütü üçün sorğu yoxdursa, xəta baş verir. Avtorizasiya tələbindən yan keçmək üçün edilən boş cəhdlərdən sonra Telnet modulunun mənbə koduna baxmaq faydalı oldu.

Başa düşdüm ki, ənənəvi giriş və parol sorğusu olana qədər irəli getməyəcəm. Sadəcə əylənmək üçün mən avtorizasiya ilə bağlı hər şeyi koddan sildim və hər şeyi yenidən yığdım. işləyir! Amma tələblərə cavab vermir. Davam et...

Axtarışa qayıdaq

ARI sənədlərini yenidən oxudum, əlavə testlər keçirdim - burada heç bir qurtum qeydiyyatı yoxdur. Ziyafət var, söhbət var, şalvar var, amma qeydiyyat yoxdur. Bir anda mən hətta düşündüm ki, həqiqətən də bizə qarğanın qeydiyyatı lazımdırmı?

Gülməli bir təsadüflə, bu anda istifadəçidən gedən zənglərdə problem olan başqa bir sorğu gəlir. Problem onda idi ki, qurtum qeydiyyatı donurdu və sadəcə modulu yenidən işə salmaqla həll edildi.

asterisk -rx "sip reload"

AMI-yə internet üzərindən daxil olmaq əla olardı: bu, bütün problemləri həll edərdi, mən düşündüm. Mən bu istiqamətdə qazmağa başlayıram və sözün əsl mənasında ilk axtarış xətti rəsmi Ulduz sənədlərinə gətirib çıxarır ki, bu da mənim vəzifələrim üçün bir seçim olduğunu söyləyir. veb-aktivdir faylda /etc/asterisk/manager.confbölməsində YES olaraq təyin edilməli olan [ümumi]

Bundan sonra, formanın müntəzəm veb sorğusu vasitəsilə http://ats:8089/mxml?action=SIPshowregistry bütün lazımi məlumatları alırıq.

FreePBX interfeysindən istifadə edərkən siz bu seçimi internet vasitəsilə aktivləşdirə bilməzsiniz, siz manager.conf faylında dəyişiklik etməklə onu konsol vasitəsilə aktivləşdirməlisiniz. İnternet vasitəsilə konfiqurasiya dəyişiklikləri edildikdə FreePBX onu silmir.

Mən uzun müddətdir ki, müxtəlif növ Asterisk inteqrasiyaları ilə işləmişəm, lakin bu xüsusiyyətin heç bir yerdə qeyd olunduğunu görməmişəm. Heç kimin ATS ilə qarşılıqlı əlaqənin bu üsulunu təsvir etməməsinə təəccübləndim. Bu mövzuda məlumat axtarmaq hətta xüsusilə faydalı idi: praktiki olaraq heç bir şey yoxdur və ya tamamilə fərqli vəzifələr üçün istifadə edilmişdir.

WEB AMI - hansı heyvandır?

Seçim əlavə edilir veb-aktivdir sənədləşdirmək manager.conf internet vasitəsilə ATS idarəçiliyinə tam girişi təmin etdi. Adi AMI vasitəsilə mövcud olan bütün əmrlər artıq internetdədir, siz ATS-dən hadisələri rozetka vasitəsilə dinləyə bilərsiniz. Əməliyyat prinsipi AMI konsolundan fərqlənmir. Bu seçimi aktivləşdirdikdən sonra aşağıdakı ünvanlar üzrə ATS ilə əlaqə saxlaya bilərsiniz:

https://ats:8089/manager — sorğuların sınaqdan keçirilməsi və əl ilə göndərilməsi üçün sadə interfeysə malik veb səhifə. Bütün cavablar oxuna bilən HTML formatında formatlanır. Monitorinq üçün çox uyğun deyil.
https://ats:8089/rawman — yalnız mətn çıxışı, AMI konsoluna bənzər format
https://ats:8089/mxml - yalnız XML formatında mətn çıxışı. Bizə yaraşır!

Zabbix-i Asterisk ilə qutudan necə bağlamaq olar

Sonra düşündüm: “Həll budur! İndi hər şey hazır olacaq! Limon sıxmaq asan,” amma sevinmək üçün hələ tez idi. Bizə lazım olan məlumatı əldə etmək üçün lazımi hərəkətlə GET sorğusundan istifadə etmək kifayətdir fəaliyyət, cavab olaraq bütün qeydiyyatların siyahısı və onların statusu ilə xml qaytarır. Bütün bunlar əladır, lakin kukidən sessiyanı yadda saxlamaq üçün sizə icazə lazımdır. Brauzerdə sınaqdan keçirdiyiniz zaman bu proses haqqında düşünmürsünüz.

Avtorizasiya prosesi

Əvvəlcə ünvanı qeyd edirik http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, cavab olaraq server bizə avtorizasiya sessiyası ilə kuki göndərir. HTTP sorğusu belə görünür:

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

Cavab:

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>

Orada işləmək üçün sizə lazımdır mansession_id="6f5de42c", yəni avtorizasiya kukisinin özü.
Məzmunu yalnız cavabı yoxlamaq lazımdır "Doğrulama qəbul edildi" Bundan sonra, PBX serverinə edilən bütün zənglər üçün sorğuya icazə kukisi əlavə etməliyik.

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

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

Avtorizasiya kukisini necə əldə etməyi və ondan digər sorğularda istifadə etməyi burada oxuyun: “Zabbix - makro sərhədləri genişləndirir»

Zabbix-də izləmə elementləri yaratmaq üçün avtomatik aşkarlamadan istifadə edəcəyəm.

Avtomatik aşkarlama

Qeydiyyatları avtomatik aşkar etmək və həmyaşıd dövlətləri izləmək üçün aşağıdakı ünvanla əlaqə saxlamalısınız: https://ats:8089/mxml?action=SIPshowregistry və ya https://ats:8089/mxml?action=SIPpeers

Cavab olaraq, PBX bizə XML cavabını qaytarır:

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

Cavabda çoxlu zibil var, ona görə də ilkin emal zamanı biz onu şablonla süzürük XPath: //cavab/ümumi[@host]
Sonra əyləncə başlayır. Aşkarlama ilə işləmək və elementləri dinamik şəkildə yaratmaq üçün cavab JSON formatında olmalıdır. XML avtomatik aşkarlamalar üçün dəstəklənmir.

XML-i JSON-a çevirmək üçün avtomatik dəyişdirmə ilə bir az oynamalı oldum, bunun üçün JS-də skript hazırladım.

Zabbix-i Asterisk ilə qutudan necə bağlamaq olar

Maraqlı bir məqam: ATS cavabında bütün parametrlər tək dırnaqlarla əhatə olunub və şablon tətbiq edildikdən sonra //cavab/ümumi[@host] onlar ikiqat olanlarla əvəz olunur.

Elementlər yaratmaq üçün biz XML cavabından (indi JSON) dəyişənlərdən istifadə edirik.

Zabbix-i Asterisk ilə qutudan necə bağlamaq olar

SIP Qeydiyyatı

Sip qeydiyyatı üçün üç dəyişəndən istifadə edirik: istifadəçi adı, sahib, port. Elementin adından məmnun qaldım [e-poçt qorunur]: 5060, Mən beş dəyişənin hamısından istifadə etməyiniz lazım olan heç bir vəziyyət tapmadım.

Bütün qeydiyyatlar haqqında məlumat alan əsas element, Ulduz - AMI SIPshowregistr. Dəqiqədə bir dəfə GET sorğusu göndərir https://ats:8089/mxml?action=SIPshowregistry, bundan sonra cavab XML məlumatları təhlil üçün bütün asılı elementlərə ötürülür. Hər qeydiyyat üçün mən ondan asılı element yaradıram. Bu rahatdır, çünki biz hər bir sorğu üçün ayrılıqda deyil, ən son məlumatları bir sorğuda alırıq. Bu tətbiqin əhəmiyyətli bir çatışmazlığı var - prosessorun yükü.

100-ə qədər asılı elementi sınaqdan keçirərkən, yükü görmədim, lakin 1700 elementlə bu, prosessorda nəzərəçarpacaq dərəcədə 15 saniyəlik bir yük verdi. Çox sayda asılı elementiniz varsa, bunu unutmayın.

Yükü "yaymaq" və ya bir element üçün müxtəlif sorğu tezlikləri təyin etmək üçün bir seçim olaraq, emal məntiqini hər bir elementə ayrıca köçürə bilərsiniz.

Alınan məlumatları əsas elementdə saxlamıram. Birincisi, buna ehtiyac görmürəm və ikincisi, cavab 64K-dan çox olarsa, Zabbix onu kəsir.

Asılı element üçün tam XML cavabından istifadə etdiyimiz üçün əvvəlcədən emalda bu elementin dəyərini almalıyıq. vasitəsilə XPath bu belə edilir:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ dövlət)
Qeydiyyat statusları üçün mətn statuslarından istifadə etmədim, JavaScript istifadə edərək onları rəqəmsal formaya çevirdim:

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

SIP həmyaşıdları

SIP qeydiyyatlarına bənzətməklə, Asterisk-in əsas elementi var - AMI SIPshowregistr, ona asılı olanlar əlavə olunur.

Bu, iki asılı element yaradır:

  • Mətn şəklində həmyaşıd statusu
  • Cihazın cavab müddəti - vəziyyət yaxşıdırsa, cihazın cavab müddəti yazılır, əks halda "-1"

Elementin özünə gedən yol bir az daha sadədir XPath:

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

İkinci element üçün ayırmaq üçün JavaScript-dən istifadə etdim cavab müddəti həmyaşıd statusundan, çünki onlar birlikdə saxlanılır:

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

Nəticə

Hazır bir həll mürəkkəb ola bilər və dərhal aydın deyil. Müxtəlif sistemlər arasında çevikliyi və daşınma qabiliyyətini artırır

Hər kəsə xoşbəxt və asan inteqrasiya! Şablon və quraşdırma təlimatları Github.

Mənbə: www.habr.com

Добавить комментарий