fluent-plugin-ikachan 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17a12295f863b0eaf2929b9960cb39a81eb0f07a
4
- data.tar.gz: 2d7db2044e51662c99d90b6038da20b11aafb651
3
+ metadata.gz: d43020695dd6a279bbdcc08d3cada12b6b3e3bf4
4
+ data.tar.gz: e8d7e2dceb0deb652a09ce715d25583878598adc
5
5
  SHA512:
6
- metadata.gz: f587d9841e0010a9f253364b1039e65f17c50473f4e57d1d67c3acdfd2c7795443d05de6cd09800af2e2d1eb1571f3a8aa5032a6e1c5038c04cfa45a2fa81a23
7
- data.tar.gz: 27845cd4329f57f992b6e4d5bd7c07f16d93120831103fc02fafb8ccc3419685284645eef9455927f67b242a902dadd2d96a8a5c7db262817408a7cc5773c4b1
6
+ metadata.gz: 77309807ea3cabdaaada3b0c4f92b17991916289771d0ba938375618e90a8b514ce5d019ea51d128b1c710a542f3e3c03913898b4e3f6055638dc1513f5095c9
7
+ data.tar.gz: fb86e66f311175eaa8dc3fc204b010fa84a0c943314bc7a229eb35c3e878a61af65c5d07da1727ec11f3794cad3a01dc244a5fe37fa61b3441cd05940bb50294
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
@@ -1,12 +1,13 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = "fluent-plugin-ikachan"
4
- gem.version = "0.2.2"
4
+ gem.version = "0.2.3"
5
5
  gem.authors = ["TAGOMORI Satoshi"]
6
6
  gem.email = ["tagomoris@gmail.com"]
7
7
  gem.summary = %q{output plugin for IRC-HTTP gateway 'ikachan'}
