@@ -6,7 +6,7 @@ class SNMP::Client
6
6
end
7
7
8
8
getter socket : UDPSocket
9
- getter session : SNMP ::Session
9
+ getter session : SNMP ::Session | SNMP :: V3 :: Session
10
10
getter host, timeout, port
11
11
12
12
def initialize (@host : String , community = " public" , @timeout = 3 , @port = 161 )
@@ -16,6 +16,12 @@ class SNMP::Client
16
16
@session = SNMP ::Session .new(community: community)
17
17
end
18
18
19
+ def initialize (@host : String , @session : SNMP ::Session | SNMP ::V3 ::Session , @timeout = 3 , @port = 161 )
20
+ @socket = UDPSocket .new
21
+ socket.sync = false
22
+ socket.read_timeout = timeout
23
+ end
24
+
19
25
private def with_socket
20
26
if socket.closed?
21
27
@socket = UDPSocket .new
@@ -38,7 +44,12 @@ class SNMP::Client
38
44
end
39
45
40
46
private def get (oid : String , sock : UDPSocket ) : SNMP ::Message
41
- sock.write_bytes session.get(oid)
47
+ check_validation_probe(sock)
48
+
49
+ message = session.get(oid)
50
+ message = session.prepare(message) if message.is_a?(SNMP ::V3 ::Message )
51
+
52
+ sock.write_bytes message
42
53
sock.flush
43
54
session.parse(sock.read_bytes(ASN1 ::BER ))
44
55
end
@@ -55,7 +66,12 @@ class SNMP::Client
55
66
end
56
67
57
68
private def get_next (oid : String , sock : UDPSocket ) : SNMP ::Message
58
- sock.write_bytes session.get_next(oid)
69
+ check_validation_probe(sock)
70
+
71
+ message = session.get_next(oid)
72
+ message = session.prepare(message) if message.is_a?(SNMP ::V3 ::Message )
73
+
74
+ sock.write_bytes message
59
75
sock.flush
60
76
session.parse(sock.read_bytes(ASN1 ::BER ))
61
77
end
@@ -92,4 +108,12 @@ class SNMP::Client
92
108
end
93
109
self
94
110
end
111
+
112
+ protected def check_validation_probe (sock )
113
+ if session.must_revalidate?
114
+ sock.write_bytes session.engine_validation_probe
115
+ sock.flush
116
+ session.validate sock.read_bytes(ASN1 ::BER )
117
+ end
118
+ end
95
119
end
0 commit comments