fluent-plugin-viki 0.1.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 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: []