Մի նախորդ հոդվածում
Այս երկու համակարգերին «ընկերանալու» գաղափարը ծնվել է շատ վաղուց՝ առանց լրացուցիչ ծրագրերի կամ սկրիպտների տեղադրման։ Արագ googling-ը տվեց բազմաթիվ հնարավոր լուծումներ, ամեն ինչ հանգեցրեց նրան, որ վերբեռնեք սկրիպտները (Pyha, Bash, Python և այլն) սերվեր, և դուք երջանիկ կլինեք: Ես ուզում էի իրականացնել մոնիտորինգ «դուրս արկղից»՝ առանց արտաքին սկրիպտների և սերվերի վրա լրացուցիչ ծրագրակազմ տեղադրել մոնիտորինգով և PBX-ով:
Ես ընդհանուր առմամբ 4 աշխատանքային օր եմ անցկացրել սրա հետ, բայց արդյունքն արժեր: AMI ինտերֆեյսի միջոցով աշխատելը, ցածր մակարդակի հայտնաբերումը, ձգանները և ամենակարևորը, PBX-ը և մյուս բոլոր կարգավորումները միացնելն այժմ տևում է մոտ 15 րոպե:
Զաբբիքս 4.4-ը հասանելի է, մոտ 100 կտոր Asterisk տարբերակ 13: Որոշ PBX-ներ գալիս են FreePBX վեբ ինտերֆեյսով, ոմանք՝ մերկ վահանակով, մի շարք հնարքներ և ինտեգրում թվային պլանի միջոցով:
PBX-ից տվյալների ստացում
Առաջին և հիմնական կետը, որը պետք է լուծվի, հասակակիցների և SIP գրանցումների վերաբերյալ տվյալներ ստանալն է: Այդ նպատակով PBX-ն ունի AGI, AMI, ARI և SSH կոնսոլային միջերեսներ: Հասկանալի պատճառներով ես չեմ դիտարկել լրացուցիչ մոդուլներ:
Նախ պետք է պարզել, թե ինչ են այս ագին, ամի, արի...
- AGI - սկրիպտների օգտագործումը հավաքագրման պլանում: Հիմնականում օգտագործվում է զանգերի կառավարման համար:
- AMI - կարող է տրամադրել բոլոր անհրաժեշտ տեղեկությունները, աշխատում է 5038 պորտի միջոցով, ինչպես Telnet-ը: Հարմար է մեզ!
- ARI - ժամանակակից, նորաձև, JSON: Շատ հնարավորություններ կան, տվյալների ձևաչափը հասկանալի է Zabbix-ի համար, բայց ինձ համար հիմնական բան չկա. դուք չեք կարող վերահսկել կումերի գրանցումը: Մեկ այլ թերություն այն է, որ հասակակիցների համար կա միայն երկու վիճակ առցանց/օֆլայն, թեև ավելի շատ վիճակներ կան, և օգտակար է դրանք հաշվի առնել ախտորոշելիս:
- SSH-ը կարող է ամեն ինչ անել, բայց երբեմն դա չի թույլատրվում «անվտանգության նկատառումներից ելնելով»։ Նկատառումները կարող են տարբեր լինել, ես չեմ խորանա դրանց մեջ:
Այնուամենայնիվ, իր բոլոր թերություններով հանդերձ, ARI-ն ծածկում է մոնիտորինգի բոլոր կարիքների 90%-ը:
Zabbix և Telnet - իմ հիասթափությունը
Ես լավ գիտեմ AMI-ին, ժամանակին ես իրականացրել էի կորուստների հետևում հեռավոր գրասենյակների բաժանման հետ զրույցներում, զանգերի կառավարում և այլն: Telnet-ով ամեն ինչ նույնպես շատ պարզ է՝ բացեք կապը, ուղարկեք հրամանները և կարդացեք պատասխանը։ Ես այդպես էլ արեցի, բայց արդյունքն ինձ հիասթափեցրեց։
Telnet-ը Zabbix-ում նույնը չէ, ինչ Linux-ի կոնսոլում, այն մի փոքր ավելի պարզ է և հարմարեցված ստանդարտ թույլտվության համար, ինչպիսին է մուտքի/գաղտնաբառը: Եթե թույլտվության տրամաբանությունը տարբեր է, և մուտքի/գաղտնաբառի զույգի հարցում չկա, սխալ է տեղի ունենում: Թույլտվության պահանջը շրջանցելու ապարդյուն փորձերից հետո օգտակար էր դիտել Telnet մոդուլի սկզբնական կոդը:
Ես հասկացա, որ քանի դեռ ավանդական մուտքի և գաղտնաբառի հարցում չի եղել, ես առաջ չեմ գնա։ Պարզապես զվարճանալու համար ես կոդից հանեցի այն ամենը, ինչ կապված էր թույլտվության հետ և նորից հավաքեցի ամեն ինչ: Աշխատում է Բայց դա չի համապատասխանում պահանջներին։ Շարունակիր…
Վերադառնանք որոնմանը
Ես նորից կարդացի ARI-ի փաստաթղթերը, անցկացրի լրացուցիչ թեստեր. այստեղ կում-կում գրանցումներ չկան: Խնջույքներ կան, խոսակցություններ կան, վարտիքներ կան, բայց գրանցումներ չկան։ Ինչ-որ պահի ես նույնիսկ մտածեցի՝ իսկապե՞ս մեզ պետք է անգղի գրանցում։
Զավեշտալի զուգադիպությամբ այս պահին օգտատերից մեկ այլ հարցում է գալիս՝ ելքային զանգերի հետ կապված խնդրի հետ։ Խնդիրն այն էր, որ կումերի գրանցումը սառչում էր և լուծվում էր մոդուլը պարզապես վերագործարկելու միջոցով:
asterisk -rx "sip reload"
Հիանալի կլիներ ինտերնետի միջոցով մուտք գործել AMI. դա կլուծեր բոլոր խնդիրները, մտածեցի ես: Ես սկսում եմ փորել այս ուղղությամբ, և բառացիորեն առաջին որոնման տողը տանում է դեպի պաշտոնական Asterisk փաստաթուղթը, որն ասում է, որ կա իմ առաջադրանքների տարբերակ: webenabled ֆայլում /etc/asterisk/manager.conf, որը պետք է դրվի «ԱՅՈ» բաժնում [ընդհանուր]
Դրանից հետո ձևի սովորական վեբ հարցման միջոցով
FreePBX ինտերֆեյսն օգտագործելիս դուք չեք կարող միացնել այս տարբերակը համացանցի միջոցով, դուք պետք է այն միացնեք վահանակի միջոցով՝ փոփոխություններ կատարելով manager.conf ֆայլում: FreePBX-ը չի ջնջում այն, երբ կոնֆիգուրացիայի փոփոխությունները կատարվում են համացանցի միջոցով:
Ես երկար ժամանակ աշխատել եմ Asterisk-ի տարբեր տեսակի ինտեգրացիաների հետ, բայց երբեք չեմ տեսել, որ այս հատկանիշը որևէ տեղ նշվի: Ես զարմացա, որ ոչ ոք չի նկարագրում PBX-ի հետ փոխգործակցության այս մեթոդը: Նույնիսկ հատկապես օգտակար էր այս թեմայի վերաբերյալ տեղեկատվություն փնտրելը. գործնականում ոչինչ չկա կամ այն օգտագործվել է բոլորովին այլ խնդիրների համար:
WEB AMI - ինչպիսի՞ գազան:
Տարբերակի ավելացում webenabled ներկայացնել manager.conf ապահովվել է ԱԹՍ-ների կառավարման ամբողջական հասանելիություն համացանցի միջոցով: Սովորական AMI-ի միջոցով հասանելի բոլոր հրամաններն այժմ համացանցում են, դուք կարող եք իրադարձությունները լսել PBX-ից վարդակից: Գործողության սկզբունքը չի տարբերվում կոնսոլից AMI-ից: Այս տարբերակը ակտիվացնելուց հետո կարող եք կապվել PBX-ի հետ հետևյալ հասցեներով.
Հետո մտածեցի. «Սա է լուծումը։ Հիմա ամեն ինչ պատրաստ կլինի։ Հեշտ ցնդող կիտրոնի քամիչ», բայց դեռ վաղ էր ուրախանալու համար։ Մեզ անհրաժեշտ տեղեկատվությունը ստանալու համար բավական է օգտագործել GET հարցումը՝ անհրաժեշտ գործողություններով գործողություն, որն ի պատասխան վերադարձնում է xml՝ բոլոր գրանցումների և դրանց կարգավիճակի ցանկով։ Այս ամենը հիանալի է, բայց ձեզ թույլտվություն է պետք՝ քուքիից նիստը հիշելու համար: Երբ փորձարկում եք բրաուզերում, դուք չեք մտածում այս գործընթացի մասին:
Լիազորման գործընթաց
Սկզբում մենք դիմում ենք հասցեին
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-ում հետևող տարրեր ստեղծելու համար ես կօգտագործեմ ավտոմատ հայտնաբերում:
Ավտոմատ հայտնաբերում
Գրանցումները ավտոմատ կերպով հայտնաբերելու և հասակակից պետություններին հետևելու համար դուք պետք է կապվեք հետևյալ հասցեով.
Ի պատասխան՝ 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-ով սկրիպտ պատրաստեցի
Հետաքրքիր կետ. ATS-ի պատասխանում բոլոր պարամետրերը շրջապատված են մեկ չակերտներով, իսկ կաղապարը կիրառելուց հետո //response/generic[@host] դրանք փոխարինվում են կրկնակիներով։
Տարրեր ստեղծելու համար մենք օգտագործում ենք փոփոխականներ XML պատասխանից (այժմ՝ JSON):
SIP ռեգիստր
Սիպի գրանցման համար մենք օգտագործում ենք երեք փոփոխական. օգտագործողի անունը, հյուրընկալող, նավահանգիստ. Ես ուրախացա տարրի անունից [էլեկտրոնային փոստով պաշտպանված]: 5060, ես չեմ գտել որևէ իրավիճակ, որտեղ դուք պետք է օգտագործեք բոլոր հինգ փոփոխականները:
Հիմնական տարրը, որը տեղեկատվություն է ստանում բոլոր գրանցումների մասին, Աստղանիշ - AMI SIP ցույց գրանցամատյան. Րոպեը մեկ անգամ այն կատարում է GET հարցում
Մինչև 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 հասակակիցներ
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;
}
Ամփոփում
Արտադրված լուծումը կարող է բարդ լինել և անհապաղ պարզ չլինել: Բարձրացնում է ճկունությունը և շարժականությունը տարբեր համակարգերի միջև
Ուրախ և հեշտ ինտեգրում բոլորին: Կաղապար և տեղադրման հրահանգներ
Source: www.habr.com