logstash-input-snmp 1.1.0 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 213be86518d3d8a674d4227ff23cad9fac2be281fe2d79e9cd6a2e3bc1415b62
4
- data.tar.gz: 1334457e8ebfcd7c979fa5bd53870af0205df9fe0842dd1f7e7d4598b653961b
3
+ metadata.gz: b52920a394a09244f4731933b5d79655002bd3569552ca33972dfd069d709ade
4
+ data.tar.gz: ff663bdff7ca249635388c68329cfcd0ae759893c4eaf27ff226ca59c6939f7f
5
5
  SHA512:
6
- metadata.gz: 5630fc5e10d784ba79700e2f11216b660194e36317e06ba6060f1459f3825719b28514324e212378a69dcc5b257c8efdaba889c6f65093560a2ae7d51f124314
7
- data.tar.gz: 0a888058d97613735f4eb4188963a73e907fa354a7799529153d00c51e58d15a6a232bcc7c0d22eaa8065a3798d3bb48d1f1b5535057e08b4b521647590bac91
6
+ metadata.gz: de641478532900bd27fa9e261b239a0d7f87c2024ee20c59e70dce40a9bb5bbd369a6ec9b4b96c69571afafda62fb49940e458b2174bcf5d852de5e893106ef9
7
+ data.tar.gz: 0c63e9b7f357faba71b6120aeaf5b42adcb399307f630597e0858ef267a071487cbff47c6fe7422dcdf1441f4755182e511d9fe5902a3f4b86162b9bd5dc63c6
@@ -1,5 +1,12 @@
1
+ ## 1.2.0
2
+ - Adding oid_path_length config option [#59] (https://github.com/logstash-plugins/logstash-input-snmp/pull/59)
3
+ - Fixing bug with table support removing index value from OIDs [#60] )https://github.com/logstash-plugins/logstash-input-snmp/issues/60)
4
+
5
+ ## 1.1.1
6
+ - Added information and other improvements to documentation [#57](https://github.com/logstash-plugins/logstash-input-snmp/pull/57)
7
+
1
8
  ## 1.1.0
2
- - Added support for querying SNMP tables
9
+ - Added support for querying SNMP tables [#49] (https://github.com/logstash-plugins/logstash-input-snmp/pull/49)
3
10
  - Changed three error messages in the base_client to include the target address for clarity in the logs.
4
11
 
5
12
  ## 1.0.1
@@ -59,8 +59,10 @@ This plugin supports the following configuration options plus the <<plugins-{typ
59
59
  | <<plugins-{type}s-{plugin}-hosts>> |<<array,array>>|No
60
60
  | <<plugins-{type}s-{plugin}-interval>> |<<number,number>>|No
61
61
  | <<plugins-{type}s-{plugin}-mib_paths>> |<<path,path>>|No
62
- | <<plugins-{type}s-{plugin}-oid_root_skip>> |<<boolean,boolean>>|No
62
+ | <<plugins-{type}s-{plugin}-oid_root_skip>> |<<number,number>>|No
63
+ | <<plugins-{type}s-{plugin}-oid_path_length>> |<<number,number>>|No
63
64
  | <<plugins-{type}s-{plugin}-walk>> |<<array,array>>|No
65
+ | <<plugins-{type}s-{plugin}-tables>> |<<array,array>>|No
64
66
  |=======================================================================
65
67
 
66
68
  ==== SNMPv3 Authentication Options
@@ -168,7 +170,7 @@ If you require other MIBs, you need to import them. See <<plugins-{type}s-{plugi
168
170
  [id="plugins-{type}s-{plugin}-oid_root_skip"]
169
171
  ===== `oid_root_skip`
170
172
 
171
- The `oid_root_skip` option specifies the number of OID root digits to ignore in event field name.
173
+ The `oid_root_skip` option specifies the number of OID root digits to ignore in the event field name.
172
174
  For example, in a numeric OID like "1.3.6.1.2.1.1.1.0" the first 5 digits could be ignored by setting `oid_root_skip => 5`
173
175
  which would result in a field name "1.1.1.0". Similarly when a MIB is used an OID such
174
176
  "1.3.6.1.2.mib-2.system.sysDescr.0" would become "mib-2.system.sysDescr.0"
@@ -176,6 +178,17 @@ which would result in a field name "1.1.1.0". Similarly when a MIB is used an OI
176
178
  * Value type is <<number,number>>
177
179
  * Default value is `0`
178
180
 
181
+ [id="plugins-{type}s-{plugin}-oid_path_length"]
182
+ ===== `oid_path_length`
183
+
184
+ The `oid_path_length` option specifies the number of OID root digits to retain in the event field name.
185
+ For example, in a numeric OID like "1.3.6.1.2.1.1.1.0" the last 2 digits could be retained by setting `oid_path_length => 2`
186
+ which would result in a field name "1.0". Similarly when a MIB is used an OID such
187
+ "1.3.6.1.2.mib-2.system.sysDescr.0" would become "sysDescr.0"
188
+
189
+ * Value type is <<number,number>>
190
+ * Default value is `0`
191
+
179
192
  [id="plugins-{type}s-{plugin}-walk"]
180
193
  ===== `walk`
181
194
 
@@ -197,6 +210,41 @@ Example
197
210
  }
198
211
  -----
199
212
 
213
+ [id="plugins-{type}s-{plugin}-tables"]
214
+ ===== `tables`
215
+
216
+ The `tables` option is used to query for tabular values for the given column OID(s).
217
+
218
+ Each table definition is a hash and must define the name key and value and the columns to return.
219
+
220
+ * Value type is <<array,array>>
221
+ * There is no default value for this setting
222
+ * Results are returned under a field using the table name
223
+
224
+ *Specifying a single table*
225
+
226
+ [source,ruby]
227
+ -----
228
+ input {
229
+ snmp {
230
+ hosts => [{host => "udp:127.0.0.1/161" community => "public" version => "2c" retries => 2 timeout => 1000}]
231
+ tables => [ {"name" => "interfaces" "columns" => ["1.3.6.1.2.1.2.2.1.1", "1.3.6.1.2.1.2.2.1.2", "1.3.6.1.2.1.2.2.1.5"]} ]
232
+ }
233
+ }
234
+ -----
235
+
236
+ *Specifying multiple tables*
237
+
238
+ [source,ruby]
239
+ -----
240
+ input {
241
+ snmp {
242
+ get => ["1.3.6.1.2.1.1.1.0"]
243
+ tables => [ {"name" => "interfaces" "columns" => ["1.3.6.1.2.1.2.2.1.1", "1.3.6.1.2.1.2.2.1.2", "1.3.6.1.2.1.2.2.1.5"]}, {"name" => "ltmPoolStatTable" "columns" => ["1.3.6.1.4.1.3375.2.2.5.2.3.1.1", "1.3.6.1.4.1.3375.2.2.5.2.3.1.6"]} ]
244
+ }
245
+ }
246
+ -----
247
+
200
248
  ==== SNMPv3 Authentication Options
201
249
 
202
250
  A **single user** can be configured and will be used for all defined SNMPv3 hosts.
@@ -252,6 +300,25 @@ The `security_level` option specifies the SNMPv3 security level between Authenti
252
300
  * Value can be any of: `noAuthNoPriv`, `authNoPriv`, `authPriv`
253
301
  * There is no default value for this setting
254
302
 
303
+ *Specifying SNMPv3 settings*
304
+
305
+ [source,ruby]
306
+ -----
307
+ input {
308
+ snmp {
309
+ hosts => [{host => "udp:127.0.0.1/161" version => "3"}]
310
+ get => ["1.3.6.1.2.1.1.1.0"]
311
+ security_name => "mySecurityName"
312
+ auth_protocol => "sha"
313
+ auth_pass => "ShaPassword"
314
+ priv_protocol => "aes"
315
+ priv_pass => "AesPasword"
316
+ security_level => "authPriv"
317
+ }
318
+ }
319
+
320
+ -----
321
+
255
322
  ==== More configuration examples
256
323
 
257
324
  *Using both `get` and `walk` in the same poll cycle for each host(s)*
@@ -56,6 +56,12 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
56
56
  # as "1.3.6.1.2.mib-2.system.sysDescr.0" would become "mib-2.system.sysDescr.0"
57
57
  config :oid_root_skip, :validate => :number, :default => 0
58
58
 
59
+ # number of OID tail digits to retain in event field name. For example, in a numeric OID
60
+ # like 1.3.6.1.2.1.1.1.0" the last 2 digits could be retained by setting oid_path_length => 2
61
+ # which would result in a field name "1.0". Similarly, when a MIB is used an OID such as
62
+ # "1.3.6.1.2.mib-2.system.sysDescr.0" would become "sysDescr.0"
63
+ config :oid_path_length, :validate => :number, :default => 0
64
+
59
65
  # Set polling interval in seconds
60
66
  #
61
67
  # The default, `30`, means poll each host every 30 seconds.
@@ -95,6 +101,7 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
95
101
  validate_oids!
96
102
  validate_hosts!
97
103
  validate_tables!
104
+ validate_strip!
98
105
 
99
106
  mib = LogStash::SnmpMib.new
100
107
 
@@ -161,7 +168,7 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
161
168
  result = {}
162
169
  if !definition[:get].empty?
163
170
  begin
164
- result = result.merge(definition[:client].get(definition[:get], @oid_root_skip))
171
+ result = result.merge(definition[:client].get(definition[:get], @oid_root_skip, @oid_path_length))
165
172
  rescue => e
166
173
  logger.error("error invoking get operation on #{definition[:host_address]} for OIDs: #{definition[:get]}, ignoring", :exception => e, :backtrace => e.backtrace)
167
174
  end
@@ -169,7 +176,7 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
169
176
  if !definition[:walk].empty?
170
177
  definition[:walk].each do |oid|
171
178
  begin
172
- result = result.merge(definition[:client].walk(oid, @oid_root_skip))
179
+ result = result.merge(definition[:client].walk(oid, @oid_root_skip, @oid_path_length))
173
180
  rescue => e
174
181
  logger.error("error invoking walk operation on OID: #{oid}, ignoring", :exception => e, :backtrace => e.backtrace)
175
182
  end
@@ -179,7 +186,7 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
179
186
  if !Array(@tables).empty?
180
187
  @tables.each do |table_entry|
181
188
  begin
182
- result = result.merge(definition[:client].table(table_entry, @oid_root_skip))
189
+ result = result.merge(definition[:client].table(table_entry, @oid_root_skip, @oid_path_length))
183
190
  rescue => e
184
191
  logger.error("error invoking table operation on OID: #{table_entry['name']}, ignoring", :exception => e, :backtrace => e.backtrace)
185
192
  end
@@ -277,4 +284,8 @@ class LogStash::Inputs::Snmp < LogStash::Inputs::Base
277
284
  end
278
285
  end
279
286
  end
287
+
288
+ def validate_strip!
289
+ raise(LogStash::ConfigurationError, "you can not specify both oid_root_skip and oid_path_length") if @oid_root_skip > 0 and @oid_path_length > 0
290
+ end
280
291
  end
@@ -45,7 +45,7 @@ module LogStash
45
45
  transport.listen()
46
46
  end
47
47
 
48
- def get(oids, strip_root = 0)
48
+ def get(oids, strip_root = 0, path_length = 0)
49
49
  pdu = get_pdu
50
50
  Array(oids).each { |oid| pdu.add(VariableBinding.new(OID.new(oid))) }
51
51
 
@@ -66,14 +66,14 @@ module LogStash
66
66
  variable = variable_binding.getVariable
67
67
  value = coerce(variable)
68
68
 
69
- result[@mib.map_oid(oid, strip_root)] = value
69
+ result[@mib.map_oid(oid, strip_root, path_length)] = value
70
70
  end
71
71
 
72
72
  result
73
73
  end
74
74
 
75
75
 
76
- def walk(oid, strip_root = 0)
76
+ def walk(oid, strip_root = 0, path_length = 0)
77
77
  result = {}
78
78
 
79
79
  pdufactory = get_pdu_factory
@@ -99,14 +99,14 @@ module LogStash
99
99
  variable = var_binding.getVariable
100
100
  value = coerce(variable)
101
101
 
102
- result[@mib.map_oid(oid, strip_root)] = value
102
+ result[@mib.map_oid(oid, strip_root, path_length)] = value
103
103
  end
104
104
  end
105
105
 
106
106
  result
107
107
  end
108
108
 
109
- def table(table, strip_root = 0)
109
+ def table(table, strip_root = 0, path_length = 0)
110
110
  result = {}
111
111
  rows = []
112
112
  pdufactory = get_pdu_factory
@@ -140,7 +140,7 @@ module LogStash
140
140
  oid = var_binding.getOid.toString
141
141
  variable = var_binding.getVariable
142
142
  value = coerce(variable)
143
- mapped_oid = @mib.map_oid(oid, strip_root).sub('.'+idx_val, '')
143
+ mapped_oid = @mib.map_oid(oid, strip_root, path_length).chomp('.'+idx_val)
144
144
  row[mapped_oid] = value
145
145
  end
146
146
  rows << row
@@ -69,7 +69,7 @@ module LogStash
69
69
  current.childs[last_node] = node
70
70
  end
71
71
 
72
- def map_oid(oid, strip_root = 0)
72
+ def map_oid(oid, strip_root = 0, path_length = 0)
73
73
  path = Oid.parse(oid)
74
74
 
75
75
  result = []
@@ -88,7 +88,13 @@ module LogStash
88
88
  result << node.name
89
89
  end
90
90
 
91
- result.drop(strip_root).join(".")
91
+ if strip_root > 0
92
+ result.drop(strip_root).join(".")
93
+ elsif path_length > 0
94
+ result.pop(path_length).join(".")
95
+ else
96
+ result.join(".")
97
+ end
92
98
  end
93
99
  end
94
100
 
@@ -136,8 +142,8 @@ module LogStash
136
142
  [module_name, nodes]
137
143
  end
138
144
 
139
- def map_oid(oid, strip_root = 0)
140
- @tree.map_oid(oid, strip_root)
145
+ def map_oid(oid, strip_root = 0, path_length = 0)
146
+ @tree.map_oid(oid, strip_root, path_length)
141
147
  end
142
148
 
143
149
  private
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-snmp'
3
- s.version = '1.1.0'
3
+ s.version = '1.2.0'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = "SNMP input plugin"
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -22,6 +22,8 @@ describe LogStash::Inputs::Snmp do
22
22
  [
23
23
  {"get" => ["1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
24
24
  {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
25
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_root_skip" => 2},
26
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => 2},
25
27
  {"get" => ["1.3.6.1.2.1.1.1.0", "1.3.6.1.2.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
26
28
  {"get" => ["1.3.6.1.2.1.1.1.0", ".1.3.6.1.2.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
27
29
  {"walk" => ["1.3.6.1.2.1.1.1"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
@@ -35,6 +37,8 @@ describe LogStash::Inputs::Snmp do
35
37
  {"get" => ["test"], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
36
38
  {"get" => [], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
37
39
  {"get" => "foo", "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
40
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => "a" },
41
+ {"get" => [".1.3.6.1.2.1.1.1.0"], "hosts" => [{"host" => "udp:127.0.0.1/161"}], "oid_path_length" => 2, "oid_root_skip" => 2 },
38
42
  {"walk" => "foo", "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
39
43
  {"tables" => [{"columns" => ["1.2.3.4", "4.3.2.1"]}], "hosts" => [{"host" => "udp:127.0.0.1/161"}]},
40
44
  ]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-snmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elasticsearch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-28 00:00:00.000000000 Z
11
+ date: 2019-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement