@@ -10,7 +10,7 @@ class SNMP::Session
1010 end
1111
1212 def engine_validation_probe : V3 ::Message
13- raise " engine probes are not required for SNMP V2C"
13+ raise SNMP :: Error .new( " engine probes are not required for SNMP V2C" )
1414 end
1515
1616 def validate (message : V3 ::Message )
@@ -44,24 +44,24 @@ class SNMP::Session
4444 SNMP ::Message .new(snmp)
4545 end
4646
47- def get (oid, request_id = rand(2147483647 ))
47+ def get (oid, request_id = rand(REQUEST_ID_RANGE ))
4848 SNMP ::Message .new(@community , Request ::Get , VarBind .new(oid), request_id)
4949 end
5050
5151 # Multi-varbind Get: one GetRequest carrying every OID (RFC 3416 allows a PDU
5252 # to bind several variables), answered by a single Response with N varbinds.
53- def get (oids : Enumerable (String ), request_id = rand(2147483647 ))
53+ def get (oids : Enumerable (String ), request_id = rand(REQUEST_ID_RANGE ))
5454 varbinds = oids.map { |oid | VarBind .new(oid) }.to_a
5555 SNMP ::Message .new(@community , Request ::Get , varbinds, request_id)
5656 end
5757
58- def get_next (oid, request_id = rand(2147483647 ))
58+ def get_next (oid, request_id = rand(REQUEST_ID_RANGE ))
5959 message = get(oid, request_id)
6060 message.request = Request ::GetNext
6161 message
6262 end
6363
64- def get_next (oids : Enumerable (String ), request_id = rand(2147483647 ))
64+ def get_next (oids : Enumerable (String ), request_id = rand(REQUEST_ID_RANGE ))
6565 message = get(oids, request_id)
6666 message.request = Request ::GetNext
6767 message
@@ -70,35 +70,35 @@ class SNMP::Session
7070 # GetBulk (RFC 3416): retrieve up to *max_repetitions* successors for each
7171 # repeating varbind in one round-trip. The first *non_repeaters* OIDs are
7272 # treated as plain GetNext, the rest as repeaters.
73- def get_bulk (oids : Enumerable (String ), non_repeaters = 0 , max_repetitions = 10 , request_id = rand(2147483647 ))
73+ def get_bulk (oids : Enumerable (String ), non_repeaters = 0 , max_repetitions = 10 , request_id = rand(REQUEST_ID_RANGE ))
7474 varbinds = oids.map { |oid | VarBind .new(oid) }.to_a
7575 message = SNMP ::Message .new(@community , Request ::GetBulk , varbinds, request_id)
7676 message.non_repeaters = non_repeaters
7777 message.max_repetitions = max_repetitions
7878 message
7979 end
8080
81- def set (oid, value, request_id = rand(2147483647 ))
82- SNMP ::Message .new(@community , Request ::Set , to_varbind (oid, value), request_id)
81+ def set (oid, value, request_id = rand(REQUEST_ID_RANGE ))
82+ SNMP ::Message .new(@community , Request ::Set , VarBind .from_value (oid, value), request_id)
8383 end
8484
8585 # Standard first two varbinds of an SNMPv2 notification (RFC 3416 4.2.6).
8686 SYS_UPTIME_OID = " 1.3.6.1.2.1.1.3.0"
8787 SNMP_TRAP_OID_OID = " 1.3.6.1.6.3.1.1.4.1.0"
8888
8989 # Build an SNMPv2-Trap: sysUpTime.0 + snmpTrapOID.0 followed by *varbinds*.
90- def trap_v2 (oid, uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(2147483647 ))
90+ def trap_v2 (oid, uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(REQUEST_ID_RANGE ))
9191 SNMP ::Message .new(@community , Request ::V2_Trap , notification_varbinds(oid, uptime, varbinds), request_id)
9292 end
9393
9494 # Build an Inform (same shape as a v2 trap, but confirmed by the receiver).
95- def inform (oid, uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(2147483647 ))
95+ def inform (oid, uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(REQUEST_ID_RANGE ))
9696 SNMP ::Message .new(@community , Request ::Inform , notification_varbinds(oid, uptime, varbinds), request_id)
9797 end
9898
9999 # Build an RFC 1157 SNMPv1 Trap (its own wire structure). *enterprise* is the
100100 # enterprise OID, *agent_address* a dotted-quad IPv4 string.
101- def trap_v1 (enterprise, agent_address, generic_trap : GenericTrap , specific_trap = 0 , uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(2147483647 ))
101+ def trap_v1 (enterprise, agent_address, generic_trap : GenericTrap , specific_trap = 0 , uptime = 0 , varbinds : Array (VarBind ) = [] of VarBind , request_id = rand(REQUEST_ID_RANGE ))
102102 pdu = V1Trap .new(agent_address, generic_trap, specific_trap.to_i32,
103103 oid: enterprise, time_ticks: uptime.to_u32, varbinds: varbinds, request_id: request_id)
104104 SNMP ::Message .new(@community , Request ::V1_Trap , pdu, version: Version ::V1 )
@@ -116,36 +116,8 @@ class SNMP::Session
116116
117117 # Multi-varbind Set: one SetRequest assigning every OID => value pair. The Hash
118118 # keeps insertion order, so the varbinds go out in the order they were given.
119- def set (values : Hash (String , _), request_id = rand(2147483647 ))
120- varbinds = values.map { |oid , value | to_varbind (oid, value) }
119+ def set (values : Hash (String , _), request_id = rand(REQUEST_ID_RANGE ))
120+ varbinds = values.map { |oid , value | VarBind .from_value (oid, value) }
121121 SNMP ::Message .new(@community , Request ::Set , varbinds, request_id)
122122 end
123-
124- # Encode a single OID => value assignment into a VarBind. Accepts the typed
125- # SNMP values (`TypedValue`), the Crystal primitives, a raw `ASN1::BER`, or a
126- # pre-built `VarBind`.
127- private def to_varbind (oid , value ) : VarBind
128- data = value.is_a?(VarBind ) ? value : VarBind .new(oid)
129-
130- case value
131- when TypedValue
132- data.value = value.to_ber
133- when String
134- data.value.set_string(value)
135- when Int
136- data.value.set_integer(value)
137- when Bool
138- data.value.set_boolean(value)
139- when Nil
140- data.value.tag_number = UniversalTags ::Null
141- when ASN1 ::BER
142- data.value = value
143- when VarBind
144- data.oid = oid
145- else
146- raise ArgumentError .new(" unsupported varbind value. For complex values pass a pre-constructed `ASN1::BER`" )
147- end
148-
149- data
150- end
151123end
0 commit comments