8
8
  gem.description = %q{output plugin for IRC-HTTP gateway 'ikachan' (see: https://metacpan.org/module/ikachan and (jpn) http://blog.yappo.jp/yappo/archives/000760.html)}
9
9
  gem.homepage = "https://github.com/tagomoris/fluent-plugin-ikachan"
10
+ gem.license = "APLv2"
10
11
 
11
12
  gem.files = `git ls-files`.split($\)
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -1,8 +1,11 @@
1
1
  class Fluent::IkachanOutput < Fluent::Output
2
2
  Fluent::Plugin.register_output('ikachan', self)
3
3
 
4
- config_param :host, :string
4
+ config_param :host, :string, :default => nil
5
5
  config_param :port, :integer, :default => 4979
6
+ config_param :base_uri, :string, :default => nil
7
+ config_param :ssl, :bool, :default => nil
8
+ config_param :verify_ssl, :bool, :default => false
6
9
  config_param :channel, :string
7
10
  config_param :message, :string, :default => nil
8
11
  config_param :out_keys, :string, :default => ""
@@ -21,10 +24,33 @@ class Fluent::IkachanOutput < Fluent::Output
21
24
  def configure(conf)
22
25
  super
23
26
 
27
+ if @base_uri.nil?
28
+ if @host.nil? or @port.nil?
29
+ raise Fluent::ConfigError, 'If `base_uri is nil, both `host` and `port` must be specifed'
30
+ end
31
+ # if only specifed "ssl true", scheme is https
32
+ scheme = @ssl == true ? "https" : "http"
33
+ @base_uri = "#{scheme}://#{@host}:#{@port}/"
34
+ end
35
+
36
+ unless @base_uri =~ /\/$/
37
+ raise Fluent::ConfigError, '`base_uri` must be end `/`'
38
+ end
39
+
40
+ # auto enable ssl option by base_uri scheme if ssl is not specifed
41
+ if @ssl.nil?
42
+ @ssl = @base_uri =~ /^https:/ ? true : false
43
+ end
44
+
45
+ if ( @base_uri =~ /^https:/ and @ssl == false ) || ( @base_uri =~ /^http:/ and @ssl == true )
46
+ raise Fluent::ConfigError, 'conflict `base_uri` scheme and `ssl`'
47
+ end
48
+
24
49
  @channel = '#' + @channel
25
- @join_uri = URI.parse "http://#{@host}:#{@port}/join"
26
- @notice_uri = URI.parse "http://#{@host}:#{@port}/notice"
27
- @privmsg_uri = URI.parse "http://#{@host}:#{@port}/privmsg"
50
+
51
+ @join_uri = URI.join(@base_uri, "join")
52
+ @notice_uri = URI.join(@base_uri, "notice")
53
+ @privmsg_uri = URI.join(@base_uri, "privmsg")
28
54
 
29
55
  @out_keys = @out_keys.split(',')
30
56
  @privmsg_out_keys = @privmsg_out_keys.split(',')
@@ -59,7 +85,7 @@ class Fluent::IkachanOutput < Fluent::Output
59
85
  end
60
86
 
61
87
  def start
62
- res = Net::HTTP.post_form(@join_uri, {'channel' => @channel})
88
+ res = http_post_request(@join_uri, {'channel' => @channel})
63
89
  if res.code.to_i == 200
64
90
  # ok
65
91
  elsif res.code.to_i == 403 and res.body == "joinned channel: #{@channel}"
@@ -84,7 +110,7 @@ class Fluent::IkachanOutput < Fluent::Output
84
110
  messages.each do |msg|
85
111
  begin
86
112
  msg.split("\n").each do |m|
87
- res = Net::HTTP.post_form(@notice_uri, {'channel' => @channel, 'message' => m})
113
+ res = http_post_request(@notice_uri, {'channel' => @channel, 'message' => m})
88
114
  end
89
115
  rescue
90
116
  $log.warn "out_ikachan: failed to send notice to #{@host}:#{@port}, #{@channel}, message: #{msg}"
@@ -94,7 +120,7 @@ class Fluent::IkachanOutput < Fluent::Output
94
120
  privmsg_messages.each do |msg|
95
121
  begin
96
122
  msg.split("\n").each do |m|
97
- res = Net::HTTP.post_form(@privmsg_uri, {'channel' => @channel, 'message' => m})
123
+ res = http_post_request(@privmsg_uri, {'channel' => @channel, 'message' => m})
98
124
  end
99
125
  rescue
100
126
  $log.warn "out_ikachan: failed to send privmsg to #{@host}:#{@port}, #{@channel}, message: #{msg}"
@@ -124,4 +150,17 @@ class Fluent::IkachanOutput < Fluent::Output
124
150
  (message % values).gsub(/\\n/, "\n")
125
151
  end
126
152
 
153
+ def http_post_request(uri, params)
154
+ http = Net::HTTP.new(uri.host, uri.port)
155
+ if @ssl
156
+ http.use_ssl = true
157
+ unless @verify_ssl
158
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
159
+ end
160
+ end
161
+ req = Net::HTTP::Post.new(uri.path)
162
+ req.set_form_data(params)
163
+ http.request req
164
+ end
165
+
127
166
  end
@@ -50,3 +50,9 @@ def get_content(server, port, path, headers={})
50
50
  http.get(path, headers).body
51
51
  }
52
52
  end
53
+
54
+ def with_base_path(path)
55
+ prev_mount,@mount = @mount,path
56
+ yield
57
+ @mount = prev_mount
58
+ end
@@ -1,5 +1,6 @@
1
1
  require 'helper'
2
2
  require 'cgi'
3
+ require 'uri'
3
4
 
4
5
  class IkachanOutputTest < Test::Unit::TestCase
5
6
  IKACHAN_TEST_LISTEN_PORT = 4979
@@ -49,6 +50,81 @@ class IkachanOutputTest < Test::Unit::TestCase
49
50
  tag_key tag
50
51
  ]
51
52
 
