netsnmp 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.travis.yml +4 -4
  4. data/Gemfile +5 -1
  5. data/README.md +124 -63
  6. data/lib/netsnmp.rb +66 -10
  7. data/lib/netsnmp/client.rb +93 -75
  8. data/lib/netsnmp/encryption/aes.rb +84 -0
  9. data/lib/netsnmp/encryption/des.rb +80 -0
  10. data/lib/netsnmp/encryption/none.rb +17 -0
  11. data/lib/netsnmp/errors.rb +1 -3
  12. data/lib/netsnmp/message.rb +81 -0
  13. data/lib/netsnmp/oid.rb +18 -137
  14. data/lib/netsnmp/pdu.rb +106 -64
  15. data/lib/netsnmp/scoped_pdu.rb +23 -0
  16. data/lib/netsnmp/security_parameters.rb +198 -0
  17. data/lib/netsnmp/session.rb +84 -275
  18. data/lib/netsnmp/v3_session.rb +81 -0
  19. data/lib/netsnmp/varbind.rb +65 -156
  20. data/lib/netsnmp/version.rb +2 -1
  21. data/netsnmp.gemspec +2 -8
  22. data/spec/client_spec.rb +147 -99
  23. data/spec/handlers/celluloid_spec.rb +33 -20
  24. data/spec/oid_spec.rb +11 -5
  25. data/spec/pdu_spec.rb +22 -22
  26. data/spec/security_parameters_spec.rb +40 -0
  27. data/spec/session_spec.rb +0 -23
  28. data/spec/support/celluloid.rb +24 -0
  29. data/spec/support/request_examples.rb +36 -0
  30. data/spec/support/start_docker.sh +15 -1
  31. data/spec/v3_session_spec.rb +21 -0
  32. data/spec/varbind_spec.rb +2 -51
  33. metadata +30 -76
  34. data/lib/netsnmp/core.rb +0 -12
  35. data/lib/netsnmp/core/client.rb +0 -15
  36. data/lib/netsnmp/core/constants.rb +0 -153
  37. data/lib/netsnmp/core/inline.rb +0 -20
  38. data/lib/netsnmp/core/libc.rb +0 -48
  39. data/lib/netsnmp/core/libsnmp.rb +0 -44
  40. data/lib/netsnmp/core/structures.rb +0 -167
  41. data/lib/netsnmp/core/utilities.rb +0 -13
  42. data/lib/netsnmp/handlers/celluloid.rb +0 -27
  43. data/lib/netsnmp/handlers/em.rb +0 -56
  44. data/spec/core/libc_spec.rb +0 -2
  45. data/spec/core/libsnmp_spec.rb +0 -32
  46. data/spec/core/structures_spec.rb +0 -54
  47. data/spec/handlers/em_client_spec.rb +0 -34
@@ -1,29 +1,42 @@
1
1
  require 'celluloid/io'
2
- require 'netsnmp/handlers/celluloid'
2
+ require_relative "../support/request_examples"
3
3
  require_relative '../support/celluloid'
4
4
 
5
- RSpec.describe NETSNMP::Celluloid::Client, type: :celluloid do
5
+ RSpec.describe "with cellulloid", type: :celluloid do
6
6
  include CelluloidHelpers
7
- let(:host) { "localhost" }
8
- let(:host_options) { {
9
- peername: "localhost",
10
- port: SNMPPORT,
11
- username: "simulator",
12
- auth_password: "auctoritas",
13
- auth_protocol: :md5,
14
- priv_password: "privatus",
15
- priv_protocol: :des
16
- } }
7
+ let(:user_options) { { username: "authprivmd5des", auth_password: "maplesyrup",
8
+ auth_protocol: :md5, priv_password: "maplesyrup",
9
+ priv_protocol: :des } }
17
10
 
