Skip to content

Commit a198f14

Browse files
authored
Merge pull request #114 from fluent/add-preserve_sid_on_hash-option
in_windows_eventlog2: Add preserve_sid_on_hash option
2 parents 7be478d + 9f3f411 commit a198f14

File tree

4 files changed

+86
-3
lines changed

4 files changed

+86
-3
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Fluentd Input plugin for the Windows Event Log using newer Windows Event Logging
3535
render_as_xml false # default is false.
3636
rate_limit 200 # default is -1(Winevt::EventLog::Subscribe::RATE_INFINITE).
3737
# preserve_qualifiers_on_hash true # default is false.
38+
# preserve_sid_on_hash false # default is true.
3839
# read_all_channels false # default is false.
3940
# description_locale en_US # default is nil. It means that system locale is used for obtaining description.
4041
# refresh_subscription_interval 10m # default is nil. It specifies refresh interval for channel subscriptions.
@@ -86,6 +87,7 @@ Fluentd Input plugin for the Windows Event Log using newer Windows Event Logging
8687
|`render_as_xml` | (option) Render Windows EventLog as XML or Ruby Hash object directly. Defaults to `false`.|
8788
|`rate_limit` | (option) Specify rate limit to consume EventLog. This is the approximate maximum number of records read per second. If more than this value is read in a second, this stops reading and waits until the next `read_interval`. This value must be a multiple of 10. Default is `-1`(`Winevt::EventLog::Subscribe::RATE_INFINITE`) and this means there is no upper limit. The log flow rate for setting this is approximately as follows: `rate_limit / read_interval [logs/second]` |
8889
|`preserve_qualifiers_on_hash` | (option) When set up it as true, this plugin preserves "Qualifiers" and "EventID" keys. When set up it as false, this plugin calculates actual "EventID" from "Qualifiers" and removing "Qualifiers". Default is `false`.|
90+
|`preserve_sid_on_hash` | (option) When set up it as true, this plugin preserves "UserID" key which includes SID of users. When set up it as false, this plugin just eliminates "UserID". This option is only effective for hash format (render_as_xml false) . Default is `true`.|
8991
|`read_all_channels`| (option) Read from all channels. Default is `false`|
9092
|`description_locale`| (option) Specify description locale. Default is `nil`. See also: [Supported locales](https://github.com/fluent-plugins-nursery/winevt_c#multilingual-description) |
9193
|`refresh_subscription_interval`|(option) It specifies refresh interval for channel subscriptions. Default is `nil`.|

fluent-plugin-winevtlog.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,5 @@ Gem::Specification.new do |spec|
2424
spec.add_development_dependency "fluent-plugin-parser-winevt_xml", ">= 0.1.2"
2525
spec.add_runtime_dependency "fluentd", [">= 0.14.12", "< 2"]
2626
spec.add_runtime_dependency "win32-eventlog"
27-
spec.add_runtime_dependency "winevt_c", ">= 0.10.1"
27+
spec.add_runtime_dependency "winevt_c", ">= 0.11.0"
2828
end

lib/fluent/plugin/in_windows_eventlog2.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class ReconnectError < Fluent::UnrecoverableError; end
2929
"Channel" => ["Channel", :string],
3030
"Computer" => ["Computer", :string],
3131
"UserID" => ["UserID", :string],
32+
"User" => ["User", :string],
3233
"Version" => ["Version", :string],
3334
"Description" => ["Description", :string],
3435
"EventData" => ["EventData", :array]}
@@ -43,6 +44,7 @@ class ReconnectError < Fluent::UnrecoverableError; end
4344
config_param :render_as_xml, :bool, default: false
4445
config_param :rate_limit, :integer, default: Winevt::EventLog::Subscribe::RATE_INFINITE
4546
config_param :preserve_qualifiers_on_hash, :bool, default: false
47+
config_param :preserve_sid_on_hash, :bool, default: true
4648
config_param :read_all_channels, :bool, default: false
4749
config_param :description_locale, :string, default: nil
4850
config_param :refresh_subscription_interval, :time, default: nil
@@ -147,6 +149,15 @@ class << self
147149
@keynames.delete('Qualifiers')
148150
end
149151
@keynames.delete('EventData') if @parse_description
152+
if @render_as_xml && !@preserve_sid_on_hash
153+
raise Fluent::ConfigError, "preserve_sid_on_hash is effective with Hash object rendering(render_as_xml as false)."
154+
end
155+
if @render_as_xml
156+
@keynames.delete('User')
157+
end
158+
if !@render_as_xml && !@preserve_sid_on_hash
159+
@keynames.delete('UserID')
160+
end
150161

