inventory-server 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +12 -0
  5. data/Dockerfile +22 -0
  6. data/Dockerfile-passenger +18 -0
  7. data/Dockerfile-unicorn +22 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +32 -0
  11. data/Rakefile +2 -0
  12. data/bin/inventory-server +33 -0
  13. data/circle.yml +26 -0
  14. data/config.ru +8 -0
  15. data/docker/passenger/passenger.conf +15 -0
  16. data/docker/passenger/run-httpd.sh +8 -0
  17. data/docker/unicorn/nginx.conf +45 -0
  18. data/docker/unicorn/run-unicorn.sh +5 -0
  19. data/docker/unicorn/unicorn.conf +31 -0
  20. data/docker/unicorn/unicorn.rb +19 -0
  21. data/fig.yml +18 -0
  22. data/inventory-server.gemspec +45 -0
  23. data/lib/inventory/server.rb +30 -0
  24. data/lib/inventory/server/cli.rb +59 -0
  25. data/lib/inventory/server/config.rb +80 -0
  26. data/lib/inventory/server/email_parser.rb +28 -0
  27. data/lib/inventory/server/http_server.rb +49 -0
  28. data/lib/inventory/server/inventory_error.rb +9 -0
  29. data/lib/inventory/server/loader.rb +60 -0
  30. data/lib/inventory/server/logger.rb +16 -0
  31. data/lib/inventory/server/smtp_server.rb +36 -0
  32. data/lib/inventory/server/version.rb +5 -0
  33. data/plugins/facts_parser.rb +95 -0
  34. data/plugins/index.rb +56 -0
  35. data/plugins/json_schema_validator.rb +33 -0
  36. data/plugins/log_failures_on_disk.rb +35 -0
  37. data/public/.gitignore +0 -0
  38. data/spec/integration/fixtures/facter.xml +4543 -0
  39. data/spec/integration/http_spec.rb +24 -0
  40. data/spec/spec_helper.rb +96 -0
  41. data/spec/unit/cli_spec.rb +54 -0
  42. data/spec/unit/config_spec.rb +65 -0
  43. data/spec/unit/email_parser_spec.rb +53 -0
  44. data/spec/unit/facts_parser_spec.rb +176 -0
  45. data/spec/unit/fixtures/simple_plugin.rb +2 -0
  46. data/spec/unit/http_server_spec.rb +58 -0
  47. data/spec/unit/index_spec.rb +77 -0
  48. data/spec/unit/json_schema_validator_spec.rb +126 -0
  49. data/spec/unit/loader_spec.rb +34 -0
  50. data/spec/unit/log_failures_on_disk_spec.rb +50 -0
  51. data/spec/unit/server_spec.rb +11 -0
  52. data/spec/unit/smtp_server_spec.rb +68 -0
  53. data/tmp/.gitignore +0 -0
  54. metadata +434 -0
