كيفية توصيل Zabbix بـ Asterisk خارج الصندوق

في مقال سابق "Zabbix - توسيع الحدود الكلية" لقد أخبرتك بكيفية الحصول على جلسة ترخيص واستبدالها بماكرو مضيف محلي. سأخبرك في هذه المقالة بكيفية توصيل Zabbix بـ Asterisk بدون نصوص وبرامج خارجية.

ولدت فكرة "تكوين صداقات" لهذين النظامين منذ وقت طويل، دون الحاجة إلى تثبيت برامج أو نصوص برمجية إضافية. أسفر البحث السريع على Google عن العديد من الحلول الممكنة، وكل ذلك يتلخص في حقيقة تحميل البرامج النصية (في Pyha وBash وPython وما إلى ذلك) إلى الخادم، وستكون سعيدًا. كنت أرغب في تنفيذ المراقبة "خارج الصندوق" - بدون نصوص برمجية خارجية وتثبيت برامج إضافية على الخادم مع المراقبة وPBX.

قضيت ما مجموعه 4 أيام عمل في هذا، ولكن النتيجة كانت تستحق العناء. العمل من خلال واجهة AMI، والكشف على المستوى المنخفض، والمشغلات، والأهم من ذلك، أن توصيل PBX وجميع الإعدادات الأخرى يستغرق الآن حوالي 15 دقيقة.

يتوفر Zabbix 4.4، حوالي 100 قطعة من الإصدار 13 من Asterisk. تأتي بعض أنظمة PBX مزودة بواجهة ويب FreePBX، وبعضها مزود بوحدة تحكم مجردة، ومجموعة من الحيل والتكامل عبر خطة الاتصال الهاتفي.

استقبال البيانات من PBX

النقطة الأولى والرئيسية التي يجب حلها هي الحصول على بيانات حول الأقران وتسجيلات SIP. ولهذا الغرض، يحتوي نظام PBX على واجهات وحدة تحكم AGI وAMI وARI وSSH. لأسباب واضحة، لم أفكر في وحدات إضافية.

نحتاج أولاً إلى معرفة ما هي هذه agi وami وari...

  • AGI - استخدام البرامج النصية في مخطط الاتصال. تستخدم بشكل رئيسي لإدارة المكالمات.
  • AMI - يمكنه توفير جميع المعلومات الضرورية، ويعمل عبر المنفذ 5038، على غرار Telnet. يناسبنا!
  • ARI - حديث، عصري، JSON. هناك العديد من الاحتمالات، وتنسيق البيانات مفهوم بالنسبة لـ Zabbix، ولكن بالنسبة لي لا يوجد شيء رئيسي: لا يمكنك التحكم في تسجيل SIP. عيب آخر هو أنه بالنسبة للأقران هناك حالتان فقط متصلان/غير متصلان، على الرغم من وجود حالات أكثر ومن المفيد أخذها في الاعتبار عند التشخيص.
  • يمكن لـ SSH أن يفعل كل شيء، لكن في بعض الأحيان لا يُسمح بذلك "لأسباب أمنية". قد تكون الاعتبارات مختلفة، ولن أخوض فيها.

ومع ذلك، مع كل عيوبها، تغطي ARI 90٪ من جميع احتياجات المراقبة.

Zabbix وTelnet - خيبة أملي

أعرف شركة AMI جيدًا؛ في وقت ما، قمت بتنفيذ تتبع الخسائر في المحادثات مع الأقسام حسب المكاتب البعيدة، وإدارة المكالمات، وما إلى ذلك. مع Telnet، كل شيء واضح جدًا أيضًا: افتح الاتصال وأرسل الأوامر واقرأ الرد. وهذا ما فعلته، ولكن النتيجة خيبت أملي.

Telnet في Zabbix ليس هو نفسه الموجود في وحدة تحكم Linux، فهو أبسط قليلاً ومصمم خصيصًا للترخيص القياسي مثل تسجيل الدخول/كلمة المرور. إذا كان منطق التفويض مختلفًا، ولم يكن هناك طلب لزوج تسجيل الدخول/كلمة المرور، فسيحدث خطأ. بعد المحاولات غير المجدية لتجاوز متطلبات الترخيص، كان من المفيد إلقاء نظرة على الكود المصدري لوحدة Telnet.

أدركت أنه حتى يكون هناك طلب تسجيل دخول وكلمة مرور تقليدي، فلن أمضي قدمًا. من أجل المتعة فقط، قمت بإزالة كل ما يتعلق بالترخيص من الكود وأعدت تجميع كل شيء. يعمل! لكنها لا تلبي المتطلبات. تفضل…

دعنا نعود إلى البحث

أعدت قراءة وثائق ARI مرة أخرى، وأجريت اختبارات إضافية - لا توجد تسجيلات رشفة هنا. هناك أعياد، هناك محادثات، هناك المؤخرات، ولكن لا توجد تسجيلات. حتى أنني فكرت في مرحلة ما، هل نحتاج حقًا إلى تسجيل النسر؟

