netsnmp 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/netsnmp.rb +2 -0
- data/lib/netsnmp/timeticks.rb +70 -0
- data/lib/netsnmp/varbind.rb +21 -13
- data/lib/netsnmp/version.rb +1 -1
- data/spec/client_spec.rb +4 -4
- data/spec/timeticks_spec.rb +12 -0
- data/spec/varbind_spec.rb +13 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8014fd377e09fcd49d70da331116b3d66bce52e3
|
4
|
+
data.tar.gz: 9038971c4dd91219e581ddfdfa11d64b062790bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1469577a0aa7719c12fa54eb445b4016f3e44b3caa2d51db8931b18f852256af0482261feeff407e195c0af2cf72d3ddb477ca6062b529f9dd0748e1dd2ffcc
|
7
|
+
data.tar.gz: 31a013f21505b92217c276b33631c52c0cb42c9d493a24b51a3bd190304f4ac67c3a1e921fa59f6f432f8f5b4b6248f68e65581ef4f2c2f7f044968bda57a4ae
|
data/lib/netsnmp.rb
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
module NETSNMP
|
2
|
+
class Timetick < Numeric
|
3
|
+
|
4
|
+
# @param [Integer] ticks number of microseconds since the time it was read
|
5
|
+
def initialize(ticks)
|
6
|
+
@ticks = ticks
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
days = days_since
|
12
|
+
hours = hours_since(days)
|
13
|
+
minutes = minutes_since(hours)
|
14
|
+
milliseconds = milliseconds_since(minutes)
|
15
|
+
"Timeticks: (#{@ticks}) #{days.to_i} days, #{hours.to_i}:#{minutes.to_i}:#{milliseconds.to_f.round(2)}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_i
|
19
|
+
@ticks
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_asn
|
23
|
+
OpenSSL::ASN1::ASN1Data.new([@ticks].pack("N"), 3, :APPLICATION)
|
24
|
+
end
|
25
|
+
|
26
|
+
def coerce(other)
|
27
|
+
[ Timetick.new(other), self]
|
28
|
+
end
|
29
|
+
|
30
|
+
def <=>(other)
|
31
|
+
to_i <=> other.to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def +(other)
|
35
|
+
Timetick.new( (to_i + other.to_i))
|
36
|
+
end
|
37
|
+
|
38
|
+
def -(other)
|
39
|
+
Timetick.new( (to_i - other.to_i))
|
40
|
+
end
|
41
|
+
|
42
|
+
def *(other)
|
43
|
+
Timetick.new( (to_i * other.to_i))
|
44
|
+
end
|
45
|
+
|
46
|
+
def /(other)
|
47
|
+
Timetick.new( (to_i / other.to_i))
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
|
53
|
+
def days_since
|
54
|
+
Rational(@ticks, 8_640_000)
|
55
|
+
end
|
56
|
+
|
57
|
+
def hours_since(days)
|
58
|
+
Rational((days.to_f - days.to_i) * 24)
|
59
|
+
end
|
60
|
+
|
61
|
+
def minutes_since(hours)
|
62
|
+
Rational((hours.to_f - hours.to_i) * 60)
|
63
|
+
end
|
64
|
+
|
65
|
+
def milliseconds_since(minutes)
|
66
|
+
Rational((minutes.to_f - minutes.to_i) * 60)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
data/lib/netsnmp/varbind.rb
CHANGED
@@ -23,8 +23,7 @@ module NETSNMP
|
|
23
23
|
def to_asn
|
24
24
|
asn_oid = OID.to_asn(@oid)
|
25
25
|
asn_val = if @type
|
26
|
-
|
27
|
-
OpenSSL::ASN1::ASN1Data.new(asn_val, asn_type, :APPLICATION)
|
26
|
+
convert_to_asn(@type, @value)
|
28
27
|
else
|
29
28
|
case @value
|
30
29
|
when String
|
@@ -37,6 +36,8 @@ module NETSNMP
|
|
37
36
|
OpenSSL::ASN1::Null.new(nil)
|
38
37
|
when IPAddr
|
39
38
|
OpenSSL::ASN1::ASN1Data.new(@value.hton, 0, :APPLICATION)
|
39
|
+
when Timetick
|
40
|
+
@value.to_asn
|
40
41
|
else
|
41
42
|
raise Error, "#{@value}: unsupported varbind type"
|
42
43
|
end
|
@@ -74,17 +75,24 @@ module NETSNMP
|
|
74
75
|
end
|
75
76
|
|
76
77
|
def convert_to_asn(typ, value)
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
78
|
+
asn_type = typ
|
79
|
+
asn_val = value
|
80
|
+
if typ.is_a?(Symbol)
|
81
|
+
asn_type = case typ
|
82
|
+
when :ipaddress then 0
|
83
|
+
when :counter32 then 1
|
84
|
+
when :gauge then 2
|
85
|
+
when :timetick
|
86
|
+
return Timetick.new(value).to_asn
|
87
|
+
when :opaque then 4
|
88
|
+
when :nsap then 5
|
89
|
+
when :counter64 then 6
|
90
|
+
when :uinteger then 7
|
91
|
+
else
|
92
|
+
raise Error, "#{typ}: unsupported application type"
|
93
|
+
end
|
87
94
|
end
|
95
|
+
OpenSSL::ASN1::ASN1Data.new(asn_val, asn_type, :APPLICATION)
|
88
96
|
end
|
89
97
|
|
90
98
|
def convert_application_asn(asn)
|
@@ -95,7 +103,7 @@ module NETSNMP
|
|
95
103
|
asn.value.unpack("n*")[0] || 0
|
96
104
|
when 2 # gauge
|
97
105
|
when 3 # timeticks
|
98
|
-
asn.value.unpack("N*")[0] || 0
|
106
|
+
Timetick.new(asn.value.unpack("N*")[0] || 0)
|
99
107
|
when 4 # opaque
|
100
108
|
when 5 # NSAP
|
101
109
|
when 6 # ASN Counter 64
|
data/lib/netsnmp/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -22,12 +22,12 @@ RSpec.describe NETSNMP::Client do
|
|
22
22
|
let(:walk_result) { <<-WALK
|
23
23
|
1.3.6.1.2.1.1.1.0: Device description
|
24
24
|
1.3.6.1.2.1.1.2.0: 1.3.6.1.4.1.3454
|
25
|
-
1.3.6.1.2.1.1.3.0: 78171676
|
25
|
+
1.3.6.1.2.1.1.3.0: Timeticks: (78171676) 9 days, 1:8:36.76
|
26
26
|
1.3.6.1.2.1.1.4.0: The Owner
|
27
27
|
1.3.6.1.2.1.1.5.0: DEVICE-192.168.1.1
|
28
28
|
1.3.6.1.2.1.1.6.0: The Cloud
|
29
29
|
1.3.6.1.2.1.1.7.0: 72
|
30
|
-
1.3.6.1.2.1.1.8.0: 0
|
30
|
+
1.3.6.1.2.1.1.8.0: Timeticks: (0) 0 days, 0:0:0.0
|
31
31
|
WALK
|
32
32
|
}
|
33
33
|
let(:set_oid_result) { 43 }
|
@@ -48,12 +48,12 @@ WALK
|
|
48
48
|
let(:walk_result) { <<-WALK
|
49
49
|
1.3.6.1.2.1.1.1.0: Device description
|
50
50
|
1.3.6.1.2.1.1.2.0: 1.3.6.1.4.1.3454
|
51
|
-
1.3.6.1.2.1.1.3.0: 78171676
|
51
|
+
1.3.6.1.2.1.1.3.0: Timeticks: (78171676) 9 days, 1:8:36.76
|
52
52
|
1.3.6.1.2.1.1.4.0: The Owner
|
53
53
|
1.3.6.1.2.1.1.5.0: DEVICE-192.168.1.1
|
54
54
|
1.3.6.1.2.1.1.6.0: The Cloud
|
55
55
|
1.3.6.1.2.1.1.7.0: 72
|
56
|
-
1.3.6.1.2.1.1.8.0: 0
|
56
|
+
1.3.6.1.2.1.1.8.0: Timeticks: (0) 0 days, 0:0:0.0
|
57
57
|
WALK
|
58
58
|
}
|
59
59
|
let(:set_oid_result) { 43 }
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# from https://ask.wireshark.org/questions/14002/how-to-decode-timeticks-hundreds-seconds-to-readable-date-time
|
2
|
+
RSpec.describe NETSNMP::Timetick do
|
3
|
+
subject { described_class.new(1525917187) }
|
4
|
+
|
5
|
+
describe "as an integer" do
|
6
|
+
it { expect((1 + subject).to_i).to be(1525917188) }
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "as an embedded string" do
|
10
|
+
it { expect(subject.to_s).to eq("Timeticks: (1525917187) 176 days, 14:39:31.87") }
|
11
|
+
end
|
12
|
+
end
|
data/spec/varbind_spec.rb
CHANGED
@@ -8,6 +8,19 @@ RSpec.describe NETSNMP::Varbind do
|
|
8
8
|
varbind = described_class.new(".1.3.6.1.4.1.2011.6.3.1.1.0", value: ipaddr)
|
9
9
|
expect(varbind.to_der).to end_with("@\x04\n\vh\x02".b)
|
10
10
|
end
|
11
|
+
it "converts custom timeticks" do
|
12
|
+
timetick = NETSNMP::Timetick.new(1) # yes, one timetick
|
13
|
+
varbind = described_class.new(".1.3.6.1.2.1.1.3.0", value: timetick)
|
14
|
+
expect(varbind.to_der).to end_with("\x04\x00\x00\x00\x01".b) # ends with an octet string rep of 1 timetick
|
15
|
+
end
|
16
|
+
context "when passed a type" do
|
17
|
+
# TODO: tidy this for IP Addresses
|
18
|
+
it "converts integer ticks" do
|
19
|
+
timetick = 1
|
20
|
+
varbind = described_class.new(".1.3.6.1.2.1.1.3.0", type: :timetick, value: timetick)
|
21
|
+
expect(varbind.to_der).to end_with("\x04\x00\x00\x00\x01".b)
|
22
|
+
end
|
23
|
+
end
|
11
24
|
end
|
12
25
|
end
|
13
26
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netsnmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Cardoso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- lib/netsnmp/scoped_pdu.rb
|
100
100
|
- lib/netsnmp/security_parameters.rb
|
101
101
|
- lib/netsnmp/session.rb
|
102
|
+
- lib/netsnmp/timeticks.rb
|
102
103
|
- lib/netsnmp/v3_session.rb
|
103
104
|
- lib/netsnmp/varbind.rb
|
104
105
|
- lib/netsnmp/version.rb
|
@@ -115,6 +116,7 @@ files:
|
|
115
116
|
- spec/support/request_examples.rb
|
116
117
|
- spec/support/start_docker.sh
|
117
118
|
- spec/support/stop_docker.sh
|
119
|
+
- spec/timeticks_spec.rb
|
118
120
|
- spec/v3_session_spec.rb
|
119
121
|
- spec/varbind_spec.rb
|
120
122
|
homepage: ''
|
@@ -156,5 +158,6 @@ test_files:
|
|
156
158
|
- spec/support/request_examples.rb
|
157
159
|
- spec/support/start_docker.sh
|
158
160
|
- spec/support/stop_docker.sh
|
161
|
+
- spec/timeticks_spec.rb
|
159
162
|
- spec/v3_session_spec.rb
|
160
163
|
- spec/varbind_spec.rb
|