puppet 6.14.0-universal-darwin → 6.15.0-universal-darwin
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -15
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +1 -1
- data/lib/puppet/agent.rb +2 -10
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/ssl.rb +2 -2
- data/lib/puppet/configurer.rb +7 -3
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/defaults.rb +22 -2
- data/lib/puppet/environments.rb +4 -5
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +2 -0
- data/lib/puppet/http/client.rb +191 -52
- data/lib/puppet/http/external_client.rb +96 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +75 -15
- data/lib/puppet/http/resolver/settings.rb +22 -2
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +63 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +67 -1
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +213 -11
- data/lib/puppet/http/service/file_server.rb +105 -4
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +59 -8
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http_pool.rb +1 -0
- data/lib/puppet/node/environment.rb +11 -1
- data/lib/puppet/pal/pal_impl.rb +1 -29
- data/lib/puppet/parser/compiler.rb +14 -7
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/apt.rb +61 -1
- data/lib/puppet/provider/package/dnfmodule.rb +39 -12
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +105 -33
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +92 -19
- data/lib/puppet/provider/service/systemd.rb +2 -1
- data/lib/puppet/reports/http.rb +13 -11
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/state_machine.rb +50 -33
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/type.rb +6 -1
- data/lib/puppet/type/file/source.rb +4 -2
- data/lib/puppet/type/package.rb +25 -2
- data/lib/puppet/type/user.rb +0 -19
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +3 -0
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +50 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +207 -201
- data/man/man5/puppet.conf.5 +11 -3
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/application/agent_spec.rb +329 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/http/client_spec.rb +34 -40
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +2 -15
- data/spec/integration/network/http_pool_spec.rb +11 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +1 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +10 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +33 -25
- data/spec/unit/application/agent_spec.rb +5 -1
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/configurer_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +8 -0
- data/spec/unit/file_system_spec.rb +10 -0
- data/spec/unit/http/client_spec.rb +105 -46
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +20 -0
- data/spec/unit/http/service/ca_spec.rb +25 -2
- data/spec/unit/http/service/compiler_spec.rb +184 -6
- data/spec/unit/http/service/file_server_spec.rb +35 -3
- data/spec/unit/http/service/report_spec.rb +3 -1
- data/spec/unit/http/service_spec.rb +3 -3
- data/spec/unit/http/session_spec.rb +56 -7
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/network/http/pool_spec.rb +3 -3
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/apt_spec.rb +30 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +26 -3
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +235 -1
- data/spec/unit/provider/service/systemd_spec.rb +10 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -29
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/state_machine_spec.rb +38 -6
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +154 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/generate_cert_fixtures.rake +15 -1
- metadata +51 -6
- data/spec/integration/faces/plugin_spec.rb +0 -63
@@ -0,0 +1,96 @@
|
|
1
|
+
#
|
2
|
+
# Adapts an external http_client_class to the HTTP client API. The former
|
3
|
+
# is typically registered by puppetserver and only implements a subset of
|
4
|
+
# the Puppet::Network::HTTP::Connection methods. As a result, only the
|
5
|
+
# `get` and `post` methods are supported. Calling `delete`, etc will
|
6
|
+
# raise a NotImplementedError.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
class Puppet::HTTP::ExternalClient < Puppet::HTTP::Client
|
10
|
+
# Create an external http client
|
11
|
+
#
|
12
|
+
# @param [Class] http_client_class The class to create to handle the request
|
13
|
+
# @api private
|
14
|
+
def initialize(http_client_class)
|
15
|
+
@http_client_class = http_client_class
|
16
|
+
end
|
17
|
+
|
18
|
+
# (see Puppet::HTTP::Client#get)
|
19
|
+
# @api private
|
20
|
+
def get(url, headers: {}, params: {}, options: {}, &block)
|
21
|
+
url = encode_query(url, params)
|
22
|
+
|
23
|
+
options[:use_ssl] = url.scheme == 'https'
|
24
|
+
if options[:user] && options[:password]
|
25
|
+
options[:basic_auth] = { user: options[:user], password: options[:password] }
|
26
|
+
end
|
27
|
+
|
28
|
+
client = @http_client_class.new(url.host, url.port, options)
|
29
|
+
response = Puppet::HTTP::Response.new(client.get(url.request_uri, headers, options), url)
|
30
|
+
|
31
|
+
if block_given?
|
32
|
+
yield response
|
33
|
+
else
|
34
|
+
response
|
35
|
+
end
|
36
|
+
rescue Puppet::HTTP::HTTPError
|
37
|
+
raise
|
38
|
+
rescue => e
|
39
|
+
raise Puppet::HTTP::HTTPError.new(e.message, e)
|
40
|
+
end
|
41
|
+
|
42
|
+
# (see Puppet::HTTP::Client#post)
|
43
|
+
# @api private
|
44
|
+
def post(url, body, headers: {}, params: {}, options: {}, &block)
|
45
|
+
raise ArgumentError.new("'post' requires a string 'body' argument") unless body.is_a?(String)
|
46
|
+
url = encode_query(url, params)
|
47
|
+
|
48
|
+
options[:use_ssl] = url.scheme == 'https'
|
49
|
+
if options[:user] && options[:password]
|
50
|
+
options[:basic_auth] = { user: options[:user], password: options[:password] }
|
51
|
+
end
|
52
|
+
|
53
|
+
client = @http_client_class.new(url.host, url.port, options)
|
54
|
+
response = Puppet::HTTP::Response.new(client.post(url.request_uri, body, headers, options), url)
|
55
|
+
|
56
|
+
if block_given?
|
57
|
+
yield response
|
58
|
+
else
|
59
|
+
response
|
60
|
+
end
|
61
|
+
rescue Puppet::HTTP::HTTPError, ArgumentError
|
62
|
+
raise
|
63
|
+
rescue => e
|
64
|
+
raise Puppet::HTTP::HTTPError.new(e.message, e)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Close the external http client.
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
def close
|
71
|
+
# This is a noop as puppetserver doesn't provide a way to close its http client.
|
72
|
+
end
|
73
|
+
|
74
|
+
# The following are intentionally not documented
|
75
|
+
|
76
|
+
def create_session
|
77
|
+
raise NotImplementedError
|
78
|
+
end
|
79
|
+
|
80
|
+
def connect(uri, options: {}, &block)
|
81
|
+
raise NotImplementedError
|
82
|
+
end
|
83
|
+
|
84
|
+
def head(url, headers: {}, params: {}, options: {})
|
85
|
+
raise NotImplementedError
|
86
|
+
end
|
87
|
+
|
88
|
+
def put(url, headers: {}, params: {}, options: {})
|
89
|
+
raise NotImplementedError
|
90
|
+
end
|
91
|
+
|
92
|
+
def delete(url, headers: {}, params: {}, options: {})
|
93
|
+
raise NotImplementedError
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -1,8 +1,30 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Handle HTTP redirects
|
5
|
+
#
|
1
6
|
class Puppet::HTTP::Redirector
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
#
|
10
|
+
# Create a new redirect handler
|
11
|
+
#
|
12
|
+
# @param [Integer] redirect_limit maximum number of redirects allowed
|
13
|
+
#
|
2
14
|
def initialize(redirect_limit)
|
3
15
|
@redirect_limit = redirect_limit
|
4
16
|
end
|
5
17
|
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
#
|
21
|
+
# Determine of the HTTP response code indicates a redirect
|
22
|
+
#
|
23
|
+
# @param [Net::HTTP] request request that received the response
|
24
|
+
# @param [Puppet::HTTP::Response] response
|
25
|
+
#
|
26
|
+
# @return [Boolean] true if the response code is 301, 302, or 307.
|
27
|
+
#
|
6
28
|
def redirect?(request, response)
|
7
29
|
# Net::HTTPRedirection is not used because historically puppet
|
8
30
|
# has only handled these, and we're not a browser
|
@@ -14,6 +36,18 @@ class Puppet::HTTP::Redirector
|
|
14
36
|
end
|
15
37
|
end
|
16
38
|
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
# Implement the HTTP request redirection
|
43
|
+
#
|
44
|
+
# @param [Net::HTTP] request request that has been redirected
|
45
|
+
# @param [Puppet::HTTP::Response] response
|
46
|
+
# @param [Integer] redirects the current number of redirects
|
47
|
+
#
|
48
|
+
# @return [Net::HTTP] A new request based on the original request, but with
|
49
|
+
# the redirected location
|
50
|
+
#
|
17
51
|
def redirect_to(request, response, redirects)
|
18
52
|
raise Puppet::HTTP::TooManyRedirects.new(request.uri) if redirects >= @redirect_limit
|
19
53
|
|
data/lib/puppet/http/resolver.rb
CHANGED
@@ -1,17 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Resolver base class. Each resolver represents a different strategy for
|
5
|
+
# resolving a service name into a list of candidate servers and ports.
|
6
|
+
#
|
7
|
+
# @abstract Subclass and override {#resolve} to create a new resolver.
|
8
|
+
#
|
1
9
|
class Puppet::HTTP::Resolver
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
#
|
13
|
+
# Create a new resolver
|
14
|
+
#
|
15
|
+
# @param [Puppet::HTTP::Client] client
|
16
|
+
#
|
2
17
|
def initialize(client)
|
3
18
|
@client = client
|
4
19
|
end
|
5
20
|
|
6
|
-
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
#
|
24
|
+
# Return a working server/port for the resolver. This is the base
|
25
|
+
# implementation and is meant to be a placeholder.
|
26
|
+
#
|
27
|
+
# @param [Puppet::HTTP::Session] session
|
28
|
+
# @param [Symbol] name the service to resolve
|
29
|
+
# @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
|
30
|
+
# use when creating a connection
|
31
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
32
|
+
# encountered while resolving a route.
|
33
|
+
#
|
34
|
+
# @raise [NotImplementedError] this base class is not implemented
|
35
|
+
#
|
36
|
+
def resolve(session, name, ssl_context: nil, error_handler: nil)
|
7
37
|
raise NotImplementedError
|
8
38
|
end
|
9
39
|
|
10
|
-
|
40
|
+
#
|
41
|
+
# @api private
|
42
|
+
#
|
43
|
+
# Check a given connection to establish if it can be relied on for future use
|
44
|
+
#
|
45
|
+
# @param [Puppet::HTTP::Session] session
|
46
|
+
# @param [Puppet::HTTP::Service] service
|
47
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
48
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
49
|
+
# encountered while resolving a route.
|
50
|
+
#
|
51
|
+
# @return [Boolean] Returns true if a connection is successful, false otherwise
|
52
|
+
#
|
53
|
+
def check_connection?(session, service, ssl_context: nil, error_handler: nil)
|
11
54
|
service.connect(ssl_context: ssl_context)
|
12
55
|
return true
|
13
56
|
rescue Puppet::HTTP::ConnectionError => e
|
14
|
-
|
57
|
+
error_handler.call(e) if error_handler
|
15
58
|
Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
|
16
59
|
return false
|
17
60
|
end
|
@@ -1,36 +1,96 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Use the server_list setting to resolve a service. This resolver is only used
|
5
|
+
# if server_list is set either on the command line or in the configuration file.
|
6
|
+
#
|
1
7
|
class Puppet::HTTP::Resolver::ServerList < Puppet::HTTP::Resolver
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
#
|
11
|
+
# @param [Puppet::HTTP::Client] client
|
12
|
+
# @param [Array<String>] server_list_setting array of servers set via the
|
13
|
+
# configuration or the command line
|
14
|
+
# @param [Integer] default_port if a port is not set for a server in
|
15
|
+
# server_list, use this port
|
16
|
+
# @param [Array<Symbol>] services array of services that server_list can be
|
17
|
+
# used to resolve. If a service is not included in this array, this resolver
|
18
|
+
# will return nil.
|
19
|
+
#
|
2
20
|
def initialize(client, server_list_setting:, default_port:, services: )
|
3
21
|
@client = client
|
4
22
|
@server_list_setting = server_list_setting
|
5
23
|
@default_port = default_port
|
6
24
|
@services = services
|
25
|
+
@resolved_url = nil
|
7
26
|
end
|
8
27
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
# Walk the server_list to find a server and port that will connect successfully.
|
32
|
+
#
|
33
|
+
# @param [Puppet::HTTP::Session] session <description>
|
34
|
+
# @param [Symbol] name the name of the service being resolved
|
35
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
36
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
37
|
+
# encountered while resolving a route.
|
38
|
+
#
|
39
|
+
# @return [nil] return nil if the service to be resolved does not support
|
40
|
+
# server_list
|
41
|
+
# @return [Puppet::HTTP::Service] a validated service to use for future HTTP
|
42
|
+
# requests
|
43
|
+
#
|
44
|
+
# @raise [Puppet::Error] raise if none of the servers defined in server_list
|
45
|
+
# are available
|
46
|
+
#
|
47
|
+
def resolve(session, name, ssl_context: nil, error_handler: nil)
|
48
|
+
# If we're configured to use an explicit service host, e.g. report_server
|
49
|
+
# then don't use server_list to resolve the `:report` service.
|
50
|
+
return nil unless @services.include?(name)
|
51
|
+
|
52
|
+
# If we resolved the URL already, use its host & port for the service
|
53
|
+
if @resolved_url
|
54
|
+
return Puppet::HTTP::Service.create_service(@client, session, name, @resolved_url.host, @resolved_url.port)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Return the first simple service status endpoint we can connect to
|
58
|
+
@server_list_setting.value.each do |server|
|
59
|
+
host = server[0]
|
60
|
+
port = server[1] || @default_port
|
61
|
+
uri = URI("https://#{host}:#{port}/status/v1/simple/master")
|
62
|
+
if get_success?(uri, session, ssl_context: ssl_context, error_handler: error_handler)
|
63
|
+
@resolved_url = uri
|
64
|
+
return Puppet::HTTP::Service.create_service(@client, session, name, host, port)
|
18
65
|
end
|
19
|
-
raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: @server_list_setting.print(@server_list_setting.value) }
|
20
|
-
else
|
21
|
-
return nil
|
22
66
|
end
|
67
|
+
|
68
|
+
raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: @server_list_setting.print(@server_list_setting.value) }
|
23
69
|
end
|
24
70
|
|
25
|
-
|
26
|
-
|
71
|
+
#
|
72
|
+
# @api private
|
73
|
+
#
|
74
|
+
# Check if a server and port is available
|
75
|
+
#
|
76
|
+
# @param [URI] uri A URI created from the server and port to test
|
77
|
+
# @param [Puppet::HTTP::Session] session
|
78
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
79
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
80
|
+
# encountered while resolving a route.
|
81
|
+
#
|
82
|
+
# @return [Boolean] true if a successful response is returned by the server,
|
83
|
+
# false otherwise
|
84
|
+
#
|
85
|
+
def get_success?(uri, session, ssl_context: nil, error_handler: nil)
|
86
|
+
response = @client.get(uri, options: {ssl_context: ssl_context})
|
27
87
|
return true if response.success?
|
28
88
|
|
29
89
|
Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
|
30
90
|
{ host: uri.host, port: uri.port, code: response.code, reason: response.reason })
|
31
91
|
return false
|
32
92
|
rescue => detail
|
33
|
-
|
93
|
+
error_handler.call(detail) if error_handler
|
34
94
|
#TRANSLATORS 'server_list' is the name of a setting and should not be translated
|
35
95
|
Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
|
36
96
|
return false
|
@@ -1,6 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Resolve a service using settings. This is the default resolver if none of the
|
5
|
+
# other resolvers find a functional connection.
|
6
|
+
#
|
1
7
|
class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver
|
2
|
-
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
#
|
11
|
+
# Resolve a service using the default server and port settings for this service.
|
12
|
+
#
|
13
|
+
# @param [Puppet::HTTP::Session] session
|
14
|
+
# @param [Symbol] name the name of the service to be resolved
|
15
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
16
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
17
|
+
# encountered while resolving a route.
|
18
|
+
#
|
19
|
+
# @return [Puppet::HTTP::Service] if the service successfully connects,
|
20
|
+
# return it. Otherwise, return nil.
|
21
|
+
#
|
22
|
+
def resolve(session, name, ssl_context: nil, error_handler: nil)
|
3
23
|
service = Puppet::HTTP::Service.create_service(@client, session, name)
|
4
|
-
check_connection?(session, service, ssl_context: ssl_context) ? service : nil
|
24
|
+
check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler) ? service : nil
|
5
25
|
end
|
6
26
|
end
|
@@ -1,17 +1,43 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Resolve a service using SRV
|
5
|
+
#
|
1
6
|
class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
#
|
10
|
+
# @param [Puppet::HTTP::Client] client
|
11
|
+
# @param [String] domain srv domain
|
12
|
+
# @param [Resolv::DNS] dns
|
13
|
+
#
|
2
14
|
def initialize(client, domain:, dns: Resolv::DNS.new)
|
3
15
|
@client = client
|
4
16
|
@srv_domain = domain
|
5
17
|
@delegate = Puppet::Network::Resolver.new(dns)
|
6
18
|
end
|
7
19
|
|
8
|
-
|
20
|
+
#
|
21
|
+
# @api private
|
22
|
+
#
|
23
|
+
# Walk the available srv records and return the first that successfully connects
|
24
|
+
#
|
25
|
+
# @param [Puppet::HTTP::Session] session
|
26
|
+
# @param [Symbol] name the service being resolved
|
27
|
+
# @param [Puppet::SSL::SSLContext] ssl_context
|
28
|
+
# @param [Proc] error_handler (nil) optional callback for each error
|
29
|
+
# encountered while resolving a route.
|
30
|
+
#
|
31
|
+
# @return [Puppet::HTTP::Service] if an available service is found, return
|
32
|
+
# it. Return nil otherwise.
|
33
|
+
#
|
34
|
+
def resolve(session, name, ssl_context: nil, error_handler: nil)
|
9
35
|
# Here we pass our HTTP service name as the DNS SRV service name
|
10
36
|
# This is fine for :ca, but note that :puppet and :file are handled
|
11
37
|
# specially in `each_srv_record`.
|
12
38
|
@delegate.each_srv_record(@srv_domain, name) do |server, port|
|
13
39
|
service = Puppet::HTTP::Service.create_service(@client, session, name, server, port)
|
14
|
-
return service if check_connection?(session, service, ssl_context: ssl_context)
|
40
|
+
return service if check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler)
|
15
41
|
end
|
16
42
|
|
17
43
|
return nil
|
data/lib/puppet/http/response.rb
CHANGED
@@ -1,37 +1,99 @@
|
|
1
|
+
#
|
2
|
+
# @api private
|
3
|
+
#
|
4
|
+
# Represents the response returned from the server from an HTTP request
|
5
|
+
#
|
1
6
|
class Puppet::HTTP::Response
|
2
|
-
|
7
|
+
# @api private
|
8
|
+
# @return [Net::HTTP] the Net::HTTP response
|
9
|
+
attr_reader :nethttp
|
3
10
|
|
11
|
+
# @api private
|
12
|
+
# @return [URI] the response uri
|
13
|
+
attr_reader :url
|
14
|
+
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
# Object to represent the response returned from an HTTP request
|
19
|
+
#
|
20
|
+
# @param [Net::HTTP] nethttp the request response
|
21
|
+
# @param [URI] url
|
22
|
+
#
|
4
23
|
def initialize(nethttp, url)
|
5
24
|
@nethttp = nethttp
|
6
25
|
@url = url
|
7
26
|
end
|
8
27
|
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
# Extract the response code
|
32
|
+
#
|
33
|
+
# @return [Integer] Response code for the request
|
34
|
+
#
|
9
35
|
def code
|
10
36
|
@nethttp.code.to_i
|
11
37
|
end
|
12
38
|
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
# Extract the response message
|
43
|
+
#
|
44
|
+
# @return [String] Response message for the request
|
45
|
+
#
|
13
46
|
def reason
|
14
47
|
@nethttp.message
|
15
48
|
end
|
16
49
|
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
#
|
53
|
+
# Returns the entire response body. Can be used instead of
|
54
|
+
# Puppet::HTTP::Response.read_body, but both methods cannot be used for the
|
55
|
+
# same response.
|
56
|
+
#
|
57
|
+
# @return [String] Response body for the request
|
58
|
+
#
|
17
59
|
def body
|
18
60
|
@nethttp.body
|
19
61
|
end
|
20
62
|
|
63
|
+
#
|
64
|
+
# @api private
|
65
|
+
#
|
66
|
+
# Streams the response body to the caller in chunks. Can be used instead of
|
67
|
+
# Puppet::HTTP::Response.body, but both methods cannot be used for the same
|
68
|
+
# response.
|
69
|
+
#
|
70
|
+
# @yield [String] Streams the response body in chunks
|
71
|
+
#
|
72
|
+
# @raise [ArgumentError] raise if a block is not given
|
73
|
+
#
|
21
74
|
def read_body(&block)
|
22
75
|
raise ArgumentError, "A block is required" unless block_given?
|
23
76
|
|
24
77
|
@nethttp.read_body(&block)
|
25
78
|
end
|
26
79
|
|
80
|
+
#
|
81
|
+
# @api private
|
82
|
+
#
|
83
|
+
# Check if the request received a response of success
|
84
|
+
#
|
85
|
+
# @return [Boolean] Returns true if the response indicates success
|
86
|
+
#
|
27
87
|
def success?
|
28
88
|
@nethttp.is_a?(Net::HTTPSuccess)
|
29
89
|
end
|
30
90
|
|
91
|
+
# @api private
|
31
92
|
def [](name)
|
32
93
|
@nethttp[name]
|
33
94
|
end
|
34
95
|
|
96
|
+
# @api private
|
35
97
|
def drain
|
36
98
|
body
|
37
99
|
true
|