18
- subject { described_class.new(host, options) }
11
+ let(:get_oid) { "1.3.6.1.2.1.1.5.0" }
12
+ let(:next_oid) { "1.3.6.1.2.1.1.6.0" }
13
+ let(:set_oid) { "1.3.6.1.2.1.1.3.0" } # sysUpTimeInstance
14
+ let(:walk_oid) { "1.3.6.1.2.1.1.9.1.3" }
15
+ let(:get_result) { "tt" }
16
+ let(:next_result) { "KK12" }
17
+ let(:walk_result) { <<-WALK
18
+ 1.3.6.1.2.1.1.9.1.3.1: The SNMP Management Architecture MIB.
19
+ 1.3.6.1.2.1.1.9.1.3.2: The MIB for Message Processing and Dispatching.
20
+ 1.3.6.1.2.1.1.9.1.3.3: The management information definitions for the SNMP User-based Security Model.
21
+ 1.3.6.1.2.1.1.9.1.3.4: The MIB module for SNMPv2 entities
22
+ 1.3.6.1.2.1.1.9.1.3.5: The MIB module for managing TCP implementations
23
+ 1.3.6.1.2.1.1.9.1.3.6: The MIB module for managing IP and ICMP implementations
24
+ 1.3.6.1.2.1.1.9.1.3.7: The MIB module for managing UDP implementations
25
+ 1.3.6.1.2.1.1.9.1.3.8: View-based Access Control Model for SNMP.
26
+ WALK
27
+ }
19
28
 
20
- describe "#get" do
21
- let(:oid) { "1.3.6.1.2.1.1.5.0" } # sysName.0
22
- let(:options) { host_options.merge(context: "a172334d7d97871b72241397f713fa12") }
23
- it "fetches the varbinds for a given oid" do
24
- value = within_io_actor { value = subject.get(oid) }
25
- expect(value).to eq("tt")
26
- end
29
+ around(:each) do |example|
30
+ within_io_actor { example.run }
31
+ end
32
+ let(:proxy) { CelluloidHelpers::Proxy.new("localhost", SNMPPORT) }
33
+ after(:each) { proxy.close }
34
+
35
+ it_behaves_like "an snmp client" do
36
+ subject { NETSNMP::Client.new(options) }
37
+ let(:device_options) { { proxy: proxy } }
38
+ let(:protocol_options) { user_options }
39
+ let(:extra_options) { { version: 3, context: "a172334d7d97871b72241397f713fa12" } }
27
40
  end
28
41
 
29
42
  end
data/spec/oid_spec.rb CHANGED
@@ -1,9 +1,15 @@
1
1
  RSpec.describe NETSNMP::OID do
2
- let(:code) { "SNMPv2-MIB::sysDescr.0" }
3
- let(:oid_code) { "1.3.6.1.2.1.1.1.0" }
4
- subject { described_class.new(code) }
2
+ #let(:code) { "SNMPv2-MIB::sysDescr.0" }
3
+ let(:code) { "1.3.6.1.2.1.1.1.0" }
4
+ subject { described_class.build(code) }
5
+
6
+ describe ".build" do
7
+ it { expect(described_class.build([1,3,6,1,2,1,1,1,0]).to_s).to eq(code) }
8
+ it { expect(described_class.build(".#{code}").to_s).to eq(code) }
9
+ it { expect { described_class.build("blablabla") }.to raise_error(NETSNMP::Error) }
10
+ end
5
11
 
6
- it "translates always to numerical oid code" do
7
- expect(subject.to_s).to eq(oid_code)
12
+ describe ".to_asn" do
13
+ it { expect(described_class.to_asn(subject).to_der).to eq("\x06\b+\x06\x01\x02\x01\x01\x01\x00".b) }
8
14
  end
9
15
  end
data/spec/pdu_spec.rb CHANGED
@@ -1,29 +1,29 @@
1
1
  RSpec.describe NETSNMP::PDU do
2
- let(:struct) { double(:structure) }
3
- let(:pointer) { double(:pointer) }
4
- subject { NETSNMP::PDU.new(pointer) }
5
- before do
6
- allow(NETSNMP::Core::Structures::PDU).to receive(:new).with(pointer).and_return(struct)
7
- end
8
-
9
- it { is_expected.to respond_to(:struct) }
10
- it { expect(subject.varbinds).to be_empty }
2
+ let(:get_request_oid) { ".1.3.6.1.2.1.1.1.0" }
3
+ let(:encoded_get_pdu) { "0'\002\001\000\004\006public\240\032\002\002?*\002\001\000\002\001\0000\0160\f\006\b+\006\001\002\001\001\001\000\005\000" }
4
+ let(:encoded_response_pdu) { "0+\002\001\000\004\006public\242\036\002\002'\017\002\001\000\002\001\0000\0220\020\006\b+\006\001\002\001\001\001\000\004\004test" }
11
5
 
