GEM netsnmp обеспечивает нативную реализацию Ruby протокола SNMP (V1/2C ABD V3).
Добавьте эту строку в Gemfile вашего приложения:
gem 'netsnmp'А затем выполнить:
$ bundle
Или установите его самостоятельно как:
$ gem install netsnmp
Этот драгоценный камень предоставляет:
Если вы ищете драгоценные камни SNMP в Ruby Toolbox, вы найдете кучу. Вы можете спросить, почему бы просто не использовать один из них?
Большинство из них только внедряют V1 и V2, поэтому, если ваше требование состоит в том, чтобы использовать V3, у вас осталось только 2 варианта: Net-SNMP (незаметный с 2013 года) и его последующий NET-SNMP2, который начинался как вилка, чтобы исправить некоторые ошибки, оставленные без присмотра. Обе библиотеки обертывают библиотеку C Netsnmp с использованием FFI, что оставляет их уязвимыми для следующих ошибок (испытываемые в обеих библиотеках):
Все эти проблемы решаются здесь.
Вы можете использовать контейнер Docker, предоставленный в соответствии с Spec/Support для тестирования на эти примеры (порт, используемый в примерах, должен быть внешним портом 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 , он построит варбинд с целым числом ASN.1. Если вы выпускаете #get , а ответ содержит целое число ASN.1, он вернет целое число.
Однако SNMP определяет специфичные для приложения типы ASN.1, для которых есть поддержка, хотя и ограниченная. В настоящее время существует поддержка IP -адресов и сроков.
Если вы создаете объект IPAddr (стандартная библиотека Ruby ipaddr ) и передадите его к вызову #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 загрузит MIB по умолчанию из известных или рекламируемых (через MIBDIRS ) каталоги (при условии, что они установлены в системе). Они будут использоваться для преобразования OID.
Иногда вам нужно больше загружать свои собственные MIB, и в этом случае вы можете использовать следующий API:
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" )Вы можете установить Common SNMP MIB, используя диспетчер пакетов:
# using apt-get
> apt-get install snmp-mibs-downloader
# using apk
> apk --update add net-snmp-libs
В Ruby обычно предлагается не делиться объектами ввода -вывода по темам. Тот же принцип применяется здесь к 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 ) Также поддерживается IO, так как вы можете передать объект A :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Для получения дополнительной информации об этом предмете, спецификации проверяют эту функцию на целлулоид-IO. Можно добавить Eventmachine, если кто -то будет достаточно любезен, чтобы обеспечить реализацию.
В этой библиотеке есть некоторые обходные пути к некоторым отсутствующим функциям на рубиновом языке, а именно с отсутствием структуры массива байтов. Самое близкое, что у нас есть байтовый поток, представленный как строка с кодированием ASCII. Метод был добавлен в класс строки под названием #xor для некоторых операций, необходимых внутри. Чтобы предотвратить ненужные обезьяны, использовались усовершенствования.
Если #xor в какой -то момент становится узким местом вашего использования, этот драгоценный камень также поддерживает Xorcist. Вы просто должны добавить его в свой Gemfile (или установить в систему):
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
и netsnmp автоматически заберут его.
Если вы часто используете этот драгоценный камень с включением SNMP V3 и Auth/Priv Security, у вас будет такое смешное ощущение, что все может быть немного быстрее. Что ж, это в основном потому, что истинное узкое место в результате этого драгоценного камня - это генерация клавиш Auth и Pass, используемые для авторизации и шифрования. Хотя это одноразовая вещь для каждого клиента, его отставание будет заметно, если вы работаете на 100 хостах.
Существует рекомендуемое рабочее обход, но это можно использовать только в том случае, если вы используете один и тот же пользователь/Authpass/PrivPass на всех хостах !!! Полем Используйте это с осторожностью, тогда:
$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 Versions 2.1 или более недавнего, включая Ruby 3. Она также поддерживает и испытывает тесты против Truffleruby.
Все кодирование/декодирование/шифрование/дешифрование/дайджесты выполняются с использованием openssl , которая (до сих пор) является частью стандартной библиотеки. Если в какой -то момент openssl удален и не специально распределен, вам придется установить его самостоятельно. Надеюсь, этого никогда не произойдет.
Он также использует API openssl ASN.1 для кодирования/декодирования BERS, который, как известно, является строгим и не может декодировать PDU, если не соответствует поддерживаемому RFC.
Вы можете либо установить NETSNMP_DEBUG на уровень отладки DESIDED (в настоящее время 1 и 2). Журналы будут записаны в Stderr.
Вы также можете установить его для конкретного клиента:
manager2 = NETSNMP :: Client . new ( debug : $stderr , debug_level : 2 , ... . ) Эта библиотека использует rspec. Спецификации клиента представляют собой тесты «интеграция», поскольку мы общаемся с SNMPSIM-построенным симулятором SNMP.
Вы можете запустить все тесты, набрав:
> 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, или дайте мне знать в The Assure Poard, чтобы я мог помочь.
Симулятор SNMP работает в своем собственном контейнере в настройке docker .
Вы можете установить пакет самостоятельно (например, pip install snmpsim ) и запустить сервер локально, а затем установить переменную среды SNMP_PORT , где работает симулятор SNMP.
Работа CI:
Есть некоторые функции, которые этот драгоценный камень не поддерживает. Он был создан для предоставления реализации клиента (или менеджера, на языке SNMP), и требования были выполнены. Тем не менее, эти заметные промахи будут выдающимися:
Поэтому, если вам нравится драгоценный камень, но предпочте, чтобы эти функции были реализованы, пожалуйста, помогите, отправив нам PR, и мы с радостью рассмотрим его.