ååã®èšäºã§
è¿œå ã®ãœãããŠã§ã¢ãã¹ã¯ãªãããã€ã³ã¹ããŒã«ããã«ãããã XNUMX ã€ã®ã·ã¹ãã ããåéã«ããããšããã¢ã€ãã¢ã¯ãã£ãšåã«çãŸããŸããã ç°¡åã«ã°ãŒã°ã«ã§æ€çŽ¢ãããšãèãããã解決çãæ°å€ãèŠã€ãããŸãããçµå±ã®ãšãããã¹ã¯ãªãã (PyhaãBashãPython ãªã©) ããµãŒããŒã«ã¢ããããŒããããšããããšã«ãªããŸããããã§æºè¶³ã§ããã§ãããã ç§ã¯ãå€éšã¹ã¯ãªããã䜿çšãããç£èŠãš PBX ãåãããµãŒããŒã«è¿œå ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããšãªãããããã«äœ¿ãããç£èŠãå®è£ ããããšèããŠããŸããã
ããã«åèš 4 å¶æ¥æ¥ãè²»ãããŸããããçµæã¯ããã ãã®äŸ¡å€ããããŸããã AMI ã€ã³ã¿ãŒãã§ã€ã¹ãäœã¬ãã«æ€åºãããªã¬ãŒããããŠæãéèŠãª PBX ã®æ¥ç¶ãšãã®ä»ãã¹ãŠã®èšå®ã®äœæ¥ã«ã¯ãçŽ 15 åããããŸãã
Zabbix 4.4 ãå©çšå¯èœã§ãAsterisk ããŒãžã§ã³ 100 ãçŽ 13 åãããŸãã äžéšã® PBX ã«ã¯ FreePBX Web ã€ã³ã¿ãŒãã§ã€ã¹ãä»å±ããŠãããäžéšã® PBX ã«ã¯è£žã®ã³ã³ãœãŒã«ãå€ãã®ããªãã¯ãšãã€ã€ã«ãã©ã³ã«ããçµ±åãä»å±ããŠããŸãã
PBXããããŒã¿ãåä¿¡ãã
解決ããå¿ èŠãããæåã®äž»èŠãªç¹ã¯ããã¢ãš SIP ç»é²ã«é¢ããããŒã¿ãååŸããããšã§ãã ãã®ç®çã®ããã«ãPBX ã«ã¯ AGIãAMIãARIãããã³ SSH ã³ã³ãœãŒã« ã€ã³ã¿ãŒãã§ã€ã¹ãåãã£ãŠããŸãã æãããªçç±ãããè¿œå ã®ã¢ãžã¥ãŒã«ã¯èæ ®ããŸããã§ããã
ãŸãããããã® agiãamiãari ãäœã§ããããç解ããå¿ èŠããããŸã...
- AGI - ãã€ã€ã«ãã©ã³ã§ã¹ã¯ãªããã䜿çšããŸãã äž»ã«é話管çã«äœ¿çšãããŸãã
- AMI - å¿ èŠãªæ å ±ããã¹ãŠæäŸã§ããTelnet ãšåæ§ã«ããŒã 5038 çµç±ã§åäœããŸãã ç§ãã¡ã«åã£ãŠãŸãïŒ
- ARI - ã¢ãã³ã§ãã¡ãã·ã§ããã«ãª JSONã å€ãã®å¯èœæ§ããããããŒã¿åœ¢åŒã¯ Zabbix ã«ãšã£ãŠç解å¯èœã§ãããç§ã«ãšã£ãŠéèŠãªããšã¯ãããŸãããSIP ç»é²ãå¶åŸ¡ã§ããªããšããããšã§ãã ãã XNUMX ã€ã®æ¬ ç¹ã¯ããã¢ã«ã¯ãªã³ã©ã€ã³/ãªãã©ã€ã³ã® XNUMX ã€ã®ç¶æ ãããªãããšã§ãããã ããç¶æ ã¯ããã«å€ãã蚺ææã«ããããèæ ®ããã®ãæçã§ãã
- SSH ã¯ãã¹ãŠãå®è¡ã§ããŸããããã»ãã¥ãªãã£äžã®çç±ãã«ããèš±å¯ãããªãå ŽåããããŸãã èæ ®äºé ã¯ç°ãªããããããŸããããããã§ã¯è§ŠããŸããã
ãã ããããŸããŸãªæ¬ ç¹ã¯ãããŸãããARI ã¯ãã¹ãŠã®ç£èŠããŒãºã® 90% ãã«ããŒããŸãã
Zabbix ãš Telnet - æ®å¿µã§ã
ç§ã¯ AMI ã®ããšãããç¥ã£ãŠããããã€ãŠã¯ãªã¢ãŒã ãªãã£ã¹ããšã®éšéãšã®äŒè©±ã«ãããæ倱ã®è¿œè·¡ãé話管çãªã©ãå®è£ ããŠããŸããã Telnet ã䜿çšãããšãæ¥ç¶ãéããŠã³ãã³ããéä¿¡ããå¿çãèªã¿åããªã©ããã¹ãŠãéåžžã«æ確ã«ãªããŸãã ãããç§ããã£ãããšã§ãããçµæã¯ç§ããã£ãããããŸããã
Zabbix ã® Telnet 㯠Linux ã³ã³ãœãŒã«ãšåãã§ã¯ãªããå°ãã·ã³ãã«ã§ããã°ã€ã³/ãã¹ã¯ãŒããªã©ã®æšæºçãªèªèšŒã«åãããŠèª¿æŽãããŠããŸãã èªå¯ããžãã¯ãç°ãªãããã°ã€ã³/ãã¹ã¯ãŒãã®ãã¢ã®èŠæ±ããªãå Žåããšã©ãŒãçºçããŸãã èªå¯èŠä»¶ãåé¿ããããšããŠãç¡é§ã§ããããTelnet ã¢ãžã¥ãŒã«ã®ãœãŒã¹ ã³ãŒãã確èªãããšåœ¹ã«ç«ã¡ãŸããã
åŸæ¥ã®ãã°ã€ã³ãšãã¹ã¯ãŒãã®èŠæ±ãè¡ããããŸã§ã¯å ã«é²ããªãããšã«æ°ã¥ããŸããã 楜ãã¿ã®ããã«ãã³ãŒãããèªèšŒã«é¢é£ãããã®ããã¹ãŠåé€ãããã¹ãŠãåæ§ç¯ããŠã¿ãŸããã å¹ãïŒ ããããããã¯èŠä»¶ãæºãããŠããŸããã ã©ããâŠ
æ€çŽ¢ã«æ»ããŸããã
ARI ããã¥ã¡ã³ããããäžåºŠèªã¿çŽããè¿œå ã®ãã¹ããå®è¡ããŸãããããã«ã¯ SIP ç»é²ããããŸããã ç¥å®ŽããããäŒè©±ãããããºãã³ãå±¥ãããŠããŸãããç»é²ã¯ãããŸããã ããæç¹ã§ããã²ã¿ã«ã®ç»é²ã¯æ¬åœã«å¿ èŠãªã®ããšããèããŸããã
é¢çœãå¶ç¶ã§ããããã®æç¹ã§ãçºä¿¡é話ã«åé¡ãããå¥ã®ãªã¯ãšã¹ãããŠãŒã¶ãŒããå±ããŸããã åé¡ã¯ãSIP ç»é²ãããªãŒãºããããšã§ãããã¢ãžã¥ãŒã«ãåèµ·åããã ãã§è§£æ±ºãããŸããã
asterisk -rx "sip reload"
Web çµç±ã§ AMI ã«ã¢ã¯ã»ã¹ã§ãããçŽ æŽãããã§ããããããããã°ãã¹ãŠã®åé¡ã解決ããããšæããŸããã ãã®æ¹åã«èª¿æ»ãéå§ãããšãæåéãæ€çŽ¢ã®æåã®è¡ã§å ¬åŒã® Asterisk ããã¥ã¡ã³ãã«ãã©ãçããŸããããã«ã¯ãç§ã®ã¿ã¹ã¯ã«ãªãã·ã§ã³ãããããšãèšèŒãããŠããŸãã ãŠã§ãåå¯èœ ãã¡ã€ã«å /etc/ã¢ã¹ã¿ãªã¹ã¯/manager.confã»ã¯ã·ã§ã³ã§ YES ã«èšå®ããå¿ èŠããããŸãã [å šè¬ç]
ãã®åŸããã©ãŒã ã®éåžžã® Web ãªã¯ãšã¹ããéããŠã
FreePBX ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå ŽåãWeb çµç±ã§ãã®ãªãã·ã§ã³ãæå¹ã«ããããšã¯ã§ããŸãããmanager.conf ãã¡ã€ã«ãå€æŽããŠãã³ã³ãœãŒã«çµç±ã§æå¹ã«ããå¿ èŠããããŸãã FreePBX ã¯ãWeb çµç±ã§èšå®å€æŽãè¡ãããå Žåã§ãããããæ¶å»ããŸããã
ç§ã¯é·ãéããŸããŸãªçš®é¡ã® Asterisk çµ±åã«åãçµãã§ããŸãããããã®æ©èœã«ã€ããŠèšåãããŠããã®ãã©ãã«ãèŠãããšããããŸããã PBX ãšå¯Ÿè©±ãããã®æ¹æ³ã誰ã説æããŠããªãããšã«é©ããŸããã ãã®ãããã¯ã«é¢ããæ å ±ãæ¢ãããšã¯ç¹ã«åœ¹ã«ç«ã¡ãŸãããäºå®äžäœããªããããŸã£ããå¥ã®ã¿ã¹ã¯ã«äœ¿çšãããŠããŸããã
WEB AMI - ã©ããªç£ã§ãã?
ãªãã·ã§ã³ã®è¿œå ãŠã§ãåå¯èœ ãã¡ã€ã«ãž ãããŒãžã£ãŒ.conf Web çµç±ã§ ATS 管çãžã®å®å šãªã¢ã¯ã»ã¹ãæäŸããŸããã éåžžã® AMI ãéããŠäœ¿çšã§ãããã¹ãŠã®ã³ãã³ã㯠Web äžã«ããããœã±ããçµç±ã§ PBX ããã®ã€ãã³ãããªãã¹ã³ã§ããŸãã åäœåçã¯ã³ã³ãœãŒã« AMI ãšå€ãããŸããã ãã®ãªãã·ã§ã³ãæå¹ã«ãããšã次ã®ã¢ãã¬ã¹ã§ PBX ã«é£çµ¡ã§ããŸãã
ããã§ç§ã¯ããæããŸããããããã§è§£æ±ºã ïŒã ããã§ãã¹ãŠã®æºåãæŽããŸããã ç°¡åã«ããŒãžãŒãªã¬ã¢ã³çµããããããåã¶ã®ã¯ãŸã æ©ãã£ãã å¿
èŠãªæ
å ±ãååŸããã«ã¯ãå¿
èŠãªã¢ã¯ã·ã§ã³ãå«ã GET ãªã¯ãšã¹ãã䜿çšããã ãã§ååã§ãã ã¢ã¯ã·ã§ã³ãå¿çãšããŠããã¹ãŠã®ç»é²ãšãã®ã¹ããŒã¿ã¹ã®ãªã¹ããå«ã xml ãè¿ãããŸãã ããã¯ãã¹ãŠçŽ æŽãããããšã§ãããCookie ããã»ãã·ã§ã³ãèšæ¶ããã«ã¯èªèšŒãå¿
èŠã§ãã ãã©ãŠã¶ã§ãã¹ããããšãã¯ããã®ããã»ã¹ã«ã€ããŠèããŸããã
èªå¯ããã»ã¹
ãŸãã¯äœæãæå®ããŸã
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>
ããã§åãããã«å¿
èŠãªã®ã¯ ãã³ã»ãã·ã§ã³ID="6f5de42c"ãã€ãŸãèªå¯ Cookie èªäœã§ãã
çãã確èªããã ãã§ååãªå
容ãèªèšŒãåãå
¥ããããŸããã 次ã«ãPBX ãµãŒããŒãžã®ãã¹ãŠã®åŒã³åºãã«ã€ããŠããªã¯ãšã¹ãã«èªèšŒ Cookie ãè¿œå ããå¿
èŠããããŸãã
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"
èªèšŒ Cookie ãååŸããŠä»ã®ãªã¯ãšã¹ãã§äœ¿çšããæ¹æ³ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
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 ã¬ãžã¹ããª
SIP ç»é²ã«ã¯ XNUMX ã€ã®å€æ°ã䜿çšããŸãã ãŠãŒã¶å, host, ããŒãã å çŽ ã®ååã«æºè¶³ããŸãã [ã¡ãŒã«ä¿è·]ïŒ5060, XNUMX ã€ã®å€æ°ãã¹ãŠã䜿çšããå¿ èŠãããç¶æ³ã¯èŠã€ãããŸããã§ããã
ãã¹ãŠã®ç»é²ã«é¢ããæ
å ±ãåãåãã¡ã€ã³èŠçŽ ã ã¢ã¹ã¿ãªã¹ã¯ - AMI SIPshowregistryã XNUMXåã«XNUMXåãGETãªã¯ãšã¹ããéä¿¡ããŸãã
æ倧 100 åã®äŸåèŠçŽ ããã¹ããããšãã¯è² è·ã«æ°ã¥ããŸããã§ãããã1700 åã®èŠçŽ ã§ã¯ãããã»ããµã« 15 ç§ã®é¡èãªè² è·ãããããŸããã å€æ°ã®äŸåèŠçŽ ãããå Žåã¯ããã®ããšã«çæããŠãã ããã
è² è·ããåæ£ãããããèŠçŽ ã«ç°ãªãããŒãªã³ã°é »åºŠãèšå®ããããããªãã·ã§ã³ãšããŠãåŠçããžãã¯ãåèŠçŽ ã«åå¥ã«ç§»åã§ããŸãã
åãåã£ãæ å ±ã¯mainèŠçŽ ã«ã¯æ ŒçŽããŸããã 第äžã«ãããã®å¿ èŠæ§ãããããŸããã第äºã«ãå¿çã 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 ãšããäž»èŠãªèŠçŽ ããããããã«äŸåããèŠçŽ ãè¿œå ãããŸãã
ããã«ãããXNUMX ã€ã®äŸåèŠçŽ ãäœæãããŸãã
- ããã¹ã圢åŒã®ãã¢ã¹ããŒã¿ã¹
- ããã€ã¹ã®å¿çæé - ã¹ããŒã¿ã¹ã OK ã®å Žåã¯ããã€ã¹ã®å¿çæéãæžã蟌ãŸãããã以å€ã®å Žåã¯ã-1ããæžã蟌ãŸããŸãã
èŠçŽ èªäœãžã®ãã¹ã¯å°ãåçŽã§ã XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
XNUMX çªç®ã®èŠçŽ ã§ã¯ãJavaScript ã䜿çšããŠåé¢ããŸããã å¿çæé ãããã¯äžç·ã«ä¿åãããããããã¢ã¹ããŒã¿ã¹ãã次ã®ããã«ãªããŸãã
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}
ãŸãšã
ããã«äœ¿ãããœãªã¥ãŒã·ã§ã³ã¯è€éã§ãããã«ã¯ç解ã§ããªãå ŽåããããŸãã ç°ãªãã·ã¹ãã éã®æè»æ§ãšç§»æ€æ§ãåäžããŸãã
çããã楜ããç°¡åã«çµ±åããŠãã ãã! ãã³ãã¬ãŒããšèšå®æé
åºæïŒ habr.com