151162
locale = Winevt::EventLog::Locale.new
152163
if @description_locale && unsupported_locale?(locale, @description_locale)
@@ -244,6 +255,9 @@ def subscription(ch, read_existing_events, remote_session)
244255
if !@render_as_xml && @preserve_qualifiers_on_hash
245256
subscribe.preserve_qualifiers = @preserve_qualifiers_on_hash
246257
end
258+
if !@render_as_xml && !@preserve_sid_on_hash
259+
subscribe.preserve_sid = @preserve_sid_on_hash
260+
end
247261
rescue Winevt::EventLog::Query::Error => e
248262
raise Fluent::ConfigError, "Invalid Bookmark XML is loaded. #{e}"
249263
end

test/plugin/test_in_windows_eventlog2.rb

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ def test_parse_privileges_description
296296
end
297297

298298
def test_write
299-
d = create_driver
299+
d = create_driver XML_RENDERING_CONFIG
300300

301301
service = Fluent::Plugin::EventService.new
302302

@@ -312,6 +312,7 @@ def test_write
312312
assert_equal("65500", record["EventID"])
313313
assert_equal("4", record["Level"])
314314
assert_equal("fluent-plugins", record["ProviderName"])
315+
assert_false(record.has_key?("User"))
315316
end
316317

317318
CONFIG_WITH_NON_EXISTENT_CHANNEL = config_element("ROOT", "", {
@@ -357,6 +358,7 @@ def test_write_with_event_query
357358
assert_equal("65500", record["EventID"])
358359
assert_equal("4", record["Level"])
359360
assert_equal("fluent-plugins", record["ProviderName"])
361+
assert_true(record.has_key?("User"))
360362
end
361363

362364

@@ -418,6 +420,7 @@ def test_write_with_remoting_access
418420
assert_equal("65500", record["EventID"])
419421
assert_equal("4", record["Level"])
420422
assert_equal("fluent-plugins", record["ProviderName"])
423+
assert_true(record.has_key?("User"))
421424
end
422425

423426
class HashRendered < self
@@ -463,7 +466,7 @@ def test_write_with_preserving_qualifiers
463466
service = Fluent::Plugin::EventService.new
464467
subscribe = Winevt::EventLog::Subscribe.new
465468

466-
omit "@parser.preserve_qualifiers does not respond" unless subscribe.respond_to?(:preserve_qualifiers?)
469+
omit "subscribe.preserve_qualifiers? does not respond" unless subscribe.respond_to?(:preserve_qualifiers?)
467470

468471
d.run(expect_emits: 1) do
469472
service.run
@@ -477,6 +480,70 @@ def test_write_with_preserving_qualifiers
477480
assert_true(record.has_key?("EventData"))
478481
assert_true(record.has_key?("Qualifiers"))
479482
end
483+
484+
def test_write_with_preserving_sid
485+
require 'winevt'
486+
487+
d = create_driver(config_element("ROOT", "", {"tag" => "fluent.eventlog",
488+
"render_as_xml" => false,
489+
'preserve_sid_on_hash' => true
490+
}, [
491+
config_element("storage", "", {
492+
'@type' => 'local',
493+
'persistent' => false
494+
}),
495+
]))
496+
497+
service = Fluent::Plugin::EventService.new
498+
subscribe = Winevt::EventLog::Subscribe.new
499+
500+
omit "subscribe.preserve_sid? does not respond" unless subscribe.respond_to?(:preserve_sid?)
501+
502+
d.run(expect_emits: 1) do
503+
service.run
504+
end
505+
506+
assert(d.events.length >= 1)
507+
event = d.events.last
508+
record = event.last
509+
510+
assert_true(record.has_key?("Description"))
511+
assert_true(record.has_key?("EventData"))
512+
assert_true(record.has_key?("UserID"))
513+
assert_true(record.has_key?("User"))
514+
end
515+
516+
def test_write_with_not_preserving_sid
517+
require 'winevt'
518+
519+
d = create_driver(config_element("ROOT", "", {"tag" => "fluent.eventlog",
520+
"render_as_xml" => false,
521+
'preserve_sid_on_hash' => false
522+
}, [
523+
config_element("storage", "", {
524+
'@type' => 'local',
525+
'persistent' => false
526+
}),
527+
]))
528+
529+
service = Fluent::Plugin::EventService.new
530+
subscribe = Winevt::EventLog::Subscribe.new
531+
532+
omit "subscribe.preserve_sid? does not respond" unless subscribe.respond_to?(:preserve_sid?)
533+
534+
d.run(expect_emits: 1) do
535+
service.run
536+
end
537+
538+
assert(d.events.length >= 1)
539+
event = d.events.last
540+
record = event.last
541+
542+
assert_true(record.has_key?("Description"))
543+
assert_true(record.has_key?("EventData"))
544+
assert_false(record.has_key?("UserID"))
545+
assert_true(record.has_key?("User"))
546+
end
480547
end
481548

482549
class PersistBookMark < self

0 commit comments

Comments
 (0)