53
+ CONFIG_HOST_NIL = %[
54
+ channel morischan
55
+ message out_ikachan: %s [%s] %s
56
+ out_keys tag,time,msg
57
+ time_key time
58
+ time_format %Y/%m/%d %H:%M:%S
59
+ tag_key tag
60
+ ]
61
+
62
+ CONFIG_INVALID_BASE_URI = %[
63
+ base_uri http://localhost:4979/ikachan
64
+ channel morischan
65
+ message out_ikachan: %s [%s] %s
66
+ out_keys tag,time,msg
67
+ time_key time
68
+ time_format %Y/%m/%d %H:%M:%S
69
+ tag_key tag
70
+ ]
71
+
72
+ CONFIG_BASE_URI = %[
73
+ base_uri http://localhost:4979/ikachan/
74
+ channel morischan
75
+ message out_ikachan: %s [%s] %s
76
+ out_keys tag,time,msg
77
+ time_key time
78
+ time_format %Y/%m/%d %H:%M:%S
79
+ tag_key tag
80
+ ]
81
+
82
+ CONFIG_BASIC_SSL = %[
83
+ host localhost
84
+ ssl true
85
+ verify_ssl false
86
+ channel morischan
87
+ message out_ikachan: %s [%s] %s
88
+ out_keys tag,time,msg
89
+ time_key time
90
+ time_format %Y/%m/%d %H:%M:%S
91
+ tag_key tag
92
+ ]
93
+
94
+ # base_uri starts with http, but ssl option is true
95
+ CONFIG_INVALID_SSL_1 = %[
96
+ base_uri http://localhost/
97
+ ssl true
98
+ channel morischan
99
+ message out_ikachan: %s [%s] %s
100
+ out_keys tag,time,msg
101
+ time_key time
102
+ time_format %Y/%m/%d %H:%M:%S
103
+ tag_key tag
104
+ ]
105
+
106
+ # base_uri starts with https, but ssl option is false
107
+ CONFIG_INVALID_SSL_2 = %[
108
+ base_uri https://localhost/
109
+ ssl false
110
+ channel morischan
111
+ message out_ikachan: %s [%s] %s
112
+ out_keys tag,time,msg
113
+ time_key time
114
+ time_format %Y/%m/%d %H:%M:%S
115
+ tag_key tag
116
+ ]
117
+
118
+ CONFIG_AUTO_ENABLE_SSL = %[
119
+ base_uri https://localhost/
120
+ channel morischan
121
+ message out_ikachan: %s [%s] %s
122
+ out_keys tag,time,msg
123
+ time_key time
124
+ time_format %Y/%m/%d %H:%M:%S
125
+ tag_key tag
126
+ ]
127
+
52
128
  def create_driver(conf=CONFIG,tag='test')
53
129
  Fluent::Test::OutputTestDriver.new(Fluent::IkachanOutput, tag).configure(conf)
54
130
  end
@@ -56,12 +132,34 @@ class IkachanOutputTest < Test::Unit::TestCase
56
132
  def test_configure
57
133
  d = create_driver
58
134
  assert_equal '#morischan', d.instance.channel
135
+ assert_equal 'http://localhost:4979/', d.instance.base_uri
136
+ assert_equal false, d.instance.ssl
59
137
  d = create_driver(CONFIG_NOTICE_ONLY)
60
138
  assert_equal '#morischan', d.instance.channel
61
139
  d = create_driver(CONFIG_PRIVMSG_ONLY)
62
140
  assert_equal '#morischan', d.instance.channel
63
141
  d = create_driver(CONFIG_LINE_FEED)
64
142
  assert_equal '#morischan', d.instance.channel
143
+ assert_raise Fluent::ConfigError do
144
+ create_driver(CONFIG_HOST_NIL)
145
+ end
146
+ assert_raise Fluent::ConfigError do
147
+ create_driver(CONFIG_INVALID_BASE_URI)
148
+ end
149
+ d = create_driver(CONFIG_BASE_URI)
150
+ assert_equal '#morischan', d.instance.channel
151
+ assert_equal 'http://localhost:4979/ikachan/', d.instance.base_uri
152
+ d = create_driver(CONFIG_BASIC_SSL)
153
+ assert_equal '#morischan', d.instance.channel
154
+ assert_raise Fluent::ConfigError do
155
+ create_driver(CONFIG_INVALID_SSL_1)
156
+ end
157
+ assert_raise Fluent::ConfigError do
158
+ create_driver(CONFIG_INVALID_SSL_2)
159
+ end
160
+ d = create_driver(CONFIG_AUTO_ENABLE_SSL)
161
+ assert_equal '#morischan', d.instance.channel
162
+ assert_equal true, d.instance.ssl
65
163
  end
66
164
 
67
165
  # CONFIG = %[
@@ -216,12 +314,45 @@ class IkachanOutputTest < Test::Unit::TestCase
216
314
  assert_equal "RETURN", @posted[i][:message]
217
315
  end
218
316
 
317
+ # CONFIG_BASE_URI = %[
318
+ # base_uri http://localhost:4979/ikachan/
319
+ # channel morischan
320
+ # message out_ikachan: %s [%s] %s
321
+ # out_keys tag,time,msg
322
+ # time_key time
323
+ # time_format %Y/%m/%d %H:%M:%S
324
+ # tag_key tag
325
+ # ]
326
+ def test_base_uri
327
+ with_base_path('/ikachan/') do
328
+ d = create_driver(CONFIG_BASE_URI)
329
+ t = Time.now
330
+ time = t.to_i
331
+ ts = t.strftime(d.instance.time_format)
332
+ d.run do
333
+ d.emit({'msg' => "notice message from fluentd out_ikachan: testing now"}, time)
334
+ d.emit({'msg' => "notice message from fluentd out_ikachan: testing second line"}, time)
335
+ end
336
+
337
+ assert_equal 2, @posted.length
338
+
339
+ assert_equal 'notice', @posted[0][:method]
340
+ assert_equal '#morischan', @posted[0][:channel]
341
+ assert_equal "out_ikachan: test [#{ts}] notice message from fluentd out_ikachan: testing now", @posted[0][:message]
342
+
343
+ assert_equal 'notice', @posted[1][:method]
344
+ assert_equal '#morischan', @posted[1][:channel]
345
+ assert_equal "out_ikachan: test [#{ts}] notice message from fluentd out_ikachan: testing second line", @posted[1][:message]
346
+ end
347
+ end
348
+
219
349
  # setup / teardown for servers
