inventory-server 0.0.1 → 0.0.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.
- checksums.yaml +4 -4
- data/.travis.yml +0 -1
- data/README.md +89 -13
- data/bin/{inventory-server → inventory-smtpd} +0 -0
- data/config/inventory.yml +21 -0
- data/fig.yml +0 -8
- data/inventory-server.gemspec +2 -5
- data/lib/inventory/server/config.rb +61 -60
- data/lib/inventory/server/loader.rb +4 -12
- data/lib/inventory/server/version.rb +1 -1
- data/lib/inventory/server.rb +1 -1
- data/plugins/json_schema_validator.rb +1 -0
- data/plugins/sample.rb +25 -0
- data/spec/unit/config_spec.rb +62 -38
- data/spec/unit/index_spec.rb +13 -1
- data/spec/unit/json_schema_validator_spec.rb +1 -1
- data/spec/unit/loader_spec.rb +1 -1
- metadata +11 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: da0b3dd5098604defe01b1faec684df26ffb974a
|
4
|
+
data.tar.gz: 771e0c694a711e161a7c4fc6e9ada10d7ef019ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c52952f9d38a8d3dd8bb72120067094e737b7d21efa05e359314220b6b8b2cd4b627dbf79ae50aa13023c6d664e8946603d7285851c94e5d39b470f55e67a69
|
7
|
+
data.tar.gz: 7de13ce85a19acf1ac3743d86c605cb8277f139ef8160a643b99ec7254e4bbb0e3a148d39dca9087b9c86e35489e5b7a0597227959c197fd7773d9f0852d1feb
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,31 +1,107 @@
|
|
1
1
|
# Inventory::Server [](https://travis-ci.org/Filirom1/inventory) [](https://codeclimate.com/github/Filirom1/inventory) [](https://codeclimate.com/github/Filirom1/inventory)
|
2
2
|
|
3
|
-
Inventory
|
3
|
+
Inventory is an HTTP and SMTP Server that process and index facts produced by facter.
|
4
4
|
|
5
|
-
## Installation
|
5
|
+
## Installation, the Docker way
|
6
6
|
|
7
|
-
|
7
|
+
$ git clone https://github.com/Filirom1/inventory.git
|
8
|
+
$ cd inventory
|
9
|
+
$ fig up -d
|
8
10
|
|
9
|
-
|
10
|
-
relay_domains = $mydestination
|
11
|
-
relayhost = 127.0.0.1:2525
|
11
|
+
## Installation, the hard way
|
12
12
|
|
13
|
-
Install ElasticSearch
|
13
|
+
Install ElasticSearch, Kibana, ruby >=1.9 and bundler
|
14
14
|
|
15
|
-
|
15
|
+
$ git clone https://github.com/Filirom1/inventory.git
|
16
|
+
$ cd inventory
|
17
|
+
$ bundle install
|
18
|
+
$ bundle exec rackup # to start the HTTP Server
|
19
|
+
$ bundle exec bin/inventory-smtpd # to start the SMTP Server
|
16
20
|
|
17
|
-
|
21
|
+
## Usage
|
18
22
|
|
19
|
-
|
20
|
-
bundle exec ruby smtp_server.rb
|
23
|
+
Send facts by HTTP:
|
21
24
|
|
25
|
+
```
|
26
|
+
$ facter --json | curl -d @- localhost:9292/api/v1/facts/`hostname`
|
27
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | facts_parser.rb:20 | Facts parser
|
28
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | json_schema_valid...:14 | JSON Schema Validator
|
29
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | json_schema_valid...:24 | No JSON Schema found at /etc/inventory/json_schema/facts/1-0-0.json, skip validation
|
30
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | index.rb:23 | Index
|
31
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | index.rb:38 | {"_index":"inventory_facts","_type":"1-0-0","_id":"dahu","_version":2,"created":false}
|
32
|
+
2015-03-01 19:03:39 +0100 t-4864360 [dahu ] INFO | http_server.rb:16 | 127.0.0.1 - - [01/Mar/2015 19:03:39] "POST /api/v1/facts/dahu HTTP/1.1" 200 36 0.0383
|
22
33
|
|
23
|
-
|
34
|
+
127.0.0.1 - - [01/Mar/2015 19:03:39] "POST /api/v1/facts/dahu HTTP/1.1" 200 36 0.0390
|
35
|
+
{"id":"dahu","ok":true,"status":200}
|
36
|
+
```
|
37
|
+
|
38
|
+
Or send facts by Email:
|
39
|
+
|
40
|
+
```
|
41
|
+
facter --json | mail -s `hostname` inventory@localdomain
|
42
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [ ] INFO | email_parser.rb:9 | Email parser
|
43
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | facts_parser.rb:20 | Facts parser
|
44
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | json_schema_valid...:14 | JSON Schema Validator
|
45
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | json_schema_valid...:24 | No JSON Schema found at /etc/inventory/json_schema/facts/1-0-0.json, skip validation
|
46
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | index.rb:23 | Index
|
47
|
+
2015-03-01 19:43:35 +0100 t-70045727140840 [dahu ] INFO | index.rb:38 | {"_index":"inventory_facts","_type":"1-0-0","_id":"dahu","_version":6,"created":false}
|
48
|
+
```
|
49
|
+
|
50
|
+
## Plugins
|
51
|
+
|
52
|
+
Inventory is built with plugins in mind. The default plugins could be found in the `plugins` dir. The default execution order is this one: `log_failures_on_disk`,`facts_parser`,`json_schema_validator`,`index`
|
53
|
+
|
54
|
+
To add/remove plugins or change the order, you have to change 2 configurations options (see configurations options below)
|
55
|
+
|
56
|
+
* `plugins_path`
|
57
|
+
* `plugins`
|
58
|
+
|
59
|
+
You could create your own plugin, copy the example `plugins/sample.rb` to start.
|
60
|
+
|
61
|
+
### log_failures_on_disk
|
62
|
+
|
63
|
+
If an error is raised during the processing, the received facts will be stored in the file `failed_facts_dir`/$ID and the error message, stacktrace and context will be written to `failed_facts_dir`/$ID.log
|
64
|
+
|
65
|
+
### facts_parser
|
66
|
+
|
67
|
+
Transform JSON, YAML, XML and XML with `__base64__` into a ruby hash
|
68
|
+
|
69
|
+
### json_schema_validator
|
70
|
+
|
71
|
+
Check if the received facts are compliant with the JSON Schema in `json_schema_dir`/$TYPE/$VERSION.json
|
72
|
+
|
73
|
+
### index
|
74
|
+
|
75
|
+
Index the received facts in ElasticSearch
|
76
|
+
|
77
|
+
## Configuration
|
78
|
+
|
79
|
+
Configuration options could be set via environment variables. Each option should be prefixed with `INVENTORY_`. For exemple: `export INVENTORY_LOG_LEVEL=ERROR`
|
80
|
+
|
81
|
+
Configurations could also be defined in a YAML file: `/etc/inventory/inventory.yml`
|
82
|
+
|
83
|
+
The following options are configurable:
|
24
84
|
|
85
|
+
* `host` (default: '127.0.0.1'): SMTP host to bind on
|
86
|
+
* `smtp_port` (default: 2525): SMTP port
|
87
|
+
* `max_connections` (default: 4): SMTP maximum number of simultaneus allowed connexions
|
88
|
+
* `es_host` (default: 'http`//localhost`9200'): ElasticSearch URL
|
89
|
+
* `es_index_prefix` (default: 'inventory_'): ElasticSearch index prefix
|
90
|
+
* `failed_facts_dir` (default: '/var/log/inventory/failures'): Dir where failed facts will be written to
|
91
|
+
* `logger` (default: 'stdout'): stout/stderr or file for log destination
|
92
|
+
* `log_level` (default: 'INFO'): DEBUG/INFO/WARN/ERROR
|
93
|
+
* `debug` (default: false): Show more details, need log_level on DEBUG
|
94
|
+
* `type_key` (default: 'type'): Facts key that will be used as a type
|
95
|
+
* `type_default` (default: 'facts'): Default type if `type_key` not found in facts
|
96
|
+
* `version_key` (default: 'version'): Facts key that wll be used as a version
|
97
|
+
* `version_default` (default: '1-0-0'): Default version if not `version_key` found
|
98
|
+
* `json_schema_dir` (default: '/etc/inventory/json_schema'): directory containing JSON Schema
|
99
|
+
* `plugins_path` (default: ''): a directory containing middlewares.
|
100
|
+
* `plugins` (default: `log_failures_on_disk,facts_parser,json_schema_validator,index`): a comma separated list of plugins that will be executed in order.
|
25
101
|
|
26
102
|
## Contributing
|
27
103
|
|
28
|
-
1. Fork it ( https://github.com/
|
104
|
+
1. Fork it ( https://github.com/Filirom1/inventory-server/fork )
|
29
105
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
30
106
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
31
107
|
4. Push to the branch (`git push origin my-new-feature`)
|
File without changes
|
@@ -0,0 +1,21 @@
|
|
1
|
+
---
|
2
|
+
host: 127.0.0.1
|
3
|
+
smtp_port: 2525
|
4
|
+
max_connections: 4
|
5
|
+
debug: false
|
6
|
+
es_host: http://localhost:9200
|
7
|
+
es_index_prefix: inventory_
|
8
|
+
failed_facts_dir: /var/log/inventory/failures
|
9
|
+
logger: stdout
|
10
|
+
log_level: INFO
|
11
|
+
type_key: type
|
12
|
+
type_default: facts
|
13
|
+
version_key: version
|
14
|
+
version_default: 1-0-0
|
15
|
+
json_schema_dir: /etc/inventory/json_schema
|
16
|
+
plugins_path:
|
17
|
+
plugins:
|
18
|
+
- log_failures_on_disk
|
19
|
+
- facts_parser
|
20
|
+
- json_schema_validator
|
21
|
+
- index
|
data/fig.yml
CHANGED
@@ -6,13 +6,5 @@ web:
|
|
6
6
|
- "80:80"
|
7
7
|
environment:
|
8
8
|
INVENTORY_ES_HOST: http://elasticsearch:9200
|
9
|
-
kibana:
|
10
|
-
image: bobrik/kibana4:4.0.0-rc1
|
11
|
-
ports:
|
12
|
-
- 5601:5601
|
13
|
-
links:
|
14
|
-
- elasticsearch
|
15
|
-
environment:
|
16
|
-
KIBANA_ES_URL: http://elasticsearch:9200
|
17
9
|
elasticsearch:
|
18
10
|
image: elasticsearch:1.4.4
|
data/inventory-server.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["filirom1@gmail.com"]
|
11
11
|
spec.summary = %q{Inventory server store and index data sent from the agent}
|
12
12
|
spec.description = %q{Inventory server store and index data sent from the agent}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/Filirom1/inventory"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -24,22 +24,19 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_dependency 'mail', '~> 2.6'
|
25
25
|
spec.add_dependency 'filum', '~> 2.2'
|
26
26
|
spec.add_dependency 'json', '~> 1.8'
|
27
|
-
spec.add_dependency 'activesupport', '~> 4.2'
|
28
27
|
spec.add_dependency 'libxml-to-hash', '~> 0.2'
|
29
28
|
spec.add_dependency 'middleware', '~> 0.1'
|
30
|
-
spec.add_dependency 'app_configuration', '~> 0.0'
|
31
29
|
spec.add_dependency 'sinatra', '~> 1.4'
|
32
30
|
spec.add_dependency 'ensure-encoding', '~> 0.1'
|
33
31
|
spec.add_dependency 'json-schema', '~> 2.5'
|
34
32
|
spec.add_dependency 'unicorn', '~> 4.8'
|
35
33
|
|
36
|
-
spec.add_development_dependency "bundler"
|
34
|
+
spec.add_development_dependency "bundler"
|
37
35
|
spec.add_development_dependency "rake", "~> 10.0"
|
38
36
|
spec.add_development_dependency "rack-test", "~> 0.6"
|
39
37
|
spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
|
40
38
|
spec.add_development_dependency "rspec", "~> 3.0"
|
41
39
|
spec.add_development_dependency "rspec-mocks", "~> 3.2"
|
42
40
|
spec.add_development_dependency "webmock", "~> 1.20"
|
43
|
-
spec.add_development_dependency 'thin', '~> 1.6'
|
44
41
|
spec.add_development_dependency 'parallel', '~> 1.4'
|
45
42
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'yaml'
|
2
2
|
require 'fileutils'
|
3
3
|
require "inventory/server/logger"
|
4
4
|
|
@@ -6,73 +6,74 @@ module Inventory
|
|
6
6
|
module Server
|
7
7
|
|
8
8
|
module Config
|
9
|
-
DEFAULTS = {
|
10
|
-
:host => '127.0.0.1',
|
11
|
-
:smtp_port => 2525,
|
12
|
-
:max_connections => 4,
|
13
|
-
:debug => false,
|
14
|
-
:es_host => 'http://localhost:9200',
|
15
|
-
:es_index_prefix => 'inventory_',
|
16
|
-
:failed_facts_dir => '/var/log/inventory/failures',
|
17
|
-
:logger => 'stdout',
|
18
|
-
:log_level => 'INFO',
|
19
|
-
:type_key => 'type',
|
20
|
-
:type_default => 'facts',
|
21
|
-
:version_key => 'version',
|
22
|
-
:version_default => '1-0-0',
|
23
|
-
:json_schema_dir => '/etc/inventory/json_schema',
|
24
|
-
:plugins_path => '',
|
25
|
-
:plugins => 'log_failures_on_disk,facts_parser,json_schema_validator,index',
|
26
|
-
}
|
27
|
-
|
28
9
|
def self.generate(cli_config)
|
10
|
+
mapping = {
|
11
|
+
'stdout'=> $stdout,
|
12
|
+
'stderr'=> $stderr,
|
13
|
+
'INFO'=>Logger::INFO,
|
14
|
+
'DEBUG'=>Logger::DEBUG,
|
15
|
+
'WARN'=>Logger::WARN,
|
16
|
+
'ERROR'=>Logger::ERROR,
|
17
|
+
'FATAL'=>Logger::FATAL
|
18
|
+
}
|
29
19
|
|
30
|
-
|
31
|
-
base_global_path '/etc'
|
32
|
-
use_env_variables true
|
33
|
-
prefix 'inventory' # ENV prefix: INVENTORY_XXXXX
|
34
|
-
end
|
20
|
+
config = self.defaults.merge self.etc.merge self.env.merge cli_config
|
35
21
|
|
36
|
-
config
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
val
|
41
|
-
|
42
|
-
|
43
|
-
# cast config values (ENV values are strings only)
|
44
|
-
if default_value.is_a? Integer
|
45
|
-
result = val.to_i
|
46
|
-
elsif !!default_value == default_value
|
47
|
-
# Boolean
|
48
|
-
if val == true || val =~ /^(true|t|yes|y|1)$/i
|
49
|
-
result = true
|
50
|
-
elsif val == false || val.blank? || val =~ /^(false|f|no|n|0)$/i
|
51
|
-
result = false
|
52
|
-
end
|
53
|
-
# Logging
|
54
|
-
elsif val == 'stdout'
|
55
|
-
result = $stdout
|
56
|
-
elsif val == 'stderr'
|
57
|
-
result = $stderr
|
58
|
-
# Logging Level
|
59
|
-
elsif val == 'INFO'
|
60
|
-
result = Logger::INFO
|
61
|
-
elsif val == 'DEBUG'
|
62
|
-
result = Logger::DEBUG
|
63
|
-
elsif val == 'WARN'
|
64
|
-
result = Logger::WARN
|
65
|
-
elsif val == 'ERROR'
|
66
|
-
result = Logger::ERROR
|
67
|
-
elsif val == 'FATAL'
|
68
|
-
result = Logger::FATAL
|
22
|
+
config.each{|sym, val|
|
23
|
+
next unless val
|
24
|
+
config[sym] = mapping[val] if mapping[val]
|
25
|
+
|
26
|
+
if val.is_a? String and [:plugins, :plugins_path].include? sym
|
27
|
+
config[sym] = val.split(',').collect(&:strip)
|
69
28
|
end
|
70
|
-
config[sym] = result
|
71
29
|
}
|
72
30
|
|
73
31
|
FileUtils.mkdir_p config[:failed_facts_dir]
|
74
32
|
|
75
|
-
config
|
33
|
+
return config
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def self.load_yaml(filepath)
|
39
|
+
begin
|
40
|
+
hash = YAML.load_file filepath
|
41
|
+
rescue
|
42
|
+
return {}
|
43
|
+
end
|
44
|
+
self.sym_keys! hash
|
45
|
+
hash
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.defaults()
|
49
|
+
default_filename = File.join File.dirname(__FILE__), '..', '..', '..', 'config', 'inventory.yml'
|
50
|
+
self.load_yaml default_filename
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.etc()
|
54
|
+
self.load_yaml "/etc/inventory/inventory.yml"
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.sym_keys!(hash)
|
58
|
+
hash.keys.each do |key|
|
59
|
+
hash[(key.to_sym rescue key) || key] = hash.delete(key)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.env()
|
64
|
+
hash = {}
|
65
|
+
ENV.each {|key, value|
|
66
|
+
next unless key.start_with? 'INVENTORY_'
|
67
|
+
key = key.gsub 'INVENTORY_', ''
|
68
|
+
key = key.downcase
|
69
|
+
hash[key] = value
|
70
|
+
}
|
71
|
+
|
72
|
+
# This is an ugly trick to auto cast data types
|
73
|
+
hash = YAML.load hash.map{|k,v| "#{k}: #{v}"}.join("\n")
|
74
|
+
|
75
|
+
self.sym_keys! hash
|
76
|
+
hash
|
76
77
|
end
|
77
78
|
end
|
78
79
|
end
|
@@ -7,11 +7,11 @@ module Inventory
|
|
7
7
|
module Server
|
8
8
|
class Loader
|
9
9
|
def initialize(config)
|
10
|
-
@plugins_path = [PLUGINS_DIR]
|
10
|
+
@plugins_path = [PLUGINS_DIR]
|
11
|
+
@plugins_path << config[:plugins_path] if config[:plugins_path]
|
11
12
|
@plugins_path.each { |path|
|
12
13
|
raise InventoryError.new "plugins_path #{path} not found" unless File.directory? path
|
13
14
|
}
|
14
|
-
@loaded = []
|
15
15
|
end
|
16
16
|
|
17
17
|
# search for plugins in the plugins_path and return a hash of plugin_filename:plugin_klass
|
@@ -32,17 +32,9 @@ module Inventory
|
|
32
32
|
return plugin_klasses
|
33
33
|
end
|
34
34
|
|
35
|
-
# Load a ruby file
|
35
|
+
# Load a ruby file
|
36
36
|
def load_file(file)
|
37
|
-
|
38
|
-
|
39
|
-
begin
|
40
|
-
@loaded << file
|
41
|
-
kernel_load(file)
|
42
|
-
rescue => e
|
43
|
-
@loaded.delete(file)
|
44
|
-
InventoryLogger.logger.error("Fail to load #{file}: #{e}")
|
45
|
-
end
|
37
|
+
kernel_load(file)
|
46
38
|
end
|
47
39
|
|
48
40
|
# Usefull for tests
|
data/lib/inventory/server.rb
CHANGED
@@ -17,7 +17,7 @@ module Inventory
|
|
17
17
|
InventoryLogger.logger.level = config[:log_level]
|
18
18
|
|
19
19
|
# Dynamically load plugins from plugins_path
|
20
|
-
plugin_names = config[:plugins]
|
20
|
+
plugin_names = config[:plugins]
|
21
21
|
@middlewares = Middleware::Builder.new do
|
22
22
|
plugins = Loader.new(config).load_plugins(*plugin_names)
|
23
23
|
plugins.each {|klass|
|
data/plugins/sample.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'inventory/server/inventory_error'
|
2
|
+
require "inventory/server/logger"
|
3
|
+
|
4
|
+
module Inventory
|
5
|
+
module Server
|
6
|
+
class Sample
|
7
|
+
def initialize(app, config)
|
8
|
+
@app = app
|
9
|
+
@config = config
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
InventoryLogger.logger.info "Sample"
|
14
|
+
|
15
|
+
# Index it into elasticsearch
|
16
|
+
id = env[:id]
|
17
|
+
raise InventoryError.new 'id is missing' if id.nil? || id.empty?
|
18
|
+
|
19
|
+
# TODO
|
20
|
+
|
21
|
+
@app.call(env)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/unit/config_spec.rb
CHANGED
@@ -12,53 +12,77 @@ RSpec.describe Inventory::Server::Config do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
ENV['INVENTORY_HOST'] = "127.0.0.1"
|
19
|
-
ENV['INVENTORY_SMTP_PORT'] = "2626"
|
20
|
-
ENV['INVENTORY_DEBUG'] = "false"
|
21
|
-
ENV['INVENTORY_LOGGER'] = "stdout"
|
22
|
-
ENV['INVENTORY_LOG_LEVEL'] = "DEBUG"
|
23
|
-
end
|
24
|
-
|
25
|
-
after do
|
26
|
-
ENV['INVENTORY_HOST'] = nil
|
27
|
-
ENV['INVENTORY_SMTP_PORT'] = nil
|
28
|
-
ENV['INVENTORY_DEBUG'] = nil
|
29
|
-
ENV['INVENTORY_LOGGER'] = nil
|
30
|
-
ENV['INVENTORY_LOG_LEVEL'] = nil
|
15
|
+
context "with etc configuration" do
|
16
|
+
before(:each) do
|
17
|
+
expect(Inventory::Server::Config).to receive(:etc).and_return({:smtp_port => 2424})
|
31
18
|
end
|
32
19
|
|
33
|
-
it "should use the
|
20
|
+
it "should use the etc configuration" do
|
34
21
|
config = Inventory::Server::Config.generate({})
|
35
|
-
expect(config[:
|
22
|
+
expect(config[:smtp_port]).to eq 2424
|
36
23
|
end
|
37
24
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
25
|
+
context "with ENV configuration" do
|
26
|
+
before do
|
27
|
+
ENV['INVENTORY_HOST'] = "127.0.0.1"
|
28
|
+
ENV['INVENTORY_SMTP_PORT'] = "2626"
|
29
|
+
ENV['INVENTORY_DEBUG'] = "false"
|
30
|
+
ENV['INVENTORY_LOGGER'] = "stdout"
|
31
|
+
ENV['INVENTORY_LOG_LEVEL'] = "DEBUG"
|
32
|
+
ENV['INVENTORY_PLUGINS'] = "plugin1, plugin2"
|
33
|
+
ENV['INVENTORY_PLUGINS_PATH'] = "/path/to/plugin/dir1,/path/to/plugin/dir2"
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
36
|
+
after do
|
37
|
+
ENV['INVENTORY_HOST'] = nil
|
38
|
+
ENV['INVENTORY_SMTP_PORT'] = nil
|
39
|
+
ENV['INVENTORY_DEBUG'] = nil
|
40
|
+
ENV['INVENTORY_LOGGER'] = nil
|
41
|
+
ENV['INVENTORY_LOG_LEVEL'] = nil
|
42
|
+
ENV['INVENTORY_PLUGINS'] = nil
|
43
|
+
ENV['INVENTORY_PLUGINS_PATH'] = nil
|
44
|
+
end
|
47
45
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
it "should use the ENV configuration" do
|
47
|
+
config = Inventory::Server::Config.generate({})
|
48
|
+
expect(config[:host]).to eq '127.0.0.1'
|
49
|
+
end
|
52
50
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
it "should should cast integer" do
|
52
|
+
config = Inventory::Server::Config.generate({})
|
53
|
+
expect(config[:smtp_port]).to eq 2626
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should should cast boolean" do
|
57
|
+
config = Inventory::Server::Config.generate({})
|
58
|
+
expect(config[:debug]).to eq false
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should should cast stdout/stderr" do
|
62
|
+
config = Inventory::Server::Config.generate({})
|
63
|
+
expect(config[:logger]).to eq $stdout
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should should cast DEBUG/INFO/WARN/ERROR/FATAL" do
|
67
|
+
config = Inventory::Server::Config.generate({})
|
68
|
+
expect(config[:log_level]).to eq Logger::DEBUG
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should should return an array for plugins" do
|
72
|
+
config = Inventory::Server::Config.generate({})
|
73
|
+
expect(config[:plugins]).to eq ['plugin1', 'plugin2']
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should should return an array for plugins_path" do
|
77
|
+
config = Inventory::Server::Config.generate({})
|
78
|
+
expect(config[:plugins_path]).to eq ['/path/to/plugin/dir1', '/path/to/plugin/dir2']
|
79
|
+
end
|
57
80
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
81
|
+
context "with CLI configuration" do
|
82
|
+
it "should use the CLI configuration" do
|
83
|
+
config = Inventory::Server::Config.generate({:smtp_port => 25})
|
84
|
+
expect(config[:smtp_port]).to eq 25
|
85
|
+
end
|
62
86
|
end
|
63
87
|
end
|
64
88
|
end
|
data/spec/unit/index_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require 'webmock/rspec'
|
|
5
5
|
|
6
6
|
noop = lambda {|env|}
|
7
7
|
|
8
|
-
config = Inventory::Server::Config::
|
8
|
+
config = Inventory::Server::Config::defaults
|
9
9
|
|
10
10
|
RSpec.describe Inventory::Server::Index, '#call' do
|
11
11
|
# needed for code climates to work after rspec
|
@@ -34,6 +34,18 @@ RSpec.describe Inventory::Server::Index, '#call' do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
context "without an ElasticSearch Server" do
|
38
|
+
env = {:id => 'MY_UUID', :facts => { :key => 'value' } }
|
39
|
+
|
40
|
+
it "should throw an error" do
|
41
|
+
WebMock.allow_net_connect!
|
42
|
+
|
43
|
+
expect {
|
44
|
+
Inventory::Server::Index.new(noop, config).call(env)
|
45
|
+
}.to raise_error(Errno::ECONNREFUSED)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
37
49
|
context "with an ElasticSearch Server Crashed" do
|
38
50
|
env = {:id => 'MY_UUID', :facts => { :key => 'value' } }
|
39
51
|
|
data/spec/unit/loader_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'inventory/server/loader'
|
|
3
3
|
RSpec.describe Inventory::Server::Loader do
|
4
4
|
|
5
5
|
context "without plugin_path" do
|
6
|
-
loader = Inventory::Server::Loader.new(Inventory::Server::Config::
|
6
|
+
loader = Inventory::Server::Loader.new(Inventory::Server::Config::defaults)
|
7
7
|
|
8
8
|
it "should throw an error when loading non existing plugins" do
|
9
9
|
expect {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inventory-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Filirom1
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: midi-smtp-server
|
@@ -94,20 +94,6 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
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
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: libxml-to-hash
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,20 +122,6 @@ dependencies:
|
|
136
122
|
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
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
125
|
- !ruby/object:Gem::Dependency
|
154
126
|
name: sinatra
|
155
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,16 +182,16 @@ dependencies:
|
|
210
182
|
name: bundler
|
211
183
|
requirement: !ruby/object:Gem::Requirement
|
212
184
|
requirements:
|
213
|
-
- - "
|
185
|
+
- - ">="
|
214
186
|
- !ruby/object:Gem::Version
|
215
|
-
version: '
|
187
|
+
version: '0'
|
216
188
|
type: :development
|
217
189
|
prerelease: false
|
218
190
|
version_requirements: !ruby/object:Gem::Requirement
|
219
191
|
requirements:
|
220
|
-
- - "
|
192
|
+
- - ">="
|
221
193
|
- !ruby/object:Gem::Version
|
222
|
-
version: '
|
194
|
+
version: '0'
|
223
195
|
- !ruby/object:Gem::Dependency
|
224
196
|
name: rake
|
225
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,20 +276,6 @@ dependencies:
|
|
304
276
|
- - "~>"
|
305
277
|
- !ruby/object:Gem::Version
|
306
278
|
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
279
|
- !ruby/object:Gem::Dependency
|
322
280
|
name: parallel
|
323
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -336,7 +294,7 @@ description: Inventory server store and index data sent from the agent
|
|
336
294
|
email:
|
337
295
|
- filirom1@gmail.com
|
338
296
|
executables:
|
339
|
-
- inventory-
|
297
|
+
- inventory-smtpd
|
340
298
|
extensions: []
|
341
299
|
extra_rdoc_files: []
|
342
300
|
files:
|
@@ -350,9 +308,10 @@ files:
|
|
350
308
|
- LICENSE.txt
|
351
309
|
- README.md
|
352
310
|
- Rakefile
|
353
|
-
- bin/inventory-
|
311
|
+
- bin/inventory-smtpd
|
354
312
|
- circle.yml
|
355
313
|
- config.ru
|
314
|
+
- config/inventory.yml
|
356
315
|
- docker/passenger/passenger.conf
|
357
316
|
- docker/passenger/run-httpd.sh
|
358
317
|
- docker/unicorn/nginx.conf
|
@@ -375,6 +334,7 @@ files:
|
|
375
334
|
- plugins/index.rb
|
376
335
|
- plugins/json_schema_validator.rb
|
377
336
|
- plugins/log_failures_on_disk.rb
|
337
|
+
- plugins/sample.rb
|
378
338
|
- public/.gitignore
|
379
339
|
- spec/integration/fixtures/facter.xml
|
380
340
|
- spec/integration/http_spec.rb
|
@@ -392,7 +352,7 @@ files:
|
|
392
352
|
- spec/unit/server_spec.rb
|
393
353
|
- spec/unit/smtp_server_spec.rb
|
394
354
|
- tmp/.gitignore
|
395
|
-
homepage:
|
355
|
+
homepage: https://github.com/Filirom1/inventory
|
396
356
|
licenses:
|
397
357
|
- MIT
|
398
358
|
metadata: {}
|