12
- describe NETSNMP::RequestPDU do
13
- before { allow(NETSNMP::Core::LibSNMP).to receive(:snmp_pdu_create).and_return(pointer) }
14
- subject { NETSNMP::PDU.build(:get) }
6
+ describe "#to_der" do
7
+ let(:pdu_get){ described_class.build(:get,
8
+ headers: [0, "public"] ,
9
+ request_id: 16170) }
15
10
 
16
- describe "#add_varbind" do
17
- let(:oid) { double(:oid) }
18
- let(:value) { double(:value) }
19
- let(:varbind) { double(:varbind) }
20
- before { allow(NETSNMP::RequestVarbind).to receive(:new).with(subject, oid, value, instance_of(Hash)).and_return(varbind) }
21
- it "creates a new varbind and adds it to the structure" do
22
- subject.add_varbind(oid, { value: value })
23
- expect(subject.varbinds).not_to be_empty
24
- expect(subject.varbinds).to include(varbind)
25
- end
11
+ context "v1" do
12
+ before { pdu_get.add_varbind(oid: get_request_oid) }
13
+ it { expect(pdu_get.to_der).to eq(encoded_get_pdu.b) }
26
14
  end
27
15
  end
28
16
 
17
+ describe "#decoding pdus" do
18
+ describe "v1" do
19
+ let(:pdu_response) { described_class.decode(encoded_response_pdu) }
20
+ it { expect(pdu_response.version).to be(0) }
21
+ it { expect(pdu_response.community).to eq("public") }
22
+ it { expect(pdu_response.request_id).to be(9999) }
23
+
24
+ it { expect(pdu_response.varbinds.length).to be(1) }
25
+ it { expect(pdu_response.varbinds[0].oid).to eq("1.3.6.1.2.1.1.1.0") }
26
+ it { expect(pdu_response.varbinds[0].value).to eq("test") }
27
+ end
28
+ end
29
29
  end
@@ -0,0 +1,40 @@
1
+ # FROM https://tools.ietf.org/html/rfc3414#appendix-A.2.1
2
+ RSpec.describe NETSNMP::SecurityParameters do
3
+ let(:engine_id) {"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02".b }
4
+ let(:password) { "maplesyrup" }
5
+ describe "#passkey" do
6
+ context "md5" do
7
+ subject { described_class.new(security_level: :auth_no_priv, auth_protocol: :md5, username: "username", engine_id: engine_id, auth_password: "maplesyrup" ) }
8
+ it { expect(subject.send(:passkey, password)).to eq("\x9f\xaf\x32\x83\x88\x4e\x92\x83\x4e\xbc\x98\x47\xd8\xed\xd9\x63".b) }
9
+ end
10
+ context "sha" do
11
+ subject { described_class.new(security_level: :auth_priv, auth_protocol: :sha, username: "username", engine_id: engine_id, auth_password: "maplesyrup", priv_password: "maplesyrup") }
12
+ it { expect(subject.send(:passkey, password).b).to eq("\x9f\xb5\xcc\x03\x81\x49\x7b\x37\x93\x52\x89\x39\xff\x78\x8d\x5d\x79\x14\x52\x11".b) }
13
+ end
14
+ end
15
+
16
+
17
+ describe "keys" do
18
+ let(:md5_sec) { described_class.new(security_level: :auth_priv,
19
+ auth_protocol: :md5,
20
+ priv_protocol: :des,
21
+ username: "username",
22
+ auth_password: password,
23
+ priv_password: password,
24
+ engine_id: engine_id ) }
25
+ let(:sha_sec) { described_class.new(security_level: :auth_priv,
26
+ auth_protocol: :sha,
27
+ priv_protocol: :des,
28
+ username: "username",
29
+ auth_password: password,
30
+ priv_password: password,
31
+ engine_id: engine_id ) }
32
+ it do
33
+ expect(md5_sec.send(:auth_key)).to eq("\x52\x6f\x5e\xed\x9f\xcc\xe2\x6f\x89\x64\xc2\x93\x07\x87\xd8\x2b".b)
34
+ expect(md5_sec.send(:priv_key)).to eq("\x52\x6f\x5e\xed\x9f\xcc\xe2\x6f\x89\x64\xc2\x93\x07\x87\xd8\x2b".b)
35
+ expect(sha_sec.send(:auth_key)).to eq("\x66\x95\xfe\xbc\x92\x88\xe3\x62\x82\x23\x5f\xc7\x15\x1f\x12\x84\x97\xb3\x8f\x3f".b)
36
+ expect(sha_sec.send(:priv_key)).to eq("\x66\x95\xfe\xbc\x92\x88\xe3\x62\x82\x23\x5f\xc7\x15\x1f\x12\x84\x97\xb3\x8f\x3f".b)
37
+ end
38
+ end
39
+
40
+ end
data/spec/session_spec.rb CHANGED
@@ -8,27 +8,4 @@ RSpec.describe NETSNMP::Session do
8
8
  subject { described_class.new(host, options) }
