อัญมณี netsnmp ให้การใช้งาน Ruby Native ของโปรโตคอล SNMP (V1/2C ABD V3)
เพิ่มบรรทัดนี้ใน Gemfile ของแอปพลิเคชันของคุณ:
gem 'netsnmp'แล้วดำเนินการ:
$ bundle
หรือติดตั้งด้วยตัวเองเป็น:
$ gem install netsnmp
อัญมณีนี้ให้:
หากคุณมองหาอัญมณี SNMP ในกล่องเครื่องมือทับทิมคุณจะพบพวง คุณอาจถามว่าทำไมไม่ใช้หนึ่งในนั้น?
ส่วนใหญ่ใช้งาน V1 และ V2 เท่านั้นดังนั้นหากความต้องการของคุณคือการใช้ V3 คุณจะเหลือเพียง 2 ตัวเลือกเท่านั้น: 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 Primitive และในทางกลับกัน: ในทางกลับกัน:
นั่นหมายความว่าถ้าคุณผ่าน value: 43 ไปยัง #set Call มันจะสร้าง varbind ด้วยจำนวนเต็ม ASN.1 หากคุณออก #get และการตอบกลับมีจำนวนเต็ม ASN.1 มันจะส่งคืนจำนวนเต็ม
อย่างไรก็ตาม SNMP กำหนดประเภท ASN.1 เฉพาะแอปพลิเคชันซึ่งมีการสนับสนุนแม้ว่าจะมี จำกัด ปัจจุบันมีการสนับสนุนที่อยู่ IP และ Timeticks
หากคุณสร้างวัตถุ IPAddr ( 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 จะโหลด MIBs เริ่มต้นจากไดเรกทอรีที่รู้จักหรือโฆษณา (ผ่าน MIBDIRS ) (หากมีการติดตั้งในระบบ) สิ่งเหล่านี้จะใช้สำหรับการแปลง 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 MIB ทั่วไปได้โดยใช้ Package Manager ของคุณ:
# using apt-get
> apt-get install snmp-mibs-downloader
# using apk
> apk --update add net-snmp-libs
ในทับทิมคุณมักจะไม่ได้รับการแนะนำให้แชร์วัตถุ 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 Payload และส่งคืนน้ำหนักบรรทุกของ 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/Auth/Priv Security ระดับความปลอดภัยคุณจะมีความรู้สึกตลก ๆ ว่าทุกอย่างจะเร็วขึ้นเล็กน้อย นี่เป็นเพราะคอขวดประสิทธิภาพที่แท้จริงของอัญมณีนี้คือการสร้างคีย์รับรองความถูกต้องและผ่านที่ใช้สำหรับการอนุญาตและการเข้ารหัส แม้ว่านี่จะเป็นสิ่งเดียวสำหรับลูกค้าแต่ละราย แต่ความล่าช้าของมันจะเห็นได้ชัดเจนหากคุณกำลังใช้โฮสต์> 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 Version 2.1 หรือมากกว่านั้นรวมถึง Ruby 3 นอกจากนี้ยังรองรับและทดสอบกับ Truffleruby
การเข้ารหัส/การถอดรหัส/การเข้ารหัส/ถอดรหัส/การย่อยทั้งหมดทำได้โดยใช้ openssl ซึ่งเป็นส่วนหนึ่งของไลบรารีมาตรฐาน หากในบางจุด openssl ถูกลบออกและไม่กระจายโดยเฉพาะคุณจะต้องติดตั้งด้วยตัวเอง หวังว่าสิ่งนี้จะไม่เกิดขึ้น
นอกจากนี้ยังใช้ openssl ASN.1 API เพื่อเข้ารหัส/ถอดรหัส 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) เรียกใช้กับเวอร์ชันทับทิมที่คุณกำหนดเป้าหมาย:
> docker-compose -f docker-compose.yml -f docker-compose-ruby-${RUBY_MAJOR_VERSION}.${RUBY_MAJOR_VERSION}.yml run netsnmp
CI ดำเนินการทดสอบกับทับทิมที่รองรับทั้งหมด หากการเปลี่ยนแปลงทำลายทับทิมเวอร์ชันเฉพาะตรวจสอบให้แน่ใจว่าคุณได้ทำการเปลี่ยนแปลงที่เหมาะสมกับเคสขอบหรือแจ้งให้เราทราบในบอร์ดปัญหาดังนั้นฉันจึงสามารถช่วยได้
ตัวจำลอง SNMP ทำงานในคอนเทนเนอร์ของตัวเองในการตั้งค่า docker
คุณสามารถติดตั้งแพ็คเกจด้วยตัวเอง (เช่น: pip install snmpsim ) และเรียกใช้เซิร์ฟเวอร์ในเครื่องจากนั้นตั้งค่าตัวแปรสภาพแวดล้อม SNMP_PORT ซึ่งตัวจำลอง SNMP กำลังทำงานอยู่
งานของ CI คือ:
มีคุณสมบัติบางอย่างที่อัญมณีนี้ไม่รองรับ มันถูกสร้างขึ้นเพื่อให้ลูกค้า (หรือผู้จัดการในภาษา SNMP) ใช้งานเท่านั้นและข้อกำหนดได้ปฏิบัติตาม อย่างไรก็ตามการพลาดที่โดดเด่นเหล่านี้จะโดดเด่น:
ดังนั้นหากคุณชอบอัญมณี แต่ต้องการนำไปใช้คุณสมบัติเหล่านี้โปรดช่วยด้วยการส่ง PR ให้เราและเราจะตรวจสอบอย่างยินดี