puppet 5.5.17-x86-mingw32 → 5.5.18-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 +2 -3
- data/Gemfile.lock +35 -31
- 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 +54 -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/configurer.rb +86 -28
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/defaults.rb +17 -4
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/face/ca.rb +1 -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/epp.rb +4 -4
- 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 +6 -5
- 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_tool/applications/builder.rb +1 -1
- 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/rack/rest.rb +2 -2
- 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/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/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/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 -48
- 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/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/mount.rb +1 -1
- data/lib/puppet/provider/mount/parsed.rb +8 -8
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/dnfmodule.rb +87 -0
- data/lib/puppet/provider/package/dpkg.rb +3 -12
- 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 +6 -6
- 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/scheduled_task/win32_taskscheduler.rb +3 -3
- 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 +8 -8
- 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/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -1
- 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/certificate_authority/interface.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +2 -2
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/type.rb +2 -4
- data/lib/puppet/type/cron.rb +1 -1
- 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/interface.rb +1 -1
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +2 -2
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/selboolean.rb +17 -3
- 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/instance_loader.rb +1 -1
- data/lib/puppet/util/log.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +2 -2
- data/lib/puppet/util/logging.rb +30 -18
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/monkey_patches.rb +1 -1
- data/lib/puppet/util/nagios_maker.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +1 -1
- data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
- data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
- 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 +58 -28
- 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_pal.rb +2 -2
- data/locales/puppet.pot +115 -95
- data/man/man5/puppet.conf.5 +21 -5
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-ca.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-cert.8 +1 -1
- data/man/man8/puppet-certificate.8 +1 -1
- data/man/man8/puppet-certificate_request.8 +1 -1
- data/man/man8/puppet-certificate_revocation_list.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-master.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-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/unit/configurer_spec.rb +380 -397
- 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 +26 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- 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 +15 -3
- 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 +22 -22
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_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/selboolean_spec.rb +4 -6
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +97 -0
- 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/tasks/manpages.rake +1 -0
- metadata +12 -5
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/locales/ja/puppet.po +0 -12114
@@ -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
|
@@ -103,7 +103,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
|
|
103
103
|
inSingleTick = !inSingleTick if ch == "'"
|
104
104
|
inDoubleTick = !inDoubleTick if ch == "\""
|
105
105
|
fail(_("unmatched [")) if nbracket < 0
|
106
|
-
end until ((nbracket == 0 && !inSingleTick && !inDoubleTick && (ch =~ /\s/)) || sc.eos?)
|
106
|
+
end until ((nbracket == 0 && !inSingleTick && !inDoubleTick && (ch =~ /\s/)) || sc.eos?) # rubocop:disable Lint/Loop
|
107
107
|
len = sc.pos - start
|
108
108
|
len -= 1 unless sc.eos?
|
109
109
|
unless p = sc.string[start, len]
|
@@ -212,7 +212,7 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
|
|
212
212
|
else
|
213
213
|
cmd_string = record[:command].gsub(/\s+/, "_")
|
214
214
|
index = ( @name_index += 1 )
|
215
|
-
record[:name] = "unmanaged:#{cmd_string}-#{ index
|
215
|
+
record[:name] = "unmanaged:#{cmd_string}-#{ index }"
|
216
216
|
record[:unmanaged] = true
|
217
217
|
end
|
218
218
|
if envs.nil? or envs.empty?
|
data/lib/puppet/provider/exec.rb
CHANGED
@@ -47,7 +47,11 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
47
47
|
# This is backwards compatible all the way to Ruby 1.8.7.
|
48
48
|
Timeout::timeout(resource[:timeout], Timeout::Error) do
|
49
49
|
cwd = resource[:cwd]
|
50
|
-
cwd
|
50
|
+
# It's ok if cwd is nil. In that case Puppet::Util::Execution.execute() simply will not attempt to
|
51
|
+
# change the working directory, which is exactly the right behavior when no cwd parameter is
|
52
|
+
# expressed on the resource. Moreover, attempting to change to the directory that is already
|
53
|
+
# the working directory can fail under some circumstances, so avoiding the directory change attempt
|
54
|
+
# is preferable to defaulting cwd to that directory.
|
51
55
|
|
52
56
|
# note that we are passing "false" for the "override_locale" parameter, which ensures that the user's
|
53
57
|
# default/system locale will be respected. Callers may override this behavior by setting locale-related
|
@@ -88,6 +92,6 @@ class Puppet::Provider::Exec < Puppet::Provider
|
|
88
92
|
def validatecmd(command)
|
89
93
|
exe = extractexe(command)
|
90
94
|
# if we're not fully qualified, require a path
|
91
|
-
self.fail _("'%{
|
95
|
+
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?
|
92
96
|
end
|
93
97
|
end
|
@@ -30,7 +30,7 @@ module Puppet::Provider::Mount
|
|
30
30
|
supports_remounts = (resource[:remounts] == :true)
|
31
31
|
if supports_remounts && os == 'AIX'
|
32
32
|
remount_with_option("remount")
|
33
|
-
elsif os
|
33
|
+
elsif os =~ /^(FreeBSD|DragonFly|OpenBSD)$/
|
34
34
|
remount_with_option("update")
|
35
35
|
elsif supports_remounts
|
36
36
|
mountcmd "-o", "remount", resource[:name]
|
@@ -56,15 +56,15 @@ Puppet::Type.type(:mount).provide(
|
|
56
56
|
filesystem_index = 0
|
57
57
|
ret = Array.new
|
58
58
|
lines.each_with_index do |line,i|
|
59
|
-
if line
|
59
|
+
if line =~ %r{^\S+:}
|
60
60
|
# Begin new filesystem stanza and save the index
|
61
61
|
ret[filesystem_index] = filesystem_stanza.join("\n") if filesystem_stanza
|
62
62
|
filesystem_stanza = Array(line)
|
63
63
|
filesystem_index = i
|
64
64
|
# Eat the preceding blank line
|
65
|
-
ret[i-1] = nil if i > 0 and ret[i-1] and ret[i-1]
|
65
|
+
ret[i-1] = nil if i > 0 and ret[i-1] and ret[i-1] =~ %r{^\s*$}
|
66
66
|
nil
|
67
|
-
elsif line
|
67
|
+
elsif line =~ %r{^(\s*\*.*|\s*)$}
|
68
68
|
# Just a comment or blank line; add in place
|
69
69
|
ret[i] = line
|
70
70
|
else
|
@@ -75,7 +75,7 @@ Puppet::Type.type(:mount).provide(
|
|
75
75
|
# Add the final stanza to the return
|
76
76
|
ret[filesystem_index] = filesystem_stanza.join("\n") if filesystem_stanza
|
77
77
|
ret = ret.compact.flatten
|
78
|
-
ret.reject { |line| line
|
78
|
+
ret.reject { |line| line =~ /^\* HEADER/ }
|
79
79
|
end
|
80
80
|
def self.header
|
81
81
|
super.gsub(/^#/,'*')
|
@@ -104,7 +104,7 @@ Puppet::Type.type(:mount).provide(
|
|
104
104
|
special_options = Array.new
|
105
105
|
result[:name] = memo[:name].sub(%r{:\s*$},'').strip
|
106
106
|
memo.each do |_,k_v|
|
107
|
-
if k_v and k_v.is_a?(String) and k_v.
|
107
|
+
if k_v and k_v.is_a?(String) and k_v.include?("=")
|
108
108
|
attr_name, attr_value = k_v.split("=",2).map(&:strip)
|
109
109
|
if attr_map_name = property_map[attr_name.to_sym]
|
110
110
|
# These are normal "options" options (see `man filesystems`)
|
@@ -135,10 +135,10 @@ Puppet::Type.type(:mount).provide(
|
|
135
135
|
def to_line(result)
|
136
136
|
output = Array.new
|
137
137
|
output << "#{result[:name]}:"
|
138
|
-
if result[:device] and result[:device]
|
138
|
+
if result[:device] and result[:device] =~ %r{^/}
|
139
139
|
output << "\tdev\t\t= #{result[:device]}"
|
140
140
|
elsif result[:device] and result[:device] != :absent
|
141
|
-
if ! result[:device]
|
141
|
+
if ! result[:device] =~ %{^.+:/}
|
142
142
|
# Just skip this entry; it was malformed to begin with
|
143
143
|
Puppet.err _("Mount[%{name}]: Field 'device' must be in the format of <absolute path> or <host>:<absolute path>") % { name: result[:name] }
|
144
144
|
return result[:line]
|
@@ -161,7 +161,7 @@ Puppet::Type.type(:mount).provide(
|
|
161
161
|
if result[:options]
|
162
162
|
options = result[:options].split(',')
|
163
163
|
special_options = options.select do |x|
|
164
|
-
x.
|
164
|
+
x.include?('=') and
|
165
165
|
["account", "boot", "check", "free", "mount", "size", "type",
|
166
166
|
"vol", "log", "quota"].include? x.split('=').first
|
167
167
|
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)
|
@@ -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
|
+
|
@@ -145,7 +145,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def hold
|
148
|
-
if package_not_installed?
|
148
|
+
if package_not_installed?
|
149
149
|
self.install
|
150
150
|
end
|
151
151
|
Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
|
@@ -163,16 +163,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
|
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
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")
|
166
|
+
def package_not_installed?
|
167
|
+
query[:status] != "installed"
|
177
168
|
end
|
178
169
|
end
|
@@ -180,7 +180,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
|
|
180
180
|
# If :ensure contains a version, use that instead of looking it up.
|
181
181
|
# This allows for installing packages with the same stem, but multiple
|
182
182
|
# version such as openldap-server.
|
183
|
-
if /(\d[^-]*)
|
183
|
+
if @resource[:ensure].to_s =~ /(\d[^-]*)$/
|
184
184
|
use_version = @resource[:ensure]
|
185
185
|
else
|
186
186
|
use_version = get_version
|
@@ -36,16 +36,25 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
36
36
|
if Puppet.features.microsoft_windows?
|
37
37
|
["pip.exe"]
|
38
38
|
else
|
39
|
-
["pip", "pip-python"]
|
39
|
+
["pip", "pip-python", "pip2", "pip-2"]
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.pip_version(command)
|
44
|
-
|
44
|
+
version = nil
|
45
|
+
execpipe [quote(command), '--version'] do |process|
|
45
46
|
process.collect do |line|
|
46
|
-
|
47
|
+
md = line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)
|
48
|
+
if md
|
49
|
+
version = md[1]
|
50
|
+
break
|
51
|
+
end
|
47
52
|
end
|
48
53
|
end
|
54
|
+
|
55
|
+
raise Puppet::Error, _("Cannot resolve pip version") unless version
|
56
|
+
|
57
|
+
version
|
49
58
|
end
|
50
59
|
|
51
60
|
# Return an array of structured information about every installed package
|
@@ -103,7 +112,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
103
112
|
self.class.validate_command(command)
|
104
113
|
|
105
114
|
self.class.instances(command).each do |pkg|
|
106
|
-
return pkg.properties if @resource[:name].
|
115
|
+
return pkg.properties if @resource[:name].casecmp(pkg.name).zero?
|
107
116
|
end
|
108
117
|
return nil
|
109
118
|
end
|
@@ -123,14 +132,17 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
123
132
|
end
|
124
133
|
end
|
125
134
|
|
135
|
+
# Less resource-intensive approach for pip version 1.5.4 and newer.
|
136
|
+
|
126
137
|
def latest_with_new_pip
|
127
138
|
command = resource_or_provider_command
|
128
139
|
self.class.validate_command(command)
|
129
140
|
|
130
|
-
|
131
|
-
|
141
|
+
command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
|
142
|
+
command_and_options << install_options if @resource[:install_options]
|
143
|
+
execpipe command_and_options do |process|
|
132
144
|
process.collect do |line|
|
133
|
-
# PIP OUTPUT: Could not find a version that satisfies the requirement
|
145
|
+
# PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
|
134
146
|
if line =~ /from versions: /
|
135
147
|
textAfterLastMatch = $'.chomp(")\n")
|
136
148
|
versionList = textAfterLastMatch.split(', ').sort do |x,y|
|
@@ -143,14 +155,18 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
143
155
|
end
|
144
156
|
end
|
145
157
|
|
158
|
+
# More resource-intensive approach for pip version 1.5.3 and older.
|
159
|
+
|
146
160
|
def latest_with_old_pip
|
147
161
|
command = resource_or_provider_command
|
148
162
|
self.class.validate_command(command)
|
149
163
|
|
150
164
|
Dir.mktmpdir("puppet_pip") do |dir|
|
151
|
-
|
165
|
+
command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
|
166
|
+
command_and_options << install_options if @resource[:install_options]
|
167
|
+
execpipe command_and_options do |process|
|
152
168
|
process.collect do |line|
|
153
|
-
# PIP OUTPUT: Using version 0.10.1 (newest of versions:
|
169
|
+
# PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
|
154
170
|
if line =~ /Using version (.+?) \(newest of versions/
|
155
171
|
return $1
|
156
172
|
end
|
@@ -210,4 +226,13 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
210
226
|
def install_options
|
211
227
|
join_options(@resource[:install_options])
|
212
228
|
end
|
229
|
+
|
230
|
+
def self.quote(path)
|
231
|
+
if path.include?(" ")
|
232
|
+
"\"#{path}\""
|
233
|
+
else
|
234
|
+
path
|
235
|
+
end
|
236
|
+
end
|
237
|
+
private_class_method :quote
|
213
238
|
end
|
@@ -70,7 +70,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
70
70
|
name = qatom[:pfx] + name if qatom[:pfx]
|
71
71
|
name = name + '-' + qatom[:pv] if qatom[:pv]
|
72
72
|
name = name + '-' + qatom[:pr] if qatom[:pr]
|
73
|
-
name = name + qatom[:slot] if qatom[:slot]
|
73
|
+
name = name + ':' + qatom[:slot] if qatom[:slot]
|
74
74
|
cmd << '--update' if [:latest].include?(should)
|
75
75
|
cmd += install_options if @resource[:install_options]
|
76
76
|
cmd << name
|
@@ -84,7 +84,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
84
84
|
name = qatom[:pfx] + name if qatom[:pfx]
|
85
85
|
name = name + '-' + qatom[:pv] if qatom[:pv]
|
86
86
|
name = name + '-' + qatom[:pr] if qatom[:pr]
|
87
|
-
name = name + qatom[:slot] if qatom[:slot]
|
87
|
+
name = name + ':' + qatom[:slot] if qatom[:slot]
|
88
88
|
cmd += uninstall_options if @resource[:uninstall_options]
|
89
89
|
cmd << name
|
90
90
|
if [:purged].include?(should)
|
@@ -169,7 +169,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
169
169
|
package_sets << package_set.to_s.strip
|
170
170
|
end
|
171
171
|
|
172
|
-
if @resource[:name]
|
172
|
+
if @resource[:name] =~ /^@/
|
173
173
|
if package_sets.include?(@resource[:name][1..-1].to_s)
|
174
174
|
return({:name => "#{@resource[:name]}", :ensure => '9999', :version_available => nil, :installed_versions => nil, :installable_versions => "9999,"})
|
175
175
|
end
|
@@ -247,7 +247,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
247
247
|
# [2.7.12: 2.7
|
248
248
|
# 3.4.5: 3.4
|
249
249
|
# 3.5.2: 3.5]
|
250
|
-
version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot
|
250
|
+
version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot }
|
251
251
|
# [3.5.2: 3.5]
|
252
252
|
version_for_slot.first if version_for_slot
|
253
253
|
# 3.5.2
|
@@ -229,14 +229,14 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
|
|
229
229
|
str2 = str2.gsub(front_strip_re, '')
|
230
230
|
|
231
231
|
# "handle the tilde separator, it sorts before everything else"
|
232
|
-
if
|
232
|
+
if str1 =~ /^~/ && str2 =~ /^~/
|
233
233
|
# if they both have ~, strip it
|
234
234
|
str1 = str1[1..-1]
|
235
235
|
str2 = str2[1..-1]
|
236
236
|
next
|
237
|
-
elsif
|
237
|
+
elsif str1 =~ /^~/
|
238
238
|
return -1
|
239
|
-
elsif
|
239
|
+
elsif str2 =~ /^~/
|
240
240
|
return 1
|
241
241
|
end
|
242
242
|
|
@@ -245,7 +245,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
|
|
245
245
|
# "grab first completely alpha or completely numeric segment"
|
246
246
|
isnum = false
|
247
247
|
# if the first char of str1 is a digit, grab the chunk of continuous digits from each string
|
248
|
-
if /^[0-9]
|
248
|
+
if str1 =~ /^[0-9]+/
|
249
249
|
if str1 =~ /^[0-9]+/
|
250
250
|
segment1 = $~.to_s
|
251
251
|
str1 = $~.post_match
|
@@ -340,8 +340,8 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
|
|
340
340
|
v = s[0,ri]
|
341
341
|
r = s[ri+1,s.length]
|
342
342
|
if arch = r.scan(ARCH_REGEX)[0]
|
343
|
-
a = arch.
|
344
|
-
|
343
|
+
a = arch.delete('.')
|
344
|
+
r.gsub!(ARCH_REGEX, '')
|
345
345
|
end
|
346
346
|
else
|
347
347
|
v = s
|