9
9
  after { subject.close }
10
10
 
11
-
12
- describe "#send" do
13
- let(:pointer) { double(:pointer) }
14
- let(:pdu) { double(:pdu, pointer: pointer) }
15
- let(:response) { double(:response) }
16
- let(:reqid) { double(:requestid) }
17
- let(:requests) { {} }
18
-
19
- before do
20
- allow(pdu).to receive(:[]).with(:reqid).and_return(reqid)
21
- allow(requests).to receive(:[]).with(reqid).and_return([:success, response])
22
- end
23
-
24
- it "sends and receives a pdu" do
25
- expect(IO).to receive(:select).twice.and_return([[], []])
26
- expect(NETSNMP::Core::LibSNMP).to receive(:snmp_sess_async_send).with(subject.signature, pointer, instance_of(FFI::Function), nil)
27
- expect(subject).to receive(:handle_response).and_return(response)
28
- expect(subject.send(pdu)).to be(response)
29
- end
30
-
31
-
32
- end
33
-
34
11
  end
@@ -19,4 +19,28 @@ module CelluloidHelpers
19
19
  actor.terminate if actor.alive? rescue nil
20
20
  end
21
21
 
22
+
23
+ class Proxy < NETSNMP::Session::Transport
24
+ MAXPDUSIZE = 0xffff + 1
25
+
26
+ def initialize(host, port)
27
+ @socket = Celluloid::IO::UDPSocket.new
28
+ @socket.connect( host, port )
29
+ @timeout = 2
30
+ end
31
+
32
+ def close
33
+ @socket.close
34
+ end
35
+
36
+ private
37
+ def wait(mode)
38
+ Celluloid.timeout(@timeout) do
39
+ @socket.__send__(mode)
40
+ end
41
+ rescue Celluloid::TaskTimeout
42
+ raise Timeout::Error, "Timeout after #{@timeout} seconds"
43
+ end
44
+
45
+ end
22
46
  end
@@ -0,0 +1,36 @@
1
+ RSpec.shared_examples "an snmp client" do
2
+ let(:device_options) { {
3
+ host: "localhost",
4
+ port: SNMPPORT
5
+ } }
6
+ let(:protocol_options) { { } }
7
+ let(:extra_options) { { } }
8
+ let(:options) { protocol_options.merge(device_options).merge(extra_options) }
9
+
10
+ subject { described_class.new(options) }
11
+
12
+ describe "#get" do
13
+ let(:value) { subject.get(oid: get_oid) }
14
+ it "fetches the varbinds for a given oid" do
15
+ expect(value).to eq(get_result)
16
+ end
17
+ end
18
+
19
+ describe "#get_next" do
20
+ let(:varbind) { subject.get_next(oid: get_oid) }
21
+ it "fetches the varbinds for the next oid" do
22
+ oid, value = varbind
23
+ expect(value).to start_with(next_result)
24
+ expect(oid).to eq(next_oid)
25
+ end
26
+ end
27
+
28
+ describe "#walk" do
29
+ let(:value) { subject.walk(oid: walk_oid) }
30
+ it "fetches the varbinds for the next oid" do
31
+ values = value.map {|oid, val| "#{oid}: #{val}" }.join("\n") << "\n"
32
+ expect(values).to eq(walk_result)
33
+ end
34
+ end
35
+
36
+ end
@@ -1,5 +1,19 @@
1
1
  sudo docker build --build-arg http_proxy=$http_proxy --build-arg https_proxy=$https_proxy -t snmp-server-emulator -f spec/support/Dockerfile .
