puppetdb-ruby 1.1.1 → 1.2.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 +5 -5
- data/CHANGELOG.md +15 -2
- data/README.md +19 -1
- data/lib/puppetdb.rb +2 -0
- data/lib/puppetdb/client.rb +21 -30
- data/lib/puppetdb/config.rb +87 -0
- data/lib/puppetdb/error.rb +17 -0
- data/lib/puppetdb/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 352d2c2bcc6b198f6c37d529472db8a5272eef594d82612880110424dbb2d341
|
4
|
+
data.tar.gz: c36524430b66a3e1ffdd74006ecdd195ba187ee9dd8deea356037c4900a9cc43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bc2a9a1f385d1eb4eb203f422ca8d97a70440eb48f1b06baaab698b9b16984db818e507a50d2c6ea9ab8f25f764c15eb36b9d28d868dad4cfa6fd4b617ea745
|
7
|
+
data.tar.gz: c0af4327590e03ef0cf73c1abfb0c577d8d108bcd25aebed201fb68dcc5fe65764b3295dcf3ae954d5471512578f59982dd7ea8918e90f1fe0511799acd483a8
|
data/CHANGELOG.md
CHANGED
@@ -4,8 +4,21 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
Each new release typically also includes the latest modulesync defaults.
|
5
5
|
These should not impact the functionality of the module.
|
6
6
|
|
7
|
-
## [
|
8
|
-
[Full Changelog](https://github.com/voxpupuli/puppetdb-ruby/compare/1.1.
|
7
|
+
## [1.2.0](https://github.com/voxpupuli/puppetdb-ruby/tree/1.2.0) (2019-08-06)
|
8
|
+
[Full Changelog](https://github.com/voxpupuli/puppetdb-ruby/compare/1.1.1...1.2.0)
|
9
|
+
|
10
|
+
**Implemented enhancements:**
|
11
|
+
|
12
|
+
- Add PE RBAC token support [\#34](https://github.com/voxpupuli/puppetdb-ruby/pull/34) ([seanmil](https://github.com/seanmil))
|
13
|
+
|
14
|
+
**Closed issues:**
|
15
|
+
|
16
|
+
- cannot load such file -- puppetdb [\#33](https://github.com/voxpupuli/puppetdb-ruby/issues/33)
|
17
|
+
- Attempting to use puppetdb-ruby in a custom function [\#11](https://github.com/voxpupuli/puppetdb-ruby/issues/11)
|
18
|
+
- No way to retrieve all facts/nodes [\#8](https://github.com/voxpupuli/puppetdb-ruby/issues/8)
|
19
|
+
|
20
|
+
## [1.1.1](https://github.com/voxpupuli/puppetdb-ruby/tree/1.1.1) (2017-08-17)
|
21
|
+
[Full Changelog](https://github.com/voxpupuli/puppetdb-ruby/compare/1.1.0...1.1.1)
|
9
22
|
|
10
23
|
**Fixed bugs:**
|
11
24
|
|
data/README.md
CHANGED
@@ -40,7 +40,7 @@ Non-SSL:
|
|
40
40
|
client = PuppetDB::Client.new({:server => 'http://localhost:8080'})
|
41
41
|
```
|
42
42
|
|
43
|
-
SSL:
|
43
|
+
SSL with cert-based authentication:
|
44
44
|
``` ruby
|
45
45
|
client = PuppetDB::Client.new({
|
46
46
|
:server => 'https://localhost:8081',
|
@@ -51,6 +51,24 @@ client = PuppetDB::Client.new({
|
|
51
51
|
}})
|
52
52
|
```
|
53
53
|
|
54
|
+
SSL with PE RBAC token based authentication:
|
55
|
+
``` ruby
|
56
|
+
client = PuppetDB::Client.new({
|
57
|
+
:server => "https://localhost:8081",
|
58
|
+
:token => "my_pe_rbac_token",
|
59
|
+
:cacert => "/path/to/cacert.pem",
|
60
|
+
})
|
61
|
+
```
|
62
|
+
|
63
|
+
SSL with PE RBAC token based authentication, using all settings from PE Client Tools configurations:
|
64
|
+
``` ruby
|
65
|
+
client = PuppetDB::Client.new()
|
66
|
+
```
|
67
|
+
|
68
|
+
Note: When using cert-based authentication you must specify the full pem structure. When using token based authentication
|
69
|
+
you must NOT provide the pem structure and instead pass ':token' and ':cacert' (or allow them to be read from the
|
70
|
+
PE Client Tools configuration).
|
71
|
+
|
54
72
|
#### Query API usage
|
55
73
|
|
56
74
|
The Query Feature allows the user to request data from PuppetDB using the Query endpoints. It defaults to the latest version of the Query Endpoint.
|
data/lib/puppetdb.rb
CHANGED
data/lib/puppetdb/client.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'logger'
|
3
3
|
|
4
|
-
|
5
|
-
class APIError < RuntimeError
|
6
|
-
attr_reader :code, :response
|
7
|
-
def initialize(response)
|
8
|
-
@response = response
|
9
|
-
end
|
10
|
-
end
|
4
|
+
require 'puppetdb/error'
|
11
5
|
|
6
|
+
module PuppetDB
|
12
7
|
class FixSSLConnectionAdapter < HTTParty::ConnectionAdapter
|
13
8
|
def attach_ssl_certificates(http, options)
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
if options[:pem].empty?
|
10
|
+
http.ca_file = options[:cacert]
|
11
|
+
else
|
12
|
+
http.cert = OpenSSL::X509::Certificate.new(File.read(options[:pem]['cert']))
|
13
|
+
http.key = OpenSSL::PKey::RSA.new(File.read(options[:pem]['key']))
|
14
|
+
http.ca_file = options[:pem]['ca_file']
|
15
|
+
end
|
17
16
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
18
17
|
end
|
19
18
|
end
|
@@ -23,19 +22,6 @@ module PuppetDB
|
|
23
22
|
attr_reader :use_ssl
|
24
23
|
attr_writer :logger
|
25
24
|
|
26
|
-
def hash_get(hash, key)
|
27
|
-
untouched = hash[key]
|
28
|
-
return untouched if untouched
|
29
|
-
|
30
|
-
sym = hash[key.to_sym]
|
31
|
-
return sym if sym
|
32
|
-
|
33
|
-
str = hash[key.to_s]
|
34
|
-
return str if str
|
35
|
-
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
|
39
25
|
def hash_includes?(hash, *sought_keys)
|
40
26
|
sought_keys.each { |x| return false unless hash.include?(x) }
|
41
27
|
true
|
@@ -45,12 +31,14 @@ module PuppetDB
|
|
45
31
|
@logger.debug(msg) if @logger
|
46
32
|
end
|
47
33
|
|
48
|
-
def initialize(settings, query_api_version = 4, command_api_version = 1)
|
34
|
+
def initialize(settings = {}, query_api_version = 4, command_api_version = 1)
|
35
|
+
config = Config.new(settings, load_files: true)
|
49
36
|
@query_api_version = query_api_version
|
50
37
|
@command_api_version = command_api_version
|
51
38
|
|
52
|
-
server =
|
53
|
-
pem =
|
39
|
+
server = config.server
|
40
|
+
pem = config['pem'] || {}
|
41
|
+
token = config.token
|
54
42
|
|
55
43
|
scheme = URI.parse(server).scheme
|
56
44
|
|
@@ -60,13 +48,14 @@ module PuppetDB
|
|
60
48
|
end
|
61
49
|
|
62
50
|
@use_ssl = scheme == 'https'
|
63
|
-
if @use_ssl
|
64
|
-
unless hash_includes?(pem, 'key', 'cert', 'ca_file')
|
65
|
-
error_msg = 'Configuration error: https:// specified but pem is
|
51
|
+
if @use_ssl
|
52
|
+
unless pem.empty? || hash_includes?(pem, 'key', 'cert', 'ca_file')
|
53
|
+
error_msg = 'Configuration error: https:// specified with pem, but pem is incomplete. It requires cert, key, and ca_file.'
|
66
54
|
raise error_msg
|
67
55
|
end
|
68
56
|
|
69
|
-
self.class.default_options = { pem: pem }
|
57
|
+
self.class.default_options = { pem: pem, cacert: config['cacert'] }
|
58
|
+
self.class.headers('X-Authentication' => token) if token
|
70
59
|
self.class.connection_adapter(FixSSLConnectionAdapter)
|
71
60
|
end
|
72
61
|
|
@@ -74,6 +63,8 @@ module PuppetDB
|
|
74
63
|
end
|
75
64
|
|
76
65
|
def raise_if_error(response)
|
66
|
+
raise UnauthorizedError, response if response.code == 401
|
67
|
+
raise ForbiddenError, response if response.code == 403
|
77
68
|
raise APIError, response if response.code.to_s =~ %r{^[4|5]}
|
78
69
|
end
|
79
70
|
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
class PuppetDB::Config
|
4
|
+
def initialize(overrides = nil, load_files = false)
|
5
|
+
@overrides = {}
|
6
|
+
overrides.each { |k, v| @overrides[k.to_s] = v } unless overrides.nil?
|
7
|
+
|
8
|
+
@load_files = load_files
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_file(path)
|
12
|
+
File.open(path) { |f| JSON.parse(f.read)['puppetdb'] }
|
13
|
+
end
|
14
|
+
|
15
|
+
def puppetlabs_root
|
16
|
+
'/etc/puppetlabs'
|
17
|
+
end
|
18
|
+
|
19
|
+
def global_conf
|
20
|
+
File.join(puppetlabs_root, 'client-tools', 'puppetdb.conf')
|
21
|
+
end
|
22
|
+
|
23
|
+
def user_root
|
24
|
+
File.join(Dir.home, '.puppetlabs')
|
25
|
+
end
|
26
|
+
|
27
|
+
def user_conf
|
28
|
+
File.join(user_root, 'client-tools', 'puppetdb.conf')
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_cacert
|
32
|
+
"#{puppetlabs_root}/puppet/ssl/certs/ca.pem"
|
33
|
+
end
|
34
|
+
|
35
|
+
def defaults
|
36
|
+
{
|
37
|
+
'cacert' => default_cacert,
|
38
|
+
'token-file' => File.join(user_root, 'token')
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def load_config
|
43
|
+
config = defaults
|
44
|
+
if @load_files
|
45
|
+
if File.exist?(global_conf) && File.readable?(global_conf)
|
46
|
+
config = config.merge(load_file(global_conf))
|
47
|
+
end
|
48
|
+
|
49
|
+
if @overrides['config-file']
|
50
|
+
config = config.merge(load_file(@overrides['config-file']))
|
51
|
+
elsif File.exist?(user_conf) && File.readable?(user_conf)
|
52
|
+
config = config.merge(load_file(user_conf))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
config.merge(@overrides)
|
57
|
+
end
|
58
|
+
|
59
|
+
def config
|
60
|
+
@config ||= load_config
|
61
|
+
end
|
62
|
+
|
63
|
+
def load_token
|
64
|
+
if @config.include?('token')
|
65
|
+
@config['token']
|
66
|
+
elsif File.readable?(config['token-file'])
|
67
|
+
File.read(config['token-file']).strip
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def token
|
72
|
+
@token ||= load_token
|
73
|
+
end
|
74
|
+
|
75
|
+
def server_urls
|
76
|
+
return [config['server']] unless config['server'].nil?
|
77
|
+
config['server_urls'] || []
|
78
|
+
end
|
79
|
+
|
80
|
+
def server
|
81
|
+
server_urls.first || {}
|
82
|
+
end
|
83
|
+
|
84
|
+
def [](key)
|
85
|
+
@config[key]
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PuppetDB
|
2
|
+
class APIError < RuntimeError
|
3
|
+
attr_reader :code, :response
|
4
|
+
def initialize(response)
|
5
|
+
@response = response
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class AccessDeniedError < APIError
|
10
|
+
end
|
11
|
+
|
12
|
+
class ForbiddenError < AccessDeniedError
|
13
|
+
end
|
14
|
+
|
15
|
+
class UnauthorizedError < AccessDeniedError
|
16
|
+
end
|
17
|
+
end
|
data/lib/puppetdb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puppetdb-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vox Pupuli
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-08-06 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -121,12 +121,14 @@ files:
|
|
121
121
|
- README.md
|
122
122
|
- lib/puppetdb.rb
|
123
123
|
- lib/puppetdb/client.rb
|
124
|
+
- lib/puppetdb/config.rb
|
125
|
+
- lib/puppetdb/error.rb
|
124
126
|
- lib/puppetdb/query.rb
|
125
127
|
- lib/puppetdb/response.rb
|
126
128
|
- lib/puppetdb/version.rb
|
127
129
|
homepage: https://github.com/voxpupuli/puppetdb-ruby
|
128
130
|
licenses:
|
129
|
-
-
|
131
|
+
- Apache-2.0
|
130
132
|
metadata: {}
|
131
133
|
post_install_message:
|
132
134
|
rdoc_options: []
|
@@ -144,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
146
|
version: '0'
|
145
147
|
requirements: []
|
146
148
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.7.7
|
148
150
|
signing_key:
|
149
151
|
specification_version: 4
|
150
152
|
summary: Simple Ruby client library for PuppetDB API
|