توفر GEM netsnmp تنفيذًا أصليًا لروبي بروتوكول SNMP (V1/2C ABD V3).
أضف هذا السطر إلى Gemfile في التطبيق الخاص بك:
gem 'netsnmp'ثم تنفذ:
$ bundle
أو تثبيته بنفسك على النحو التالي:
$ gem install netsnmp
توفر هذه الأحجار الكريمة:
إذا كنت تبحث عن SNMP GEMS في Ruby Toolbox ، فستجد حفنة. قد تسأل ، لماذا لا تستخدم واحد منهم فقط؟
معظمهم ينفذان فقط V1 و V2 ، لذلك إذا كان متطلباتك هو استخدام V3 ، فأنت تركت خيارين فقط: Net-SNMP (غير مضطرب منذ عام 2013) ومتابعة Net-SNMP2 ، والتي بدأت كشوكة لإصلاح بعض الأخطاء التي تركت دون مراقبة. تلتزم كلتا المكتبات مكتبة C netsnmp باستخدام FFI ، مما يجعلهما عرضة للأخطاء التالية (من ذوي الخبرة في كلتا المكتبات):
يتم حل كل هذه القضايا هنا.
يمكنك استخدام حاوية Docker المتوفرة تحت المواصفات/الدعم للاختبار مقابل هذه الأمثلة (يجب أن يكون المنفذ المستخدم في الأمثلة هو المنفذ الخارجي Docker المعين إلى المنفذ 161).
require 'netsnmp'
# example you can test against the docker simulator provided. port attribute might be different.
manager = NETSNMP :: Client . new ( host : "localhost" , port : 33445 , username : "simulator" ,
auth_password : "auctoritas" , auth_protocol : :md5 ,
priv_password : "privatus" , priv_protocol : :des ,
context : "a172334d7d97871b72241397f713fa12" )
# SNMP get
manager . get ( oid : "sysName.0" ) #=> 'tt'
# SNMP walk
# sysORDescr
manager . walk ( oid : "sysORDescr" ) . each do | oid_code , value |
# do something with them
puts "for #{ oid_code } : #{ value } "
end
manager . close
# SNMP set
manager2 = NETSNMP :: Client . new ( host : "localhost" , port : 33445 , username : "simulator" ,
auth_password : "auctoritas" , auth_protocol : :md5 ,
priv_password : "privatus" , priv_protocol : :des ,
context : "0886e1397d572377c17c15036a1e6c66" )
# setting to 43, becos yes
# sysUpTimeInstance
manager2 . set ( "1.3.6.1.2.1.1.3.0" , value : 43 )
manager2 . closeستكون أمثلة SNMP V2/V1 متشابهة (احذر من الاختلافات في سمات التهيئة).
تم تنفيذ جميع الأمثلة السابقة لتحديد أنواع بدائية ، أي ما لم يتم تحديدها خلاف ذلك ، فسيحاول تحويل نوع "بدائي" روبي إلى نوع بدائي ASN.1 ، والعكس صحيح:
هذا يعني أنه ، إذا قمت بتمرير value: 43 إلى #set Call ، فسيقوم ببناء varbind مع عدد صحيح ASN.1. إذا قمت بإصدار #get وتحتوي الاستجابة على عدد صحيح ASN.1 ، فسوف يعيد عدد صحيح.
ومع ذلك ، يحدد SNMP أنواع ASN.1 الخاصة بالتطبيق ، والتي يوجد لها الدعم ، وإن كانت محدودة. حاليًا ، هناك دعم لعناوين IP و Timeticks.
إذا قمت بإنشاء كائن IPAddr ( ipaddr المكتبة القياسية Ruby) ونقله إلى Call #set ، فسيتم تعيينه على رمز محتوى SNMP الخاص. إذا كانت استجابة المكالمة #get تحتوي على عنوان IP ، فسيتم تعيينها على كائن IPAddr .
نوع NETSNMP::Timeticks داخلي لهذه المكتبة ، لكنه نوع Numeric روبي. أنت آمن لاستخدامه "كرقمي" ، أي إجراء الحسابات.
Counter32 و Counter64 أنواع سوف يرسمون إلى الأعداد الصحيحة العادية.
يمكنك العثور على أمثلة الاستخدام هنا. إذا كنت بحاجة إلى دعم لنوع مفقود ، فلديك الخيارات التالية:
:type في مكالمات #set : # as a symbol
manager . set ( "somecounteroid" , value : 999999 , type : :counter64 )
# as the SNMP specific type id, if you're familiar with the protocol
manager . set ( "somecounteroid" , value : 999999 , type : 6 ) ستقوم netsnmp بتحميل MIBs الافتراضية من أدلة المعروفة أو المعلن عنها (عبر MIBDIRS ) (شريطة أن تكون مثبتة في النظام). سيتم استخدام هذه لتحويل OID.
في بعض الأحيان ، ستحتاج إلى تحميل المزيد ، MIBs الخاصة بك ، وفي هذه الحالة ، يمكنك استخدام واجهة برمجة التطبيقات التالية:
require "netsnmp"
NETSNMP :: MIB . load ( "MY-MIB" )
# or, if it's not in any of the known locations
NETSNMP :: MIB . load ( "/path/to/MY-MIB.txt" )يمكنك تثبيت MIBs SNMP SNMP باستخدام مدير الحزمة الخاص بك:
# using apt-get
> apt-get install snmp-mibs-downloader
# using apk
> apk --update add net-snmp-libs
في Ruby ، عادة ما يتم تقديم دعوة لعدم مشاركة كائنات IO عبر مؤشرات الترابط. ينطبق نفس المبدأ هنا على NETSNMP::Client : شريطة أن تستخدمه ضمن مؤشر ترابط التنفيذ ، يجب أن يتصرف بأمان. لذا ، سيكون من الممكن أن يكون هناك شيء مثل هذا:
general_options = { auth_protocol : ... .
routers . map do | r |
Thread . start do
NETSNMP :: Client . new ( general_options . merge ( host : r ) ) do | cl |
cli . get ( oid : " 1.6 . 3 ...... .
end
end
end . each ( & :join ) يتم دعم Evented IO أيضًا ، حيث يمكنك تمرير كائن :proxy كقناة اتصال مفتوحة بالفعل للعميل. مهم جدًا: عليك أن تهتم بدورة الحياة ، لأن العميل لن يتصل ولن يغلق الكائن ، فلن يتحكم في ذلك.
عند تمرير كائن وكيل ، يمكنك حذف المعلمة :host .
يجب أن يكون كائن الوكيل عبارة عن نوع بطة ينفذ #send ، وهي طريقة تتلقى حمولة PDU المرسلة ، وإرجاع الحمولة الحمولة من PDU المستقبلة.
فيما يلي مثال صغير من الرمز الزائف:
# beware, we are inside a warp-speed loop!!!
general_options = { auth_protocol : ... .
proxy = SpecialUDPImplementation . new ( host : router )
NETSNMP :: Client . new ( general_options . merge ( proxy : proxy ) ) do | cl |
# this get call will eventually #send to the proxy...
cli . get ( oid : " 1.6 . 3 ...... .
end
# client isn't usable anymore, but now we must close to proxy
proxy . closeلمزيد من المعلومات حول هذا الموضوع ، تختبر المواصفات هذه الميزة ضد Celluloid-IO. يمكن إضافة eventmachine ، إذا كان شخص ما لطيفًا بما يكفي لتوفير تنفيذ.
تحتوي هذه المكتبة على بعض الحلول لبعض الميزات المفقودة بلغة الياقوت ، وهي عدم ثمن بنية صفيف البايت. الأقرب لدينا هو دفق بايت يتم تقديمه كسلسلة مع ترميز ASCII. تمت إضافة طريقة إلى فئة السلسلة التي تسمى #xor لبعض العمليات اللازمة داخليًا. لمنع حدوث قرد لا داعي له ، تم استخدام التحسينات.
إذا أصبح #xor في مرحلة ما عنق الزجاجة لاستخدامك ، فإن هذه الأحجار الكريمة لديها أيضًا دعم لـ Xorcist. عليك فقط إضافتها إلى Gemfile (أو تثبيتها في النظام):
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
وسيقوم netsnmp بالتقاطها تلقائيًا.
إذا كنت ستستخدم هذه الأحجار الكريمة في كثير من الأحيان مع SNMP V3 وتمكين مستوى أمان AUTH/Priv ، فستكون لديك هذا الشعور المضحك بأن كل شيء يمكن أن يكون أسرع قليلاً. حسنًا ، هذا في الأساس لأن عنق الزجاجة الأداء الحقيقي لهذه الأحجار الكريمة هو توليد مفاتيح المصادقة والمرور المستخدمة للترخيص والتشفير. على الرغم من أن هذا أمر لمرة واحدة لكل عميل ، إلا أن تأخره سيكون ملحوظًا إذا كنت تعمل على> 100 مضيف.
هناك عمل موصى به ، لكن هذا أمر قابل للاستخدام فقط إذا كنت تستخدم نفس المستخدم/AuthPass/Privapp على جميع المضيفين !!! . استخدم هذا بعناية ، ثم:
$shared_security_parameters = NETSNMP :: SecurityParameters . new ( security_level : :authpriv , username : "mustermann" ,
auth_protocol : :md5 , priv_protocol : :aes , ... .
# this will eager-load the auth/priv_key
...
# over 9000 routers are running on this event loop!!! this is just one!
NETSNMP :: Client . new ( share_options . merge ( proxy : router_proxy , security_parameters : $shared_security_parameters . dup ) . new do | cl |
cli . get ( oid : .....
end تدعم هذه المكتبة ويتم اختبارها مقابل إصدارات Ruby 2.1 أو أكثر ، بما في ذلك Ruby 3. كما تدعم واختبارات ضد Truffleruby.
تتم جميع عمليات الترميز/فك التشفير/التشفير/فك التشفير/الهضم باستخدام openssl ، وهو جزء من المكتبة القياسية. إذا تمت إزالة openssl في مرحلة ما ولم يتم توزيعها على وجه التحديد ، فسيتعين عليك تثبيته بنفسك. نأمل ألا يحدث هذا أبدًا.
كما أنه يستخدم واجهة برمجة تطبيقات openssl ASN.1 لتشفير/فك تشفير BERS ، والتي من المعروف أنها صارمة ، وقد لا تكون قادرة على فك تشفير PDU إذا لم تكن متوافقة مع RFC المدعومة.
يمكنك إما تعيين NETSNMP_DEBUG على مستوى التصحيح المطلوب (حاليًا ، 1 و 2). سيتم كتابة السجلات إلى Stderr.
يمكنك أيضًا تعيينه لعميل معين:
manager2 = NETSNMP :: Client . new ( debug : $stderr , debug_level : 2 , ... . ) تستخدم هذه المكتبة RSPEC. مواصفات العميل هي اختبارات "التكامل" ، حيث نتواصل مع محاكاة عامل SNMP SNMPSIM.
يمكنك إجراء جميع الاختبارات عن طريق الكتابة:
> bundle exec rake spec
# or
> bundle exec rspec
...
الطريقة الأكثر وضوحًا لتشغيل الاختبارات هي استخدام إعداد docker-compose (وهو أيضًا ما يستخدم في CI). قم بتشغيله مقابل إصدار Ruby الذي تستهدفه:
> docker-compose -f docker-compose.yml -f docker-compose-ruby-${RUBY_MAJOR_VERSION}.${RUBY_MAJOR_VERSION}.yml run netsnmp
تدير CI الاختبارات ضد جميع إصدارات Ruby المدعومة. إذا كانت التغييرات تعطل إصدارًا معينًا من Ruby ، فتأكد من ارتكاب تغييرات مناسبة معالجة حالة Edge ، أو أخبرني في لوحة المشكلات ، حتى أتمكن من المساعدة.
يعمل SNMP Simulator في الحاوية الخاصة به في إعداد docker .
يمكنك تثبيت الحزمة بنفسك (على سبيل المثال: pip install snmpsim ) وتشغيل الخادم محليًا ، ثم قم بتعيين متغير بيئة SNMP_PORT ، حيث يتم تشغيل محاكاة SNMP.
وظيفة CI هي:
هناك بعض الميزات التي لا تدعمها هذه الأحجار الكريمة. تم تصميمه لتوفير تنفيذ عميل (أو مدير ، بلغة SNMP) فقط ، وتم الوفاء بالمتطلبات. ومع ذلك ، فإن هذه الأخطاء البارزة ستستمر:
لذلك إذا كنت تحب الأحجار الكريمة ، ولكنك تفضل تنفيذ هذه الميزات ، فيرجى المساعدة عن طريق إرسال العلاقات العامة لنا وسنراجعها بكل سرور.