2
- sudo docker run -d -p :1161/udp --name test-snmp-emulator snmp-server-emulator --agent-udpv4-endpoint=0.0.0.0:1161 --agent-udpv6-endpoint='[::0]:1161'
2
+ sudo docker run -d -p :1161/udp --name test-snmp-emulator snmp-server-emulator \
3
+ --v3-engine-id=000000000000000000000002 \
4
+ --agent-udpv4-endpoint=0.0.0.0:1161 --agent-udpv6-endpoint='[::0]:1161' \
5
+ --v3-user=simulator --v3-auth-key=auctoritas --v3-priv-key=privatus \
6
+ --v3-user=authmd5 --v3-auth-key=maplesyrup --v3-auth-proto=MD5 --v3-priv-proto=NONE \
7
+ --v3-user=authsha --v3-auth-key=maplesyrup --v3-auth-proto=SHA --v3-priv-proto=NONE \
8
+ --v3-user=authprivshaaes --v3-auth-key=maplesyrup --v3-auth-proto=SHA \
9
+ --v3-priv-key=maplesyrup --v3-priv-proto=AES \
10
+ --v3-user=authprivmd5aes --v3-auth-key=maplesyrup --v3-auth-proto=MD5 \
11
+ --v3-priv-key=maplesyrup --v3-priv-proto=AES \
12
+ --v3-user=authprivshades --v3-auth-key=maplesyrup --v3-auth-proto=SHA \
13
+ --v3-priv-key=maplesyrup --v3-priv-proto=DES \
14
+ --v3-user=authprivmd5des --v3-auth-key=maplesyrup --v3-auth-proto=MD5 \
15
+ --v3-priv-key=maplesyrup --v3-priv-proto=DES \
16
+ --v3-user=unsafe --v3-auth-proto=NONE --v3-priv-proto=NONE
3
17
  sleep 20 # give some time for the simulator to boot
4
18
 
5
19
 
@@ -0,0 +1,21 @@
1
+ RSpec.describe NETSNMP::V3Session do
2
+ let(:security_options) { { username: "authprivmd5des", auth_password: "maplesyrup",
3
+ auth_protocol: :md5, priv_password: "maplesyrup",
4
+ priv_protocol: :des, security_level: :auth_priv } }
5
+ it "generates the security parameters handler" do
6
+ sess = described_class.new(security_options.merge(host: "localhost", port: SNMPPORT))
7
+ # not generated yet
8
+ expect(sess.instance_variable_get(:@security_parameters)).to be_a(NETSNMP::SecurityParameters)
9
+ end
10
+
11
+ it "allows to pass a custom one" do
12
+ sec_params = NETSNMP::SecurityParameters.new(security_options)
13
+ sess = described_class.new(host: "localhost", port: SNMPPORT, security_parameters: sec_params)
14
+ # not generated yet
15
+ expect(sess.instance_variable_get(:@security_parameters)).to be(sec_params)
16
+ end
17
+
18
+ it "fails if the pass object doesn't follow the expected api" do
19
+ expect { described_class.new(host: "localhost", port: SNMPPORT, security_parameters: double) }.to raise_error(NETSNMP::Error)
20
+ end
21
+ end
data/spec/varbind_spec.rb CHANGED
@@ -1,54 +1,5 @@
1
1
  RSpec.describe NETSNMP::Varbind do
