Како да го поврзете Zabbix со Asterisk надвор од кутијата

Во претходниот напис „Zabbix - проширување на макро границите“ Ви кажав како да примите сесија за овластување и да ја замените во макро за локален домаќин. Во оваа статија ќе ви кажам како да поврзете Zabbix со Asterisk без надворешни скрипти и софтвер.

Идејата да се „дружиме“ со овие два системи се роди многу одамна, без да се инсталира дополнителен софтвер или скрипти. Брзото гуглање даде многу можни решенија, сето тоа се сведуваше на фактот дека прикачете ги скриптите (во Pyha, Bash, Python итн.) на серверот и ќе бидете среќни. Сакав да спроведам мониторинг „надвор од кутијата“ - без надворешни скрипти и инсталирање дополнителен софтвер на серверот со мониторинг и PBX.

Поминав вкупно 4 работни дена со ова, но резултатот вредеше. Работата преку интерфејсот AMI, откривањето на ниско ниво, активирачите и што е најважно, поврзувањето на PBX и сите други поставки сега трае околу 15 минути.

Zabbix 4.4 е достапен, околу 100 парчиња од Asterisk верзија 13. Некои PBX доаѓаат со веб-интерфејс FreePBX, некои со гола конзола, куп трикови и интеграција преку план за бирање.

Примање податоци од PBX

Првата и главна точка што треба да се реши е добивањето податоци за врсниците и регистрацијата на SIP. За таа цел, PBX има AGI, AMI, ARI и SSH конзолни интерфејси. Од очигледни причини, не размислував за дополнителни модули.

Прво треба да откриеме што се овие аги, ами, ари...

  • AGI - користење скрипти во планот за бирање. Главно се користи за управување со повици.
  • AMI - може да ги обезбеди сите потребни информации, работи преку порта 5038, слично на Телнет. Ни одговара!
  • ARI - модерен, модерен, JSON. Има многу можности, форматот на податоци е разбирлив за Zabbix, но за мене нема главна работа: не можете да ја контролирате регистрацијата на голтка. Друг недостаток е тоа што за врсниците има само две состојби онлајн/офлајн, иако има повеќе состојби и корисно е да се земат предвид при дијагностицирање.
  • SSH може да направи сè, но понекогаш не е дозволено поради „безбедносни причини“. Размислувањата може да бидат различни, нема да навлегувам во нив.

Сепак, со сите свои недостатоци, ARI покрива 90% од сите потреби за следење.

Забикс и Телнет - мое разочарување

Добро го познавам AMI едно време имплементирав следење на загубите во разговори со поделба по оддалечени канцеларии, управување со повици итн. Со Телнет, сè е исто така многу јасно: отворете ја врската, испратете ги командите и прочитајте го одговорот. Така направив, но резултатот ме разочара.

Телнетот на Забикс не е ист како оној на конзолата. LinuxМалку е поедноставно и дизајнирано за стандардна автентикација со најавување/лозинка. Ако логиката за автентикација е различна и нема побаран пар најавување/лозинка, се јавува грешка. Откако неуспешно се обидов да го заобиколам барањето за автентикација, почнав да го разгледувам изворниот код на Telnet модулот.

Сфатив дека додека нема традиционално барање за најава и лозинка, нема да одам напред. Само за забава, извадив се што е поврзано со овластување од кодот и повторно составив сè. Работи! Но, тоа не ги исполнува условите. Само напред…

Да се ​​вратиме на потрагата

Повторно ја прочитав документацијата на ARI, направив дополнителни тестови - тука нема регистрации за голтка. Има гозби, има муабети, има панталони, но нема регистрација. Во одреден момент дури помислив, дали навистина ни треба регистрација на мршојадците?

По смешна случајност, во овој момент пристигнува уште едно барање од корисникот, со проблем со појдовните повици. Проблемот беше што регистрацијата на голтка беше замрзната и беше решена со едноставно рестартирање на модулот.

asterisk -rx "sip reload"

Би било одлично да се пристапи до AMI преку интернет: тоа ќе ги реши сите проблеми, си помислив. Почнувам да копам во оваа насока, и буквално првата линија за пребарување води до официјалната документација на Asterisk, која вели дека има опција за моите задачи веб-овозможено во датотека /etc/asterisk/manager.conf, што треба да се постави на ДА, во делот [општо]

По ова, преку редовно веб барање на формуларот http://ats:8089/mxml?action=SIPshowregistry ги добиваме сите потребни информации.

Кога го користите интерфејсот FreePBX, не можете да ја овозможите оваа опција преку веб, треба да ја овозможите преку конзолата со правење промени во датотеката manager.conf. FreePBX не го брише кога промените во конфигурацијата се прават преку веб.

Долго време работев со различни видови интеграции на Asterisk, но никогаш не сум видел никаде да се споменува оваа функција. Бев изненаден што никој не го опишува овој метод на интеракција со PBX. Дури беше особено корисно да се бараат информации за оваа тема: практично нема ништо или се користеше за сосема различни задачи.

WEB AMI - каков вид на ѕвер?

Додавање опција веб-овозможено да поднесе менаџер.conf обезбеди целосен пристап до управувањето со АТС преку веб. Сите команди достапни преку обичен AMI сега се на интернет, можете да слушате настани од PBX преку приклучок. Принципот на работа не се разликува од конзолата AMI. Откако ќе ја активирате оваа опција, можете да контактирате со PBX на следните адреси:

