fluent-plugin-snmp 0.0.5 → 0.0.6
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.
- data/fluent-plugin-snmp.gemspec +1 -1
- data/lib/fluent/plugin/in_snmp.rb +81 -15
- data/sample/out_exec.rb.sample +17 -0
- data/sample/snmp.conf.sample +43 -0
- data/test/plugin/test_in_snmp.rb +81 -8
- metadata +4 -3
- data/snmp.conf.sample +0 -43
data/fluent-plugin-snmp.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = "fluent-plugin-snmp"
|
6
|
-
gem.version = "0.0.
|
6
|
+
gem.version = "0.0.6"
|
7
7
|
gem.authors = ["hiro-su"]
|
8
8
|
gem.email = ["h-sugimoto@iij.ad.jp"]
|
9
9
|
gem.description = %q{Input plugin to walk snmp}
|
@@ -12,6 +12,10 @@ module Fluent
|
|
12
12
|
config_param :nodes, :string, :default => nil
|
13
13
|
config_param :polling_time, :string, :default => nil
|
14
14
|
config_param :host_name, :string, :default => nil
|
15
|
+
config_param :retry, :integer, :default => 5
|
16
|
+
config_param :retry_interval, :time, :default => 1
|
17
|
+
config_param :method_type, :string, :default => "walk"
|
18
|
+
config_param :out_exec_filter, :string, :default => nil
|
15
19
|
|
16
20
|
# SNMP Lib Params
|
17
21
|
# require param: host, community
|
@@ -38,7 +42,7 @@ module Fluent
|
|
38
42
|
config_param :write_community, :string, :default => nil
|
39
43
|
config_param :version, :string, :default => nil # Use :SNMPv1 or :SNMPv2c
|
40
44
|
config_param :timeout, :time, :default => nil
|
41
|
-
config_param :retries, :integer, :default =>
|
45
|
+
config_param :retries, :integer, :default => 0
|
42
46
|
config_param :transport, :string, :default => nil
|
43
47
|
config_param :max_recv_bytes, :string, :default => nil
|
44
48
|
config_param :mib_dir, :string, :default => nil
|
@@ -83,7 +87,19 @@ module Fluent
|
|
83
87
|
:use_IPv6 => @use_IPv6
|
84
88
|
}
|
85
89
|
|
86
|
-
@
|
90
|
+
unless @out_exec_filter.nil?
|
91
|
+
@out_exec = lambda do |manager|
|
92
|
+
require @out_exec_filter
|
93
|
+
opts = {
|
94
|
+
:tag => @tag,
|
95
|
+
:mib => @mib,
|
96
|
+
:mib_modules => @mib_modules,
|
97
|
+
:nodes => @nodes,
|
98
|
+
:conf => conf
|
99
|
+
}
|
100
|
+
Fluent::SnmpInput.new.out_exec(manager, opts)
|
101
|
+
end
|
102
|
+
end
|
87
103
|
end
|
88
104
|
|
89
105
|
def starter
|
@@ -102,35 +118,69 @@ module Fluent
|
|
102
118
|
|
103
119
|
def run
|
104
120
|
Polling::run(@polling_time) do
|
105
|
-
snmpwalk(@manager, @mib, @nodes)
|
106
121
|
break if @end_flag
|
122
|
+
exec_params = {
|
123
|
+
manager: @manager,
|
124
|
+
mib: @mib,
|
125
|
+
nodes: @nodes,
|
126
|
+
method_type: @method_type
|
127
|
+
}
|
128
|
+
exec_snmp(exec_params)
|
107
129
|
end
|
108
130
|
rescue TypeError => ex
|
109
131
|
$log.error "run TypeError", :error=>ex.message
|
110
|
-
exit
|
111
132
|
rescue => ex
|
112
|
-
$log.
|
113
|
-
|
114
|
-
|
115
|
-
retry if @retry_conut < 30
|
133
|
+
$log.fatal "run failed", :error=>ex.inspect
|
134
|
+
$log.fatal_backtrace ex.backtrace
|
135
|
+
exit
|
116
136
|
end
|
117
137
|
|
118
|
-
#Ctrl-cで処理を停止時に呼ばれる
|
119
138
|
def shutdown
|
120
139
|
@end_flag = true
|
121
140
|
@thread.run
|
122
141
|
@thread.join
|
123
142
|
@starter.join
|
124
143
|
@manager.close
|
144
|
+
super
|
145
|
+
end
|
146
|
+
|
147
|
+
def exec_snmp opts={}
|
148
|
+
@retry_count ||= 0
|
149
|
+
if @out_exec_filter.nil?
|
150
|
+
case opts[:method_type]
|
151
|
+
when /^walk$/
|
152
|
+
snmp_walk(opts[:manager], opts[:mib], opts[:nodes])
|
153
|
+
when /^get$/
|
154
|
+
snmp_get(opts[:manager], opts[:mib], opts[:nodes])
|
155
|
+
else
|
156
|
+
$log.error "unknow exec method"
|
157
|
+
raise
|
158
|
+
end
|
159
|
+
else
|
160
|
+
@out_exec.call opts[:manager]
|
161
|
+
end
|
162
|
+
@retry_count = 0
|
163
|
+
rescue SNMP::RequestTimeout => ex
|
164
|
+
$log.error "exec_snmp failed", :error=>ex.inspect
|
165
|
+
@retry_count += 1
|
166
|
+
if @retry_count <= @retry
|
167
|
+
sleep @retry_interval
|
168
|
+
$log.error "retry: #{@retry_count}"
|
169
|
+
retry
|
170
|
+
else
|
171
|
+
raise ex
|
172
|
+
end
|
173
|
+
rescue => ex
|
174
|
+
raise ex
|
125
175
|
end
|
126
176
|
|
127
177
|
private
|
128
178
|
|
129
|
-
def
|
179
|
+
def snmp_walk(manager, mib, nodes, test=false)
|
130
180
|
manager.walk(mib) do |row|
|
131
181
|
time = Engine.now
|
132
182
|
time = time - time % 5
|
133
|
-
record =
|
183
|
+
record = {}
|
134
184
|
row.each do |vb|
|
135
185
|
if nodes.nil?
|
136
186
|
record["value"] = vb
|
@@ -142,10 +192,27 @@ module Fluent
|
|
142
192
|
end
|
143
193
|
end
|
144
194
|
rescue => ex
|
145
|
-
|
195
|
+
raise ex
|
196
|
+
end
|
197
|
+
|
198
|
+
def snmp_get(manager, mib, nodes, test=false)
|
199
|
+
manager.get(mib).each_varbind do |vb|
|
200
|
+
time = Engine.now
|
201
|
+
time = time - time % 5
|
202
|
+
record = {}
|
203
|
+
if nodes.nil?
|
204
|
+
record["value"] = vb
|
205
|
+
else
|
206
|
+
nodes.each{|param| record[param] = check_type(vb.__send__(param))}
|
207
|
+
end
|
208
|
+
Engine.emit(@tag, time, record)
|
209
|
+
return {:time => time, :record => record} if test
|
210
|
+
end
|
211
|
+
rescue => ex
|
212
|
+
raise ex
|
146
213
|
end
|
147
214
|
|
148
|
-
#
|
215
|
+
# data check from snmp
|
149
216
|
def check_type(value)
|
150
217
|
if value =~ /^\d+(\.\d+)?$/
|
151
218
|
return value.to_f
|
@@ -153,9 +220,8 @@ module Fluent
|
|
153
220
|
return value.to_s
|
154
221
|
end
|
155
222
|
rescue => ex
|
156
|
-
$
|
223
|
+
$log.error "snmp failed to check_type", :error=>ex.message
|
157
224
|
$log.warn_backtrace ex.backtrace
|
158
225
|
end
|
159
|
-
|
160
226
|
end
|
161
227
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Fluent
|
2
|
+
class SnmpInput
|
3
|
+
def out_exec manager, opts={}
|
4
|
+
manager.walk(opts[:mib]) do |row|
|
5
|
+
time = Time.now.to_i
|
6
|
+
time = time - time % 5
|
7
|
+
record = {}
|
8
|
+
row.each do |vb|
|
9
|
+
record["name"] = vb.name.to_s
|
10
|
+
record["value"] = vb.value.to_s
|
11
|
+
Engine.emit opts[:tag], time, record
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<source>
|
2
|
+
type snmp
|
3
|
+
tag snmp.server1
|
4
|
+
nodes name, value
|
5
|
+
host localhost
|
6
|
+
community public
|
7
|
+
version 2c
|
8
|
+
mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
9
|
+
mib_modules HOST-RESOURCES-MIB
|
10
|
+
retries 0
|
11
|
+
timeout 3s
|
12
|
+
polling_time 0,10,20,30,40,50
|
13
|
+
</source>
|
14
|
+
|
15
|
+
#<source>
|
16
|
+
#type snmp
|
17
|
+
#tag snmp.server2
|
18
|
+
#host localhost
|
19
|
+
#community public
|
20
|
+
#version 2c
|
21
|
+
#mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
22
|
+
#mib_modules HOST-RESOURCES-MIB
|
23
|
+
#retries 0
|
24
|
+
#timeout 3s
|
25
|
+
#polling_time 5,15,25,35,45,55
|
26
|
+
#</source>
|
27
|
+
#
|
28
|
+
#<source>
|
29
|
+
#type snmp
|
30
|
+
#tag snmp.server3
|
31
|
+
#host localhost
|
32
|
+
#community public
|
33
|
+
#version 2c
|
34
|
+
#mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
35
|
+
#mib_modules HOST-RESOURCES-MIB
|
36
|
+
#retries 0
|
37
|
+
#timeout 3s
|
38
|
+
#polling_time 5m
|
39
|
+
#</source>
|
40
|
+
|
41
|
+
<match snmp.server*>
|
42
|
+
type stdout
|
43
|
+
</match>
|
data/test/plugin/test_in_snmp.rb
CHANGED
@@ -15,10 +15,14 @@ class SnmpInputTest < Test::Unit::TestCase
|
|
15
15
|
nodes name, value
|
16
16
|
polling_time 0,10,20,30,40,50
|
17
17
|
host localhost
|
18
|
-
|
18
|
+
host_name test_host
|
19
|
+
community public
|
19
20
|
mib_modules HOST-RESOURCES-MIB, IF-MIB
|
20
|
-
|
21
|
+
retry 0
|
22
|
+
retry_interval 2
|
21
23
|
timeout 3s
|
24
|
+
method_type walk
|
25
|
+
out_exec_filter sample/out_exec.rb
|
22
26
|
]
|
23
27
|
|
24
28
|
def create_driver(conf=CONFIG)
|
@@ -33,16 +37,20 @@ class SnmpInputTest < Test::Unit::TestCase
|
|
33
37
|
assert_equal ["hrStorageIndex","hrStorageDescr","hrStorageSize","hrStorageUsed"], d.instance.mib
|
34
38
|
assert_equal ["name","value"], d.instance.nodes
|
35
39
|
assert_equal ["0","10","20","30","40","50"], d.instance.polling_time
|
40
|
+
assert_equal "walk", d.instance.method_type
|
41
|
+
assert_equal 2, d.instance.retry_interval
|
42
|
+
assert_equal "sample/out_exec.rb", d.instance.out_exec_filter
|
36
43
|
|
37
44
|
# SNMP Lib Params
|
38
45
|
assert_equal "localhost", d.instance.host
|
46
|
+
assert_equal "test_host", d.instance.host_name
|
39
47
|
assert_nil d.instance.port
|
40
48
|
assert_nil d.instance.trap_port
|
41
|
-
assert_equal "
|
49
|
+
assert_equal "public", d.instance.community
|
42
50
|
assert_nil d.instance.write_community
|
43
51
|
assert_equal :SNMPv2c, d.instance.version
|
44
52
|
assert_equal 3, d.instance.timeout
|
45
|
-
assert_equal 0, d.instance.
|
53
|
+
assert_equal 0, d.instance.retry
|
46
54
|
assert_nil d.instance.transport
|
47
55
|
assert_nil d.instance.max_recv_bytes
|
48
56
|
assert_nil d.instance.mib_dir
|
@@ -57,9 +65,15 @@ class SnmpInputTest < Test::Unit::TestCase
|
|
57
65
|
assert_equal "sensorValue_%RH", @obj.__send__(:check_type,"sensorValue_%RH")
|
58
66
|
assert_equal 12.00, @obj.__send__(:check_type,"12")
|
59
67
|
assert_equal 12.34, @obj.__send__(:check_type,"12.34")
|
68
|
+
assert_equal String, @obj.__send__(:check_type,"test").class
|
69
|
+
assert_equal String, @obj.__send__(:check_type,"utrh0").class
|
70
|
+
assert_equal String, @obj.__send__(:check_type,"sensorValue_degC").class
|
71
|
+
assert_equal String, @obj.__send__(:check_type,"sensorValue_%RH").class
|
72
|
+
assert_equal Float, @obj.__send__(:check_type,"12").class
|
73
|
+
assert_equal Float, @obj.__send__(:check_type,"12.34").class
|
60
74
|
end
|
61
75
|
|
62
|
-
def
|
76
|
+
def test_snmp_walk
|
63
77
|
d = create_driver
|
64
78
|
nodes = d.instance.nodes
|
65
79
|
mib = d.instance.mib
|
@@ -77,12 +91,71 @@ class SnmpInputTest < Test::Unit::TestCase
|
|
77
91
|
Time.stubs(:now).returns(Time.parse "2012/12/31 23:59:50")
|
78
92
|
manager = SNMP::Manager.new(snmp_init_params)
|
79
93
|
|
80
|
-
data = @obj.__send__(:
|
94
|
+
data = @obj.__send__(:snmp_walk, manager, mib, nodes, true)
|
81
95
|
record = data[:record]
|
82
96
|
|
83
97
|
assert_equal 1356965990, data[:time]
|
84
|
-
assert_equal "HOST-RESOURCES-MIB::hrStorageIndex.
|
85
|
-
assert_equal "
|
98
|
+
assert_equal "HOST-RESOURCES-MIB::hrStorageIndex.31", record["name"]
|
99
|
+
assert_equal "31", record["value"]
|
86
100
|
end
|
87
101
|
|
102
|
+
|
103
|
+
def test_snmp_get
|
104
|
+
d = create_driver %[
|
105
|
+
tag snmp.server1
|
106
|
+
mib hrStorageIndex.31
|
107
|
+
nodes name, value
|
108
|
+
polling_time 0,10,20,30,40,50
|
109
|
+
host localhost
|
110
|
+
community public
|
111
|
+
mib_modules HOST-RESOURCES-MIB
|
112
|
+
]
|
113
|
+
nodes = d.instance.nodes
|
114
|
+
mib = d.instance.mib
|
115
|
+
|
116
|
+
snmp_init_params = {
|
117
|
+
:host => d.instance.host,
|
118
|
+
:community => d.instance.community,
|
119
|
+
:timeout => d.instance.timeout,
|
120
|
+
:retries => d.instance.retries,
|
121
|
+
:mib_dir => d.instance.mib_dir,
|
122
|
+
:mib_modules => d.instance.mib_modules,
|
123
|
+
}
|
124
|
+
|
125
|
+
# unixtime 1356965990
|
126
|
+
Time.stubs(:now).returns(Time.parse "2012/12/31 23:59:50")
|
127
|
+
manager = SNMP::Manager.new(snmp_init_params)
|
128
|
+
|
129
|
+
data = @obj.__send__(:snmp_get, manager, mib, nodes, true)
|
130
|
+
record = data[:record]
|
131
|
+
|
132
|
+
assert_equal 1356965990, data[:time]
|
133
|
+
assert_equal "HOST-RESOURCES-MIB::hrStorageIndex.31", record["name"]
|
134
|
+
assert_equal "31", record["value"]
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_exec_snmp
|
138
|
+
d = create_driver
|
139
|
+
snmp_init_params = {
|
140
|
+
:host => d.instance.host,
|
141
|
+
:community => d.instance.community,
|
142
|
+
:timeout => d.instance.timeout,
|
143
|
+
:retries => d.instance.retries,
|
144
|
+
:mib_dir => d.instance.mib_dir,
|
145
|
+
:mib_modules => d.instance.mib_modules,
|
146
|
+
}
|
147
|
+
|
148
|
+
manager = SNMP::Manager.new(snmp_init_params)
|
149
|
+
|
150
|
+
opts = {
|
151
|
+
:manager => manager,
|
152
|
+
:method_type => d.instance.method_type,
|
153
|
+
:mib => d.instance.mib,
|
154
|
+
:nodes => d.instance.nodes,
|
155
|
+
:test => true
|
156
|
+
}
|
157
|
+
|
158
|
+
exec = @obj.__send__(:exec_snmp, opts)
|
159
|
+
assert_equal 0, exec
|
160
|
+
end
|
88
161
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-snmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
@@ -121,7 +121,8 @@ files:
|
|
121
121
|
- Rakefile
|
122
122
|
- fluent-plugin-snmp.gemspec
|
123
123
|
- lib/fluent/plugin/in_snmp.rb
|
124
|
-
-
|
124
|
+
- sample/out_exec.rb.sample
|
125
|
+
- sample/snmp.conf.sample
|
125
126
|
- test/helper.rb
|
126
127
|
- test/plugin/test_in_snmp.rb
|
127
128
|
homepage:
|
data/snmp.conf.sample
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
<source>
|
2
|
-
type snmp
|
3
|
-
tag snmp.server1
|
4
|
-
nodes name, value
|
5
|
-
host localhost
|
6
|
-
community private
|
7
|
-
version 2c
|
8
|
-
mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
9
|
-
mib_modules HOST-RESOURCES-MIB
|
10
|
-
retries 0
|
11
|
-
timeout 3s
|
12
|
-
polling_time 0,10,20,30,40,50
|
13
|
-
</source>
|
14
|
-
|
15
|
-
<source>
|
16
|
-
type snmp
|
17
|
-
tag snmp.server2
|
18
|
-
host localhost
|
19
|
-
community private
|
20
|
-
version 2c
|
21
|
-
mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
22
|
-
mib_modules HOST-RESOURCES-MIB
|
23
|
-
retries 0
|
24
|
-
timeout 3s
|
25
|
-
polling_time 5,15,25,35,45,55
|
26
|
-
</source>
|
27
|
-
|
28
|
-
<source>
|
29
|
-
type snmp
|
30
|
-
tag snmp.server3
|
31
|
-
host localhost
|
32
|
-
community private
|
33
|
-
version 2c
|
34
|
-
mib hrStorageIndex, hrStorageDescr, hrStorageSize, hrStorageUsed
|
35
|
-
mib_modules HOST-RESOURCES-MIB
|
36
|
-
retries 0
|
37
|
-
timeout 3s
|
38
|
-
polling_time 5m
|
39
|
-
</source>
|
40
|
-
|
41
|
-
<match snmp.server*>
|
42
|
-
type stdout
|
43
|
-
</match>
|