2
- let(:struct) { double(:structure) }
3
- let(:pointer) { double(:pointer) }
4
- subject { NETSNMP::Varbind.new(pointer) }
5
- before do
6
- allow(NETSNMP::Core::Structures::VariableList).to receive(:new).with(pointer).and_return(struct)
7
- end
8
-
9
- it { is_expected.to respond_to(:struct) }
10
-
11
- describe NETSNMP::RequestVarbind do
12
- subject { NETSNMP::RequestVarbind.new(pdu, oid, value) }
13
- let(:p1) { double(:pdu_pointer) }
14
- let(:p2) { double(:oid_pointer) }
15
- let(:pdu) { double(:pdu, pointer: p1) }
16
- let(:oid) { double(:oid, pointer: p2, length: 2) }
17
- context "on initialization" do
18
- after { subject }
19
- context "when not passed type" do
20
- context "and the value is a fixnum" do
21
- let(:value) { 1 }
22
- it { expect(NETSNMP::Core::LibSNMP).to receive(:snmp_pdu_add_variable).with(p1, p2, 2, instance_of(Fixnum), instance_of(FFI::MemoryPointer), value.size).and_return(pointer) }
23
- # TODO: value.length is too abstract. but this value differs between 32 and 64 bit architectures...
24
- end
25
- context "and the value is a string" do
26
- let(:value) { "value" }
27
- it { expect(NETSNMP::Core::LibSNMP).to receive(:snmp_pdu_add_variable).with(p1, p2, 2, instance_of(Fixnum), value, 5).and_return(pointer) }
28
- end
29
- context "and the value is a oid" do
30
- let(:value) { NETSNMP::OID.new("SNMPv2-MIB::sysDescr.0") }
31
- let(:p3) { double(:value_pointer) }
32
- let(:len) { double(:length) }
33
- before do
34
- expect(value).to receive(:size).and_return(len)
35
- expect(value).to receive(:pointer).and_return(p3)
36
- end
37
- it { expect(NETSNMP::Core::LibSNMP).to receive(:snmp_pdu_add_variable).with(p1, p2, 2, instance_of(Fixnum), p3, len).and_return(pointer) }
38
- end
39
- context "and the value is nothing" do
40
- let(:value) { nil }
41
- it { expect(NETSNMP::Core::LibSNMP).to receive(:snmp_pdu_add_variable).with(p1, p2, 2, instance_of(Fixnum), nil, 0).and_return(pointer) }
42
- end
43
-
44
- end
45
- end
46
- end
47
-
48
-
49
- describe NETSNMP::ResponseVarbind do
50
- let(:value) { "value" }
51
- before { allow(subject).to receive(:load_varbind_value).and_return(value) }
52
-
2
+ describe "#to_der" do
3
+ it { expect(described_class.new(".1.3.6.1.2.1.1.1.0").to_der).to eq("0\f\006\b+\006\001\002\001\001\001\000\005\000".b) }
53
4
  end
54
5
  end
metadata CHANGED
@@ -1,97 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netsnmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-06 00:00:00.000000000 Z
11
+ date: 2016-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: ffi
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.9'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.9'
27
- - !ruby/object:Gem::Dependency
28
- name: RubyInline
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: '3.12'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: '3.12'
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: rake
43
15
  requirement: !ruby/object:Gem::Requirement
44
16
  requirements:
45
- - - ~>
17
+ - - "~>"
46
18
  - !ruby/object:Gem::Version
47
19
  version: 10.4.2
48
20
  type: :development
49
21
  prerelease: false
50
22
  version_requirements: !ruby/object:Gem::Requirement
51
23
  requirements:
52
- - - ~>
24
+ - - "~>"
53
25
  - !ruby/object:Gem::Version
54
26
  version: 10.4.2
55
27
  - !ruby/object:Gem::Dependency
56
28
  name: rspec
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
- - - ~>
31
+ - - "~>"
60
32
  - !ruby/object:Gem::Version
61
33
  version: 3.3.0
62
34
  type: :development
63
35
  prerelease: false
64
36
  version_requirements: !ruby/object:Gem::Requirement
65
37
  requirements:
66
- - - ~>
38
+ - - "~>"
67
39
  - !ruby/object:Gem::Version
68
40
  version: 3.3.0
69
- - !ruby/object:Gem::Dependency
70
- name: em-synchrony
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: 1.0.4
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ~>
81
- - !ruby/object:Gem::Version
82
- version: 1.0.4
83
41
  - !ruby/object:Gem::Dependency
84
42
  name: celluloid-io
85
43
  requirement: !ruby/object:Gem::Requirement
86
44
  requirements:
87
- - - ~>
45
+ - - "~>"
88
46
  - !ruby/object:Gem::Version
89
47
  version: 0.17.2
90
48
  type: :development
91
49
  prerelease: false
92
50
  version_requirements: !ruby/object:Gem::Requirement
93
51
  requirements:
94
- - - ~>
52
+ - - "~>"
95
53
  - !ruby/object:Gem::Version
96
54
  version: 0.17.2
97
55
  description: |
@@ -102,9 +60,10 @@ executables: []
102
60
  extensions: []
103
61
  extra_rdoc_files: []
104
62
  files:
105
- - .gitignore
106
- - .rspec
107
- - .travis.yml
63
+ - ".coveralls.yml"
64
+ - ".gitignore"
65
+ - ".rspec"
66
+ - ".travis.yml"
108
67
  - AUTHORS
109
68
  - Gemfile
110
69
  - LICENSE.txt
