fluent-plugin-windows-eventlog 0.2.1 → 0.4.2

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.
@@ -1,47 +1,47 @@
1
- require 'win32/eventlog'
2
-
3
- class EventLog
4
- def initialize
5
- @logger = Win32::EventLog.new
6
- @app_source = "fluent-plugins"
7
- end
8
-
9
- def info(event_id, message)
10
- @logger.report_event(
11
- source: @app_source,
12
- event_type: Win32::EventLog::INFO_TYPE,
13
- event_id: event_id,
14
- data: message
15
- )
16
- end
17
-
18
- def warn(event_id, message)
19
- @logger.report_event(
20
- source: @app_source,
21
- event_type: Win32::EventLog::WARN_TYPE,
22
- event_id: event_id,
23
- data: message
24
- )
25
- end
26
-
27
- def crit(event_id, message)
28
- @logger.report_event(
29
- source: @app_source,
30
- event_type: Win32::EventLog::ERROR_TYPE,
31
- event_id: event_id,
32
- data: message
33
- )
34
- end
35
-
36
- end
37
-
38
- module Fluent
39
- module Plugin
40
- class EventService
41
- def run
42
- eventlog = EventLog.new()
43
- eventlog.info(65500, "Hi, from fluentd-plugins!! at " + Time.now.strftime("%Y/%m/%d %H:%M:%S "))
44
- end
45
- end
46
- end
47
- end
1
+ require 'win32/eventlog'
2
+
3
+ class EventLog
4
+ def initialize
5
+ @logger = Win32::EventLog.new
6
+ @app_source = "fluent-plugins"
7
+ end
8
+
9
+ def info(event_id, message)
10
+ @logger.report_event(
11
+ source: @app_source,
12
+ event_type: Win32::EventLog::INFO_TYPE,
13
+ event_id: event_id,
14
+ data: message
15
+ )
16
+ end
17
+
18
+ def warn(event_id, message)
19
+ @logger.report_event(
20
+ source: @app_source,
21
+ event_type: Win32::EventLog::WARN_TYPE,
22
+ event_id: event_id,
23
+ data: message
24
+ )
25
+ end
26
+
27
+ def crit(event_id, message)
28
+ @logger.report_event(
29
+ source: @app_source,
30
+ event_type: Win32::EventLog::ERROR_TYPE,
31
+ event_id: event_id,
32
+ data: message
33
+ )
34
+ end
35
+
36
+ end
37
+
38
+ module Fluent
39
+ module Plugin
40
+ class EventService
41
+ def run
42
+ eventlog = EventLog.new()
43
+ eventlog.info(65500, "Hi, from fluentd-plugins!! at " + Time.now.strftime("%Y/%m/%d %H:%M:%S "))
44
+ end
45
+ end
46
+ end
47
+ end
data/test/helper.rb CHANGED
@@ -1,32 +1,33 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require 'test/unit'
11
-
12
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
- $LOAD_PATH.unshift(File.dirname(__FILE__))
14
- require 'fluent/test'
15
- unless ENV.has_key?('VERBOSE')
16
- nulllogger = Object.new
17
- nulllogger.instance_eval {|obj|
18
- def method_missing(method, *args)
19
- # pass
20
- end
21
- }
22
- $log = nulllogger
23
- end
24
-
25
- require 'fluent/test/driver/input'
26
- require 'fluent/plugin/in_windows_eventlog'
27
-
28
- class Test::Unit::TestCase
29
- end
30
- require 'fluent/test/helpers'
31
-
32
- include Fluent::Test::Helpers
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ require 'fluent/test'
15
+ unless ENV.has_key?('VERBOSE')
16
+ nulllogger = Object.new
17
+ nulllogger.instance_eval {|obj|
18
+ def method_missing(method, *args)
19
+ # pass
20
+ end
21
+ }
22
+ $log = nulllogger
23
+ end
24
+
25
+ require 'fluent/test/driver/input'
26
+ require 'fluent/plugin/in_windows_eventlog'
27
+ require 'fluent/plugin/in_windows_eventlog2'
28
+
29
+ class Test::Unit::TestCase
30
+ end
31
+ require 'fluent/test/helpers'
32
+
33
+ include Fluent::Test::Helpers
@@ -0,0 +1,214 @@
1
+ require 'helper'
2
+ require 'fileutils'
3
+ require 'generate-windows-event'
4
+
5
+ class WindowsEventLog2InputTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ Fluent::Test.setup
9
+ end
10
+
11
+ CONFIG = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
12
+ config_element("storage", "", {
13
+ '@type' => 'local',
14
+ 'persistent' => false
15
+ })
16
+ ])
17
+
18
+ def create_driver(conf = CONFIG)
19
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::WindowsEventLog2Input).configure(conf)
20
+ end
21
+
22
+ def test_configure
23
+ d = create_driver CONFIG
24
+ assert_equal 'fluent.eventlog', d.instance.tag
25
+ assert_equal 2, d.instance.read_interval
26
+ assert_equal ['application'], d.instance.channels
27
+ assert_false d.instance.read_from_head
28
+ assert_true d.instance.render_as_xml
29
+ end
30
+
31
+ def test_parse_desc
32
+ d = create_driver
33
+ desc =<<-DESC
34
+ A user's local group membership was enumerated.\r\n\r\nSubject:\r\n\tSecurity ID:\t\tS-X-Y-XX-WWWWWW-VVVV\r\n\tAccount Name:\t\tAdministrator\r\n\tAccount Domain:\t\tDESKTOP-FLUENTTEST\r\n\tLogon ID:\t\t0x3185B1\r\n\r\nUser:\r\n\tSecurity ID:\t\tS-X-Y-XX-WWWWWW-VVVV\r\n\tAccount Name:\t\tAdministrator\r\n\tAccount Domain:\t\tDESKTOP-FLUENTTEST\r\n\r\nProcess Information:\r\n\tProcess ID:\t\t0x50b8\r\n\tProcess Name:\t\tC:\\msys64\\usr\\bin\\make.exe
35
+ DESC
36
+ h = {"Description" => desc}
37
+ expected = {"DescriptionTitle" => "A user's local group membership was enumerated.",
38
+ "subject.security_id" => "S-X-Y-XX-WWWWWW-VVVV",
39
+ "subject.account_name" => "Administrator",
40
+ "subject.account_domain" => "DESKTOP-FLUENTTEST",
41
+ "subject.logon_id" => "0x3185B1",
42
+ "user.security_id" => "S-X-Y-XX-WWWWWW-VVVV",
43
+ "user.account_name" => "Administrator",
44
+ "user.account_domain" => "DESKTOP-FLUENTTEST",
45
+ "process_information.process_id" => "0x50b8",
46
+ "process_information.process_name" => "C:\\msys64\\usr\\bin\\make.exe"}
47
+ d.instance.parse_desc(h)
48
+ assert_equal(expected, h)
49
+ end
50
+
51
+ def test_write
52
+ d = create_driver
53
+
54
+ service = Fluent::Plugin::EventService.new
55
+
56
+ d.run(expect_emits: 1) do
57
+ service.run
58
+ end
59
+
60
+ assert(d.events.length >= 1)
61
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
62
+ record = event.last
63
+
64
+ assert_equal("Application", record["Channel"])
65
+ assert_equal("65500", record["EventID"])
66
+ assert_equal("4", record["Level"])
67
+ assert_equal("fluent-plugins", record["ProviderName"])
68
+ end
69
+
70
+ CONFIG_KEYS = config_element("ROOT", "", {
71
+ "tag" => "fluent.eventlog",
72
+ "keys" => ["EventID", "Level", "Channel", "ProviderName"]
73
+ }, [
74
+ config_element("storage", "", {
75
+ '@type' => 'local',
76
+ 'persistent' => false
77
+ })
78
+ ])
79
+ def test_write_with_keys
80
+ d = create_driver(CONFIG_KEYS)
81
+
82
+ service = Fluent::Plugin::EventService.new
83
+
84
+ d.run(expect_emits: 1) do
85
+ service.run
86
+ end
87
+
88
+ assert(d.events.length >= 1)
89
+ event = d.events.last
90
+ record = event.last
91
+
92
+ expected = {"EventID" => "65500",
93
+ "Level" => "4",
94
+ "Channel" => "Application",
95
+ "ProviderName" => "fluent-plugins"}
96
+
97
+ assert_equal(expected, record)
98
+ end
99
+
100
+ class HashRendered < self
101
+ def test_write
102
+ d = create_driver(config_element("ROOT", "", {"tag" => "fluent.eventlog",
103
+ "render_as_xml" => false}, [
104
+ config_element("storage", "", {
105
+ '@type' => 'local',
106
+ 'persistent' => false
107
+ })
108
+ ]))
109
+
110
+ service = Fluent::Plugin::EventService.new
111
+
112
+ d.run(expect_emits: 1) do
113
+ service.run
114
+ end
115
+
116
+ assert(d.events.length >= 1)
117
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
118
+ record = event.last
119
+
120
+ assert_false(d.instance.render_as_xml)
121
+ assert_equal("Application", record["Channel"])
122
+ assert_equal("65500", record["EventID"])
123
+ assert_equal("4", record["Level"])
124
+ assert_equal("fluent-plugins", record["ProviderName"])
125
+ end
126
+ end
127
+
128
+ class PersistBookMark < self
129
+ TEST_PLUGIN_STORAGE_PATH = File.join( File.dirname(File.dirname(__FILE__)), 'tmp', 'in_windows_eventlog2', 'store' )
130
+ CONFIG2 = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
131
+ config_element("storage", "", {
132
+ '@type' => 'local',
133
+ '@id' => 'test-02',
134
+ 'path' => File.join(TEST_PLUGIN_STORAGE_PATH,
135
+ 'json', 'test-02.json'),
136
+ 'persistent' => true,
137
+ })
138
+ ])
139
+
140
+ def setup
141
+ FileUtils.rm_rf(TEST_PLUGIN_STORAGE_PATH)
142
+ FileUtils.mkdir_p(File.join(TEST_PLUGIN_STORAGE_PATH, 'json'))
143
+ FileUtils.chmod_R(0755, File.join(TEST_PLUGIN_STORAGE_PATH, 'json'))
144
+ end
145
+
146
+ def test_write
147
+ d = create_driver(CONFIG2)
148
+
149
+ assert !File.exist?(File.join(TEST_PLUGIN_STORAGE_PATH, 'json', 'test-02.json'))
150
+
151
+ service = Fluent::Plugin::EventService.new
152
+
153
+ d.run(expect_emits: 1) do
154
+ service.run
155
+ end
156
+
157
+ assert(d.events.length >= 1)
158
+ event = d.events.select {|e| e.last["EventID"] == "65500" }.last
159
+ record = event.last
160
+
161
+ prev_id = record["EventRecordID"].to_i
162
+ assert_equal("Application", record["Channel"])
163
+ assert_equal("65500", record["EventID"])
164
+ assert_equal("4", record["Level"])
165
+ assert_equal("fluent-plugins", record["ProviderName"])
166
+
167
+ assert File.exist?(File.join(TEST_PLUGIN_STORAGE_PATH, 'json', 'test-02.json'))
168
+
169
+ d2 = create_driver(CONFIG2)
170
+ d2.run(expect_emits: 1) do
171
+ service.run
172
+ end
173
+
174
+ assert(d2.events.length == 1) # should be tailing after previous context.
175
+ event2 = d2.events.last
176
+ record2 = event2.last
177
+
178
+ curr_id = record2["EventRecordID"].to_i
179
+ assert(curr_id > prev_id)
180
+
181
+ assert File.exist?(File.join(TEST_PLUGIN_STORAGE_PATH, 'json', 'test-02.json'))
182
+ end
183
+ end
184
+
185
+ def test_write_with_none_parser
186
+ d = create_driver(config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
187
+ config_element("storage", "", {
188
+ '@type' => 'local',
189
+ 'persistent' => false
190
+ }),
191
+ config_element("parse", "", {
192
+ '@type' => 'none',
193
+ }),
194
+ ]))
195
+
196
+ service = Fluent::Plugin::EventService.new
197
+
198
+ d.run(expect_emits: 1) do
199
+ service.run
200
+ end
201
+
202
+ assert(d.events.length >= 1)
203
+ event = d.events.last
204
+ record = event.last
205
+
206
+ assert do
207
+ # record should be {message: <RAW XML EventLog>}.
208
+ record["message"]
209
+ end
210
+
211
+ assert_true(record.has_key?("Description"))
212
+ assert_true(record.has_key?("EventData"))
213
+ end
214
+ end
@@ -1,48 +1,48 @@
1
- require 'helper'
2
- require 'generate-windows-event'
3
-
4
- class WindowsEventLogInputTest < Test::Unit::TestCase
5
-
6
- def setup
7
- Fluent::Test.setup
8
- end
9
-
10
- CONFIG = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
11
- config_element("storage", "", {
12
- '@type' => 'local',
13
- 'persistent' => false
14
- })
15
- ])
16
-
17
- def create_driver(conf = CONFIG)
18
- Fluent::Test::Driver::Input.new(Fluent::Plugin::WindowsEventLogInput).configure(conf)
19
- end
20
-
21
- def test_configure
22
- d = create_driver CONFIG
23
- assert_equal 'fluent.eventlog', d.instance.tag
24
- assert_equal 2, d.instance.read_interval
25
- assert_nil d.instance.pos_file
26
- assert_equal ['application'], d.instance.channels
27
- assert_true d.instance.keys.empty?
28
- assert_false d.instance.read_from_head
29
- end
30
-
31
- def test_write
32
- d = create_driver
33
-
34
- service = Fluent::Plugin::EventService.new
35
-
36
- d.run(expect_emits: 1) do
37
- service.run
38
- end
39
-
40
- assert(d.events.length >= 1)
41
- event = d.events.last
42
- record = event.last
43
- assert_equal("application", record["channel"])
44
- assert_equal("65500", record["event_id"])
45
- assert_equal("information", record["event_type"])
46
- assert_equal("fluent-plugins", record["source_name"])
47
- end
48
- end
1
+ require 'helper'
2
+ require 'generate-windows-event'
3
+
4
+ class WindowsEventLogInputTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ Fluent::Test.setup
8
+ end
9
+
10
+ CONFIG = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
11
+ config_element("storage", "", {
12
+ '@type' => 'local',
13
+ 'persistent' => false
14
+ })
15
+ ])
16
+
17
+ def create_driver(conf = CONFIG)
18
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::WindowsEventLogInput).configure(conf)
19
+ end
20
+
21
+ def test_configure
22
+ d = create_driver CONFIG
23
+ assert_equal 'fluent.eventlog', d.instance.tag
24
+ assert_equal 2, d.instance.read_interval
25
+ assert_nil d.instance.pos_file
26
+ assert_equal ['application'], d.instance.channels
27
+ assert_true d.instance.keys.empty?
28
+ assert_false d.instance.read_from_head
29
+ end
30
+
31
+ def test_write
32
+ d = create_driver
33
+
34
+ service = Fluent::Plugin::EventService.new
35
+
36
+ d.run(expect_emits: 1) do
37
+ service.run
38
+ end
39
+
40
+ assert(d.events.length >= 1)
41
+ event = d.events.select {|e| e.last["event_id"] == "65500" }.last
42
+ record = event.last
43
+ assert_equal("application", record["channel"])
44
+ assert_equal("65500", record["event_id"])
45
+ assert_equal("information", record["event_type"])
46
+ assert_equal("fluent-plugins", record["source_name"])
47
+ end
48
+ end