puppet 6.19.0-x86-mingw32 → 6.22.1-x86-mingw32
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/CODEOWNERS +2 -16
- data/Gemfile +3 -1
- data/Gemfile.lock +50 -39
- data/ext/project_data.yaml +2 -2
- data/lib/puppet/application.rb +10 -6
- data/lib/puppet/application/agent.rb +1 -0
- data/lib/puppet/application/apply.rb +3 -2
- data/lib/puppet/application/device.rb +1 -0
- data/lib/puppet/application/filebucket.rb +2 -2
- data/lib/puppet/application/script.rb +1 -0
- data/lib/puppet/application/ssl.rb +11 -0
- data/lib/puppet/application_support.rb +7 -0
- data/lib/puppet/configurer.rb +28 -18
- data/lib/puppet/defaults.rb +46 -20
- data/lib/puppet/environments.rb +54 -55
- data/lib/puppet/face/config.rb +10 -0
- data/lib/puppet/face/epp.rb +12 -2
- data/lib/puppet/face/facts.rb +158 -0
- data/lib/puppet/ffi/posix.rb +10 -0
- data/lib/puppet/ffi/posix/constants.rb +14 -0
- data/lib/puppet/ffi/posix/functions.rb +24 -0
- data/lib/puppet/file_system/memory_file.rb +8 -1
- data/lib/puppet/file_system/windows.rb +2 -0
- data/lib/puppet/functions/epp.rb +1 -0
- data/lib/puppet/functions/inline_epp.rb +1 -0
- data/lib/puppet/functions/partition.rb +8 -0
- data/lib/puppet/indirector/fact_search.rb +60 -0
- data/lib/puppet/indirector/facts/facter.rb +24 -3
- data/lib/puppet/indirector/facts/json.rb +27 -0
- data/lib/puppet/indirector/facts/yaml.rb +3 -58
- data/lib/puppet/indirector/json.rb +5 -1
- data/lib/puppet/indirector/node/json.rb +8 -0
- data/lib/puppet/indirector/report/json.rb +34 -0
- data/lib/puppet/module_tool/applications/installer.rb +48 -2
- data/lib/puppet/module_tool/errors/shared.rb +17 -2
- data/lib/puppet/network/formats.rb +69 -1
- data/lib/puppet/network/http/factory.rb +4 -0
- data/lib/puppet/pal/pal_impl.rb +70 -17
- data/lib/puppet/parser/ast/leaf.rb +3 -2
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
- data/lib/puppet/pops/model/ast_transformer.rb +1 -1
- data/lib/puppet/property/list.rb +1 -1
- data/lib/puppet/provider/group/groupadd.rb +13 -8
- data/lib/puppet/provider/package/apt.rb +34 -2
- data/lib/puppet/provider/package/aptitude.rb +6 -0
- data/lib/puppet/provider/package/dnfmodule.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +2 -2
- data/lib/puppet/provider/user/useradd.rb +62 -8
- data/lib/puppet/reference/configuration.rb +6 -5
- data/lib/puppet/settings.rb +43 -15
- data/lib/puppet/settings/alias_setting.rb +37 -0
- data/lib/puppet/settings/base_setting.rb +26 -2
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/type/package.rb +3 -3
- data/lib/puppet/util/autoload.rb +1 -8
- data/lib/puppet/util/fact_dif.rb +81 -0
- data/lib/puppet/util/monkey_patches.rb +7 -0
- data/lib/puppet/util/posix.rb +54 -5
- data/lib/puppet/util/rubygems.rb +5 -1
- data/lib/puppet/util/windows/adsi.rb +46 -0
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/principal.rb +9 -2
- data/lib/puppet/util/windows/service.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +4 -2
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +295 -219
- data/man/man5/puppet.conf.5 +15 -7
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- 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 +2 -2
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +90 -1
- data/man/man8/puppet-filebucket.8 +3 -3
- 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 +4 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +4 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +2 -2
- data/man/man8/puppet-ssl.8 +5 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
- data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
- data/spec/integration/application/agent_spec.rb +160 -3
- data/spec/integration/application/apply_spec.rb +19 -0
- data/spec/integration/application/plugin_spec.rb +1 -1
- data/spec/integration/defaults_spec.rb +0 -7
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/http/client_spec.rb +12 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
- data/spec/integration/resource/type_collection_spec.rb +2 -6
- data/spec/integration/transaction_spec.rb +4 -9
- data/spec/integration/util/windows/adsi_spec.rb +21 -1
- data/spec/integration/util/windows/principal_spec.rb +21 -0
- data/spec/integration/util/windows/registry_spec.rb +6 -10
- data/spec/lib/puppet_spec/settings.rb +6 -1
- data/spec/spec_helper.rb +12 -5
- data/spec/unit/agent_spec.rb +8 -6
- data/spec/unit/application/agent_spec.rb +0 -1
- data/spec/unit/application/config_spec.rb +224 -4
- data/spec/unit/application/facts_spec.rb +482 -3
- data/spec/unit/application/filebucket_spec.rb +0 -2
- data/spec/unit/application/ssl_spec.rb +23 -0
- data/spec/unit/application_spec.rb +51 -9
- data/spec/unit/confine/feature_spec.rb +1 -1
- data/spec/unit/confine_spec.rb +8 -2
- data/spec/unit/defaults_spec.rb +36 -1
- data/spec/unit/environments_spec.rb +221 -68
- data/spec/unit/face/config_spec.rb +27 -32
- data/spec/unit/face/facts_spec.rb +4 -0
- data/spec/unit/face/node_spec.rb +0 -11
- data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
- data/spec/unit/file_serving/metadata_spec.rb +3 -3
- data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
- data/spec/unit/file_system_spec.rb +9 -0
- data/spec/unit/forge/module_release_spec.rb +2 -7
- data/spec/unit/functions/inline_epp_spec.rb +26 -1
- data/spec/unit/http/service/compiler_spec.rb +49 -0
- data/spec/unit/http/service_spec.rb +1 -1
- data/spec/unit/indirector/face_spec.rb +0 -1
- data/spec/unit/indirector/facts/facter_spec.rb +95 -1
- data/spec/unit/indirector/facts/json_spec.rb +255 -0
- data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
- data/spec/unit/indirector/indirection_spec.rb +8 -12
- data/spec/unit/indirector/key/file_spec.rb +0 -1
- data/spec/unit/indirector/node/json_spec.rb +33 -0
- data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
- data/spec/unit/indirector/report/yaml_spec.rb +72 -8
- data/spec/unit/indirector_spec.rb +2 -2
- data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
- data/spec/unit/network/authconfig_spec.rb +0 -3
- data/spec/unit/network/formats_spec.rb +41 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
- data/spec/unit/network/http/factory_spec.rb +19 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/parser/compiler_spec.rb +3 -19
- data/spec/unit/parser/resource_spec.rb +14 -8
- data/spec/unit/parser/templatewrapper_spec.rb +4 -3
- data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
- data/spec/unit/property_spec.rb +1 -0
- data/spec/unit/provider/group/groupadd_spec.rb +5 -2
- data/spec/unit/provider/nameservice_spec.rb +66 -65
- data/spec/unit/provider/package/apt_spec.rb +28 -23
- data/spec/unit/provider/package/aptitude_spec.rb +1 -1
- data/spec/unit/provider/package/base_spec.rb +6 -5
- data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
- data/spec/unit/provider/package/pacman_spec.rb +18 -12
- data/spec/unit/provider/package/pip_spec.rb +6 -11
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
- data/spec/unit/provider/service/systemd_spec.rb +11 -0
- data/spec/unit/provider/user/aix_spec.rb +5 -0
- data/spec/unit/provider/user/hpux_spec.rb +1 -1
- data/spec/unit/provider/user/pw_spec.rb +2 -0
- data/spec/unit/provider/user/useradd_spec.rb +71 -3
- data/spec/unit/provider_spec.rb +8 -10
- data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
- data/spec/unit/resource/capability_finder_spec.rb +6 -1
- data/spec/unit/resource/catalog_spec.rb +1 -1
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +11 -10
- data/spec/unit/settings_spec.rb +543 -228
- data/spec/unit/ssl/base_spec.rb +0 -1
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
- data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
- data/spec/unit/transaction/event_manager_spec.rb +14 -11
- data/spec/unit/transaction_spec.rb +13 -4
- data/spec/unit/type/file/content_spec.rb +0 -1
- data/spec/unit/type/file/selinux_spec.rb +0 -2
- data/spec/unit/type/file_spec.rb +0 -6
- data/spec/unit/type/group_spec.rb +13 -6
- data/spec/unit/type/resources_spec.rb +7 -7
- data/spec/unit/type/service_spec.rb +1 -1
- data/spec/unit/type/tidy_spec.rb +0 -1
- data/spec/unit/type_spec.rb +2 -2
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/autoload_spec.rb +5 -1
- data/spec/unit/util/backups_spec.rb +1 -2
- data/spec/unit/util/execution_spec.rb +15 -11
- data/spec/unit/util/inifile_spec.rb +6 -14
- data/spec/unit/util/log_spec.rb +8 -7
- data/spec/unit/util/logging_spec.rb +3 -3
- data/spec/unit/util/posix_spec.rb +363 -15
- data/spec/unit/util/rubygems_spec.rb +2 -2
- data/spec/unit/util/selinux_spec.rb +76 -52
- data/spec/unit/util/storage_spec.rb +3 -1
- data/spec/unit/util/suidmanager_spec.rb +44 -41
- data/spec/unit/util/windows/sid_spec.rb +6 -0
- data/spec/unit/util_spec.rb +13 -6
- metadata +31 -16
- data/spec/integration/application/config_spec.rb +0 -74
- data/spec/lib/matchers/include.rb +0 -27
- data/spec/lib/matchers/include_spec.rb +0 -32
- data/spec/unit/face/catalog_spec.rb +0 -6
- data/spec/unit/face/module_spec.rb +0 -3
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'puppet/ffi/posix'
|
2
|
+
|
3
|
+
module Puppet::FFI::POSIX
|
4
|
+
module Constants
|
5
|
+
extend FFI::Library
|
6
|
+
|
7
|
+
# Maximum number of supplementary groups (groups
|
8
|
+
# that a user can be in plus its primary group)
|
9
|
+
# (64 + 1 primary group)
|
10
|
+
# Chosen a reasonable middle number from the list
|
11
|
+
# https://www.j3e.de/ngroups.html
|
12
|
+
MAXIMUM_NUMBER_OF_GROUPS = 65
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'puppet/ffi/posix'
|
2
|
+
|
3
|
+
module Puppet::FFI::POSIX
|
4
|
+
module Functions
|
5
|
+
|
6
|
+
extend FFI::Library
|
7
|
+
|
8
|
+
ffi_convention :stdcall
|
9
|
+
|
10
|
+
# https://man7.org/linux/man-pages/man3/getgrouplist.3.html
|
11
|
+
# int getgrouplist (
|
12
|
+
# const char *user,
|
13
|
+
# gid_t group,
|
14
|
+
# gid_t *groups,
|
15
|
+
# int *ngroups
|
16
|
+
# );
|
17
|
+
begin
|
18
|
+
ffi_lib FFI::Library::LIBC
|
19
|
+
attach_function :getgrouplist, [:string, :uint, :pointer, :pointer], :int
|
20
|
+
rescue FFI::NotFoundError
|
21
|
+
# Do nothing
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -7,6 +7,13 @@ class Puppet::FileSystem::MemoryFile
|
|
7
7
|
new(path, :exist? => false, :executable? => false)
|
8
8
|
end
|
9
9
|
|
10
|
+
def self.a_missing_directory(path)
|
11
|
+
new(path,
|
12
|
+
:exist? => false,
|
13
|
+
:executable? => false,
|
14
|
+
:directory? => true)
|
15
|
+
end
|
16
|
+
|
10
17
|
def self.a_regular_file_containing(path, content)
|
11
18
|
new(path, :exist? => true, :executable? => false, :content => content)
|
12
19
|
end
|
@@ -18,7 +25,7 @@ class Puppet::FileSystem::MemoryFile
|
|
18
25
|
def self.a_directory(path, children = [])
|
19
26
|
new(path,
|
20
27
|
:exist? => true,
|
21
|
-
:
|
28
|
+
:executable? => true,
|
22
29
|
:directory? => true,
|
23
30
|
:children => children)
|
24
31
|
end
|
@@ -128,6 +128,8 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
|
|
128
128
|
end
|
129
129
|
|
130
130
|
current_sid = Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_user_name)
|
131
|
+
current_sid = Puppet::Util::Windows::SID.name_to_sid(Puppet::Util::Windows::ADSI::User.current_sam_compatible_user_name) unless current_sid
|
132
|
+
|
131
133
|
dacl = case mode
|
132
134
|
when 0644
|
133
135
|
dacl = secure_dacl(current_sid)
|
data/lib/puppet/functions/epp.rb
CHANGED
@@ -40,6 +40,7 @@ Puppet::Functions.create_function(:epp, Puppet::Functions::InternalFunction) do
|
|
40
40
|
scope_param
|
41
41
|
param 'String', :path
|
42
42
|
optional_param 'Hash[Pattern[/^\w+$/], Any]', :parameters
|
43
|
+
return_type 'Variant[String, Sensitive[String]]'
|
43
44
|
end
|
44
45
|
|
45
46
|
def epp(scope, path, parameters = nil)
|
@@ -51,6 +51,7 @@ Puppet::Functions.create_function(:inline_epp, Puppet::Functions::InternalFuncti
|
|
51
51
|
scope_param()
|
52
52
|
param 'String', :template
|
53
53
|
optional_param 'Hash[Pattern[/^\w+$/], Any]', :parameters
|
54
|
+
return_type 'Variant[String, Sensitive[String]]'
|
54
55
|
end
|
55
56
|
|
56
57
|
def inline_epp(scope, template, parameters = nil)
|
@@ -5,13 +5,21 @@
|
|
5
5
|
Puppet::Functions.create_function(:partition) do
|
6
6
|
# @param collection A collection of things to partition.
|
7
7
|
# @example Partition array of empty strings, results in e.g. [[''], [b, c]]
|
8
|
+
# ```puppet
|
8
9
|
# ['', b, c].partition |$s| { $s.empty }
|
10
|
+
# ```
|
9
11
|
# @example Partition array of strings using index, results in e.g. [['', 'ab'], ['b']]
|
12
|
+
# ```puppet
|
10
13
|
# ['', b, ab].partition |$i, $s| { $i == 2 or $s.empty }
|
14
|
+
# ```
|
11
15
|
# @example Partition hash of strings by key-value pair, results in e.g. [[['b', []]], [['a', [1, 2]]]]
|
16
|
+
# ```puppet
|
12
17
|
# { a => [1, 2], b => [] }.partition |$kv| { $kv[1].empty }
|
18
|
+
# ```
|
13
19
|
# @example Partition hash of strings by key and value, results in e.g. [[['b', []]], [['a', [1, 2]]]]
|
20
|
+
# ```puppet
|
14
21
|
# { a => [1, 2], b => [] }.partition |$k, $v| { $v.empty }
|
22
|
+
# ```
|
15
23
|
dispatch :partition_1 do
|
16
24
|
required_param 'Collection', :collection
|
17
25
|
block_param 'Callable[1,1]', :block
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# module containing common methods used by json and yaml facts indirection terminus
|
2
|
+
module Puppet::Indirector::FactSearch
|
3
|
+
def node_matches?(facts, options)
|
4
|
+
options.each do |key, value|
|
5
|
+
type, name, operator = key.to_s.split(".")
|
6
|
+
operator ||= 'eq'
|
7
|
+
|
8
|
+
return false unless node_matches_option?(type, name, operator, value, facts)
|
9
|
+
end
|
10
|
+
return true
|
11
|
+
end
|
12
|
+
|
13
|
+
def node_matches_option?(type, name, operator, value, facts)
|
14
|
+
case type
|
15
|
+
when "meta"
|
16
|
+
case name
|
17
|
+
when "timestamp"
|
18
|
+
compare_timestamp(operator, facts.timestamp, Time.parse(value))
|
19
|
+
end
|
20
|
+
when "facts"
|
21
|
+
compare_facts(operator, facts.values[name], value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def compare_facts(operator, value1, value2)
|
26
|
+
return false unless value1
|
27
|
+
|
28
|
+
case operator
|
29
|
+
when "eq"
|
30
|
+
value1.to_s == value2.to_s
|
31
|
+
when "le"
|
32
|
+
value1.to_f <= value2.to_f
|
33
|
+
when "ge"
|
34
|
+
value1.to_f >= value2.to_f
|
35
|
+
when "lt"
|
36
|
+
value1.to_f < value2.to_f
|
37
|
+
when "gt"
|
38
|
+
value1.to_f > value2.to_f
|
39
|
+
when "ne"
|
40
|
+
value1.to_s != value2.to_s
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def compare_timestamp(operator, value1, value2)
|
45
|
+
case operator
|
46
|
+
when "eq"
|
47
|
+
value1 == value2
|
48
|
+
when "le"
|
49
|
+
value1 <= value2
|
50
|
+
when "ge"
|
51
|
+
value1 >= value2
|
52
|
+
when "lt"
|
53
|
+
value1 < value2
|
54
|
+
when "gt"
|
55
|
+
value1 > value2
|
56
|
+
when "ne"
|
57
|
+
value1 != value2
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -32,8 +32,14 @@ class Puppet::Node::Facts::Facter < Puppet::Indirector::Code
|
|
32
32
|
# Initialize core Puppet facts, such as puppetversion
|
33
33
|
Puppet.initialize_facts
|
34
34
|
|
35
|
-
result =
|
36
|
-
|
35
|
+
result = if request.options[:resolve_options]
|
36
|
+
raise(Puppet::Error, _("puppet facts show requires version 4.0.40 or greater of Facter.")) unless Facter.respond_to?(:resolve)
|
37
|
+
find_with_options(request)
|
38
|
+
else
|
39
|
+
Puppet::Node::Facts.new(request.key, Facter.to_hash)
|
40
|
+
end
|
41
|
+
|
42
|
+
result.add_local_facts unless request.options[:resolve_options]
|
37
43
|
result.sanitize
|
38
44
|
result
|
39
45
|
end
|
@@ -61,7 +67,7 @@ class Puppet::Node::Facts::Facter < Puppet::Indirector::Code
|
|
61
67
|
|
62
68
|
true
|
63
69
|
end
|
64
|
-
|
70
|
+
dirs << request.options[:custom_dir] if request.options[:custom_dir]
|
65
71
|
Facter.search(*dirs)
|
66
72
|
end
|
67
73
|
|
@@ -83,6 +89,21 @@ class Puppet::Node::Facts::Facter < Puppet::Indirector::Code
|
|
83
89
|
dirs << dir
|
84
90
|
end
|
85
91
|
|
92
|
+
dirs << request.options[:external_dir] if request.options[:external_dir]
|
86
93
|
Facter.search_external dirs
|
87
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def find_with_options(request)
|
99
|
+
options = request.options
|
100
|
+
options_for_facter = String.new
|
101
|
+
options_for_facter += options[:user_query].join(' ')
|
102
|
+
options_for_facter += " --config #{options[:config_file]}" if options[:config_file]
|
103
|
+
options_for_facter += " --show-legacy" if options[:show_legacy]
|
104
|
+
options_for_facter += " --no-block" if options[:no_block] == false
|
105
|
+
options_for_facter += " --no-cache" if options[:no_cache] == false
|
106
|
+
|
107
|
+
Puppet::Node::Facts.new(request.key, Facter.resolve(options_for_facter))
|
108
|
+
end
|
88
109
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'puppet/node/facts'
|
2
|
+
require 'puppet/indirector/json'
|
3
|
+
require 'puppet/indirector/fact_search'
|
4
|
+
|
5
|
+
class Puppet::Node::Facts::Json < Puppet::Indirector::JSON
|
6
|
+
desc "Store client facts as flat files, serialized using JSON, or
|
7
|
+
return deserialized facts from disk."
|
8
|
+
|
9
|
+
include Puppet::Indirector::FactSearch
|
10
|
+
|
11
|
+
def search(request)
|
12
|
+
node_names = []
|
13
|
+
Dir.glob(json_dir_path).each do |file|
|
14
|
+
facts = load_json_from_file(file, '')
|
15
|
+
if facts && node_matches?(facts, request.options)
|
16
|
+
node_names << facts.name
|
17
|
+
end
|
18
|
+
end
|
19
|
+
node_names
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def json_dir_path
|
25
|
+
self.path("*")
|
26
|
+
end
|
27
|
+
end
|
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'puppet/node/facts'
|
2
2
|
require 'puppet/indirector/yaml'
|
3
|
+
require 'puppet/indirector/fact_search'
|
3
4
|
|
4
5
|
class Puppet::Node::Facts::Yaml < Puppet::Indirector::Yaml
|
5
6
|
desc "Store client facts as flat files, serialized using YAML, or
|
6
7
|
return deserialized facts from disk."
|
7
8
|
|
9
|
+
include Puppet::Indirector::FactSearch
|
10
|
+
|
8
11
|
def search(request)
|
9
12
|
node_names = []
|
10
13
|
Dir.glob(yaml_dir_path).each do |file|
|
@@ -23,62 +26,4 @@ class Puppet::Node::Facts::Yaml < Puppet::Indirector::Yaml
|
|
23
26
|
base = Puppet.run_mode.server? ? Puppet[:yamldir] : Puppet[:clientyamldir]
|
24
27
|
File.join(base, 'facts', '*.yaml')
|
25
28
|
end
|
26
|
-
|
27
|
-
def node_matches?(facts, options)
|
28
|
-
options.each do |key, value|
|
29
|
-
type, name, operator = key.to_s.split(".")
|
30
|
-
operator ||= 'eq'
|
31
|
-
|
32
|
-
return false unless node_matches_option?(type, name, operator, value, facts)
|
33
|
-
end
|
34
|
-
return true
|
35
|
-
end
|
36
|
-
|
37
|
-
def node_matches_option?(type, name, operator, value, facts)
|
38
|
-
case type
|
39
|
-
when "meta"
|
40
|
-
case name
|
41
|
-
when "timestamp"
|
42
|
-
compare_timestamp(operator, facts.timestamp, Time.parse(value))
|
43
|
-
end
|
44
|
-
when "facts"
|
45
|
-
compare_facts(operator, facts.values[name], value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def compare_facts(operator, value1, value2)
|
50
|
-
return false unless value1
|
51
|
-
|
52
|
-
case operator
|
53
|
-
when "eq"
|
54
|
-
value1.to_s == value2.to_s
|
55
|
-
when "le"
|
56
|
-
value1.to_f <= value2.to_f
|
57
|
-
when "ge"
|
58
|
-
value1.to_f >= value2.to_f
|
59
|
-
when "lt"
|
60
|
-
value1.to_f < value2.to_f
|
61
|
-
when "gt"
|
62
|
-
value1.to_f > value2.to_f
|
63
|
-
when "ne"
|
64
|
-
value1.to_s != value2.to_s
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def compare_timestamp(operator, value1, value2)
|
69
|
-
case operator
|
70
|
-
when "eq"
|
71
|
-
value1 == value2
|
72
|
-
when "le"
|
73
|
-
value1 <= value2
|
74
|
-
when "ge"
|
75
|
-
value1 >= value2
|
76
|
-
when "lt"
|
77
|
-
value1 < value2
|
78
|
-
when "gt"
|
79
|
-
value1 > value2
|
80
|
-
when "ne"
|
81
|
-
value1 != value2
|
82
|
-
end
|
83
|
-
end
|
84
29
|
end
|
@@ -41,12 +41,16 @@ class Puppet::Indirector::JSON < Puppet::Indirector::Terminus
|
|
41
41
|
raise ArgumentError, _("invalid key")
|
42
42
|
end
|
43
43
|
|
44
|
-
base =
|
44
|
+
base = data_dir
|
45
45
|
File.join(base, self.class.indirection_name.to_s, name.to_s + ext)
|
46
46
|
end
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
+
def data_dir()
|
51
|
+
Puppet.run_mode.server? ? Puppet[:server_datadir] : Puppet[:client_datadir]
|
52
|
+
end
|
53
|
+
|
50
54
|
def load_json_from_file(file, key)
|
51
55
|
json = nil
|
52
56
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'puppet/transaction/report'
|
2
|
+
require 'puppet/indirector/json'
|
3
|
+
|
4
|
+
class Puppet::Transaction::Report::Json < Puppet::Indirector::JSON
|
5
|
+
include Puppet::Util::SymbolicFileMode
|
6
|
+
|
7
|
+
desc "Store last report as a flat file, serialized using JSON."
|
8
|
+
|
9
|
+
# Force report to be saved there
|
10
|
+
def path(name,ext='.json')
|
11
|
+
Puppet[:lastrunreport]
|
12
|
+
end
|
13
|
+
|
14
|
+
def save(request)
|
15
|
+
filename = path(request.key)
|
16
|
+
mode = Puppet.settings.setting(:lastrunreport).mode
|
17
|
+
|
18
|
+
unless valid_symbolic_mode?(mode)
|
19
|
+
raise Puppet::DevError, _("replace_file mode: %{mode} is invalid") % { mode: mode }
|
20
|
+
end
|
21
|
+
|
22
|
+
mode = symbolic_mode_to_int(normalize_symbolic_mode(mode))
|
23
|
+
|
24
|
+
FileUtils.mkdir_p(File.dirname(filename))
|
25
|
+
|
26
|
+
begin
|
27
|
+
Puppet::FileSystem.replace_file(filename, mode) do |fh|
|
28
|
+
fh.print JSON.dump(request.instance)
|
29
|
+
end
|
30
|
+
rescue TypeError => detail
|
31
|
+
Puppet.err _("Could not save %{indirection} %{request}: %{detail}") % { indirection: self.name, request: request.key, detail: detail }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -131,8 +131,54 @@ module Puppet::ModuleTool
|
|
131
131
|
begin
|
132
132
|
Puppet.info _("Resolving dependencies ...")
|
133
133
|
releases = SemanticPuppet::Dependency.resolve(graph)
|
134
|
-
rescue SemanticPuppet::Dependency::UnsatisfiableGraph
|
135
|
-
|
134
|
+
rescue SemanticPuppet::Dependency::UnsatisfiableGraph => e
|
135
|
+
unsatisfied = nil
|
136
|
+
|
137
|
+
if e.respond_to?(:unsatisfied)
|
138
|
+
constraints = {}
|
139
|
+
# If the module we're installing satisfies all its
|
140
|
+
# dependencies, but would break an already installed
|
141
|
+
# module that depends on it, show what would break.
|
142
|
+
if name == e.unsatisfied
|
143
|
+
graph.constraints[name].each do |mod, range, _|
|
144
|
+
next unless mod.split.include?('constraint')
|
145
|
+
|
146
|
+
# If the user requested a specific version or range,
|
147
|
+
# only show the modules with non-intersecting ranges
|
148
|
+
if options[:version]
|
149
|
+
requested_range = SemanticPuppet::VersionRange.parse(options[:version])
|
150
|
+
constraint_range = SemanticPuppet::VersionRange.parse(range)
|
151
|
+
|
152
|
+
if requested_range.intersection(constraint_range) == SemanticPuppet::VersionRange::EMPTY_RANGE
|
153
|
+
constraints[mod.split.first] = range
|
154
|
+
end
|
155
|
+
else
|
156
|
+
constraints[mod.split.first] = range
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# If the module fails to satisfy one of its
|
161
|
+
# dependencies, show the unsatisfiable module
|
162
|
+
else
|
163
|
+
unsatisfied_range = graph.dependencies[name].max.constraints[e.unsatisfied].first[1]
|
164
|
+
constraints[e.unsatisfied] = unsatisfied_range
|
165
|
+
end
|
166
|
+
|
167
|
+
installed_module = @environment.module_by_forge_name(e.unsatisfied.tr('-', '/'))
|
168
|
+
current_version = installed_module.version if installed_module
|
169
|
+
|
170
|
+
unsatisfied = {
|
171
|
+
:name => e.unsatisfied,
|
172
|
+
:constraints => constraints,
|
173
|
+
:current_version => current_version
|
174
|
+
}
|
175
|
+
end
|
176
|
+
|
177
|
+
raise NoVersionsSatisfyError, results.merge(
|
178
|
+
:requested_name => name,
|
179
|
+
:requested_version => options[:version] || graph.dependencies[name].max.version.to_s,
|
180
|
+
:unsatisfied => unsatisfied
|
181
|
+
)
|
136
182
|
end
|
137
183
|
|
138
184
|
unless forced?
|