@@ -112,77 +71,72 @@ files:
112
71
  - Rakefile
113
72
  - lib/netsnmp.rb
114
73
  - lib/netsnmp/client.rb
115
- - lib/netsnmp/core.rb
116
- - lib/netsnmp/core/client.rb
117
- - lib/netsnmp/core/constants.rb
118
- - lib/netsnmp/core/inline.rb
119
- - lib/netsnmp/core/libc.rb
120
- - lib/netsnmp/core/libsnmp.rb
121
- - lib/netsnmp/core/structures.rb
122
- - lib/netsnmp/core/utilities.rb
74
+ - lib/netsnmp/encryption/aes.rb
75
+ - lib/netsnmp/encryption/des.rb
76
+ - lib/netsnmp/encryption/none.rb
123
77
  - lib/netsnmp/errors.rb
124
- - lib/netsnmp/handlers/celluloid.rb
125
- - lib/netsnmp/handlers/em.rb
78
+ - lib/netsnmp/message.rb
126
79
  - lib/netsnmp/oid.rb
127
80
  - lib/netsnmp/pdu.rb
81
+ - lib/netsnmp/scoped_pdu.rb
82
+ - lib/netsnmp/security_parameters.rb
128
83
  - lib/netsnmp/session.rb
84
+ - lib/netsnmp/v3_session.rb
129
85
  - lib/netsnmp/varbind.rb
130
86
  - lib/netsnmp/version.rb
131
87
  - netsnmp.gemspec
132
88
  - spec/client_spec.rb
133
- - spec/core/libc_spec.rb
134
- - spec/core/libsnmp_spec.rb
135
- - spec/core/structures_spec.rb
136
89
  - spec/handlers/celluloid_spec.rb
137
- - spec/handlers/em_client_spec.rb
138
90
  - spec/oid_spec.rb
139
91
  - spec/pdu_spec.rb
92
+ - spec/security_parameters_spec.rb
140
93
  - spec/session_spec.rb
141
94
  - spec/spec_helper.rb
142
95
  - spec/support/Dockerfile
143
96
  - spec/support/celluloid.rb
97
+ - spec/support/request_examples.rb
144
98
  - spec/support/start_docker.sh
145
99
  - spec/support/stop_docker.sh
100
+ - spec/v3_session_spec.rb
146
101
  - spec/varbind_spec.rb
147
102
  homepage: ''
148
103
  licenses:
149
104
  - Apache-2.0
150
105
  metadata:
151
- allowed_push_hosts: https://rubygems.org/
106
+ allowed_push_host: https://rubygems.org/
152
107
  post_install_message:
153
108
  rdoc_options: []
154
109
  require_paths:
155
110
  - lib
156
111
  required_ruby_version: !ruby/object:Gem::Requirement
157
112
  requirements:
158
- - - '>='
113
+ - - ">="
159
114
  - !ruby/object:Gem::Version
160
- version: 2.0.0
115
+ version: 2.1.0
161
116
  required_rubygems_version: !ruby/object:Gem::Requirement
162
117
  requirements:
163
- - - '>='
118
+ - - ">="
164
119
  - !ruby/object:Gem::Version
165
120
  version: '0'
166
121
  requirements:
167
122
  - net-snmp
168
123
  rubyforge_project:
169
- rubygems_version: 2.5.2
124
+ rubygems_version: 2.2.5
170
125
  signing_key:
171
126
  specification_version: 4
172
127
  summary: SNMP Client library
173
128
  test_files:
174
129
  - spec/client_spec.rb
175
- - spec/core/libc_spec.rb
176
- - spec/core/libsnmp_spec.rb
177
- - spec/core/structures_spec.rb
178
130
  - spec/handlers/celluloid_spec.rb
179
- - spec/handlers/em_client_spec.rb
180
131
  - spec/oid_spec.rb
181
132
  - spec/pdu_spec.rb
133
+ - spec/security_parameters_spec.rb
182
134
  - spec/session_spec.rb
183
135
  - spec/spec_helper.rb
184
136
  - spec/support/Dockerfile
185
137
  - spec/support/celluloid.rb
138
+ - spec/support/request_examples.rb
186
139
  - spec/support/start_docker.sh
187
140
  - spec/support/stop_docker.sh
141
+ - spec/v3_session_spec.rb
188
142
  - spec/varbind_spec.rb