puppet 6.4.4-x86-mingw32 → 6.4.5-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 +1 -1
- data/Gemfile +4 -4
- data/Gemfile.lock +38 -32
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +38 -8
- data/install.rb +6 -6
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/application/ssl.rb +4 -1
- data/lib/puppet/configurer.rb +86 -30
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/defaults.rb +32 -6
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions.rb +1 -2
- data/lib/puppet/functions/camelcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/find_file.rb +9 -9
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +4 -3
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +2 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module/task.rb +20 -4
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
- data/lib/puppet/network/http/connection.rb +10 -12
- data/lib/puppet/network/http/pool.rb +2 -0
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +4 -2
- data/lib/puppet/pal/pal_impl.rb +2 -2
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/parser/scope.rb +8 -7
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -49
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/apt.rb +5 -1
- data/lib/puppet/provider/package/dnfmodule.rb +87 -0
- data/lib/puppet/provider/package/dpkg.rb +34 -18
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +34 -9
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/rpm.rb +5 -5
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +9 -9
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +22 -13
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -3
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/host.rb +1 -1
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/transaction.rb +33 -11
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/type.rb +2 -4
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +1 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +10 -3
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- data/lib/puppet/util/log.rb +2 -2
- data/lib/puppet/util/log/destinations.rb +2 -2
- data/lib/puppet/util/logging.rb +32 -20
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/adsi.rb +48 -18
- data/lib/puppet/util/windows/registry.rb +7 -5
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509/cert_provider.rb +13 -6
- data/locales/puppet.pot +199 -159
- data/man/man5/puppet.conf.5 +35 -5
- 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/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
- data/spec/integration/configurer_spec.rb +52 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/lib/puppet/certificate_factory.rb +2 -2
- data/spec/spec_helper.rb +28 -0
- data/spec/unit/application/ssl_spec.rb +4 -7
- data/spec/unit/configurer_spec.rb +394 -398
- data/spec/unit/defaults_spec.rb +4 -4
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/connection_spec.rb +119 -145
- data/spec/unit/parser/scope_spec.rb +10 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
- data/spec/unit/provider/package/dpkg_spec.rb +238 -78
- data/spec/unit/provider/package/pip_spec.rb +51 -6
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +25 -25
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_spec.rb +46 -0
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/state_machine_spec.rb +0 -6
- data/spec/unit/transaction_spec.rb +46 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +5 -0
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +118 -27
- data/spec/unit/util/log/destinations_spec.rb +7 -3
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/windows/adsi_spec.rb +51 -0
- data/spec/unit/x509/cert_provider_spec.rb +24 -4
- data/tasks/manpages.rake +1 -0
- metadata +12 -10
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +0 -24
@@ -1,57 +1,59 @@
|
|
1
|
-
module Puppet
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
1
|
+
module Puppet
|
2
|
+
module Pops
|
3
|
+
# Utility class for keeping track of the "Puppet stack", ie the file
|
4
|
+
# and line numbers of Puppet Code that created the current context.
|
5
|
+
#
|
6
|
+
# To use this make a call with:
|
7
|
+
#
|
8
|
+
# ```rb
|
9
|
+
# Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
|
10
|
+
# ```
|
11
|
+
#
|
12
|
+
# To get the stack call:
|
13
|
+
#
|
14
|
+
# ```rb
|
15
|
+
# Puppet::Pops::PuppetStack.stacktrace
|
16
|
+
# ```
|
17
|
+
#
|
18
|
+
# or
|
19
|
+
#
|
20
|
+
# ```rb
|
21
|
+
# Puppet::Pops::PuppetStack.top_of_stack
|
22
|
+
# ```
|
23
|
+
#
|
24
|
+
# To support testing, a given file that is an empty string, or nil
|
25
|
+
# as well as a nil line number are supported. Such stack frames
|
26
|
+
# will be represented with the text `unknown` and `0´ respectively.
|
27
|
+
module PuppetStack
|
28
|
+
@stack = Array.new
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def self.stack(file, line, obj, message, args, &block)
|
27
|
-
file = '' if file.nil?
|
28
|
-
line = 0 if line.nil?
|
30
|
+
def self.stack(file, line, obj, message, args, &block)
|
31
|
+
file = 'unknown' if (file.nil? || file == '')
|
32
|
+
line = 0 if line.nil?
|
29
33
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
result = nil
|
35
|
+
@stack.unshift([file, line])
|
36
|
+
begin
|
37
|
+
if block_given?
|
38
|
+
result = obj.send(message, *args, &block)
|
39
|
+
else
|
40
|
+
result = obj.send(message, *args)
|
41
|
+
end
|
42
|
+
ensure
|
43
|
+
@stack.shift()
|
44
|
+
end
|
45
|
+
result
|
46
|
+
end
|
36
47
|
|
37
|
-
|
38
|
-
|
39
|
-
if loc =~ PP_ENTRY_PATTERN
|
40
|
-
memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
|
48
|
+
def self.stacktrace
|
49
|
+
@stack.dup
|
41
50
|
end
|
42
|
-
memo
|
43
|
-
end
|
44
|
-
end
|
45
51
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
if loc =~ PP_ENTRY_PATTERN
|
51
|
-
return [$1.nil? ? 'unknown' : $1, $2.to_i]
|
52
|
+
# Returns an Array with the top of the puppet stack, or an empty
|
53
|
+
# Array if there was no such entry.
|
54
|
+
def self.top_of_stack
|
55
|
+
@stack.first || []
|
52
56
|
end
|
53
57
|
end
|
54
|
-
[]
|
55
58
|
end
|
56
|
-
end
|
57
|
-
end
|
59
|
+
end
|
@@ -728,7 +728,7 @@ class StringConverter
|
|
728
728
|
when :c
|
729
729
|
char = [val].pack("U")
|
730
730
|
char = f.alt? ? "\"#{char}\"" : char
|
731
|
-
Kernel.format(f.orig_fmt.
|
731
|
+
Kernel.format(f.orig_fmt.tr('c','s'), char)
|
732
732
|
|
733
733
|
when :s
|
734
734
|
fmt = f.alt? ? 'p' : 's'
|
@@ -781,7 +781,7 @@ class StringConverter
|
|
781
781
|
|
782
782
|
when :p
|
783
783
|
# width & precision applied to string, not the the name of the type
|
784
|
-
"Binary(\"#{Kernel.format(f.orig_fmt.
|
784
|
+
"Binary(\"#{Kernel.format(f.orig_fmt.tr('p', 's'), val.to_s)}\")"
|
785
785
|
|
786
786
|
when :b
|
787
787
|
Kernel.format(f.orig_fmt.gsub('b', substitute), val.relaxed_to_s)
|
@@ -817,23 +817,23 @@ class StringConverter
|
|
817
817
|
|
818
818
|
when :c
|
819
819
|
c_val = val.capitalize
|
820
|
-
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.
|
820
|
+
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('c', 's'), c_val)
|
821
821
|
|
822
822
|
when :C
|
823
823
|
c_val = val.split('::').map {|s| s.capitalize }.join('::')
|
824
|
-
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.
|
824
|
+
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('C', 's'), c_val)
|
825
825
|
|
826
826
|
when :u
|
827
827
|
c_val = val.upcase
|
828
|
-
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.
|
828
|
+
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('u', 's'), c_val)
|
829
829
|
|
830
830
|
when :d
|
831
831
|
c_val = val.downcase
|
832
|
-
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.
|
832
|
+
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('d', 's'), c_val)
|
833
833
|
|
834
834
|
when :t # trim
|
835
835
|
c_val = val.strip
|
836
|
-
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.
|
836
|
+
f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('t', 's'), c_val)
|
837
837
|
|
838
838
|
else
|
839
839
|
raise FormatError.new('String', f.format, 'cCudspt')
|
@@ -921,7 +921,7 @@ class StringConverter
|
|
921
921
|
case f.format
|
922
922
|
when :p
|
923
923
|
str_regexp = PRegexpType.regexp_to_s_with_delimiters(val)
|
924
|
-
f.orig_fmt == '%p' ? str_regexp : Kernel.format(f.orig_fmt.
|
924
|
+
f.orig_fmt == '%p' ? str_regexp : Kernel.format(f.orig_fmt.tr('p', 's'), str_regexp)
|
925
925
|
when :s
|
926
926
|
str_regexp = PRegexpType.regexp_to_s(val)
|
927
927
|
str_regexp = puppet_quote(str_regexp) if f.alt?
|
@@ -1098,10 +1098,10 @@ class StringConverter
|
|
1098
1098
|
f = get_format(val_type, format_map)
|
1099
1099
|
case f.format
|
1100
1100
|
when :s
|
1101
|
-
str_val = f.alt? ? "\"#{val
|
1101
|
+
str_val = f.alt? ? "\"#{val}\"" : val.to_s
|
1102
1102
|
Kernel.format(f.orig_fmt, str_val)
|
1103
1103
|
when :p
|
1104
|
-
Kernel.format(f.orig_fmt.
|
1104
|
+
Kernel.format(f.orig_fmt.tr('p', 's'), val.to_s)
|
1105
1105
|
else
|
1106
1106
|
raise FormatError.new('Type', f.format, 'sp')
|
1107
1107
|
end
|
@@ -340,7 +340,7 @@ class PAnyType < TypedModelObject
|
|
340
340
|
# @raises ArgumentError
|
341
341
|
#
|
342
342
|
def self.new_function(type)
|
343
|
-
raise ArgumentError.new("Creation of new instance of type '#{type
|
343
|
+
raise ArgumentError.new("Creation of new instance of type '#{type}' is not supported")
|
344
344
|
end
|
345
345
|
|
346
346
|
# Answers the question if instances of this type can represent themselves as a string that
|
@@ -1268,7 +1268,7 @@ class PFloatType < PNumericType
|
|
1268
1268
|
else
|
1269
1269
|
begin
|
1270
1270
|
# support a binary as float
|
1271
|
-
if from[0] == '0' && from[1].
|
1271
|
+
if from[0] == '0' && from[1].casecmp('b').zero?
|
1272
1272
|
from = Integer(from)
|
1273
1273
|
end
|
1274
1274
|
Float(from)
|
@@ -1699,7 +1699,7 @@ class PRegexpType < PScalarType
|
|
1699
1699
|
# @param regexp [Regexp] the regular expression
|
1700
1700
|
# @return [String] the Regexp as a slash delimited string with slashes escaped
|
1701
1701
|
def self.regexp_to_s_with_delimiters(regexp)
|
1702
|
-
regexp.options == 0 ? regexp.inspect : "/#{regexp
|
1702
|
+
regexp.options == 0 ? regexp.inspect : "/#{regexp}/"
|
1703
1703
|
end
|
1704
1704
|
|
1705
1705
|
# @param regexp [Regexp] the regular expression
|
data/lib/puppet/property.rb
CHANGED
@@ -209,7 +209,7 @@ class Puppet::Property < Puppet::Parameter
|
|
209
209
|
else
|
210
210
|
return "#{name} changed #{is_to_s(current_value)} to #{should_to_s(newvalue)}"
|
211
211
|
end
|
212
|
-
rescue Puppet::Error
|
212
|
+
rescue Puppet::Error
|
213
213
|
raise
|
214
214
|
rescue => detail
|
215
215
|
message = _("Could not convert change '%{name}' to string: %{detail}") % { name: name, detail: detail }
|
@@ -56,7 +56,7 @@ class Puppet::Property::Ensure < Puppet::Property
|
|
56
56
|
else
|
57
57
|
return _('%{name} changed %{is} to %{should}') % { name: name, is: is_to_s(currentvalue), should: should_to_s(newvalue) }
|
58
58
|
end
|
59
|
-
rescue Puppet::Error
|
59
|
+
rescue Puppet::Error
|
60
60
|
raise
|
61
61
|
rescue => detail
|
62
62
|
raise Puppet::DevError, _("Could not convert change %{name} to string: %{detail}") % { name: self.name, detail: detail }, detail.backtrace
|
data/lib/puppet/provider/exec.rb
CHANGED
@@ -52,7 +52,11 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
52
52
|
# This is backwards compatible all the way to Ruby 1.8.7.
|
53
53
|
Timeout::timeout(resource[:timeout], Timeout::Error) do
|
54
54
|
cwd = resource[:cwd]
|
55
|
-
cwd
|
55
|
+
# It's ok if cwd is nil. In that case Puppet::Util::Execution.execute() simply will not attempt to
|
56
|
+
# change the working directory, which is exactly the right behavior when no cwd parameter is
|
57
|
+
# expressed on the resource. Moreover, attempting to change to the directory that is already
|
58
|
+
# the working directory can fail under some circumstances, so avoiding the directory change attempt
|
59
|
+
# is preferable to defaulting cwd to that directory.
|
56
60
|
|
57
61
|
# note that we are passing "false" for the "override_locale" parameter, which ensures that the user's
|
58
62
|
# default/system locale will be respected. Callers may override this behavior by setting locale-related
|
@@ -93,6 +97,6 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
93
97
|
def validatecmd(command)
|
94
98
|
exe = extractexe(command)
|
95
99
|
# if we're not fully qualified, require a path
|
96
|
-
self.fail _("'%{
|
100
|
+
self.fail _("'%{exe}' is not qualified and no path was specified. Please qualify the command or specify a path.") % { exe: exe } if !absolute_path?(exe) and resource[:path].nil?
|
97
101
|
end
|
98
102
|
end
|
@@ -289,7 +289,7 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
|
|
289
289
|
end
|
290
290
|
dscl_out = dscl(dscl_args)
|
291
291
|
# We're ok with throwing away negative uids here.
|
292
|
-
ids = dscl_out.split.compact.collect { |l| l.to_i if l
|
292
|
+
ids = dscl_out.split.compact.collect { |l| l.to_i if l =~ /^\d+$/ }
|
293
293
|
ids.compact!.sort! { |a,b| a.to_f <=> b.to_f }
|
294
294
|
# We're just looking for an unused id in our sorted array.
|
295
295
|
ids.each_index do |i|
|
@@ -3,13 +3,13 @@ require 'puppet/provider/nameservice/objectadd'
|
|
3
3
|
class Puppet::Provider::NameService
|
4
4
|
class PW < ObjectAdd
|
5
5
|
def deletecmd
|
6
|
-
[command(:pw), "#{@resource.class.name
|
6
|
+
[command(:pw), "#{@resource.class.name}del", @resource[:name]]
|
7
7
|
end
|
8
8
|
|
9
9
|
def modifycmd(param, value)
|
10
10
|
cmd = [
|
11
11
|
command(:pw),
|
12
|
-
"#{@resource.class.name
|
12
|
+
"#{@resource.class.name}mod",
|
13
13
|
@resource[:name],
|
14
14
|
flag(param),
|
15
15
|
munge(param, value)
|
@@ -8,7 +8,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
8
8
|
These options should be specified as an array where each element is either a
|
9
9
|
string or a hash."
|
10
10
|
|
11
|
-
has_feature :versionable, :install_options
|
11
|
+
has_feature :versionable, :install_options, :virtual_packages
|
12
12
|
|
13
13
|
commands :aptget => "/usr/bin/apt-get"
|
14
14
|
commands :aptcache => "/usr/bin/apt-cache"
|
@@ -22,6 +22,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
|
|
22
22
|
ENV['APT_LISTBUGS_FRONTEND'] = "none"
|
23
23
|
ENV['APT_LISTCHANGES_FRONTEND'] = "none"
|
24
24
|
|
25
|
+
def self.defaultto_allow_virtual
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
25
29
|
# A derivative of DPKG; this is how most people actually manage
|
26
30
|
# Debian boxes, and the only thing that differs is that it can
|
27
31
|
# install packages from remote sites.
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# dnfmodule - A puppet package provider for DNF modules
|
2
|
+
#
|
3
|
+
# Installing a module:
|
4
|
+
# package { 'postgresql':
|
5
|
+
# provider => 'dnfmodule',
|
6
|
+
# ensure => '9.6', # install a specific stream
|
7
|
+
# flavor => 'client', # install a specific profile
|
8
|
+
# }
|
9
|
+
|
10
|
+
|
11
|
+
require 'puppet/provider/package'
|
12
|
+
|
13
|
+
Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
|
14
|
+
|
15
|
+
has_feature :installable, :uninstallable, :versionable
|
16
|
+
#has_feature :upgradeable
|
17
|
+
# it's not (yet) feasible to make this upgradeable since module streams don't
|
18
|
+
# always have matching version types (i.e. idm has streams DL1 and client,
|
19
|
+
# other modules have semver streams, others have string streams... we cannot
|
20
|
+
# programatically determine a latest version for ensure => 'latest'
|
21
|
+
|
22
|
+
commands :dnf => '/usr/bin/dnf'
|
23
|
+
|
24
|
+
def self.current_version
|
25
|
+
@current_version ||= dnf('--version').split.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.prefetch(packages)
|
29
|
+
if Puppet::Util::Package.versioncmp(current_version, '3.0.1') < 0
|
30
|
+
raise Puppet::Error, _("Modules are not supported on DNF versions lower than 3.0.1")
|
31
|
+
end
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.instances
|
36
|
+
packages = []
|
37
|
+
cmd = "#{command(:dnf)} module list --installed -d 0 -e #{error_level}"
|
38
|
+
execute(cmd).each_line do |line|
|
39
|
+
next unless line =~ /\[i\][, ]/ # get rid of non-package lines (including last Hint line)
|
40
|
+
line.gsub!(/\[[de]\]/, '') # we don't care about default/enabled flags
|
41
|
+
packages << new(
|
42
|
+
name: line.split[0],
|
43
|
+
ensure: line.split[1],
|
44
|
+
flavor: line.split('[i]').first.split.last, # this is nasty
|
45
|
+
provider: name
|
46
|
+
)
|
47
|
+
end
|
48
|
+
packages
|
49
|
+
end
|
50
|
+
|
51
|
+
def query
|
52
|
+
pkg = self.class.instances.find do |package|
|
53
|
+
@resource[:name] == package.name
|
54
|
+
end
|
55
|
+
pkg ? pkg.properties : nil
|
56
|
+
end
|
57
|
+
|
58
|
+
def reset
|
59
|
+
execute([command(:dnf), 'module', 'reset', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
|
60
|
+
end
|
61
|
+
|
62
|
+
# to install specific streams and profiles:
|
63
|
+
# $ dnf module install module-name:stream/profile
|
64
|
+
# $ dnf module install perl:5.24/minimal
|
65
|
+
# if unspecified, they will be defaulted (see [d] param in dnf module list output)
|
66
|
+
def install
|
67
|
+
args = @resource[:name]
|
68
|
+
# ensure we start fresh (remove existing stream)
|
69
|
+
uninstall unless [:absent, :purged].include?(@property_hash[:ensure])
|
70
|
+
case @resource[:ensure]
|
71
|
+
when true, false, Symbol
|
72
|
+
# pass
|
73
|
+
else
|
74
|
+
args << ":#{@resource[:ensure]}"
|
75
|
+
end
|
76
|
+
if @resource[:flavor]
|
77
|
+
args << "/#{@resource[:flavor]}"
|
78
|
+
end
|
79
|
+
execute([command(:dnf), 'module', 'install', '-d', '0', '-e', self.class.error_level, '-y', args])
|
80
|
+
end
|
81
|
+
|
82
|
+
def uninstall
|
83
|
+
execute([command(:dnf), 'module', 'remove', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
|
84
|
+
reset # reset module to the default stream
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
@@ -5,8 +5,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
5
5
|
and not `apt`, you must specify the source of any packages you want
|
6
6
|
to manage."
|
7
7
|
|
8
|
-
has_feature :holdable
|
9
|
-
|
8
|
+
has_feature :holdable, :virtual_packages
|
10
9
|
commands :dpkg => "/usr/bin/dpkg"
|
11
10
|
commands :dpkg_deb => "/usr/bin/dpkg-deb"
|
12
11
|
commands :dpkgquery => "/usr/bin/dpkg-query"
|
@@ -44,16 +43,23 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
44
43
|
# Note: self:: is required here to keep these constants in the context of what will
|
45
44
|
# eventually become this Puppet::Type::Package::ProviderDpkg class.
|
46
45
|
self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'}
|
46
|
+
self::DPKG_QUERY_PROVIDES_FORMAT_STRING = %Q{'${Status} ${Package} ${Version} [${Provides}]\\n'}
|
47
47
|
self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
|
48
|
+
self::FIELDS_REGEX_WITH_PROVIDES = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
|
48
49
|
self::FIELDS= [:desired, :error, :status, :name, :ensure]
|
49
50
|
|
51
|
+
def self.defaultto_allow_virtual
|
52
|
+
false
|
53
|
+
end
|
54
|
+
|
50
55
|
# @param line [String] one line of dpkg-query output
|
51
56
|
# @return [Hash,nil] a hash of FIELDS or nil if we failed to match
|
52
57
|
# @api private
|
53
|
-
def self.parse_line(line)
|
58
|
+
def self.parse_line(line, regex=self::FIELDS_REGEX)
|
54
59
|
hash = nil
|
55
60
|
|
56
|
-
|
61
|
+
match = regex.match(line)
|
62
|
+
if match
|
57
63
|
hash = {}
|
58
64
|
|
59
65
|
self::FIELDS.zip(match.captures) do |field,value|
|
@@ -78,7 +84,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
78
84
|
public
|
79
85
|
|
80
86
|
def install
|
81
|
-
|
87
|
+
file = @resource[:source]
|
88
|
+
unless file
|
82
89
|
raise ArgumentError, _("You cannot install dpkg packages without a source")
|
83
90
|
end
|
84
91
|
args = []
|
@@ -102,7 +109,11 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
102
109
|
|
103
110
|
# Return the version from the package.
|
104
111
|
def latest
|
105
|
-
|
112
|
+
source = @resource[:source]
|
113
|
+
unless source
|
114
|
+
@resource.fail _("Could not update: You cannot install dpkg packages without a source")
|
115
|
+
end
|
116
|
+
output = dpkg_deb "--show", source
|
106
117
|
matches = /^(\S+)\t(\S+)$/.match(output).captures
|
107
118
|
warning _("source doesn't contain named package, but %{name}") % { name: matches[0] } unless matches[0].match( Regexp.escape(@resource[:name]) )
|
108
119
|
matches[1]
|
@@ -113,6 +124,20 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
113
124
|
|
114
125
|
# list out our specific package
|
115
126
|
begin
|
127
|
+
if @resource.allow_virtual?
|
128
|
+
output = dpkgquery(
|
129
|
+
"-W",
|
130
|
+
"--showformat",
|
131
|
+
self.class::DPKG_QUERY_PROVIDES_FORMAT_STRING
|
132
|
+
#the regex searches for the resource[:name] in the dpkquery result in which the Provides field is also available
|
133
|
+
#it will search for the packages only in the brackets ex: [rubygems]
|
134
|
+
).lines.find {|package| package.match(/[\[ ](#{Regexp.escape(@resource[:name])})[\],]/)}
|
135
|
+
if output
|
136
|
+
hash = self.class.parse_line(output,self.class::FIELDS_REGEX_WITH_PROVIDES)
|
137
|
+
Puppet.info("Package #{@resource[:name]} is virtual, defaulting to #{hash[:name]}")
|
138
|
+
@resource[:name] = hash[:name]
|
139
|
+
end
|
140
|
+
end
|
116
141
|
output = dpkgquery(
|
117
142
|
"-W",
|
118
143
|
"--showformat",
|
@@ -145,7 +170,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
145
170
|
end
|
146
171
|
|
147
172
|
def hold
|
148
|
-
if package_not_installed?
|
173
|
+
if package_not_installed?
|
149
174
|
self.install
|
150
175
|
end
|
151
176
|
Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
|
@@ -163,16 +188,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
163
188
|
end
|
164
189
|
end
|
165
190
|
|
166
|
-
def package_not_installed?
|
167
|
-
|
168
|
-
begin
|
169
|
-
dpkgquery("-W", "--showformat", self.class::DPKG_QUERY_FORMAT_STRING, name)
|
170
|
-
rescue Puppet::ExecutionFailure
|
171
|
-
# return true if exception is generated because package is not found
|
172
|
-
return true
|
173
|
-
end
|
174
|
-
return false
|
175
|
-
end
|
176
|
-
raise ArgumentError.new("Package name is nil or empty")
|
191
|
+
def package_not_installed?
|
192
|
+
query[:status] != "installed"
|
177
193
|
end
|
178
194
|
end
|