Bir önceki yazıda
Bu iki sistemi "arkadaş edinme" fikri, ek yazılım veya komut dosyaları yüklemeden uzun zaman önce doğdu. Hızlı bir Google araması birçok olası çözümü ortaya çıkardı; bunların hepsi komut dosyalarını (Pyha, Bash, Python vb.) sunucuya yüklemeniz gerçeğine dayanıyordu ve mutlu olacaksınız. Harici komut dosyaları olmadan ve izleme ve PBX ile sunucuya ek yazılım yüklemeden "kutudan çıktığı gibi" izleme uygulamak istedim.
Bununla toplam 4 iş günü geçirdim ama sonuç buna değdi. AMI arayüzü, düşük seviye tespiti, tetikleyiciler ve en önemlisi PBX'e ve diğer tüm ayarlara bağlanmak artık yaklaşık 15 dakika sürüyor.
Zabbix 4.4 mevcuttur, yaklaşık 100 adet Asterisk sürüm 13'tür. Bazı PBX'ler FreePBX web arayüzüyle birlikte gelir, bazıları ise sade bir konsolla, bir dizi hileyle ve bir arama planı aracılığıyla entegrasyonla gelir.
PBX'ten veri alma
Çözülmesi gereken ilk ve temel nokta, eşler ve SIP kayıtları ile ilgili verilerin elde edilmesidir. Bu amaçla PBX'te AGI, AMI, ARI ve SSH konsol arayüzleri bulunmaktadır. Açık nedenlerden dolayı ek modülleri dikkate almadım.
Öncelikle bu agi, ami, ari'nin ne olduğunu bulmalıyız...
- AGI - arama planındaki komut dosyalarını kullanma. Esas olarak çağrı yönetimi için kullanılır.
- AMI - gerekli tüm bilgileri sağlayabilir, Telnet'e benzer şekilde 5038 numaralı bağlantı noktası üzerinden çalışır. Bize uyar!
- ARI - modern, modaya uygun, JSON. Pek çok olasılık var, veri formatı Zabbix için anlaşılabilir, ancak benim için önemli olan bir şey yok: yudum kaydını kontrol edemezsiniz. Diğer bir dezavantaj, akranlar için çevrimiçi/çevrimdışı yalnızca iki durumun bulunmasıdır, ancak daha fazla durum vardır ve tanı koyarken bunları dikkate almanın yararlı olduğu söylenebilir.
- SSH her şeyi yapabilir ancak bazen “güvenlik nedeniyle” buna izin verilmiyor. Düşünceler farklı olabilir, onlara girmeyeceğim.
Ancak ARI, tüm eksiklikleriyle birlikte tüm izleme ihtiyaçlarının %90'ını karşılamaktadır.
Zabbix ve Telnet - hayal kırıklığım
AMI'yi iyi tanıyorum; bir zamanlar uzak ofisler, çağrı yönetimi vb. ile yapılan görüşmelerdeki kayıpların takibini uyguladım. Telnet'te de her şey çok net: bağlantıyı açın, komutları gönderin ve yanıtı okuyun. Ben de öyle yaptım ama sonuç beni hayal kırıklığına uğrattı.
Zabbix'teki Telnet, Linux konsolundaki ile aynı değildir, biraz daha basittir ve kullanıcı adı/şifre gibi standart yetkilendirmeye göre uyarlanmıştır. Yetkilendirme mantığı farklıysa ve kullanıcı adı/şifre çifti için istek yoksa bir hata oluşur. Yetkilendirme gereksinimini aşmaya yönelik nafile girişimlerden sonra Telnet modülünün kaynak koduna bakmak faydalı oldu.
Geleneksel bir giriş ve şifre talebi olana kadar ilerlemeyeceğimi fark ettim. Sırf eğlence olsun diye, yetkilendirmeyle ilgili her şeyi koddan kaldırdım ve her şeyi yeniden birleştirdim. İşler! Ama gereksinimleri karşılamıyor. Devam etmek…
Aramaya geri dönelim
ARI belgelerini tekrar okudum, ek testler yaptım - burada yudum kaydı yok. Ziyafetler var, sohbetler var, pantolonlar var ama kayıt yok. Bir noktada akbaba kaydına gerçekten ihtiyacımız var mı diye düşündüm.
Komik bir tesadüf eseri, şu anda kullanıcıdan giden aramalarla ilgili bir sorunla ilgili başka bir istek geliyor. Sorun, yudum kaydının donmasıydı ve modülün yeniden başlatılmasıyla çözüldü.
asterisk -rx "sip reload"
AMI'ye web üzerinden erişmek harika olurdu; bunun tüm sorunları çözeceğini düşündüm. Bu yönde kazmaya başlıyorum ve kelimenin tam anlamıyla ilk arama satırı, görevlerim için bir seçenek olduğunu söyleyen resmi Yıldız işareti belgelerine yönlendiriyor web etkin dosyada /etc/asterisk/manager.confbölümünde EVET olarak ayarlanması gerekir. [genel]
Bundan sonra formun düzenli bir web isteği aracılığıyla
FreePBX arayüzünü kullanırken bu seçeneği web üzerinden etkinleştiremezsiniz; yönetici.conf dosyasında değişiklik yaparak konsol üzerinden etkinleştirmeniz gerekir. FreePBX, web üzerinden konfigürasyon değişiklikleri yapıldığında bunu silmez.
Uzun zamandır çeşitli yıldız işareti entegrasyonlarıyla çalıştım ancak bu özelliğin hiçbir yerde bahsedildiğini görmedim. Hiç kimsenin PBX ile etkileşime geçmenin bu yöntemini açıklamamasına şaşırdım. Bu konuyla ilgili bilgi aramak bile özellikle faydalıydı: pratikte hiçbir şey yok veya tamamen farklı görevler için kullanılıyordu.
WEB AMI - ne tür bir canavar?
Bir seçenek ekleme web etkin dosyalamak yönetici.conf web üzerinden ATS yönetimine tam erişim sağladı. Normal bir AMI aracılığıyla kullanılabilen tüm komutlar artık web'dedir; PBX'teki olayları bir soket aracılığıyla dinleyebilirsiniz. Çalışma prensibi AMI konsolundan farklı değildir. Bu seçeneği etkinleştirdikten sonra PBX ile aşağıdaki adreslerden iletişime geçebilirsiniz:
Sonra düşündüm: “Çözüm bu! Artık her şey hazır olacak! Kolay-peezy limon sıkacağı” ama sevinmek için henüz çok erkendi. İhtiyacımız olan bilgiyi elde etmek için gerekli aksiyonla birlikte GET isteğini kullanmak yeterlidir. aksiyonyanıt olarak tüm kayıtların ve durumlarının bir listesini içeren xml'yi döndürür. Bunların hepsi harika, ancak çerezden oturumu hatırlamak için izne ihtiyacınız var. Tarayıcıda test yaptığınızda bu süreci düşünmüyorsunuz.
Yetkilendirme süreci
İlk önce adresi veriyoruz
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
Cevap:
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 çalışmak için ihtiyacın var konak_id="6f5de42c", yani yetkilendirme çerezinin kendisi.
Cevabı için kontrol etmeniz gereken içerik "Kimlik doğrulama kabul edildi" Daha sonra, PBX sunucusuna yapılan tüm aramalar için isteğe bir yetkilendirme çerezi eklememiz gerekecek.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"
Yetkilendirme çerezini nasıl alacağınızı ve onu diğer isteklerde nasıl kullanacağınızı buradan okuyun: “
Zabbix'te izleme öğeleri oluşturmak için otomatik algılamayı kullanacağım.
Otomatik algılama
Kayıtları otomatik olarak tespit etmek ve akran durumlarını takip etmek için aşağıdaki adresle iletişime geçmeniz gerekir:
Yanıt olarak PBX bize bir XML yanıtı döndürü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>
Yanıtta çok fazla çöp var, bu nedenle ön işlemede onu şablona göre filtreliyoruz XPath: //yanıt/genel[@ana bilgisayar]
Sonra eğlence başlıyor. Algılamayla çalışmak ve öğeleri dinamik olarak oluşturmak için yanıtın JSON biçiminde olması gerekir. Otomatik algılamalar için XML desteklenmez.
XML'i JSON'a dönüştürmek için, JS'de bir komut dosyası hazırladığım otomatik değiştirmeyle biraz oynamak zorunda kaldım
İlginç bir nokta: ATS yanıtında tüm parametreler tek tırnak içine alınır ve şablon uygulandıktan sonra //yanıt/genel[@ana bilgisayar] bunların yerini çift olanlar alır.
Öğeler oluşturmak için XML yanıtındaki (şimdi JSON) değişkenleri kullanırız.
SIP Kaydı
Sip kayıtları için üç değişken kullanıyoruz: kullanıcı adı, ev sahibi, Liman. Elementin adından memnun kaldım [e-posta korumalı]: 5060, Beş değişkenin tümünü kullanmanız gereken herhangi bir durum bulamadım.
Tüm kayıtlar hakkında bilgi alan ana unsur, Yıldız işareti - AMI SIP gösteri kaydı. Dakikada bir kez GET isteğinde bulunur
100'e kadar bağımlı öğeyi test ederken yükü fark etmedim, ancak 1700 öğeyle bu, işlemciye 15 saniyelik gözle görülür bir yük verdi. Çok sayıda bağımlı öğeniz varsa bunu aklınızda bulundurun.
Yükü "yaymak" veya bir öğe için farklı yoklama frekansları ayarlamak için bir seçenek olarak, işleme mantığını her bir öğeye ayrı ayrı taşıyabilirsiniz.
Alınan bilgileri ana öğede saklamıyorum. Öncelikle buna gerek görmüyorum ve ikinci olarak eğer yanıt 64K’dan fazla ise Zabbix kesiyor.
Bağımlı öğe için tam bir XML yanıtı kullandığımızdan, bu öğenin değerini ön işlemede almamız gerekir. Başından sonuna kadar XPath şu şekilde yapılır:
string(//response/generic[@event = "RegistryEntry"] durum)
Kayıt durumları için metin durumlarını kullanmadım, ancak bunları JavaScript kullanarak sayısal forma dönüştürdüm:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP Eşleri
SIP kayıtlarına benzer şekilde, bağımlı olanların eklendiği Yıldız İşareti - AMI SIPshowregistry'nin ana unsuru vardır.
Bu iki bağımlı öğe oluşturur:
- Metin biçiminde akran durumu
- Cihaz yanıt süresi - eğer durum iyiyse, cihazın yanıt süresi yazılır, aksi takdirde “-1”
Elemanın kendisine giden yol biraz daha basit XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
İkinci öğeyi ayırmak için JavaScript kullandım Tepki Süresi birlikte depolandıkları için eş durumundan:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}
Sonuç
Kullanıma hazır bir çözüm karmaşık olabilir ve hemen anlaşılamayabilir. Farklı sistemler arasında esnekliği ve taşınabilirliği artırır
Herkese mutlu ve kolay entegrasyon! Kurulum için şablon ve talimatlar
Kaynak: habr.com