https://ats:8089/manager — веб-страница со едноставен интерфејс за тестирање и рачно испраќање барања. Сите одговори се форматирани во читлив HTML. Не е многу погоден за следење.
https://ats:8089/rawman — Само за излез на текст, формат сличен на конзолата AMI
https://ats:8089/mxml - само излез на текст, во XML формат. Ни одговара!

Како да го поврзете Zabbix со Asterisk надвор од кутијата

Тогаш си помислив: „Ова е решението! Сега сè ќе биде подготвено! Лесно цеден лимон, но рано беше да се радуваме. За да ги добиеме информациите што ни се потребни, доволно е да користиме барање за GET со потребното дејство акција, кој како одговор враќа xml со листа на сите регистрации и нивниот статус. Сето ова е одлично, но ви треба овластување за да ја запомните сесијата од колачето. Кога тестирате во прелистувачот, не размислувате за овој процес.

Процес на овластување

Прво се обраќаме на адресата http://ats:8089/mxml?action=login&username=zabbix&secret=zabbix, како одговор, серверот ни испраќа колаче со сесијата за авторизација. Вака изгледа барањето HTTP:

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

Одговор:

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>

За да работите таму ви треба mansession_id="6f5de42c“, т.е. самото колаче за авторизација.
Содржината што треба само да ја проверите за одговорот“Автентикацијата е прифатена" Следно, за сите повици до серверот PBX, ќе треба да додадеме колаче за авторизација на барањето.

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

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

Прочитајте како да добиете колаче за авторизација и да го користите во други барања овде:Zabbix - проширување на макро границите»

За да креирам елементи за следење во Zabbix, ќе користам автоматско откривање.

Автоматско откривање

За автоматски да откриете регистрации и да ги следите состојбите на врсниците, треба да контактирате на следнава адреса: https://ats:8089/mxml?action=SIPshowregistry или https://ats:8089/mxml?action=SIPpeers

Како одговор, PBX ни враќа 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>

Има многу ѓубре во одговорот, па при претходна обработка го филтрираме по шаблон XPath: //response/generic[@host]
Тогаш започнува забавата. За да работите со откривање и динамички да креирате елементи, одговорот мора да биде во JSON формат. XML не е поддржан за автоматско откривање.

За да конвертирам XML во JSON, морав малку да играм со автоматска замена, за што направив скрипта во JS

Како да го поврзете Zabbix со Asterisk надвор од кутијата

Интересна точка: во одговорот на ATS, сите параметри се опкружени со единечни наводници, а по примената на шаблонот //response/generic[@host] тие се заменуваат со двојни.

За да создадеме елементи, користиме променливи од XML одговорот (сега JSON).

Како да го поврзете Zabbix со Asterisk надвор од кутијата

SIP регистар

За регистрација на голтки користиме три променливи: корисничко име, домаќин, пристаниште. Бев среќен со името на елементот 111111@login.mtt.ru:5060, Не најдов никакви ситуации каде што треба да ги користите сите пет променливи.

Главниот елемент кој добива информации за сите регистрации, Ѕвездичка - AMI SIPshowregistry. Еднаш во минута испраќа барање за GET https://ats:8089/mxml?action=SIPshowregistry, по што XML податоците од одговорот се пренесуваат до сите зависни елементи за парсирање. За секоја регистрација создавам елемент зависен од него. Ова е погодно бидејќи добиваме ажурирани информации во едно барање, а не за секое барање посебно. Оваа имплементација има значителен недостаток - оптоварувањето на процесорот.

При тестирање до 100 зависни елементи, не го забележав оптоварувањето, но со 1700 елементи, ова даде забележително оптоварување од 15 секунди на процесорот. Имајте го ова на ум ако имате голем број зависни елементи.

Како опција за „раширување“ на оптоварувањето или поставување на различни фреквенции на избирање за некој елемент, можете да ја преместите логиката на обработка на секој елемент посебно.

Не ги чувам добиените информации во главниот елемент. Прво, не гледам потреба за ова, и второ, ако одговорот е повеќе од 64K, тогаш Zabbix го прекинува.

Бидејќи користиме целосен XML одговор за зависниот елемент, треба да ја добиеме вредноста на овој елемент при претпроцесирање. Преку XPath направено е вака:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ држава)
За статусите на регистрација, не користев текстуални статуси, туку ги претворив во нумеричка форма користејќи JavaScript:

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

SIP Peers

По аналогија со SIP-регистрациите, постои главен елемент на Asterisk - AMI SIPshowregistry, на кој се додаваат зависните.

Ова создава два зависни елементи:

  • Статус на врсници во текстуална форма
  • Време на одговор на уредот - ако статусот е во ред, тогаш времето на одговор на уредот е напишано, инаку „-1“

Патот до самиот елемент е малку поедноставен XPath:

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

За вториот елемент користев JavaScript за одвојување време на одговор од статусот на врсници, бидејќи тие се зачувани заедно:

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

Заклучок

Решението надвор од кутијата може да биде сложено и да не биде веднаш јасно. Ја зголемува флексибилноста и преносливоста помеѓу различни системи

Среќна и лесна интеграција на сите! Шаблон и упатства за поставување GitHub.

Извор: www.habr.com

Купете доверлив хостинг за сајтови со DDoS заштита, VPS VDS сервери 🔥 Купете сигурен веб-хостинг со DDoS заштита, VPS VDS сервери | ProHoster