netsnmp GEMは、SNMPプロトコル(V1/2C ABD V3)のRubyネイティブ実装を提供します。
この行をアプリケーションのGemfileに追加します。
gem 'netsnmp'そして実行してください:
$ bundle
または、自分でインストールします:
$ gem install netsnmp
この宝石は次のとおりです。
Ruby ToolboxでSNMP Gemsを探している場合は、束を見つけることができます。なぜそのうちの1つを使用しないのはなぜですか?
それらのほとんどはV1とV2のみを実装するため、要件がV3を使用することである場合、2つの選択肢のみが残されています。NET-SNMP(2013年以降は未成年)とそのフォローアップNET-SNMP2は、いくつかのバグを修正するためのフォークとして始まりました。両方のライブラリは、FFIを使用してc netsnmpライブラリをラップします。これにより、次のバグ(両方のライブラリで経験)に対して脆弱になります。
これらの問題はすべてここで解決されます。
スペック/サポートの下で提供されるDockerコンテナを使用して、これらの例に対してテストできます(例で使用されるポートは、ポート161にマッピングされたDocker外部ポートでなければなりません)。
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の例は似ています(初期化属性の違いに注意してください)。
以前のすべての例は、プリミティブタイプを指定していました。つまり、特に指定されていない限り、Rubyの「プリミティブ」タイプをASN.1プリミティブタイプに変換しようとします。
つまり、 #set通話にvalue: 43渡すと、asn.1整数でvarbindを構築することを意味します。 #get発行すると、応答がasn.1整数が含まれている場合、整数を返します。
ただし、SNMPはアプリケーション固有のASN.1タイプを定義します。現在、IPアドレスとタイムテックのサポートがあります。
IPAddrオブジェクト(Ruby Standard Library ipaddr )を作成し、 #set呼び出しに渡すと、SNMPコンテンツ固有のコードにマッピングされます。 #getコールの応答にIPアドレスが含まれている場合、 IPAddrオブジェクトにマッピングされます。
NETSNMP::Timeticksタイプはこのライブラリの内部ですが、Ruby 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 、既知または広告( MIBDIRS経由)ディレクトリからデフォルトのMIBSをロードします(システムにインストールされている場合)。これらはOID変換に使用されます。
自分のMIBSをもっとロードする必要がある場合があります。その場合、次の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" )パッケージマネージャーを使用して、一般的なSNMP MIBSをインストールできます。
# 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 )イベントIOもサポートされています。これは、クライアントへの通信のチャネルとして既に開かれたチャネルとしてA :proxyオブジェクトを渡すことができるという点でサポートされています。非常に重要:クライアントが接続せず、オブジェクトを閉じないため、ライフサイクルの世話をする必要があります。
プロキシオブジェクトを渡すときは、 :hostパラメーター。
プロキシオブジェクトは、送信PDUペイロードを受信するメソッドであり、受信PDUのペイロードを返すアヒルタイプの#sendである必要があります。
ここに小さな擬似コードの例があります:
# 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この主題の詳細については、Specsはこの機能をCelluloid-Ioに対してテストします。誰かが実装を提供するのに十分なほど親切であれば、EventMachineを追加できます。
このライブラリには、Ruby言語のいくつかの欠落している機能、つまりバイト配列構造の存在にいくつかの回避策があります。最も近いのは、ASCIIエンコードを備えた文字列として提示されるバイトストリームです。内部的に必要な一部の操作について、 #xorと呼ばれる文字列クラスにメソッドが追加されました。不必要なサルパッチを防ぐために、改良が採用されています。
#xorある時点で使用法のボトルネックになった場合、この宝石はXorcistもサポートしています。 Gemfileに追加する必要があります(またはシステムにインストールします):
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
netsnmpは自動的に拾います。
SNMP V3とAUTH/PRIVセキュリティレベルを有効にしてこの宝石を頻繁に使用すると、すべてが少し速くなる可能性があるという面白い感覚があります。まあ、これは基本的に、この宝石の真のパフォーマンスのボトルネックが、承認と暗号化に使用される認証キーとパスキーの生成であるためです。これはクライアントごとに1回限りのことですが、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 3を含むRubyバージョン2.1以上のRubyバージョン2.1以上に対してテストされています。Trufflerubyに対するサポートとテストもサポートしています。
すべてのエンコード/デコード/暗号化/復号化/ダイジェストは、標準ライブラリの一部であるopensslを使用して行われます。ある時点でopensslが削除され、特別に分布していない場合、自分でインストールする必要があります。うまくいけば、これは決して起こりません。
また、 openssl asn.1 APIを使用して、厳密であることが知られていることが知られており、サポートされているRFCに準拠していない場合はPDUをデコードできない場合があります。
NETSNMP_DEBUG dedidedデバッグレベル(現在、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でも使用されているものです)。あなたがターゲットにしているルビーバージョンに対してそれを実行します:
> docker-compose -f docker-compose.yml -f docker-compose-ruby-${RUBY_MAJOR_VERSION}.${RUBY_MAJOR_VERSION}.yml run netsnmp
CIは、サポートされているすべてのRubyバージョンに対してテストを実行します。変更がRubyの特定のバージョンを破った場合は、Edgeケースに対処する適切な変更を確実にコミットするか、問題ボードでお知らせください。
SNMPシミュレーターは、 dockerセットアップで独自のコンテナで実行されます。
パッケージを自分でインストールし(例: pip install snmpsim )、サーバーをローカルで実行し、SNMPシミュレーターが実行されているSNMP_PORT環境変数を設定できます。
CIの仕事は次のとおりです。
この宝石がサポートしていないいくつかの機能があります。クライアント(またはマネージャー、SNMP言語)の実装のみを提供するために構築され、要件が満たされました。ただし、これらの注目すべきミスは際立っています。
したがって、宝石が好きであるが、これらの機能を実装したい場合は、PRを送信して助けてください。喜んでレビューします。