وبصدفة طريفة، في هذه اللحظة يصل طلب آخر من المستخدم، بوجود مشكلة في المكالمات الصادرة. كانت المشكلة هي تجميد تسجيل SIP وتم حلها ببساطة عن طريق إعادة تشغيل الوحدة.

asterisk -rx "sip reload"

سيكون من الرائع الوصول إلى AMI عبر الويب: فهذا من شأنه أن يحل جميع المشكلات، على ما أعتقد. أبدأ بالحفر في هذا الاتجاه، ويؤدي حرفيًا سطر البحث الأول إلى توثيق النجمة الرسمي، والذي ينص على وجود خيار لمهامي webenabled في ملف /etc/asterisk/manager.conf، والذي يجب ضبطه على نعم، في القسم [عام]

بعد ذلك، من خلال طلب ويب عادي للنموذج http://ats:8089/mxml?action=SIPshowregistry نحصل على جميع المعلومات اللازمة.

عند استخدام واجهة FreePBX، لا يمكنك تمكين هذا الخيار عبر الويب، بل تحتاج إلى تمكينه من خلال وحدة التحكم عن طريق إجراء تغييرات على ملف manager.conf. لا يقوم FreePBX بمسحه عند إجراء تغييرات التكوين عبر الويب.

لقد عملت مع أنواع مختلفة من تكاملات النجمة لفترة طويلة، ولكنني لم أر هذه الميزة مذكورة في أي مكان. لقد فوجئت بأن لا أحد يصف طريقة التفاعل مع PBX هذه. كان من المفيد بشكل خاص البحث عن معلومات حول هذا الموضوع: لا يوجد شيء عمليًا أو تم استخدامه لمهام مختلفة تمامًا.

WEB AMI - أي نوع من الوحش؟

إضافة خيار webenabled إلى ملف manager.conf توفير الوصول الكامل إلى إدارة ATS عبر شبكة الإنترنت. جميع الأوامر المتاحة من خلال 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>

هناك الكثير من البيانات المهملة في الاستجابة، لذلك أثناء المعالجة المسبقة نقوم بتصفيتها حسب القالب كسباث: //الاستجابة/عامة[@host]
ثم تبدأ المتعة. للعمل مع الكشف وإنشاء العناصر ديناميكيًا، يجب أن تكون الاستجابة بتنسيق JSON. XML غير مدعوم للاكتشافات التلقائية.

لتحويل XML إلى JSON، كان علي أن ألعب قليلاً مع الاستبدال التلقائي، والذي قمت بإنشاء برنامج نصي له في JS

كيفية توصيل Zabbix بـ Asterisk خارج الصندوق

نقطة مثيرة للاهتمام: في استجابة ATS، تكون جميع المعلمات محاطة بعلامات اقتباس مفردة، وبعد تطبيق القالب //الاستجابة/عامة[@host] يتم استبدالها بأخرى مزدوجة.

لإنشاء العناصر، نستخدم متغيرات من استجابة XML (الآن JSON).

كيفية توصيل Zabbix بـ Asterisk خارج الصندوق

سجل SIP

لتسجيلات SIP نستخدم ثلاثة متغيرات: اسم المستخدم, مضيف, ميناء. كنت سعيدًا باسم العنصر [البريد الإلكتروني محمي]: 5060، لم أجد أي مواقف تحتاج فيها إلى استخدام المتغيرات الخمسة جميعها.

العنصر الرئيسي الذي يتلقى معلومات حول جميع التسجيلات، النجمة - AMI SIP تظهر التسجيل. مرة واحدة في الدقيقة يقوم بتقديم طلب GET إلى https://ats:8089/mxml?action=SIPshowregistry، وبعد ذلك يتم تمرير بيانات الاستجابة XML إلى كافة العناصر التابعة للتحليل. لكل تسجيل أقوم بإنشاء عنصر يعتمد عليه. وهذا أمر مناسب، لأننا نتلقى معلومات محدثة في طلب واحد، وليس لكل طلب على حدة. هذا التطبيق له عيب كبير - الحمل على المعالج.

عند اختبار ما يصل إلى 100 عنصر تابع، لم ألاحظ الحمل، ولكن مع 1700 عنصر، أعطى هذا حملًا ملحوظًا لمدة 15 ثانية على المعالج. ضع ذلك في الاعتبار إذا كان لديك عدد كبير من العناصر التابعة.

كخيار "لتوزيع" الحمل أو تعيين ترددات استقصاء مختلفة لعنصر ما، يمكنك نقل منطق المعالجة إلى كل عنصر على حدة.

لا أقوم بتخزين المعلومات المستلمة في العنصر الرئيسي. أولاً، لا أرى ضرورة لذلك، وثانياً، إذا كانت الاستجابة أكثر من 64 ألفاً، فإن Zabbix يقطعها.

وبما أننا نستخدم استجابة XML كاملة للعنصر التابع، فإننا نحتاج إلى الحصول على قيمة هذا العنصر في المعالجة المسبقة. خلال كسباث يتم ذلك على النحو التالي:
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"

الطريق إلى العنصر نفسه أبسط قليلاً كسباث:

سلسلة(//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

إضافة تعليق