This repository was archived by the owner on Aug 29, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 28
This repository was archived by the owner on Aug 29, 2024. It is now read-only.
SNMP-Get blocks #43
Copy link
Copy link
Closed
Description
I expect the SNMP-GET request not to block:
require 'bundler/setup'
require 'snmp'
require 'async'
require 'async/io'
require 'async/io/udp_socket'
OID_SYSNAME = "1.3.6.1.2.1.1.5.0"
OID_SYSLOCATION = "1.3.6.1.2.1.1.6.0"
module SNMP
include Async::IO
end
Async do |task|
task.async do
puts "BEGIN"
puts "Ruby version: #{RUBY_VERSION}"
end
task.async do |t|
t.sleep 0.5
manager = SNMP::Manager.new(host: '127.0.0.1', port: 1024, community: 'linksys-system') #do |manager|
puts "Created manager."
response = manager.get([OID_SYSNAME, OID_SYSLOCATION])
puts "Got response."
response.each_varbind do |vb|
puts "#{vb.name.to_s} #{vb.value.to_s} #{vb.value.asn1_type}"
end
end
task.async do
puts "MIDDLE"
end
task.async do |t|
5.times do
puts "X"
t.sleep 0.5
end
puts "END"
end
end
To run an agent locally:
$ pip install snmpsim
$ mkdir snmp-data
$ cat > snmp-data/linksys-system.snmprec
1.3.6.1.2.1.1.1.0|4|BEFSX41
1.3.6.1.2.1.1.2.0|6|1.3.6.1.4.1.3955.1.1
1.3.6.1.2.1.1.3.0|67|638239
1.3.6.1.2.1.1.4.0|4|Linksys
1.3.6.1.2.1.1.5.0|4|isp-gw
1.3.6.1.2.1.1.6.0|4|4, Petersburger strasse, Berlin, Germany
1.3.6.1.2.1.1.8.0|67|4
^D
$ snmpsimd.py --data-dir=snmp-data/ --agent-udpv4-endpoint=127.0.0.1:1024 --log-level=debug --v2c-arch
When the SNMP agent is running:
$ ruby snmp.rb
BEGIN
Ruby version: 3.0.0
MIDDLE
X
Created manager.
Got response.
SNMPv2-MIB::sysName.0 isp-gw OCTET STRING
SNMPv2-MIB::sysLocation.0 4, Petersburger strasse, Berlin, Germany OCTET STRING
X
X
X
X
END
When it's not running:
$ ruby snmp.rb
BEGIN
Ruby version: 3.0.0
MIDDLE
X
Created manager.
0.0s error: Async::Task [oid=0xca8] [pid=17081] [2020-12-10 13:50:35 +0100]
| SNMP::RequestTimeout: host 127.0.0.1 not responding
| → /home/user/dev/oss/ruby-snmp/lib/snmp/manager.rb:246 in `get'
| snmp.rb:24 in `block (2 levels) in <main>'
| /home/user/dev/oss/async/lib/async/task.rb:265 in `block in make_fiber'
X
X
X
X
END
I expect something like:
$ ruby snmp.rb
BEGIN
Ruby version: 3.0.0
MIDDLE
X
Created manager.
X
X
X
X
END
0.0s error: Async::Task [oid=0xca8] [pid=17081] [2020-12-10 13:50:35 +0100]
| SNMP::RequestTimeout: host 127.0.0.1 not responding
| → /home/user/dev/oss/ruby-snmp/lib/snmp/manager.rb:246 in `get'
| snmp.rb:24 in `block (2 levels) in <main>'
| /home/user/dev/oss/async/lib/async/task.rb:265 in `block in make_fiber'
Ruby-SNMP uses stdlib's Timeout.timeout
, which uses Kernel#sleep
. AFAIK in Ruby 3.0 Kernel#sleep
should be aware of the Fiber scheduler?
Ruby: 3.0.0preview2
async: HEAD
async-io: HEAD
ruby-snmp: 1.3.2
Metadata
Metadata
Assignees
Labels
No labels