220
350
  def setup
221
351
  Fluent::Test.setup
222
352
  @posted = []
223
353
  @prohibited = 0
224
354
  @auth = false
355
+ @mount = '/' # @mount 's first and last char should be '/'. it is for dummy server path handling
225
356
  @dummy_server_thread = Thread.new do
226
357
  srv = if ENV['VERBOSE']
227
358
  WEBrick::HTTPServer.new({:BindAddress => '127.0.0.1', :Port => IKACHAN_TEST_LISTEN_PORT})
@@ -231,6 +362,11 @@ class IkachanOutputTest < Test::Unit::TestCase
231
362
  end
232
363
  begin
233
364
  srv.mount_proc('/') { |req,res| # /join, /notice, /privmsg
365
+ # setup called before each test method. so @mount can not use for mount_proc.
366
+ unless req.path =~ /^#{@mount}/
367
+ res.status = 404
368
+ next
369
+ end
234
370
  # POST /join?channel=#channel&channel_keyword=keyword
235
371
  # POST /notice?channel=#channel&message=your_message
236
372
  # POST /privmsg?channel=#channel&message=your_message
@@ -249,12 +385,16 @@ class IkachanOutputTest < Test::Unit::TestCase
249
385
  # ok, authorization not required
250
386
  end
251
387
 
252
- if req.path == '/'
388
+ if req.path == @mount
253
389
  res.status = 200
254
390
  next
255
391
  end
256
392
 
257
- req.path =~ /^\/(join|notice|privmsg)$/
393
+ unless req.path =~ /^#{@mount}(join|notice|privmsg)$/
394
+ res.status = 404
395
+ next
396
+ end
397
+
258
398
  method = $1
259
399
  post_param = CGI.parse(req.body)
260
400
 
@@ -314,6 +454,14 @@ class IkachanOutputTest < Test::Unit::TestCase
314
454
  assert_equal 'notice', @posted[0][:method]
315
455
  assert_equal '#test', @posted[0][:channel]
316
456
  assert_equal 'NOW TESTING', @posted[0][:message]
457
+
458
+ @mount = '/ikachan/'
459
+ assert_equal '404', client.request_post('/', '').code
460
+ assert_equal '404', client.request_post('/join', 'channel=#test').code
461
+
462
+ assert_equal '200', client.request_post('/ikachan/', '').code
463
+ assert_equal '404', client.request_post('/ikachan/test', 'channel=#test').code
464
+ assert_equal '200', client.request_post('/ikachan/join', 'channel=#test').code
317
465
  end
318
466
 
319
467
  def teardown
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-ikachan
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-08 00:00:00.000000000 Z
11
+ date: 2013-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -47,6 +47,7 @@ extensions: []
47
47
  extra_rdoc_files: []
48
48
  files:
49
49
  - .gitignore
50
+ - .travis.yml
50
51
  - Gemfile
51
52
  - LICENSE.txt
52
53
  - README.md
@@ -56,7 +57,8 @@ files:
56
57
  - test/helper.rb
57
58
  - test/plugin/test_out_ikachan.rb
58
59
  homepage: https://github.com/tagomoris/fluent-plugin-ikachan
59
- licenses: []
60
+ licenses:
61
+ - APLv2
60
62
  metadata: {}
61
63
  post_install_message:
62
64
  rdoc_options: []
@@ -74,10 +76,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
76
  version: '0'
75
77
  requirements: []
76
78
  rubyforge_project:
77
- rubygems_version: 2.0.0
79
+ rubygems_version: 2.0.3
78
80
  signing_key:
79
81
  specification_version: 4
80
82
  summary: output plugin for IRC-HTTP gateway 'ikachan'
81
83
  test_files:
82
84
  - test/helper.rb
83
85
  - test/plugin/test_out_ikachan.rb
86
+ has_rdoc: