netsnmp GEM은 SNMP 프로토콜 (V1/2C ABD V3)의 루비 네이티브 구현을 제공합니다.
이 라인을 응용 프로그램의 보석에 추가하십시오.
gem 'netsnmp'그런 다음 실행 :
$ bundle
또는 직접 설치하십시오.
$ gem install netsnmp
이 보석은 다음을 제공합니다.
Ruby Toolbox에서 SNMP 보석을 찾으면 무리를 찾을 수 있습니다. 왜 그 중 하나를 사용하지 않습니까?
대부분의 경우 V1과 V2 만 구현하므로 V3를 사용하는 것이라면 Net-SNMP (2013 년 이후의 영향을받지 않음)와 후속 조치 Net-SNMP2가 2 가지만 남습니다. 두 라이브러리는 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 "Primitive"유형을 ASN.1 원시 유형으로 변환하고 그 반대로 다음과 같습니다.
즉, value: 43 전달하면 #set 호출에 43을 전달하면 ASN.1 정수로 varbind를 구축 할 것입니다. #get 발행하고 응답에 ASN.1 정수가 포함되어 있으면 정수를 반환합니다.
그러나 SNMP는 제한적이지만 지원이있는 응용 프로그램 별 ASN.1 유형을 정의합니다. 현재 IP 주소 및 시간표에 대한 지원이 있습니다.
IPAddr 객체 (Ruby Standard Library ipaddr )를 생성하고 #set 호출로 전달하면 SNMP 컨텐츠 별 코드에 매핑됩니다. #get 호출의 응답에 IP 주소가 포함되어 있으면 IPAddr 객체에 매핑됩니다.
NETSNMP::Timeticks 유형은이 라이브러리 내부이지만 루비 Numeric 유형입니다. "숫자", 즉 계산을 수행하는 것이 안전합니다.
Counter32 및 Counter64 유형은 일반 정수에 매핑됩니다.
여기에서 사용 예제를 찾을 수 있습니다. 누락 된 유형을 지원 해야하는 경우 다음 옵션이 있습니다.
#set 호출에서 :type 사용하십시오. # 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 통해) 디렉토리 (시스템에 설치된 경우)에서 기본 MIB를로드합니다. 이것들은 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" )패키지 관리자를 사용하여 공통 SNMP MIB를 설치할 수 있습니다.
# 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 ) 이벤트 IO도 지원되며, 클라이언트에 이미 열린 커뮤니케이션 채널로 :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에 대해 테스트합니다. 누군가가 구현을 제공하기에 충분히 친절하다면 이벤트 마카인을 추가 할 수 있습니다.
이 라이브러리에는 루비 언어의 일부 누락 된 기능, 즉 바이트 어레이 구조의 존재가없는 해결 방법이 있습니다. 우리가 가진 가장 가까운 것은 ASCII 인코딩이있는 문자열로 제시된 바이트 스트림입니다. 내부적으로 필요한 일부 작업에 대해 #xor 라는 문자열 클래스에 메소드가 추가되었습니다. 불필요한 원숭이 패치를 방지하기 위해 개선이 사용되었습니다.
#xor 어느 시점에서 사용의 병목 현상이되면,이 보석은 Xorcist를 지원합니다. 젬 파일에 추가해야합니다 (또는 시스템에 설치).
# Gemfile
gem 'netsnmp'
# or, in the command line
$ gem install netsnmp
netsnmp 는 자동으로 픽업합니다.
이 보석을 자주 SNMP V3 및 Auth/Priv Security Level을 활성화하여 사용하면 모든 것이 조금 더 빠를 수 있다는 재미있는 느낌이들 것입니다. 글쎄, 이것은 기본적 으로이 보석의 진정한 성능 병목 현상이 승인 및 암호화에 사용되는 인증 및 패스 키의 생성이기 때문입니다. 이것은 각 클라이언트의 일회성이지만> 100 호스트에서 실행하면 지연이 눈에 띄게됩니다.
권장되는 작업이 있지만 모든 호스트에서 동일한 사용자/Authpase/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 이상을 지원하고 테스트합니다. Truffleruby에 대한 지원 및 테스트도 있습니다.
모든 인코딩/디코딩/암호화/암호 해독/다이제스트는 표준 라이브러리의 일부인 openssl 사용하여 수행됩니다. 어느 시점에서 openssl 제거되어 구체적으로 배포되지 않으면 직접 설치해야합니다. 바라건대 이것은 결코 일어나지 않을 것입니다.
또한 openssl ASN.1 API를 사용하여 엄격한 것으로 알려져 있으며 지원되는 RFC를 준수하지 않으면 PDU를 해독하지 못할 수 있습니다.
NETSNMP_DEBUG DEDED DEBUG 레벨 (현재 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의 특정 버전을 끊는 경우 Edge Case를 다루는 적절한 변경 사항을 저지르거나 문제위원회에서 알려주십시오. 도움을 줄 수 있습니다.
SNMP 시뮬레이터는 docker 설정에서 자체 컨테이너로 실행됩니다.
패키지를 직접 설치하고 (예 : pip install snmpsim ) 서버를 로컬로 실행 한 다음 SNMP 시뮬레이터가 실행중인 SNMP_PORT 환경 변수를 설정할 수 있습니다.
CI의 임무는 다음과 같습니다.
이 보석이 지원하지 않는 몇 가지 기능이 있습니다. 클라이언트 (또는 SNMP 언어) 구현 만 제공하도록 구축되었으며 요구 사항은 충족되었습니다. 그러나 이러한 주목할만한 미스가 눈에 띄게됩니다.
따라서 보석을 좋아하지만 이러한 기능을 구현하려면 PR을 보내 주시면 기꺼이 검토하겠습니다.