Das netsnmp -Edelstein bietet eine ruby -native Implementierung des SNMP -Protokolls (V1/2C ABD V3).
Fügen Sie diese Zeile der GemFile Ihrer Anwendung hinzu:
gem 'netsnmp'Und dann ausführen:
$ bundle
Oder installieren Sie es selbst als:
$ gem install netsnmp
Dieses Juwel bietet:
Wenn Sie nach SNMP -Edelsteinen in Ruby Toolbox suchen, finden Sie ein paar. Sie können fragen, warum nicht einfach einen von ihnen verwenden?
Die meisten von ihnen implementieren nur V1 und V2. Wenn Sie also V3 verwenden müssen, haben Sie nur zwei Auswahlmöglichkeiten: Net-SNMP (seit 2013 nicht unangebracht) und der Follow-up-Net-SNMP2, das als Gabel begann, um einige Fehler unbedingt zu beheben. Beide Bibliotheken wickeln die C netsnmp -Bibliothek mit FFI ein, wodurch sie anfällig für die folgenden Fehler (in beiden Bibliotheken erlebt) anfällig sind:
Alle diese Probleme sind hier gelöst.
Sie können den unter Spec/Support bereitgestellten Docker -Container verwenden, um anhand dieser Beispiele zu testen (der in den Beispielen verwendete Port sollte der externe Docker -Port sein, der auf Port 161 zugeordnet ist).
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 . closeSNMP V2/V1 -Beispiele sind ähnlich (Vorsicht der Unterschiede in den Initialisierungsattributen).
Alle früheren Beispiele wurden durchgeführt, indem primitive Typen angegeben wurden, dh sofern nicht anders angegeben. Es wird versuchen, einen "primitiven" Typ "primitiv" in einen asn.1-primitiven Typ und umgekehrt zu konvertieren:
Das bedeutet, dass, wenn Sie value: 43 an den #set -Aufruf, es wird eine Varbind mit einer ASN.1 -Ganzzahl erstellen. Wenn Sie ein #get ausgeben und die Antwort eine ASN.1 -Ganzzahl enthält, wird es eine Ganzzahl zurückgeben.
SNMP definiert jedoch anwendungsspezifische ASN.1-Typen, für die es Unterstützung gibt, wenn auch begrenzt. Derzeit gibt es Unterstützung für IP -Adressen und Zeitpläne.
Wenn Sie ein IPAddr Objekt (Ruby Standard Library ipaddr ) erstellen und an den #set -Anruf weitergeben, wird es dem inhaltspezifischen SNMP-Code zugeordnet. Wenn die Antwort eines #get -Anrufs eine IP -Adresse enthält, wird sie einem IPAddr -Objekt zugeordnet.
Der NETSNMP::Timeticks -Typ ist intern in dieser Bibliothek, ist jedoch ein Numeric Rubin -Typ. Sie können es sicher "als numerisch" verwenden, dh Berechnungen durchführen.
COMPLE32- und COMPE64 -Typen werden einfache Ganzzahlen zugeordnet.
Hier finden Sie Nutzungsbeispiele. Wenn Sie Unterstützung für einen fehlenden Typ benötigen, haben Sie die folgenden Optionen:
:type Sie den Parameter in #set -Aufrufe ein: # 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 lädt die Standard -MIBs aus bekannten oder beworbenen (über MIBDIRS ) Verzeichnis (vorausgesetzt, dass sie im System installiert sind). Diese werden für die OID -Umwandlung verwendet.
Manchmal müssen Sie mehr laden, Ihre eigenen MIBs. In diesem Fall können Sie die folgende API verwenden:
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" )Sie können gemeinsame SNMP -MIBs mit Ihrem Paketmanager installieren:
# using apt-get
> apt-get install snmp-mibs-downloader
# using apk
> apk --update add net-snmp-libs
In Ruby sind Sie normalerweise empfohlen, IO -Objekte nicht über Threads zu teilen. Das gleiche Prinzip gilt hier für NETSNMP::Client : Siniene, vorausgesetzt, Sie verwenden es in einem Ausführungsthread, es sollte sich sicher verhalten. So etwas wäre also möglich:
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 wird ebenfalls unterstützt, da Sie ein :proxy -Objekt als bereits geöffneter Kommunikationskanal zum Kunden übergeben können. Sehr wichtig: Sie müssen sich um den Lebenszyklus kümmern, da der Kunde keine Verbindung herstellt und das Objekt nicht schließt. Es wird keine Kontrolle darüber annehmen.
Beim Übergeben eines Proxy -Objekts können Sie den :host -Parameter weglassen.
Das Proxy-Objekt muss ein Enten-Typ-Implementierung #send sein, bei dem es sich um eine Methode handelt, die die sendende PDU-Nutzlast empfängt und die Nutzlast der empfangenden PDU zurücksendet.
Hier ist ein kleines Beispiel für Pseudo-Code:
# 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 . closeFür weitere Informationen zu diesem Thema testen die Spezifikationen dieses Merkmal gegen Celluloid-io. Eine Ereignismaschine könnte hinzugefügt werden, wenn jemand freundlich genug wäre, um eine Implementierung zu liefern.
Diese Bibliothek hat einige Problemumgehungen zu einigen fehlenden Merkmalen in der Ruby -Sprache, nämlich die Entfernung einer Byte -Array -Struktur. Das nächste, was wir haben, ist ein Byte -Stream, der als Zeichenfolge mit ASCII -Codierung dargestellt wird. Der String -Klasse, der #xor namens #xor namens, für einige interne Operationen hinzugefügt wurde, wurde hinzugefügt. Um unnötige Affenpatches zu verhindern, wurden Verfeinerungen eingesetzt.
Wenn #xor irgendwann zum Engpass Ihrer Verwendung wird, unterstützt dieses Juwel auch für XORCIST. Sie müssen es nur zu Ihrer GemFile hinzufügen (oder im System installieren):
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
und netsnmp nimmt es automatisch auf.
Wenn Sie dieses Juwel oft mit SNMP V3 und Auth/Prival Security Level aktivieren, haben Sie das lustige Gefühl, dass alles etwas schneller sein kann. Dies liegt im Grunde genommen daran, dass der tatsächliche Leistungs Engpass dieses Juwel die Erzeugung der Auth- und Passschlüssel ist, die zur Autorisierung und Verschlüsselung verwendet werden. Obwohl dies eine einmalige Sache für jeden Kunden ist, wird sich die Verzögerung bemerkbar machen, wenn Sie auf> 100 Hosts ausgeführt werden.
Es gibt eine empfohlene Arbeit, die jedoch nur dann verwendet werden kann , wenn Sie auf allen Hosts dieselbe Benutzer/Authastpass/Berechtigung verwenden !!! . Verwenden Sie dies dann mit Vorsicht:
$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 Diese Bibliothek unterstützt und wird gegen Ruby -Versionen 2.1 oder neuer getestet, einschließlich Ruby 3. Sie unterstützt und testet auch gegen Truffleruby.
Alle Codierung/Decodierung/Verschlüsselung/Entschlüsselung/Digests werden unter Verwendung von openssl durchgeführt, was (noch) ein Teil der Standardbibliothek ist. Wenn openssl irgendwann entfernt und nicht speziell verteilt ist, müssen Sie es selbst installieren. Hoffentlich wird dies niemals passieren.
Es verwendet auch die openssl ASN.1 -API, um BERS zu codieren/zu dekodieren, von dem bekannt ist, dass sie streng sind und möglicherweise nicht in der Lage sind, PDUs zu entschlüsseln, wenn sie nicht mit dem unterstützten RFC entspricht.
Sie können entweder das NETSNMP_DEBUG auf die abgestiegene Debug -Ebene (derzeit 1 und 2) einstellen. Die Protokolle werden an Stderr geschrieben.
Sie können es auch für einen bestimmten Client festlegen:
manager2 = NETSNMP :: Client . new ( debug : $stderr , debug_level : 2 , ... . ) Diese Bibliothek verwendet RSPEC. Die Client-Spezifikationen sind "Integrations" -Tests, indem wir mit einem SNMPSIM-gebauten SNMP-Agentensimulator kommunizieren.
Sie können alle Tests durch Eingabe ausführen:
> bundle exec rake spec
# or
> bundle exec rspec
...
Die unkomplizierteste Ausführung der Tests ist die Verwendung des docker-compose -Setups (das auch in der CI verwendet wird). Führen Sie es gegen die Ruby -Version aus, auf die Sie abzielen:
> docker-compose -f docker-compose.yml -f docker-compose-ruby-${RUBY_MAJOR_VERSION}.${RUBY_MAJOR_VERSION}.yml run netsnmp
Der CI führt die Tests gegen alle unterstützten Ruby -Versionen durch. Wenn Änderungen eine bestimmte Version von Ruby brechen, stellen Sie sicher, dass Sie angemessene Änderungen für den Rand -Fall begehen, oder lassen Sie es mich in der Ausgabe des Problems wissen, damit ich helfen kann.
Der SNMP -Simulator läuft im docker -Setup in seinem eigenen Container.
Sie können das Paket selbst installieren (Beispiel: pip install snmpsim ) und den Server lokal ausführen und dann die Umgebungsvariable SNMP_PORT festlegen, auf der der SNMP -Simulator ausgeführt wird.
Die Aufgabe des CI ist:
Es gibt einige Funktionen, die dieses Juwel nicht unterstützt. Es wurde entwickelt, um nur einen Kunden (oder einen Manager in SNMP Language) implementiert zu haben, und die Anforderungen wurden erfüllt. Diese bemerkenswerten Fehler werden jedoch herauskommen:
Wenn Sie also das Edelstein mögen, aber diese Funktionen lieber implementieren möchten, helfen Sie uns bitte, indem Sie uns eine PR senden, und wir werden ihn gerne überprüfen.