Permata netsnmp menyediakan implementasi asli Ruby dari protokol SNMP (V1/2C ABD V3).
Tambahkan baris ini ke gemfile aplikasi Anda:
gem 'netsnmp'Dan kemudian mengeksekusi:
$ bundle
Atau instal sendiri sebagai:
$ gem install netsnmp
Permata ini menyediakan:
Jika Anda mencari permata SNMP di Ruby Toolbox, Anda akan menemukan banyak. Anda mungkin bertanya, mengapa tidak hanya menggunakan salah satunya?
Sebagian besar dari mereka hanya mengimplementasikan V1 dan V2, jadi jika kebutuhan Anda adalah menggunakan V3, Anda hanya memiliki 2 pilihan: Net-SNMP (tidak dikupas sejak 2013) dan tindak lanjutnya NET-SNMP2, yang dimulai sebagai garpu untuk memperbaiki beberapa bug yang dibiarkan tanpa pengawasan. Kedua perpustakaan membungkus perpustakaan C netsnmp menggunakan FFI, yang membuat mereka rentan terhadap bug berikut (dialami di kedua perpustakaan):
Semua masalah ini diselesaikan di sini.
Anda dapat menggunakan wadah Docker yang disediakan di bawah SPEC/Dukungan untuk menguji terhadap contoh -contoh ini (port yang digunakan dalam contoh harus menjadi port eksternal Docker yang dipetakan ke port 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 . closeContoh SNMP V2/V1 akan serupa (waspadalah terhadap perbedaan dalam atribut inisialisasi).
Semua contoh sebelumnya dilakukan menentukan tipe primitif, yaitu kecuali ditentukan sebaliknya, itu akan mencoba untuk mengubah tipe "primitif" ruby menjadi tipe primitif ASN.1, dan sebaliknya:
Itu berarti bahwa, jika Anda memberikan value: 43 ke panggilan #set , itu akan membangun varbind dengan integer ASN.1. Jika Anda mengeluarkan #get dan respons berisi integer ASN.1, itu akan mengembalikan bilangan bulat.
Namun, SNMP mendefinisikan tipe ASN.1 khusus aplikasi, yang mana ada dukungan, meskipun terbatas. Saat ini, ada dukungan untuk alamat IP dan timeTicks.
Jika Anda membuat objek IPAddr (ruby standard library ipaddr ) dan lewati ke panggilan #set , itu akan memetakan ke kode khusus konten SNMP. Jika respons panggilan #get berisi alamat IP, itu akan memetakan ke objek IPAddr .
Jenis NETSNMP::Timeticks bersifat internal ke perpustakaan ini, tetapi ini adalah tipe Numeric ruby. Anda aman menggunakannya "sebagai numerik", yaitu, melakukan perhitungan.
Tipe Counter32 dan Counter64 akan memetakan ke bilangan bulat polos.
Anda dapat menemukan contoh penggunaan di sini. Jika Anda memerlukan dukungan untuk jenis yang hilang, Anda memiliki opsi berikut:
:type Panggilan #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 akan memuat MIB default dari direktori yang diketahui atau diiklankan (melalui MIBDIRS ) (asalkan mereka diinstal dalam sistem). Ini akan digunakan untuk konversi OID.
Terkadang Anda perlu memuat lebih banyak, MIB Anda sendiri, dalam hal ini, Anda dapat menggunakan API berikut:
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" )Anda dapat menginstal SNMP MIBS umum dengan menggunakan manajer paket Anda:
# using apt-get
> apt-get install snmp-mibs-downloader
# using apk
> apk --update add net-snmp-libs
Di Ruby, Anda biasanya disarankan untuk tidak berbagi objek IO di seluruh utas. Prinsip yang sama berlaku di sini untuk NETSNMP::Client : Asalkan Anda menggunakannya dalam utas eksekusi, itu harus berperilaku aman. Jadi, sesuatu seperti ini mungkin terjadi:
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 Evented juga didukung, karena Anda dapat melewati objek :proxy sebagai saluran komunikasi yang sudah dibuka dengan klien. Sangat penting: Anda harus mengurus siklus hidup, karena klien tidak akan terhubung dan tidak akan menutup objek, itu tidak akan mengasumsikan kontrol atasnya.
Saat melewati objek proxy, Anda dapat menghilangkan :host .
Objek proxy harus berupa tipe bebek yang menerapkan #send , yang merupakan metode yang menerima muatan PDU pengiriman, dan mengembalikan muatan PDU penerima.
Berikut adalah contoh kode semu kecil:
# 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 . closeUntuk informasi lebih lanjut tentang subjek ini, spesifikasi menguji fitur ini terhadap seluloid-io. Suatu eventmachine dapat ditambahkan, jika seseorang akan berbaik hati untuk memberikan implementasi.
Perpustakaan ini memiliki beberapa solusi untuk beberapa fitur yang hilang dalam bahasa Ruby, yaitu tidak adil dari struktur array byte. Yang paling dekat yang kami miliki adalah aliran byte yang disajikan sebagai string dengan pengkodean ASCII. Metode ditambahkan ke kelas string yang disebut #xor untuk beberapa operasi yang diperlukan secara internal. Untuk mencegah patch monyet yang tidak perlu, penyempurnaan telah digunakan.
Jika #xor menjadi beberapa titik hambatan penggunaan Anda, permata ini juga memiliki dukungan untuk Xorcist. Anda hanya perlu menambahkannya ke gemfile Anda (atau menginstalnya di sistem):
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
dan netsnmp akan secara otomatis mengambilnya.
Jika Anda sering menggunakan permata ini dengan SNMP V3 dan tingkat keamanan AUTH/Priv diaktifkan, Anda akan memiliki perasaan lucu bahwa semuanya bisa sedikit lebih cepat. Nah, ini pada dasarnya karena kemacetan kinerja sebenarnya dari permata ini adalah generasi auth dan kunci lulus yang digunakan untuk otorisasi dan enkripsi. Meskipun ini adalah hal satu kali untuk setiap klien, kelambatannya akan terlihat jika Anda menjalankan> 100 host.
Ada kerja yang disarankan, tetapi ini hanya dapat digunakan jika Anda menggunakan pengguna/authpass/privpass yang sama di semua host !!! . Gunakan ini dengan hati -hati, lalu:
$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 Perpustakaan ini mendukung dan diuji terhadap versi Ruby 2.1 atau lebih baru, termasuk Ruby 3. Ini juga mendukung dan menguji terhadap Truffleruby.
Semua pengkodean/decoding/enkripsi/dekripsi/pencernaan dilakukan dengan menggunakan openssl , yang merupakan (masih) bagian dari perpustakaan standar. Jika pada titik tertentu openssl dihapus dan tidak terdistribusi secara khusus, Anda harus menginstalnya sendiri. Semoga ini tidak akan pernah terjadi.
Ini juga menggunakan openssl ASN.1 API untuk mengkode/mendekode BER, yang diketahui ketat, dan mungkin tidak dapat memecahkan kode PDU jika tidak sesuai dengan RFC yang didukung.
Anda dapat mengatur NETSNMP_DEBUG ke level debug Desided (saat ini, 1 dan 2). Log akan ditulis ke Stderr.
Anda juga dapat mengaturnya untuk klien tertentu:
manager2 = NETSNMP :: Client . new ( debug : $stderr , debug_level : 2 , ... . ) Perpustakaan ini menggunakan RSPEC. Spesifikasi klien adalah tes "integrasi", karena kami berkomunikasi dengan simulator agen SNMP yang dibangun oleh SNMPSIM.
Anda dapat menjalankan semua tes dengan mengetik:
> bundle exec rake spec
# or
> bundle exec rspec
...
Cara paling mudah untuk menjalankan tes adalah dengan menggunakan pengaturan docker-compose (yang juga apa yang digunakan dalam CI). Jalankan terhadap versi Ruby yang Anda targetkan:
> docker-compose -f docker-compose.yml -f docker-compose-ruby-${RUBY_MAJOR_VERSION}.${RUBY_MAJOR_VERSION}.yml run netsnmp
CI menjalankan tes terhadap semua versi Ruby yang didukung. Jika perubahan memecahkan versi ruby tertentu, pastikan Anda melakukan perubahan yang tepat menangani case Edge, atau beri tahu saya di papan masalah, sehingga saya dapat membantu.
Simulator SNMP berjalan dalam wadahnya sendiri di pengaturan docker .
Anda dapat menginstal paket sendiri (mis: pip install snmpsim ) dan jalankan server secara lokal, lalu atur variabel lingkungan SNMP_PORT , tempat simulator snmp berjalan.
Pekerjaan CI adalah:
Ada beberapa fitur yang tidak didukung oleh permata ini. Itu dibangun untuk memberikan implementasi klien (atau manajer, dalam bahasa SNMP) saja, dan persyaratan dipenuhi. Namun, kesalahan penting ini akan menonjol:
Jadi jika Anda menyukai permata, tetapi lebih suka fitur -fitur ini diterapkan, tolong bantu dengan mengirimi kami PR dan kami dengan senang hati akan memeriksanya.