fluent-plugin-viki 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4e25ddf170d217cf078ea8075da0b4045af950dd
4
+ data.tar.gz: 5466ab22f9020a7c2ba5cdef075327764b547d8b
5
+ SHA512:
6
+ metadata.gz: 96c81345d50a5c81764f5a5abe1720fad5860e990567972024d80d7ff262bdf55d5a9d2136d87431113821264fa23132626f338e32f8505d2a62c0f8994c52be
7
+ data.tar.gz: b8c47a3cd5c4a1ef9e073ef9e1951b1dd4792d543f49848b94f9bd9e0c977803b32d06627d1fddf2c95658e1cb60ea05213a3b0f2545dc2ae97780b4550cd7a1
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
11
+ .byebug_history
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-viki.gemspec
4
+ gemspec
5
+
6
+ gem "maxminddb", "~> 0.1"
7
+ gem "fluentd", "~> 0.12", "< 0.13"
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Fluent::Plugin::Viki
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/fluent/plugin/viki`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'fluent-plugin-viki'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install fluent-plugin-viki
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/fluent-plugin-viki.
36
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "fluent/viki"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,116 @@
1
+ # In v1 configuration, type and id are @ prefix parameters.
2
+ # @type and @id are recommended. type and id are still available for backward compatibility
3
+
4
+ ## built-in TCP input
5
+ ## $ echo <json> | fluent-cat <tag>
6
+ <source>
7
+ @type forward
8
+ @id forward_input
9
+ </source>
10
+
11
+ ## built-in UNIX socket input
12
+ #<source>
13
+ # @type unix
14
+ #</source>
15
+
16
+ # HTTP input
17
+ # http://localhost:8888/<tag>?json=<json>
18
+ <source>
19
+ @type http
20
+ @id http_input
21
+
22
+ port 8888
23
+ </source>
24
+
25
+ <source>
26
+ @type viki
27
+ @id http_viki_input
28
+ port 8889
29
+ </source>
30
+
31
+ ## File input
32
+ ## read apache logs with tag=apache.access
33
+ #<source>
34
+ # @type tail
35
+ # format apache
36
+ # path /var/log/httpd-access.log
37
+ # tag apache.access
38
+ #</source>
39
+
40
+ # Listen HTTP for monitoring
41
+ # http://localhost:24220/api/plugins
42
+ # http://localhost:24220/api/plugins?type=TYPE
43
+ # http://localhost:24220/api/plugins?tag=MYTAG
44
+ <source>
45
+ @type monitor_agent
46
+ @id monitor_agent_input
47
+
48
+ port 24220
49
+ </source>
50
+
51
+ # Listen DRb for debug
52
+ <source>
53
+ @type debug_agent
54
+ @id debug_agent_input
55
+
56
+ bind 127.0.0.1
57
+ port 24230
58
+ </source>
59
+
60
+ ## match tag=apache.access and write to file
61
+ #<match apache.access>
62
+ # @type file
63
+ # path /var/log/fluent/access
64
+ #</match>
65
+
66
+ ## match tag=debug.** and dump to console
67
+ <match debug.**>
68
+ @type stdout
69
+ @id stdout_output
70
+ </match>
71
+
72
+ # match tag=system.** and forward to another fluent server
73
+ <match system.**>
74
+ @type forward
75
+ @id forward_output
76
+
77
+ <server>
78
+ host 192.168.0.11
79
+ </server>
80
+ <secondary>
81
+ <server>
82
+ host 192.168.0.12
83
+ </server>
84
+ </secondary>
85
+ </match>
86
+
87
+ ## match tag=myapp.** and forward and write to file
88
+ #<match myapp.**>
89
+ # @type copy
90
+ # <store>
91
+ # @type forward
92
+ # buffer_type file
93
+ # buffer_path /var/log/fluent/myapp-forward
94
+ # retry_limit 50
95
+ # flush_interval 10s
96
+ # <server>
97
+ # host 192.168.0.13
98
+ # </server>
99
+ # </store>
100
+ # <store>
101
+ # @type file
102
+ # path /var/log/fluent/myapp
103
+ # </store>
104
+ #</match>
105
+
106
+ ## match fluent's internal events
107
+ #<match fluent.**>
108
+ # @type null
109
+ #</match>
110
+
111
+ ## match not matched logs and write to file
112
+ #<match **>
113
+ # @type file
114
+ # path /var/log/fluent/else
115
+ # compress gz
116
+ #</match>
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fluent/plugin/viki/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fluent-plugin-viki"
8
+ spec.version = Fluent::Viki::VERSION
9
+ spec.authors = ["Zhe Wang"]
10
+ spec.email = ["zh3w4ng@gmail.com"]
11
+
12
+ spec.summary = %q{Viki's custom fluentd input plugin.}
13
+ spec.description = %q{Viki's custom fluentd input plugin.}
14
+ spec.homepage = "https://github.com/viki-org/fluent-plugin-viki"
15
+
16
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
17
+ # delete this section to allow pushing this gem to any host.
18
+ if spec.respond_to?(:metadata)
19
+ spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
20
+ else
21
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
22
+ end
23
+
24
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.11"
30
+ spec.add_development_dependency "rake", "~> 10.0"
31
+ spec.add_development_dependency "rspec", "~> 3.3"
32
+ spec.add_development_dependency "byebug"
33
+ spec.add_development_dependency "timecop"
34
+
35
+ spec.add_dependency "maxminddb", "~> 0.1"
36
+ spec.add_dependency "fluentd", "~> 0.12", "< 0.13"
37
+
38
+ spec.license = 'Apache-2.0'
39
+ end
data/fluentd.conf ADDED
@@ -0,0 +1,53 @@
1
+ <source>
2
+ type viki
3
+ port 80
4
+ respond_with_empty_img true
5
+ default_tag viki.development.untagged
6
+ </source>
7
+
8
+ <match **.health_check.**>
9
+ type null
10
+ </match>
11
+
12
+ <match **.{development,staging}.**>
13
+ type copy
14
+ <store>
15
+ type stdout
16
+ </store>
17
+ <store>
18
+ type forward
19
+ <server>
20
+ host $BROADCASTER_HOST
21
+ port $BROADCASTER_PORT1
22
+ weight 100
23
+ </server>
24
+ <server>
25
+ host $BROADCASTER_HOST
26
+ port $BROADCASTER_PORT2
27
+ weight 100
28
+ </server>
29
+ flush_interval 10s
30
+ buffer_type file
31
+ buffer_path /var/log/td-agent/buffer/forward/dev/forward.*.buffer
32
+ </store>
33
+ </match>
34
+
35
+ <match **.production.**>
36
+ type forward
37
+ <server>
38
+ host $BROADCASTER_HOST
39
+ port $BROADCASTER_PORT1
40
+ weight 100
41
+ </server>
42
+ <server>
43
+ host $BROADCASTER_HOST
44
+ port $BROADCASTER_PORT2
45
+ weight 100
46
+ </server>
47
+ flush_interval 5s
48
+ buffer_chunk_limit 4m
49
+ buffer_queue_limit 512
50
+
51
+ buffer_type file
52
+ buffer_path /var/log/td-agent/buffer/forward/prod/forward.*.buffer
53
+ </match>
@@ -0,0 +1,28 @@
1
+ module Fluent
2
+ module Geoip
3
+ def country_code_of_ip(ip)
4
+ iso_code = global_geoip.lookup(ip).country.iso_code
5
+ iso_code && iso_code.downcase
6
+ end
7
+
8
+ def city_of_ip(ip)
9
+ city = global_geoip.lookup(ip)
10
+ record = {}
11
+ record['dma_code'] = city.location.metro_code
12
+ record['city_name'] = city.city && city.city.name
13
+ record['latitude'] = city.location.latitude.to_s
14
+ record['longitude'] = city.location.longitude.to_s
15
+ record['postal_code'] = city.postal.code
16
+ record['region_name'] = city.subdivisions.first && city.subdivisions.first.iso_code
17
+ record
18
+ end
19
+
20
+ def global_geoip
21
+ @@global_geoip ||= ::MaxMindDB.new(geoip_db_path)
22
+ end
23
+
24
+ def geoip_db_path
25
+ '/usr/local/var/GeoIP/GeoIP2-City.mmdb'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ module Fluent
2
+ module Viki
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,184 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ Bundler.require(:default)
4
+ require 'fluent/plugin/in_http'
5
+ require 'fluent/plugin/geoip'
6
+ require "fluent/plugin/viki/version"
7
+
8
+ module Fluent
9
+ class HttpVikiInput < HttpInput
10
+ include Geoip
11
+ CROSSDOMAIN_XML = <<EOF
12
+ <?xml version="1.0"?>
13
+ <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
14
+ <cross-domain-policy>
15
+ <allow-access-from domain="*" />
16
+ </cross-domain-policy>
17
+ EOF
18
+
19
+ Plugin.register_input('viki', self)
20
+
21
+ config_param :respond_with_empty_img, :bool, :default => 'true'
22
+ config_param :default_tag, :default => ''
23
+
24
+ def on_request(path_info, params)
25
+ return_hash = nil
26
+
27
+ begin
28
+ tag = path_info[1..-1].split('/').join('.')
29
+ return return_200_crossdomain unless tag.downcase.match("crossdomain.xml").nil?
30
+ tag = @default_tag if tag == '' && @default_tag != ''
31
+
32
+ record = params.dup
33
+
34
+ time = if record['t_f']
35
+ t_f = record['t_f']
36
+ record.delete('t_f')
37
+ t_f.to_i
38
+ else
39
+ Engine.now
40
+ end
41
+
42
+ record['t'] = time.to_s unless record['t']
43
+
44
+ set_record_ip(params, record)
45
+ set_record_domain(record)
46
+
47
+ record['uuid'] = record.delete('viki_uuid') if record['viki_uuid']
48
+ record['content_provider'] = record.delete('type') if record['type']
49
+ record['device_id'] = record.delete('dev_model') if record['dev_model']
50
+ record.each { |k, v| record[k] = '' if v == 'null' }
51
+
52
+ # generate a unique event id for each event
53
+ unless record['mid']
54
+ record['mid'] = params['HTTP_X_REQUEST_ID'] || gen_message_id(time)
55
+ end
56
+
57
+ # rename video_view to minute_view
58
+ record['event'] = 'minute_view' if record['event'] == 'video_view'
59
+
60
+ # rename bottom_subtitle to subtitle_lang, add subtitle_enabled
61
+ if %w(video_play minute_view).include?(record['event'])
62
+ update_subtitles(record)
63
+ end
64
+
65
+ # fix xunlei data sending timestamps
66
+ if record['app_id'] == '100105a'
67
+ record.delete_if {|key, _| !!(key =~ /\A[0-9]+{13}\z/) }
68
+ end
69
+
70
+ rescue
71
+ return return_400
72
+ end
73
+
74
+ begin
75
+ Engine.emit(tag, time, record)
76
+ rescue
77
+ return return_505
78
+ end
79
+
80
+ return_200(return_hash)
81
+ end
82
+
83
+ def update_subtitles(record)
84
+ record['subtitle_lang'] = record.delete('bottom_subtitle') if record['bottom_subtitle'] and record['subtitle_lang'].nil?
85
+
86
+ if record['subtitle_visible'].nil?
87
+ record['subtitle_visible'] = record['subtitle_lang'] && record['subtitle_lang'].size > 0
88
+ end
89
+
90
+ # manual subtitle set to Chinese for xunlei and letv
91
+ if %w(100106a 100105a).include?(record['app_id'])
92
+ record['subtitle_enabled'] = true
93
+ record['subtitle_lang'] = 'zh'
94
+ end
95
+ end
96
+
97
+ def remove_exceptions_from_hash(attr_hash, app_id)
98
+ app_hash = { '100004a' => 'ios', '100005a' => 'android', '65535a' => 'flash', '100017a' => 'android', '100016a' => 'mweb', '100018a' => 'xbox' }
99
+ source = app_hash[app_id]
100
+
101
+ if source.nil?
102
+ puts "Warning: Could not identify source with app_id: "+app_id
103
+ return nil
104
+ end
105
+
106
+ attr_hash.each { |k, v|
107
+ if v.any? && v.include?(source)
108
+ attr_hash.delete(k)
109
+ end
110
+ }
111
+ attr_hash.keys
112
+ end
113
+
114
+
115
+ def set_record_domain(record)
116
+ site = record['site']
117
+ record['domain'] = site.gsub(/^https?:\/\//, '').gsub(/([^\/]*)(.*)/, '\1').gsub(/^www\./, '') if site
118
+ end
119
+
120
+ def set_record_ip(params, record)
121
+ record['ip'] ||= params['HTTP_X_FORWARDED_FOR'] || params['REMOTE_ADDR']
122
+ ips = unless record['ip'].nil?
123
+ if record['ip'].kind_of? String
124
+ record['ip'].gsub(' ', ',').split(',')
125
+ elsif record['ip'].kind_of? Array
126
+ record['ip']
127
+ .map {|e| e.split(",").map(&:strip) }
128
+ .inject([]) {|accum, e| accum + e}
129
+ end
130
+ end
131
+
132
+ record['country'] = record.delete('country_code') if record['country_code']
133
+
134
+ valid_ip, geo_country = resolve_correct_ip(ips)
135
+
136
+ record['ip_raw'], record['ip'] = record['ip'], valid_ip
137
+ record['country'] = geo_country || record['country']
138
+
139
+ record.merge! city_of_ip(valid_ip)
140
+ end
141
+
142
+ def resolve_correct_ip(ips)
143
+ ips.each do |ip|
144
+ geo_country = country_code_of_ip(ip)
145
+
146
+ return [ip, geo_country] unless geo_country.nil?
147
+ end unless ips.nil?
148
+
149
+ [ips.first, nil]
150
+ end
151
+
152
+ def return_505
153
+ ["500 Internal Server Error", { 'Content-type' => 'text/plain' }, "500 Internal Server Error\n#{$!}\n"]
154
+ end
155
+
156
+ def return_400
157
+ ["400 Bad Request", { 'Content-type' => 'text/plain' }, "400 Bad Request\n#{$!}\n"]
158
+ end
159
+
160
+ def return_200 json_hash
161
+ if json_hash
162
+ ["200 OK", { 'Content-type' => 'application/json' }, json_hash.to_json]
163
+ else
164
+ if @respond_with_empty_img
165
+ ["200 OK", { 'Content-type' => 'image/gif', 'Access-Control-Allow-Origin' => '*' }, "GIF89a\u0001\u0000\u0001\u0000\x80\xFF\u0000\xFF\xFF\xFF\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0002\u0002D\u0001\u0000;"]
166
+ else
167
+ ["200 OK", { 'Content-type' => 'text/plain', 'Access-Control-Allow-Origin' => '*' }, ""]
168
+ end
169
+ end
170
+ end
171
+
172
+ def return_200_crossdomain
173
+ ["200 OK", { 'Content-type' => 'text/xml', 'Access-Control-Allow-Origin' => '*', 'Cache-Control' => 'public; max-age=36000' }, CROSSDOMAIN_XML]
174
+ end
175
+
176
+ # Generate a unique id for the event, length: 10+1+5 = 16
177
+ # It's relatively sortable
178
+ def gen_message_id time
179
+ r = rand(36**5).to_s(36)
180
+ "#{time.to_s}-#{r}"
181
+ end
182
+
183
+ end
184
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-viki
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Zhe Wang
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-02-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '3.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: timecop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: maxminddb
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '0.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '0.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fluentd
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '0.12'
104
+ - - <
105
+ - !ruby/object:Gem::Version
106
+ version: '0.13'
107
+ type: :runtime
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ version: '0.12'
114
+ - - <
115
+ - !ruby/object:Gem::Version
116
+ version: '0.13'
117
+ description: Viki's custom fluentd input plugin.
118
+ email:
119
+ - zh3w4ng@gmail.com
120
+ executables: []
121
+ extensions: []
122
+ extra_rdoc_files: []
123
+ files:
124
+ - .gitignore
125
+ - .rspec
126
+ - .travis.yml
127
+ - Gemfile
128
+ - README.md
129
+ - Rakefile
130
+ - bin/console
131
+ - bin/setup
132
+ - config/fluent.conf
133
+ - fluent-plugin-viki.gemspec
134
+ - fluentd.conf
135
+ - lib/fluent/plugin/geoip.rb
136
+ - lib/fluent/plugin/viki.rb
137
+ - lib/fluent/plugin/viki/version.rb
138
+ homepage: https://github.com/viki-org/fluent-plugin-viki
139
+ licenses:
140
+ - Apache-2.0
141
+ metadata:
142
+ allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 2.0.14
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: Viki's custom fluentd input plugin.
163
+ test_files: []