@@ -0,0 +1,2 @@
1
+ class Inventory::Server::SimplePlugin
2
+ end
@@ -0,0 +1,58 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+
3
+ require 'inventory/server/http_server'
4
+ require 'rspec'
5
+ require 'rack/test'
6
+
7
+
8
+ RSpec.describe Inventory::Server::HTTPServer do
9
+ context "when doing POST on api/v1/facts/:id" do
10
+ include Rack::Test::Methods
11
+
12
+ executed = 0
13
+ trigger_error = true
14
+
15
+ middleware = lambda { |env|
16
+ executed += 1
17
+ raise 'my custom error message' if trigger_error
18
+ }
19
+
20
+ # Proc.new is needed because Sinatra use lambda for lazy loading
21
+ Inventory::Server::HTTPServer.set :middlewares, Proc.new { middleware }
22
+ Inventory::Server::HTTPServer.set :config, {}
23
+
24
+ def app
25
+ Inventory::Server::HTTPServer
26
+ end
27
+
28
+ before(:each) do
29
+ executed = 0
30
+ trigger_error = false
31
+ end
32
+
33
+ it "should do the processing" do
34
+ post '/api/v1/facts/MY_UUID', {"key" => "value"}
35
+ expect(last_response).to be_ok
36
+ expect(last_response.body).to eq('{"id":"MY_UUID","ok":true,"status":200}')
37
+ expect(executed).to eq 1
38
+ end
39
+
40
+ it "should return error when processing fails" do
41
+ trigger_error = true
42
+ post '/api/v1/facts/MY_UUID', {"key" => "value"}
43
+ expect(last_response).to_not be_ok
44
+ expect(last_response.status).to eq 500
45
+ expect(last_response.body).to eq('{"id":"MY_UUID","ok":false,"status":500,"message":"my custom error message"}')
46
+ expect(executed).to eq 1
47
+ end
48
+
49
+ it "should return 404 without id" do
50
+ trigger_error = true
51
+ post '/api/v1/facts/', {"key" => "value"}
52
+ expect(last_response).to_not be_ok
53
+ expect(last_response.status).to eq 404
54
+ expect(last_response.body).to eq('{"id":null,"ok":false,"status":404,"message":"Sinatra::NotFound"}')
55
+ expect(executed).to eq 0
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+ require_relative '../../plugins/index'
3
+
4
+ require 'webmock/rspec'
5
+
6
+ noop = lambda {|env|}
7
+
8
+ config = Inventory::Server::Config::DEFAULTS
9
+
10
+ RSpec.describe Inventory::Server::Index, '#call' do
11
+ # needed for code climates to work after rspec
12
+ before(:all) do
13
+ WebMock.disable_net_connect!
14
+ end
15
+ after(:all) do
16
+ WebMock.allow_net_connect!
17
+ end
18
+
19
+ context "without id" do
20
+ env = {:facts => { :key => 'value' }}
21
+ it "should throw an error" do
22
+ expect {
23
+ Inventory::Server::Index.new(noop, config).call(env)
24
+ }.to raise_error 'id is missing'
25
+ end
26
+ end
27
+
28
+ context "without facts" do
29
+ env = {:id => 'MY_UUID' }
30
+ it "should throw an error" do
31
+ expect {
32
+ Inventory::Server::Index.new(noop, config).call(env)
33
+ }.to raise_error 'facts is missing'
34
+ end
35
+ end
36
+
37
+ context "with an ElasticSearch Server Crashed" do
38
+ env = {:id => 'MY_UUID', :facts => { :key => 'value' } }
39
+
40
+ it "should throw an error" do
41
+ stub_request(:put, "#{config[:es_host]}/inventory_facts/1-0-0/MY_UUID").to_return(:status => [500, "Internal Server Error"], :body => '{"OK": false}')
42
+
43
+ expect {
44
+ Inventory::Server::Index.new(noop, config).call(env)
45
+ }.to raise_error(/500 Internal Server Error: {"OK": false}/)
46
+ end
47
+ end
48
+
49
+ context "with an ElasticSearch Server" do
50
+ it "should call ElasticSearch" do
51
+ env = {:id => 'MY_UUID', :facts => { :key => 'value' } }
52
+ stub = stub_request(:put, "#{config[:es_host]}/inventory_facts/1-0-0/MY_UUID").to_return(:body => '{"OK": true}')
53
+
54
+ Inventory::Server::Index.new(noop, config).call(env)
55
+
56
+ expect(stub).to have_been_requested
57
+ end
58
+
59
+ it "should change url depending on the type and version" do
60
+ env = {:id => 'MY_UUID', :facts => { 'key' => 'value', 'type' => 'my_type', 'version' => 'my_version' } }
61
+ stub = stub_request(:put, "#{config[:es_host]}/inventory_my_type/my_version/MY_UUID").to_return(:body => '{"OK": true}')
62
+
63
+ Inventory::Server::Index.new(noop, config).call(env)
64
+
65
+ expect(stub).to have_been_requested
66
+ end
67
+
68
+ it "should change not pass dot, spaces and utf8 to elasticsearch" do
69
+ env = {:id => 'MY_UUID', :facts => { 'key' => 'value', 'type' => 'my typé.1', 'version' => 'my vérsion.1' } }
70
+ stub = stub_request(:put, "#{config[:es_host]}/inventory_my_typ-1/my_vrsion-1/MY_UUID").to_return(:body => '{"OK": true}')
71
+
72
+ Inventory::Server::Index.new(noop, config).call(env)
73
+
74
+ expect(stub).to have_been_requested
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,126 @@
1
+ require_relative '../../plugins/json_schema_validator'
2
+
3
+ require 'rspec/mocks'
4
+
5
+ noop = lambda {|env|}
6
+
7
+ config = Inventory::Server::Config::DEFAULTS
8
+
9
+ RSpec.describe Inventory::Server::JsonSchemaValidator, '#call' do
10
+
11
+ before(:each) do
12
+ JSON::Validator.clear_cache
13
+ end
14
+
15
+ context "without facts" do
16
+ it "should throw an error" do
17
+ expect {
18
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call({})
19
+ }.to raise_error 'facts is missing'
20
+ end
21
+ end
22
+
23
+ context "without version and type" do
24
+ env = { :facts => { 'key' => 'value'} }
25
+ it "should use the default config" do
26
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/facts/1-0-0.json").and_return false
27
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
28
+ end
29
+ end
30
+
31
+ context "with facts" do
32
+ env = { :facts => { 'key' => 'value', 'type' => 'my_fact', 'version' => 'my_version' } }
33
+
34
+ context "without JSON schema" do
35
+ it "should pass" do
36
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
37
+ end
38
+ end
39
+
40
+ context "with JSON schema" do
41
+ it "should fail if the file is not redable" do
42
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
43
+ expect {
44
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
45
+ }.to raise_error Errno::ENOENT
46
+ end
47
+
48
+ it "should fail if the file is not a valid JSON" do
49
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
50
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return '{"dsf": dsf}'
51
+ expect {
52
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
53
+ }.to raise_error MultiJson::ParseError
54
+ end
55
+
56
+ it "should fail if the facts do not respect the type" do
57
+ schema = {
58
+ "type" => "object",
59
+ "properties" => {
60
+ "key"=> {"type" => "integer" }
61
+ }
62
+ }
63
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
64
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return schema.to_json
65
+ expect {
66
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
67
+ }.to raise_error JSON::Schema::ValidationError
68
+ end
69
+
70
+ it "should pass if the facts validate the JSON Schema" do
71
+ schema = {
72
+ "type" => "object",
73
+ "properties" => {
74
+ "key"=> {"type" => "string" }
75
+ }
76
+ }
77
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
78
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return schema.to_json
79
+
80
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
81
+ end
82
+
83
+ it "should pass if the facts contains more attributes than the JSON Schema " do
84
+ schema = {
85
+ "type" => "object",
86
+ "properties" => {
87
+ }
88
+ }
89
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
90
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return schema.to_json
91
+
92
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
93
+ end
94
+
95
+ it "should pass if optional fields are not present " do
96
+ schema = {
97
+ "type" => "object",
98
+ "properties" => {
99
+ "optional"=> {"type" => "string" }
100
+ }
101
+ }
102
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
103
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return schema.to_json
104
+
105
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
106
+ end
107
+
108
+ it "should fail if mandatory fields are not present " do
109
+ schema = {
110
+ "type" => "object",
111
+ "required" => ["mandatory"],
112
+ "properties" => {
113
+ "mandatory"=> {"type" => "string" }
114
+ }
115
+ }
116
+ expect(File).to receive(:file?).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return true
117
+ expect(File).to receive(:read).with("#{config[:json_schema_dir]}/my_fact/my_version.json").and_return schema.to_json
118
+
119
+ expect {
120
+ Inventory::Server::JsonSchemaValidator.new(noop, config).call(env)
121
+ }.to raise_error JSON::Schema::ValidationError
122
+ end
123
+ end
124
+ end
125
+
126
+ end
@@ -0,0 +1,34 @@
1
+ require 'inventory/server/loader'
2
+
3
+ RSpec.describe Inventory::Server::Loader do
4
+
5
+ context "without plugin_path" do
6
+ loader = Inventory::Server::Loader.new(Inventory::Server::Config::DEFAULTS)
7
+
8
+ it "should throw an error when loading non existing plugins" do
9
+ expect {
10
+ plugins = loader.load_plugins 'blabla'
11
+ }.to raise_error 'Plugin blabla not found'
12
+ end
13
+
14
+ it "should load official plugins" do
15
+ plugins = loader.load_plugins 'index', 'facts_parser'
16
+ expect(plugins[0]).to eq Inventory::Server::Index
17
+ expect(plugins[1]).to eq Inventory::Server::FactsParser
18
+ end
19
+ end
20
+
21
+ context "with an existing plugin_path" do
22
+ loader = Inventory::Server::Loader.new(:plugins_path => File.join(File.dirname(__FILE__), 'fixtures'))
23
+ it "should load custom plugins" do
24
+ plugins = loader.load_plugins 'simple_plugin'
25
+ expect(plugins[0]).to eq Inventory::Server::SimplePlugin
26
+ end
27
+
28
+ it "should throw an error if plugins_path not found" do
29
+ expect {
30
+ loader = Inventory::Server::Loader.new(:plugins_path => '/tmp/blabla/plugins')
31
+ }.to raise_error 'plugins_path /tmp/blabla/plugins not found'
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,50 @@
1
+ require_relative '../../plugins/log_failures_on_disk'
2
+ require 'rspec/mocks'
3
+
4
+ noop = lambda {|env|}
5
+
6
+ RSpec.describe Inventory::Server::LogFailuresOnDisk do
7
+ config = { :failed_facts_dir => './log' }
8
+
9
+ context "without body" do
10
+ env = { :id => 'id', :body => nil }
11
+ it "should throw an error" do
12
+ expect {
13
+ Inventory::Server::LogFailuresOnDisk.new(noop, config).call(env)
14
+ Inventory::Server::FactsParser.new(noop, {}).call(env)
15
+ }.to raise_error 'body missing'
16
+ end
17
+ end
18
+
19
+ context "without id" do
20
+ env = { :id => nil, :body => 'body' }
21
+ it "should throw an error" do
22
+ expect {
23
+ Inventory::Server::LogFailuresOnDisk.new(noop, config).call(env)
24
+ Inventory::Server::FactsParser.new(noop, {}).call(env)
25
+ }.to raise_error 'id missing'
26
+ end
27
+ end
28
+
29
+ context "with all mandatory params" do
30
+ env = { :id => 'MY_UUID', :body => 'body' }
31
+
32
+ context "without error" do
33
+ it "should pass without writing anything" do
34
+ Inventory::Server::LogFailuresOnDisk.new(noop, config).call(env)
35
+ expect(File).to_not receive(:write)
36
+ end
37
+ end
38
+
39
+ context "with error" do
40
+ it "should write facts" do
41
+ raise_error = lambda{ |e| raise "an error" }
42
+ expect(File).to receive(:write).with('./log/MY_UUID', 'body')
43
+ expect(File).to receive(:write).with('./log/MY_UUID.log', /an error/)
44
+ expect {
45
+ Inventory::Server::LogFailuresOnDisk.new(raise_error, config).call(env)
46
+ }.to raise_error 'an error'
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ require 'inventory/server.rb'
2
+
3
+ RSpec.describe Inventory::Server::Server do
4
+ it "should instantiate without error" do
5
+ expect(Inventory::Server::InventoryLogger).to_not receive(:setup).with(any_args).once
6
+ server = Inventory::Server::Server.new({})
7
+
8
+ expect(server.config).to_not eq nil
9
+ expect(server.middlewares).to_not eq nil
10
+ end
11
+ end
@@ -0,0 +1,68 @@
1
+ require 'inventory/server/smtp_server'
2
+
3
+ require 'mail'
4
+ require "middleware"
5
+
6
+ PORT=2526
7
+ HOST="127.0.0.1"
8
+
9
+ Mail.defaults do
10
+ delivery_method :smtp, address: HOST, port: PORT
11
+ end
12
+
13
+ RSpec.describe Inventory::Server::SMTPServer do
14
+ context "With an SMTPServer running" do
15
+
16
+ smtp_server = nil
17
+ executed = nil
18
+ trigger_error = nil
19
+ mail = nil
20
+
21
+ before(:all) do
22
+
23
+ # Start SMTPServer
24
+ config = {
25
+ :host => HOST,
26
+ :smtp_port => PORT,
27
+ :max_connections => 1,
28
+ }
29
+ middleware = lambda { |env|
30
+ executed += 1
31
+ raise 'my custom error message' if trigger_error
32
+ }
33
+
34
+ smtp_server = Inventory::Server::SMTPServer.new(config, middleware)
35
+ smtp_server.audit = true
36
+ smtp_server.start
37
+ end
38
+
39
+ before(:each) do
40
+ # Reset context variables
41
+ executed = 0
42
+ trigger_error = false
43
+
44
+ mail = Mail.new do
45
+ from 'rspec@localhost'
46
+ to 'midi@localhost'
47
+ subject 'MY_UUID'
48
+ body '{"key": "value"}'
49
+ end
50
+ end
51
+
52
+ it "should accept mails" do
53
+ mail.deliver!
54
+
55
+ expect(executed).to eq 1
56
+ end
57
+
58
+ it "should not raise error when processing fails" do
59
+ trigger_error = true
60
+ mail.deliver!
61
+ expect(executed).to eq 1
62
+ end
63
+
64
+ after(:all) do
65
+ smtp_server.stop
66
+ end
67
+ end
68
+ end
data/tmp/.gitignore ADDED
File without changes
metadata ADDED
@@ -0,0 +1,434 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inventory-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Filirom1
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: midi-smtp-server
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rest-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gserver
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mail
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: filum
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.8'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.8'
97
+ - !ruby/object:Gem::Dependency
98
+ name: activesupport
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '4.2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '4.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: libxml-to-hash
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.2'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: middleware
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: app_configuration
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sinatra
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.4'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.4'
167
+ - !ruby/object:Gem::Dependency
168
+ name: ensure-encoding
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.1'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.1'
181
+ - !ruby/object:Gem::Dependency
182
+ name: json-schema
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '2.5'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '2.5'
195
+ - !ruby/object:Gem::Dependency
196
+ name: unicorn
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '4.8'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '4.8'
209
+ - !ruby/object:Gem::Dependency
210
+ name: bundler
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '1.7'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '1.7'
223
+ - !ruby/object:Gem::Dependency
224
+ name: rake
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '10.0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '10.0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rack-test
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '0.6'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '0.6'
251
+ - !ruby/object:Gem::Dependency
252
+ name: codeclimate-test-reporter
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '0.4'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '0.4'
265
+ - !ruby/object:Gem::Dependency
266
+ name: rspec
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '3.0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '3.0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: rspec-mocks
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '3.2'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '3.2'
293
+ - !ruby/object:Gem::Dependency
294
+ name: webmock
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '1.20'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '1.20'
307
+ - !ruby/object:Gem::Dependency
308
+ name: thin
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: '1.6'
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - "~>"
319
+ - !ruby/object:Gem::Version
320
+ version: '1.6'
321
+ - !ruby/object:Gem::Dependency
322
+ name: parallel
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - "~>"
326
+ - !ruby/object:Gem::Version
327
+ version: '1.4'
328
+ type: :development
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - "~>"
333
+ - !ruby/object:Gem::Version
334
+ version: '1.4'
335
+ description: Inventory server store and index data sent from the agent
336
+ email:
337
+ - filirom1@gmail.com
338
+ executables:
339
+ - inventory-server
340
+ extensions: []
341
+ extra_rdoc_files: []
342
+ files:
343
+ - ".gitignore"
344
+ - ".rspec"
345
+ - ".travis.yml"
346
+ - Dockerfile
347
+ - Dockerfile-passenger
348
+ - Dockerfile-unicorn
349
+ - Gemfile
350
+ - LICENSE.txt
351
+ - README.md
352
+ - Rakefile
353
+ - bin/inventory-server
354
+ - circle.yml
355
+ - config.ru
356
+ - docker/passenger/passenger.conf
357
+ - docker/passenger/run-httpd.sh
358
+ - docker/unicorn/nginx.conf
359
+ - docker/unicorn/run-unicorn.sh
360
+ - docker/unicorn/unicorn.conf
361
+ - docker/unicorn/unicorn.rb
362
+ - fig.yml
363
+ - inventory-server.gemspec
364
+ - lib/inventory/server.rb
365
+ - lib/inventory/server/cli.rb
366
+ - lib/inventory/server/config.rb
367
+ - lib/inventory/server/email_parser.rb
368
+ - lib/inventory/server/http_server.rb
369
+ - lib/inventory/server/inventory_error.rb
370
+ - lib/inventory/server/loader.rb
371
+ - lib/inventory/server/logger.rb
372
+ - lib/inventory/server/smtp_server.rb
373
+ - lib/inventory/server/version.rb
374
+ - plugins/facts_parser.rb
375
+ - plugins/index.rb
376
+ - plugins/json_schema_validator.rb
377
+ - plugins/log_failures_on_disk.rb
378
+ - public/.gitignore
379
+ - spec/integration/fixtures/facter.xml
380
+ - spec/integration/http_spec.rb
381
+ - spec/spec_helper.rb
382
+ - spec/unit/cli_spec.rb
383
+ - spec/unit/config_spec.rb
384
+ - spec/unit/email_parser_spec.rb
385
+ - spec/unit/facts_parser_spec.rb
386
+ - spec/unit/fixtures/simple_plugin.rb
387
+ - spec/unit/http_server_spec.rb
388
+ - spec/unit/index_spec.rb
389
+ - spec/unit/json_schema_validator_spec.rb
390
+ - spec/unit/loader_spec.rb
391
+ - spec/unit/log_failures_on_disk_spec.rb
392
+ - spec/unit/server_spec.rb
393
+ - spec/unit/smtp_server_spec.rb
394
+ - tmp/.gitignore
395
+ homepage: ''
396
+ licenses:
397
+ - MIT
398
+ metadata: {}
399
+ post_install_message:
400
+ rdoc_options: []
401
+ require_paths:
402
+ - lib
403
+ required_ruby_version: !ruby/object:Gem::Requirement
404
+ requirements:
405
+ - - ">="
406
+ - !ruby/object:Gem::Version
407
+ version: '0'
408
+ required_rubygems_version: !ruby/object:Gem::Requirement
409
+ requirements:
410
+ - - ">="
411
+ - !ruby/object:Gem::Version
412
+ version: '0'
413
+ requirements: []
414
+ rubyforge_project:
415
+ rubygems_version: 2.4.5
416
+ signing_key:
417
+ specification_version: 4
418
+ summary: Inventory server store and index data sent from the agent
419
+ test_files:
420
+ - spec/integration/fixtures/facter.xml
421
+ - spec/integration/http_spec.rb
422
+ - spec/spec_helper.rb
423
+ - spec/unit/cli_spec.rb
424
+ - spec/unit/config_spec.rb
425
+ - spec/unit/email_parser_spec.rb
426
+ - spec/unit/facts_parser_spec.rb
427
+ - spec/unit/fixtures/simple_plugin.rb
428
+ - spec/unit/http_server_spec.rb
429
+ - spec/unit/index_spec.rb
430
+ - spec/unit/json_schema_validator_spec.rb
431
+ - spec/unit/loader_spec.rb
432
+ - spec/unit/log_failures_on_disk_spec.rb
433
+ - spec/unit/server_spec.rb
434
+ - spec/unit/smtp_server_spec.rb