sloth-snmp 0.1.0
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 +7 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +5 -0
- data/README.adoc +213 -0
- data/README.ja.adoc +213 -0
- data/Rakefile +96 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/sloth/snmp.rb +3 -0
- data/lib/sloth/snmp/impl.rb +302 -0
- data/lib/sloth/snmp/version.rb +5 -0
- data/sample/snmpcustom.rb +22 -0
- data/sample/snmpget.rb +27 -0
- data/sample/snmpset.rb +30 -0
- data/sample/snmptrap.rb +45 -0
- data/sample/snmpwalk.rb +29 -0
- data/sloth-snmp.gemspec +25 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5cea4c07bc9f9ce8c5e8d21f486a58186450aec95d818187ca64d998d641ede9
|
4
|
+
data.tar.gz: d1b59278de3b73f751ac6b2cfb4510522b09f8c26ed248d90babc43211f71ddf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bb2092ad1507afc77094d4d21e7a1a215d4f96bf2bd6e93ba3e5f4dfb765159532107601b23382ebfdbf9da23525ddfc8c97cf98b4ccd34d0c33628783ac54b0
|
7
|
+
data.tar.gz: 8ac8f497c635fc6d63dff118dfce4fffd86acceacda57f18164ddd61e484edfc57039246d143d2f0cb7cac76da49c34d851310a66564bac4f2f814b70292a17e
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
*.bundle
|
11
|
+
*.so
|
12
|
+
*.o
|
13
|
+
*.a
|
14
|
+
mkmf.log
|
15
|
+
/vendor/
|
16
|
+
*.pid
|
17
|
+
*.log
|
18
|
+
*.log.*
|
19
|
+
/var/
|
20
|
+
/log/
|
21
|
+
*.swp
|
22
|
+
/.rspec_status
|
23
|
+
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.adoc
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
= Sloth::Snmp
|
2
|
+
|
3
|
+
Sloth::Snmp is yet another wrapper library for snmp.
|
4
|
+
|
5
|
+
== Features
|
6
|
+
|
7
|
+
* Handles SNMP asynchronously.
|
8
|
+
* By referring to the YAML file generated from the MIB file, you can operate without describing raw OID.
|
9
|
+
|
10
|
+
== Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
[source,ruby]
|
15
|
+
----
|
16
|
+
gem 'sloth/snmp'
|
17
|
+
----
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
$ bundle install
|
22
|
+
|
23
|
+
Or install it yourself as:
|
24
|
+
|
25
|
+
$ gem install sloth-snmp
|
26
|
+
or
|
27
|
+
$ gem install -l sloth-snmp-x.x.x.gem
|
28
|
+
|
29
|
+
== Usage
|
30
|
+
|
31
|
+
=== New
|
32
|
+
[source,ruby]
|
33
|
+
----
|
34
|
+
require "sloth/snmp"
|
35
|
+
|
36
|
+
snmp = Sloth::Snmp.new
|
37
|
+
snmp = Sloth::Snmp.new( bind: 1161 )
|
38
|
+
snmp = Sloth::Snmp.new( bind: "127.0.0.1" )
|
39
|
+
snmp = Sloth::Snmp.new( bind: "192.168.0.1:1161" )
|
40
|
+
snmp = Sloth::Snmp.new( mibs: "RS-232-MIB.yaml" )
|
41
|
+
snmp = Sloth::Snmp.new( mibs: "spec/sloth/RFC1414-MIB.yaml" )
|
42
|
+
----
|
43
|
+
|
44
|
+
=== Get
|
45
|
+
|
46
|
+
[source,ruby]
|
47
|
+
----
|
48
|
+
require "sloth/snmp"
|
49
|
+
|
50
|
+
snmp = Sloth::Snmp.new
|
51
|
+
peer = "127.0.0.1"
|
52
|
+
topics = [ "sysDescr.0", "sysUpTime.0", "sysName.0" ],
|
53
|
+
tuples = snmp.get( peer, topics )
|
54
|
+
tuples.each do |oid, tuple|
|
55
|
+
p tuple
|
56
|
+
end
|
57
|
+
----
|
58
|
+
|
59
|
+
=== Set
|
60
|
+
|
61
|
+
[source,ruby]
|
62
|
+
----
|
63
|
+
require "sloth/snmp"
|
64
|
+
|
65
|
+
snmp = Sloth::Snmp.new
|
66
|
+
peer = "127.0.0.1"
|
67
|
+
tuple = { topic: "sysName.0", type: SNMP::OctetString, value: Time.now.to_s },
|
68
|
+
snmp.set( peer, tuple )
|
69
|
+
|
70
|
+
tuples = snmp.get( peer, tuple[:topic] )
|
71
|
+
tuples.each do |oid, tuple|
|
72
|
+
p tuple
|
73
|
+
end
|
74
|
+
----
|
75
|
+
|
76
|
+
=== Walk
|
77
|
+
|
78
|
+
[source,ruby]
|
79
|
+
----
|
80
|
+
require "sloth/snmp"
|
81
|
+
|
82
|
+
snmp = Sloth::Snmp.new
|
83
|
+
peer = "127.0.0.1"
|
84
|
+
topic = "internet"
|
85
|
+
tuples = snmp.walk( peer, topic )
|
86
|
+
tuples.each do |oid, tuple|
|
87
|
+
p tuple
|
88
|
+
end
|
89
|
+
----
|
90
|
+
|
91
|
+
=== Trap
|
92
|
+
|
93
|
+
[source,ruby]
|
94
|
+
----
|
95
|
+
require "sloth/snmp"
|
96
|
+
|
97
|
+
snmp = Sloth::Snmp.new( bind: 1162 )
|
98
|
+
snmp.trap( "snmpInTraps", "snmpOutTraps" ) do |trapname, source_ip, tuples|
|
99
|
+
p [:trapname, trapname]
|
100
|
+
p [:source_ip, source_ip]
|
101
|
+
tuples.each do |oid, tuple|
|
102
|
+
p tuple
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
sleep
|
107
|
+
----
|
108
|
+
|
109
|
+
== Reference
|
110
|
+
|
111
|
+
=== Create a new Sloth::Snmp.
|
112
|
+
|
113
|
+
[source,ruby]
|
114
|
+
----
|
115
|
+
Sloth::Snmp.new( mibs: nil, bind: nil, rocommunity: "public", rwcommunity: "private" )
|
116
|
+
----
|
117
|
+
|
118
|
+
* Result:
|
119
|
+
- Sloth::Snmp object.
|
120
|
+
|
121
|
+
* Parameter:
|
122
|
+
** mibs: Additional MIB file path, or array of the paths. (default: nil)
|
123
|
+
** bind: Bind host and port for trap. (default: "0.0.0.0:162")
|
124
|
+
** rocommunity: Community string for Read Only. (default: "public")
|
125
|
+
** rwcommunity: Community string for Read/Write. (default: "private")
|
126
|
+
|
127
|
+
=== SNMP Get.
|
128
|
+
|
129
|
+
[source,ruby]
|
130
|
+
----
|
131
|
+
Sloth::Snmp#get( peer, topics, community: nil, bindto: nil, device: nil )
|
132
|
+
----
|
133
|
+
|
134
|
+
* Result:
|
135
|
+
* Hash of key=>oid, value=>{name, value}.
|
136
|
+
|
137
|
+
* Parameter:
|
138
|
+
** peer: Target IP address and port. (default port: 162)
|
139
|
+
** topics: Topic(s) for SNMP Get Request.
|
140
|
+
** community: Community string. (default: nil)
|
141
|
+
** bindto: Interface address. (default: nil)
|
142
|
+
** device: Interface name. (default: nil)
|
143
|
+
|
144
|
+
=== SNMP Set.
|
145
|
+
|
146
|
+
[source,ruby]
|
147
|
+
----
|
148
|
+
Sloth::Snmp#set( peer, topics, community: nil, bindto: nil, device: nil )
|
149
|
+
----
|
150
|
+
|
151
|
+
* Result:
|
152
|
+
* Hash of key=>oid, value=>{name, value}.
|
153
|
+
|
154
|
+
* Parameter:
|
155
|
+
** peer: Target IP address and port. (default port: 162)
|
156
|
+
** tuple: Hash of topic, type, value for SNMP Set Request.
|
157
|
+
** community: Community string. (default: nil)
|
158
|
+
** bindto: Interface address. (default: nil)
|
159
|
+
** device: Interface name. (default: nil)
|
160
|
+
|
161
|
+
=== SNMP Walk.
|
162
|
+
|
163
|
+
[source,ruby]
|
164
|
+
----
|
165
|
+
Sloth::Snmp#walk( target, topic, port: 162, community: "public", bindto: nil, device: nil )
|
166
|
+
----
|
167
|
+
|
168
|
+
* Result:
|
169
|
+
** Hash of key=>oid, value=>{name, value}.
|
170
|
+
|
171
|
+
* Parameter:
|
172
|
+
** peer: Target IP address and port. (default port: 162)
|
173
|
+
** topic: Topic for SNMP Get Next.
|
174
|
+
** community: Community string. (default: nil)
|
175
|
+
** bindto: Interface address. (default: nil)
|
176
|
+
** device: Interface name. (default: nil)
|
177
|
+
|
178
|
+
=== SNMP Trap.
|
179
|
+
|
180
|
+
[source,ruby]
|
181
|
+
----
|
182
|
+
Sloth::Snmp#trap( *topics, &block )
|
183
|
+
----
|
184
|
+
|
185
|
+
* Result:
|
186
|
+
** nil.
|
187
|
+
|
188
|
+
* Parameter:
|
189
|
+
** topics: The topic(s) that enables trap monitoring.
|
190
|
+
** block: Callback action.
|
191
|
+
|
192
|
+
=== SNMP Untrap.
|
193
|
+
|
194
|
+
[source,ruby]
|
195
|
+
----
|
196
|
+
Sloth::Snmp#untrap( *topics )
|
197
|
+
----
|
198
|
+
|
199
|
+
* Result:
|
200
|
+
** nil.
|
201
|
+
|
202
|
+
* Parameter:
|
203
|
+
** topics: The topic(s) that disables trap monitoring.
|
204
|
+
|
205
|
+
== Contributing
|
206
|
+
|
207
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/arimay/sloth-snmp.
|
208
|
+
|
209
|
+
== License
|
210
|
+
|
211
|
+
The gem is available as open source under the terms of the http://opensource.org/licenses/MIT[MIT License].
|
212
|
+
|
213
|
+
Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
|
data/README.ja.adoc
ADDED
@@ -0,0 +1,213 @@
|
|
1
|
+
= Sloth::Snmp
|
2
|
+
|
3
|
+
Sloth::Snmp はさらにもうひとつの SNMP ラッパーライブラリ.
|
4
|
+
|
5
|
+
== 特徴
|
6
|
+
|
7
|
+
* 非同期で SNMP を扱う.
|
8
|
+
* MIBファイルから生成したYAMLファイルを参照することで、生のOIDを記述することなく操作できる.
|
9
|
+
|
10
|
+
== 導入
|
11
|
+
|
12
|
+
アプリの Gemfile にこの行を追加
|
13
|
+
|
14
|
+
[source,ruby]
|
15
|
+
----
|
16
|
+
gem 'sloth/snmp'
|
17
|
+
----
|
18
|
+
|
19
|
+
それから実行
|
20
|
+
|
21
|
+
$ bundle install
|
22
|
+
|
23
|
+
または次のように手動で導入
|
24
|
+
|
25
|
+
$ gem install sloth-snmp
|
26
|
+
or
|
27
|
+
$ gem install -l sloth-snmp-x.x.x.gem
|
28
|
+
|
29
|
+
== 使い方
|
30
|
+
|
31
|
+
=== 新規
|
32
|
+
[source,ruby]
|
33
|
+
----
|
34
|
+
require "sloth/snmp"
|
35
|
+
|
36
|
+
snmp = Sloth::Snmp.new
|
37
|
+
snmp = Sloth::Snmp.new( bind: 1161 )
|
38
|
+
snmp = Sloth::Snmp.new( bind: "127.0.0.1" )
|
39
|
+
snmp = Sloth::Snmp.new( bind: "192.168.0.1:1161" )
|
40
|
+
snmp = Sloth::Snmp.new( mibs: "RS-232-MIB.yaml" )
|
41
|
+
snmp = Sloth::Snmp.new( mibs: "spec/sloth/RFC1414-MIB.yaml" )
|
42
|
+
----
|
43
|
+
|
44
|
+
=== 取得
|
45
|
+
|
46
|
+
[source,ruby]
|
47
|
+
----
|
48
|
+
require "sloth/snmp"
|
49
|
+
|
50
|
+
snmp = Sloth::Snmp.new
|
51
|
+
peer = "127.0.0.1"
|
52
|
+
topics = [ "sysDescr.0", "sysUpTime.0", "sysName.0" ],
|
53
|
+
tuples = snmp.get( peer, topics )
|
54
|
+
tuples.each do |oid, tuple|
|
55
|
+
p tuple
|
56
|
+
end
|
57
|
+
----
|
58
|
+
|
59
|
+
=== 更新
|
60
|
+
|
61
|
+
[source,ruby]
|
62
|
+
----
|
63
|
+
require "sloth/snmp"
|
64
|
+
|
65
|
+
snmp = Sloth::Snmp.new
|
66
|
+
peer = "127.0.0.1"
|
67
|
+
tuple = { topic: "sysName.0", type: SNMP::OctetString, value: Time.now.to_s },
|
68
|
+
snmp.set( peer, tuple )
|
69
|
+
|
70
|
+
tuples = snmp.get( peer, tuple[:topic] )
|
71
|
+
tuples.each do |oid, tuple|
|
72
|
+
p tuple
|
73
|
+
end
|
74
|
+
----
|
75
|
+
|
76
|
+
=== 巡回
|
77
|
+
|
78
|
+
[source,ruby]
|
79
|
+
----
|
80
|
+
require "sloth/snmp"
|
81
|
+
|
82
|
+
snmp = Sloth::Snmp.new
|
83
|
+
peer = "127.0.0.1"
|
84
|
+
topic = "internet"
|
85
|
+
tuples = snmp.walk( peer, topic )
|
86
|
+
tuples.each do |oid, tuple|
|
87
|
+
p tuple
|
88
|
+
end
|
89
|
+
----
|
90
|
+
|
91
|
+
=== トラップ
|
92
|
+
|
93
|
+
[source,ruby]
|
94
|
+
----
|
95
|
+
require "sloth/snmp"
|
96
|
+
|
97
|
+
snmp = Sloth::Snmp.new( bind: 1162 )
|
98
|
+
snmp.trap( "snmpInTraps", "snmpOutTraps" ) do |trapname, source_ip, tuples|
|
99
|
+
p [:trapname, trapname]
|
100
|
+
p [:source_ip, source_ip]
|
101
|
+
tuples.each do |oid, tuple|
|
102
|
+
p tuple
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
sleep
|
107
|
+
----
|
108
|
+
|
109
|
+
== リファレンス
|
110
|
+
|
111
|
+
=== 新たな Sloth::Snmp を作成する.
|
112
|
+
|
113
|
+
[source,ruby]
|
114
|
+
----
|
115
|
+
Sloth::Snmp.new( mibs: nil, bind: nil, rocommunity: "public", rwcommunity: "private" )
|
116
|
+
----
|
117
|
+
|
118
|
+
* Result:
|
119
|
+
** Sloth::Snmp オブジェクト.
|
120
|
+
|
121
|
+
* Parameter:
|
122
|
+
** mibs: 追加 MIB ファイルパスの文字列. またはその配列. (default: nil)
|
123
|
+
** bind: トラップ用のバインドホストとポート. (default: "0.0.0.0:162")
|
124
|
+
** rocommunity: 読み取り用コミュニティ文字列. (default: "public")
|
125
|
+
** rwcommunity: 読み書き用コミュニティ文字列. (default: "private")
|
126
|
+
|
127
|
+
=== SNMP Get.
|
128
|
+
|
129
|
+
[source,ruby]
|
130
|
+
----
|
131
|
+
Sloth::Snmp#get( peer, topics, community: nil, bindto: nil, device: nil )
|
132
|
+
----
|
133
|
+
|
134
|
+
* Result:
|
135
|
+
** hash of key=>oid, value=>{name, value}.
|
136
|
+
|
137
|
+
* Parameter:
|
138
|
+
** peer: 宛先IPアドレスとポート. (default port: 162)
|
139
|
+
** topics: SNMP Get Request 用のトピック.
|
140
|
+
** community: コミュニティ文字列. (default: nil)
|
141
|
+
** bindto: インターフェースアドレス. (default: nil)
|
142
|
+
** device: インターフェース名称. (default: nil)
|
143
|
+
|
144
|
+
=== SNMP Set.
|
145
|
+
|
146
|
+
[source,ruby]
|
147
|
+
----
|
148
|
+
Sloth::Snmp#set( peer, topics, community: nil, bindto: nil, device: nil )
|
149
|
+
----
|
150
|
+
|
151
|
+
* Result:
|
152
|
+
** hash of key=>oid, value=>{name, value}.
|
153
|
+
|
154
|
+
* Parameter:
|
155
|
+
** peer: 宛先IPアドレスとポート. (default port: 162)
|
156
|
+
** tuple: SNMP Set Request 用のトピック、型、値のハッシュ.
|
157
|
+
** community: コミュニティ文字列. (default: nil)
|
158
|
+
** bindto: インターフェースアドレス. (default: nil)
|
159
|
+
** device: インターフェース名称. (default: nil)
|
160
|
+
|
161
|
+
=== SNMP Walk.
|
162
|
+
|
163
|
+
[source,ruby]
|
164
|
+
----
|
165
|
+
Sloth::Snmp#walk( peer, topic, port: 162, community: "public", bindto: nil, device: nil )
|
166
|
+
----
|
167
|
+
|
168
|
+
* Result:
|
169
|
+
** hash of key=>oid, value=>{name, value}.
|
170
|
+
|
171
|
+
* Parameter:
|
172
|
+
** peer: 宛先IPアドレスとポート. (default port: 162)
|
173
|
+
** topic: SNMP Get Next 用のトピック.
|
174
|
+
** community: コミュニティ文字列. (default: nil)
|
175
|
+
** bindto: インターフェースアドレス. (default: nil)
|
176
|
+
** device: インターフェース名称. (default: nil)
|
177
|
+
|
178
|
+
=== SNMP Trap.
|
179
|
+
|
180
|
+
[source,ruby]
|
181
|
+
----
|
182
|
+
Sloth::Snmp#trap( *topics, &block )
|
183
|
+
----
|
184
|
+
|
185
|
+
* Result:
|
186
|
+
** nil.
|
187
|
+
|
188
|
+
* Parameter:
|
189
|
+
** topics: トラップを有効化するトピック.
|
190
|
+
** block: コールバック動作.
|
191
|
+
|
192
|
+
=== SNMP Untrap.
|
193
|
+
|
194
|
+
[source,ruby]
|
195
|
+
----
|
196
|
+
Sloth::Snmp#untrap( *topics )
|
197
|
+
----
|
198
|
+
|
199
|
+
* Result:
|
200
|
+
** nil.
|
201
|
+
|
202
|
+
* Parameter:
|
203
|
+
** topics: トラップの監視を無効化するトピック.
|
204
|
+
|
205
|
+
== 貢献
|
206
|
+
|
207
|
+
不具合報告とプルリクエストは GitHub https://github.com/arimay/sloth-snmp まで.
|
208
|
+
|
209
|
+
== ライセンス
|
210
|
+
|
211
|
+
この Gem は、 http://opensource.org/licenses/MIT[MITライセンス] の条件に基づいてオープンソースとして入手できる.
|
212
|
+
|
213
|
+
Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
|
data/Rakefile
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require "bundler/gem_helper"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
class Bundler::GemHelper
|
10
|
+
|
11
|
+
def git_archive( dir = "../zip" )
|
12
|
+
FileUtils.mkdir_p dir
|
13
|
+
dest_path = File.join(dir, "#{name}-#{version}.zip")
|
14
|
+
cmnd = "git archive --format zip --prefix=#{name}/ HEAD > #{dest_path}"
|
15
|
+
|
16
|
+
_, code = sh_with_status( cmnd )
|
17
|
+
raise "Couldn't archive gem," unless code == 0
|
18
|
+
|
19
|
+
Bundler.ui.confirm "#{name} #{version} archived to #{dest_path}."
|
20
|
+
end
|
21
|
+
|
22
|
+
def git_push
|
23
|
+
ver = version.to_s
|
24
|
+
|
25
|
+
cmnd = "git push origin #{ver} "
|
26
|
+
_, code = sh_with_status( cmnd )
|
27
|
+
raise "Couldn't git push origin." unless code == 0
|
28
|
+
|
29
|
+
cmnd = "git push "
|
30
|
+
_, code = sh_with_status( cmnd )
|
31
|
+
raise "Couldn't git push." unless code == 0
|
32
|
+
|
33
|
+
Bundler.ui.confirm "Git Push #{ver}."
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_version( new_version )
|
37
|
+
version_filename = %x[ find . -type f -name "version.rb" | grep -v vendor | head -1 ].chomp
|
38
|
+
version_pathname = File.expand_path( version_filename )
|
39
|
+
lines = File.open( version_pathname ).read
|
40
|
+
lines = lines.gsub( /VERSION\s*=\s*\"\d+\.\d+\.\d+\"/, "VERSION = \"#{new_version}\"" )
|
41
|
+
File.open( version_pathname, "w" ) do |file|
|
42
|
+
file.write( lines )
|
43
|
+
end
|
44
|
+
|
45
|
+
cmnd = "git add #{version_pathname} "
|
46
|
+
_, code = sh_with_status( cmnd )
|
47
|
+
raise "Couldn't git add," unless code == 0
|
48
|
+
|
49
|
+
cmnd = "git commit -m '#{new_version}' "
|
50
|
+
_, code = sh_with_status( cmnd )
|
51
|
+
raise "Couldn't git commit." unless code == 0
|
52
|
+
|
53
|
+
cmnd = "git tag #{new_version} "
|
54
|
+
_, code = sh_with_status( cmnd )
|
55
|
+
raise "Couldn't git tag." unless code == 0
|
56
|
+
|
57
|
+
Bundler.ui.confirm "Update Tags to #{new_version}."
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
Bundler::GemHelper.new(Dir.pwd).instance_eval do
|
63
|
+
|
64
|
+
desc "Archive #{name}-#{version}.zip from repository"
|
65
|
+
task 'zip' do
|
66
|
+
git_archive
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Git Push"
|
70
|
+
task 'push' do
|
71
|
+
git_push
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "Update Version Tiny"
|
75
|
+
task 'tiny' do
|
76
|
+
major, minor, tiny = version.to_s.split('.')
|
77
|
+
new_version = [major, minor, tiny.to_i + 1].join('.')
|
78
|
+
update_version( new_version )
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Update Version Minor"
|
82
|
+
task 'minor' do
|
83
|
+
major, minor, _tiny = version.to_s.split('.')
|
84
|
+
new_version = [major, minor.to_i + 1, 0].join('.')
|
85
|
+
update_version( new_version )
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Update Version Major"
|
89
|
+
task 'major' do
|
90
|
+
major, _minor, _tiny = version.to_s.split('.')
|
91
|
+
new_version = [major.to_i + 1, 0, 0].join('.')
|
92
|
+
update_version( new_version )
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "sloth/snmp"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/lib/sloth/snmp.rb
ADDED
@@ -0,0 +1,302 @@
|
|
1
|
+
require "snmp"
|
2
|
+
|
3
|
+
module Sloth
|
4
|
+
class Snmp
|
5
|
+
|
6
|
+
class Error < StandardError; end
|
7
|
+
|
8
|
+
class UDPTransportExt < ::SNMP::UDPTransport
|
9
|
+
def initialize( address_family, bindto: nil, device: nil )
|
10
|
+
super
|
11
|
+
@socket = UDPSocket.open( address_family )
|
12
|
+
if bindto
|
13
|
+
host, port = bindto.split(':') rescue nil
|
14
|
+
@socket.bind( host, port.to_i )
|
15
|
+
end
|
16
|
+
if device
|
17
|
+
@socket.setsockopt( Socket::SOL_SOCKET, Socket::SO_BINDTODEVICE, device )
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize( mibs: nil, bind: nil, rocommunity: "public", rwcommunity: "private" )
|
23
|
+
case bind
|
24
|
+
when Integer, NilClass
|
25
|
+
@host = "0.0.0.0"
|
26
|
+
@port = bind || 162
|
27
|
+
when String
|
28
|
+
host, port = bind.split(':') rescue nil
|
29
|
+
if host.nil? || host.empty?
|
30
|
+
@host = "0.0.0.0"
|
31
|
+
else
|
32
|
+
@host = host
|
33
|
+
end
|
34
|
+
if port.nil? || port.empty?
|
35
|
+
@port = 162
|
36
|
+
else
|
37
|
+
@port = port.to_i
|
38
|
+
end
|
39
|
+
else
|
40
|
+
raise Sloth::Snmp::Error, "invalid class. : %s" % bind.class
|
41
|
+
end
|
42
|
+
@rocommunity = rocommunity
|
43
|
+
@rwcommunity = rwcommunity
|
44
|
+
|
45
|
+
@mibs = SNMP::MIB.new
|
46
|
+
@mibs.load_module( "RFC1155-SMI" )
|
47
|
+
@mibs.load_module( "RFC1158-MIB" )
|
48
|
+
|
49
|
+
case mibs
|
50
|
+
when NilClass
|
51
|
+
mibs = []
|
52
|
+
when Array
|
53
|
+
# noop
|
54
|
+
when String
|
55
|
+
mibs = [mibs]
|
56
|
+
else
|
57
|
+
raise Sloth::Snmp::Error, "invalid class. : %s" % mibs.class
|
58
|
+
end
|
59
|
+
|
60
|
+
mibpath = mibs.shift
|
61
|
+
while mibpath
|
62
|
+
mibbase = File.basename( mibpath )
|
63
|
+
mibdir = File.dirname( mibpath )
|
64
|
+
if ( mibdir == "." && mibbase == mibpath )
|
65
|
+
@mibs.load_module( mibbase.gsub( /\..*\Z/, "" ) )
|
66
|
+
else
|
67
|
+
@mibs.load_module( mibbase.gsub( /\..*\Z/, "" ), mibdir )
|
68
|
+
end
|
69
|
+
mibpath = mibs.shift
|
70
|
+
end
|
71
|
+
|
72
|
+
@topics = {}
|
73
|
+
@mutex = ::Mutex.new
|
74
|
+
end
|
75
|
+
|
76
|
+
def start_listener
|
77
|
+
@thread ||= Thread.start do
|
78
|
+
listener = SNMP::TrapListener.new( host: @host, port: @port, community: @rocommunity ) do |manager|
|
79
|
+
manager.on_trap_v2c do |mesg|
|
80
|
+
begin
|
81
|
+
next if mesg.error_status != :noError
|
82
|
+
|
83
|
+
source_ip = mesg.source_ip
|
84
|
+
trap_oid = mesg.trap_oid.join(".")
|
85
|
+
trapname = @mibs.name( trap_oid )
|
86
|
+
items = {}
|
87
|
+
mesg.each_varbind do |varbind|
|
88
|
+
oid, item = * parse_varbind( varbind )
|
89
|
+
items[oid] = item
|
90
|
+
end
|
91
|
+
Thread.start do
|
92
|
+
@mutex.synchronize do
|
93
|
+
@topics[ trap_oid ]&.call( trapname, source_ip, items )
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
rescue => e
|
98
|
+
raise Sloth::Snmp::Error, e.message
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
Thread.current[:listener] = listener
|
104
|
+
listener.join
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def stop_listener
|
109
|
+
@mutex.synchronize do
|
110
|
+
@topics.clear
|
111
|
+
@thread[:listener].exit
|
112
|
+
@thread = nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def trap( *topics, &block )
|
117
|
+
@mutex.synchronize do
|
118
|
+
topics.each do |topic|
|
119
|
+
trap_oid = SNMP::ObjectId.new( topic ) rescue @mibs.oid( topic )
|
120
|
+
@topics[trap_oid.to_str] = block
|
121
|
+
end
|
122
|
+
end
|
123
|
+
start_listener
|
124
|
+
end
|
125
|
+
|
126
|
+
def untrap( *topics )
|
127
|
+
@mutex.synchronize do
|
128
|
+
topics.each do |topic|
|
129
|
+
trap_oid = SNMP::ObjectId.new( topic ) rescue @mibs.oid( topic )
|
130
|
+
@topics.delete( trap_oid.to_str )
|
131
|
+
end
|
132
|
+
end
|
133
|
+
stop_listener if @topics.empty?
|
134
|
+
end
|
135
|
+
|
136
|
+
def get( peer, topics, **options )
|
137
|
+
host, port = peer.split(':') rescue nil
|
138
|
+
host = "127.0.0.1" if host.nil? || host.empty?
|
139
|
+
port = (port || 161).to_i
|
140
|
+
community = options[:rocommunity] || @rocommunity
|
141
|
+
|
142
|
+
case topics
|
143
|
+
when String
|
144
|
+
oids = [ ( SNMP::ObjectId.new( topics ) rescue @mibs.oid( topics ) ) ]
|
145
|
+
when Array
|
146
|
+
oids = topics.map do |topic|
|
147
|
+
SNMP::ObjectId.new( topic ) rescue @mibs.oid( topic )
|
148
|
+
end
|
149
|
+
else
|
150
|
+
raise Sloth::Snmp::Error, "topics missing."
|
151
|
+
end
|
152
|
+
|
153
|
+
if options[:bindto] && options[:device]
|
154
|
+
transport = UDPTransportExt.new( Socket::AF_INET, bindto: options[:bindto], device: options[:device] )
|
155
|
+
end
|
156
|
+
|
157
|
+
manager = SNMP::Manager.new( host: host, port: port, community: community, transport: transport )
|
158
|
+
|
159
|
+
items = {}
|
160
|
+
begin
|
161
|
+
response = Thread.handle_interrupt( ::Timeout::Error => :on_blocking ) do
|
162
|
+
manager.get( oids )
|
163
|
+
end
|
164
|
+
|
165
|
+
response.each_varbind do |varbind|
|
166
|
+
oid, item = * parse_varbind( varbind )
|
167
|
+
items[oid] = item
|
168
|
+
end
|
169
|
+
|
170
|
+
rescue SNMP::RequestTimeout => e
|
171
|
+
raise Sloth::Snmp::Error, e.message
|
172
|
+
|
173
|
+
rescue => e
|
174
|
+
raise Sloth::Snmp::Error, e.message
|
175
|
+
|
176
|
+
end
|
177
|
+
items
|
178
|
+
end
|
179
|
+
|
180
|
+
def walk( peer, topic, **options )
|
181
|
+
host, port = peer.split(':') rescue nil
|
182
|
+
host = "127.0.0.1" if host.nil? || host.empty?
|
183
|
+
port = (port || 161).to_i
|
184
|
+
community = options[:rocommunity] || @rocommunity
|
185
|
+
|
186
|
+
if options[:bindto] && options[:device]
|
187
|
+
transport = UDPTransportExt.new( Socket::AF_INET, bindto: options[:bindto], device: options[:device] )
|
188
|
+
end
|
189
|
+
|
190
|
+
manager = SNMP::Manager.new( host: host, port: port, community: community, transport: transport )
|
191
|
+
|
192
|
+
topic ||= "internet"
|
193
|
+
base_oid = SNMP::ObjectId.new( topic ) rescue @mibs.oid( topic )
|
194
|
+
|
195
|
+
items = {}
|
196
|
+
begin
|
197
|
+
Thread.handle_interrupt( ::Timeout::Error => :on_blocking ) do
|
198
|
+
manager.walk( base_oid ) do |varbind|
|
199
|
+
oid, item = * parse_varbind( varbind )
|
200
|
+
items[oid] = item
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
rescue SNMP::RequestTimeout => e
|
205
|
+
raise Sloth::Snmp::Error, e.message
|
206
|
+
|
207
|
+
rescue => e
|
208
|
+
raise Sloth::Snmp::Error, e.message
|
209
|
+
|
210
|
+
end
|
211
|
+
items
|
212
|
+
end
|
213
|
+
|
214
|
+
def set( peer, tuple, **options )
|
215
|
+
host, port = peer.split(':') rescue nil
|
216
|
+
host = "127.0.0.1" if host.nil? || host.empty?
|
217
|
+
port = (port || 161).to_i
|
218
|
+
community = options[:rwcommunity] || @rwcommunity
|
219
|
+
|
220
|
+
if options[:bindto] && options[:device]
|
221
|
+
transport = UDPTransportExt.new( Socket::AF_INET, bindto: options[:bindto], device: options[:device] )
|
222
|
+
end
|
223
|
+
|
224
|
+
varbind = build_varbind( tuple[:topic], tuple[:type], tuple[:value] )
|
225
|
+
|
226
|
+
manager = SNMP::Manager.new( host: host, port: port, community: community, transport: transport )
|
227
|
+
|
228
|
+
begin
|
229
|
+
response = Thread.handle_interrupt( ::Timeout::Error => :on_blocking ) do
|
230
|
+
manager.set( varbind )
|
231
|
+
end
|
232
|
+
response
|
233
|
+
|
234
|
+
rescue SNMP::RequestTimeout => e
|
235
|
+
raise Sloth::Snmp::Error, e.message
|
236
|
+
|
237
|
+
rescue => e
|
238
|
+
raise Sloth::Snmp::Error, e.message
|
239
|
+
|
240
|
+
ensure
|
241
|
+
manager.close
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def parse_varbind( varbind, keys: nil )
|
246
|
+
keys = [:name, :value] if keys.nil? || keys.empty?
|
247
|
+
oid = varbind.name.to_str
|
248
|
+
name = @mibs.name( oid )
|
249
|
+
case varbind.value
|
250
|
+
when SNMP::OctetString
|
251
|
+
type = SNMP::OctetString
|
252
|
+
valu = varbind.value.to_s
|
253
|
+
if /[^[:print:]]/.match( valu )
|
254
|
+
valu = "0x" + valu.unpack("H*").shift
|
255
|
+
end
|
256
|
+
when SNMP::Integer
|
257
|
+
type = SNMP::Integer
|
258
|
+
valu = varbind.value.to_i
|
259
|
+
when SNMP::Counter32
|
260
|
+
type = SNMP::Counter32
|
261
|
+
valu = varbind.value.to_i
|
262
|
+
when SNMP::IpAddress
|
263
|
+
type = SNMP::IpAddress
|
264
|
+
valu = varbind.value.to_s
|
265
|
+
when SNMP::ObjectId
|
266
|
+
type = SNMP::ObjectId
|
267
|
+
valu = varbind.value
|
268
|
+
when SNMP::NoSuchInstance, SNMP::NoSuchObject
|
269
|
+
type = varbind.value
|
270
|
+
valu = nil
|
271
|
+
else
|
272
|
+
type = varbind.value
|
273
|
+
valu = nil
|
274
|
+
end
|
275
|
+
|
276
|
+
tuple = {}
|
277
|
+
tuple[:name] = name if keys.include?( :name )
|
278
|
+
tuple[:type] = type if keys.include?( :type )
|
279
|
+
tuple[:value] = valu if keys.include?( :value )
|
280
|
+
[oid, tuple]
|
281
|
+
end
|
282
|
+
|
283
|
+
def build_varbind( topic, type, value )
|
284
|
+
oid = SNMP::ObjectId.new( topic ) rescue @mibs.oid( topic )
|
285
|
+
case type
|
286
|
+
when SNMP::OctetString
|
287
|
+
SNMP::VarBind.new( oid, SNMP::OctetString.new( value ))
|
288
|
+
when SNMP::Integer
|
289
|
+
SNMP::VarBind.new( oid, SNMP::Integer.new( value ))
|
290
|
+
when SNMP::Counter32
|
291
|
+
SNMP::VarBind.new( oid, SNMP::Counter32.new( value ))
|
292
|
+
when SNMP::IpAddress
|
293
|
+
SNMP::VarBind.new( oid, SNMP::IpAddress.new( value ))
|
294
|
+
when SNMP::ObjectId
|
295
|
+
SNMP::VarBind.new( oid, SNMP::ObjectId.new( value ))
|
296
|
+
else
|
297
|
+
SNMP::VarBind.new( oid, SNMP::OctetString.new( value.to_s ))
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
end
|
302
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec ruby sample/snmp_custom.rb
|
3
|
+
# bundle exec ruby sample/snmp_custom.rb sample/SAMPLE-MIB.yml 10.0.2.1
|
4
|
+
#
|
5
|
+
|
6
|
+
require "sloth/snmp"
|
7
|
+
|
8
|
+
config = {}
|
9
|
+
mibpath = ARGV.shift
|
10
|
+
if mibpath
|
11
|
+
config.merge!( mibs: mibpath )
|
12
|
+
end
|
13
|
+
|
14
|
+
Snmp = Sloth::Snmp.new( **config )
|
15
|
+
|
16
|
+
peer = ARGV.shift || "127.0.0.1:161"
|
17
|
+
|
18
|
+
topic = "internet"
|
19
|
+
tuples = Snmp.walk( peer, topic )
|
20
|
+
tuples.each do |_oid, tuple|
|
21
|
+
p tuple
|
22
|
+
end
|
data/sample/snmpget.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec ruby sample/snmpget.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
require "sloth/snmp"
|
6
|
+
|
7
|
+
Snmp = Sloth::Snmp.new
|
8
|
+
|
9
|
+
options = {
|
10
|
+
# bindto: "10.0.2.15",
|
11
|
+
# device: "enp0s3",
|
12
|
+
}
|
13
|
+
|
14
|
+
peer = ARGV.shift || "127.0.0.1:161"
|
15
|
+
|
16
|
+
[
|
17
|
+
[ "sysDescr.0", "sysUpTime.0", "sysName.0" ],
|
18
|
+
[ "1.3.6.1.2.1.1.1.0", "1.3.6.1.2.1.1.3.0" ],
|
19
|
+
"1.3.6.1.2.1.1.5.0",
|
20
|
+
].each do |topics|
|
21
|
+
p [:get, topics]
|
22
|
+
tuples = Snmp.get( peer, topics, **options )
|
23
|
+
tuples.each do |_oid, tuple|
|
24
|
+
p tuple
|
25
|
+
end
|
26
|
+
puts
|
27
|
+
end
|
data/sample/snmpset.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec ruby sample/snmpset.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
require "sloth/snmp"
|
6
|
+
|
7
|
+
Snmp = Sloth::Snmp.new
|
8
|
+
|
9
|
+
options = {
|
10
|
+
# bindto: "10.0.2.15",
|
11
|
+
# device: "enp0s3",
|
12
|
+
}
|
13
|
+
|
14
|
+
peer = ARGV.shift || "127.0.0.1:161"
|
15
|
+
|
16
|
+
[
|
17
|
+
{ topic: "sysName.0", type: SNMP::OctetString, value: Time.now.to_s },
|
18
|
+
].each do |tuple|
|
19
|
+
p [:set, tuple]
|
20
|
+
pp Snmp.set( peer, tuple, **options )
|
21
|
+
|
22
|
+
# topics = [tuple[:topic]]
|
23
|
+
topics = tuple[:topic]
|
24
|
+
p [:get, topics]
|
25
|
+
tuples = Snmp.get( peer, topics, **options )
|
26
|
+
tuples.each do |_oid, tuple_|
|
27
|
+
p tuple_
|
28
|
+
end
|
29
|
+
puts
|
30
|
+
end
|
data/sample/snmptrap.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec ruby sample/snmptrap.rb
|
3
|
+
# sudo bundle exec ruby sample/snmptrap.rb
|
4
|
+
#
|
5
|
+
# RFC1158-MIB.yaml:191:snmpInTraps: 1.3.6.1.2.1.11.19
|
6
|
+
# RFC1158-MIB.yaml:201:snmpOutTraps: 1.3.6.1.2.1.11.29
|
7
|
+
#
|
8
|
+
|
9
|
+
require "sloth/snmp"
|
10
|
+
|
11
|
+
port = ( ARGV.shift || ( Process::Sys.getuid == 0 ? 162 : 1162 ) )
|
12
|
+
p [:port, port]
|
13
|
+
|
14
|
+
Snmp = Sloth::Snmp.new( bind: port )
|
15
|
+
|
16
|
+
queue = Queue.new
|
17
|
+
|
18
|
+
p :ready
|
19
|
+
Snmp.trap( "snmpInTraps", "snmpOutTraps" ) do |trapname, source_ip, tuples|
|
20
|
+
#Snmp.trap( "1.3.6.1.2.1.11.19", "1.3.6.1.2.1.11.29" ) do |trapname, source_ip, tuples|
|
21
|
+
p ["TRAP!!", :trapname, trapname, :source_ip, source_ip]
|
22
|
+
tuples.each do |_oid, tuple|
|
23
|
+
p tuple
|
24
|
+
end
|
25
|
+
queue.push trapname
|
26
|
+
end
|
27
|
+
|
28
|
+
p :wait
|
29
|
+
sleep 1
|
30
|
+
puts
|
31
|
+
|
32
|
+
p cmnd = "snmptrap -v 2c -c public 127.0.0.1:#{port} '' .1.3.6.1.2.1.11.19 2> /dev/null "
|
33
|
+
%x[#{cmnd}]
|
34
|
+
p queue.pop
|
35
|
+
|
36
|
+
p cmnd = "snmptrap -v 2c -c public 127.0.0.1:#{port} '' .1.3.6.1.2.1.11.29 2> /dev/null "
|
37
|
+
%x[#{cmnd}]
|
38
|
+
p queue.pop
|
39
|
+
|
40
|
+
p :untrap
|
41
|
+
Snmp.untrap( "snmpInTraps", "snmpOutTraps" )
|
42
|
+
# Snmp.untrap( "1.3.6.1.2.1.11.19", "1.3.6.1.2.1.11.29" )
|
43
|
+
|
44
|
+
sleep 1
|
45
|
+
p :quit
|
data/sample/snmpwalk.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#
|
2
|
+
# bundle exec ruby sample/snmpwalk.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
require "sloth/snmp"
|
6
|
+
|
7
|
+
Snmp = Sloth::Snmp.new
|
8
|
+
|
9
|
+
options = {
|
10
|
+
# bindto: "10.0.2.15",
|
11
|
+
# device: "enp0s3",
|
12
|
+
}
|
13
|
+
|
14
|
+
peer = ARGV.shift || "127.0.0.1:161"
|
15
|
+
|
16
|
+
[
|
17
|
+
"system.8",
|
18
|
+
"system.9",
|
19
|
+
"mib-2.25.1",
|
20
|
+
"internet",
|
21
|
+
nil,
|
22
|
+
].each do |topic|
|
23
|
+
p [:walk, topic]
|
24
|
+
tuples = Snmp.walk( peer, topic, **options )
|
25
|
+
tuples.each do |_oid, tuple|
|
26
|
+
p tuple
|
27
|
+
end
|
28
|
+
puts
|
29
|
+
end
|
data/sloth-snmp.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'lib/sloth/snmp/version'
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "sloth-snmp"
|
5
|
+
spec.version = Sloth::Snmp::VERSION
|
6
|
+
spec.authors = ["arimay"]
|
7
|
+
spec.email = ["arima.yasuhiro@gmail.com"]
|
8
|
+
|
9
|
+
spec.summary = %q{ Sloth Snmp Library. }
|
10
|
+
spec.description = %q{ Sloth::Snmp is yet another wrapper library for snmp. }
|
11
|
+
spec.homepage = "https://github.com/arimay/sloth-snmp"
|
12
|
+
spec.license = "MIT"
|
13
|
+
|
14
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
15
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
16
|
+
end
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "snmp"
|
22
|
+
|
23
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
24
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sloth-snmp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- arimay
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-11-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: snmp
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '12.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '12.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
description: " Sloth::Snmp is yet another wrapper library for snmp. "
|
56
|
+
email:
|
57
|
+
- arima.yasuhiro@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- Gemfile
|
66
|
+
- README.adoc
|
67
|
+
- README.ja.adoc
|
68
|
+
- Rakefile
|
69
|
+
- bin/console
|
70
|
+
- bin/setup
|
71
|
+
- lib/sloth/snmp.rb
|
72
|
+
- lib/sloth/snmp/impl.rb
|
73
|
+
- lib/sloth/snmp/version.rb
|
74
|
+
- sample/snmpcustom.rb
|
75
|
+
- sample/snmpget.rb
|
76
|
+
- sample/snmpset.rb
|
77
|
+
- sample/snmptrap.rb
|
78
|
+
- sample/snmpwalk.rb
|
79
|
+
- sloth-snmp.gemspec
|
80
|
+
homepage: https://github.com/arimay/sloth-snmp
|
81
|
+
licenses:
|
82
|
+
- MIT
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubygems_version: 3.1.4
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: Sloth Snmp Library.
|
103
|
+
test_files: []
|