puppet 8.7.0-universal-darwin → 8.9.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +57 -43
  4. data/ext/project_data.yaml +12 -0
  5. data/ext/windows/service/daemon.rb +9 -2
  6. data/install.rb +3 -74
  7. data/lib/puppet/application/apply.rb +1 -0
  8. data/lib/puppet/application/doc.rb +1 -5
  9. data/lib/puppet/application/filebucket.rb +6 -4
  10. data/lib/puppet/application/lookup.rb +2 -0
  11. data/lib/puppet/application/ssl.rb +4 -4
  12. data/lib/puppet/daemon.rb +0 -1
  13. data/lib/puppet/defaults.rb +67 -71
  14. data/lib/puppet/face/catalog.rb +24 -8
  15. data/lib/puppet/face/help.rb +43 -23
  16. data/lib/puppet/file_serving/http_metadata.rb +2 -0
  17. data/lib/puppet/functions/capitalize.rb +1 -1
  18. data/lib/puppet/functions/find_file.rb +4 -0
  19. data/lib/puppet/functions/hiera.rb +1 -0
  20. data/lib/puppet/functions/index.rb +2 -2
  21. data/lib/puppet/functions/lookup.rb +1 -1
  22. data/lib/puppet/functions/new.rb +1 -1
  23. data/lib/puppet/functions/regsubst.rb +11 -14
  24. data/lib/puppet/functions/unique.rb +3 -2
  25. data/lib/puppet/functions/yaml_data.rb +1 -0
  26. data/lib/puppet/indirector/catalog/compiler.rb +2 -35
  27. data/lib/puppet/interface/action_manager.rb +1 -1
  28. data/lib/puppet/module_tool/tar/gnu.rb +10 -8
  29. data/lib/puppet/node/server_facts.rb +43 -0
  30. data/lib/puppet/parser/functions/generate.rb +2 -1
  31. data/lib/puppet/pops/evaluator/deferred_resolver.rb +41 -6
  32. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +2 -1
  33. data/lib/puppet/pops/evaluator/runtime3_support.rb +0 -6
  34. data/lib/puppet/provider/file/posix.rb +16 -2
  35. data/lib/puppet/provider/package/gem.rb +1 -0
  36. data/lib/puppet/provider/package/pacman.rb +9 -10
  37. data/lib/puppet/provider/package/pkgutil.rb +6 -5
  38. data/lib/puppet/provider/package/puppet_gem.rb +4 -15
  39. data/lib/puppet/reference/configuration.rb +6 -1
  40. data/lib/puppet/resource/type.rb +15 -1
  41. data/lib/puppet/scheduler/splay_job.rb +0 -9
  42. data/lib/puppet/settings.rb +2 -2
  43. data/lib/puppet/transaction/resource_harness.rb +7 -3
  44. data/lib/puppet/type/exec.rb +3 -4
  45. data/lib/puppet/type/file/checksum.rb +4 -2
  46. data/lib/puppet/type/file/ctime.rb +2 -2
  47. data/lib/puppet/type/file/mtime.rb +2 -2
  48. data/lib/puppet/type/file/selcontext.rb +8 -7
  49. data/lib/puppet/type/file/target.rb +9 -11
  50. data/lib/puppet/type/package.rb +4 -3
  51. data/lib/puppet/type/user.rb +1 -1
  52. data/lib/puppet/util/checksums.rb +1 -0
  53. data/lib/puppet/util/execution.rb +1 -1
  54. data/lib/puppet/util/profiler/aggregate.rb +2 -2
  55. data/lib/puppet/util/profiler/wall_clock.rb +2 -2
  56. data/lib/puppet/util/reference.rb +1 -31
  57. data/lib/puppet/util/run_mode.rb +40 -0
  58. data/lib/puppet/util/selinux.rb +38 -16
  59. data/lib/puppet/util/windows/daemon.rb +15 -32
  60. data/lib/puppet/version.rb +1 -1
  61. data/locales/puppet.pot +141 -145
  62. data/man/man5/puppet.conf.5 +18 -18
  63. data/man/man8/puppet-agent.8 +1 -1
  64. data/man/man8/puppet-apply.8 +2 -1
  65. data/man/man8/puppet-catalog.8 +5 -2
  66. data/man/man8/puppet-config.8 +1 -1
  67. data/man/man8/puppet-describe.8 +1 -1
  68. data/man/man8/puppet-device.8 +1 -1
  69. data/man/man8/puppet-doc.8 +1 -1
  70. data/man/man8/puppet-epp.8 +1 -1
  71. data/man/man8/puppet-facts.8 +1 -1
  72. data/man/man8/puppet-filebucket.8 +10 -1
  73. data/man/man8/puppet-generate.8 +1 -1
  74. data/man/man8/puppet-help.8 +1 -1
  75. data/man/man8/puppet-lookup.8 +1 -1
  76. data/man/man8/puppet-module.8 +1 -1
  77. data/man/man8/puppet-node.8 +1 -1
  78. data/man/man8/puppet-parser.8 +1 -1
  79. data/man/man8/puppet-plugin.8 +1 -1
  80. data/man/man8/puppet-report.8 +1 -1
  81. data/man/man8/puppet-resource.8 +1 -1
  82. data/man/man8/puppet-script.8 +1 -1
  83. data/man/man8/puppet-ssl.8 +3 -3
  84. data/man/man8/puppet.8 +128 -9
  85. metadata +44 -29
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Puppet::Node::ServerFacts
4
+ def self.load
5
+ server_facts = {}
6
+
7
+ # Add our server Puppet Enterprise version, if available.
8
+ pe_version_file = '/opt/puppetlabs/server/pe_version'
9
+ if File.readable?(pe_version_file) and !File.zero?(pe_version_file)
10
+ server_facts['pe_serverversion'] = File.read(pe_version_file).chomp
11
+ end
12
+
13
+ # Add our server version to the fact list
14
+ server_facts["serverversion"] = Puppet.version.to_s
15
+
16
+ # And then add the server name and IP
17
+ { "servername" => "networking.fqdn",
18
+ "serverip" => "networking.ip",
19
+ "serverip6" => "networking.ip6" }.each do |var, fact|
20
+ value = Puppet.runtime[:facter].value(fact)
21
+ unless value.nil?
22
+ server_facts[var] = value
23
+ end
24
+ end
25
+
26
+ if server_facts["servername"].nil?
27
+ host = Puppet.runtime[:facter].value('networking.hostname')
28
+ if host.nil?
29
+ Puppet.warning _("Could not retrieve fact servername")
30
+ elsif domain = Puppet.runtime[:facter].value('networking.domain') # rubocop:disable Lint/AssignmentInCondition
31
+ server_facts["servername"] = [host, domain].join(".")
32
+ else
33
+ server_facts["servername"] = host
34
+ end
35
+ end
36
+
37
+ if server_facts["serverip"].nil? && server_facts["serverip6"].nil?
38
+ Puppet.warning _("Could not retrieve either serverip or serverip6 fact")
39
+ end
40
+
41
+ server_facts
42
+ end
43
+ end
@@ -31,7 +31,8 @@ Puppet::Parser::Functions.newfunction(:generate, :arity => -2, :type => :rvalue,
31
31
  end
32
32
 
33
33
  begin
34
- Dir.chdir(File.dirname(args[0])) { Puppet::Util::Execution.execute(args).to_str }
34
+ dir = File.dirname(args[0])
35
+ Puppet::Util::Execution.execute(args, failonfail: true, combine: true, cwd: dir).to_str
35
36
  rescue Puppet::ExecutionFailure => detail
36
37
  raise Puppet::ParseError, _("Failed to execute generator %{generator}: %{detail}") % { generator: args[0], detail: detail }, detail.backtrace
37
38
  end
@@ -89,17 +89,25 @@ class DeferredResolver
89
89
  overrides = {}
90
90
  r.parameters.each_pair do |k, v|
91
91
  resolved = resolve(v)
92
- # If the value is instance of Sensitive - assign the unwrapped value
93
- # and mark it as sensitive if not already marked
94
- #
95
92
  case resolved
96
93
  when Puppet::Pops::Types::PSensitiveType::Sensitive
94
+ # If the resolved value is instance of Sensitive - assign the unwrapped value
95
+ # and mark it as sensitive if not already marked
96
+ #
97
97
  resolved = resolved.unwrap
98
98
  mark_sensitive_parameters(r, k)
99
- # If the value is a DeferredValue and it has an argument of type PSensitiveType, mark it as sensitive
100
- # The DeferredValue.resolve method will unwrap it during catalog application
99
+
101
100
  when Puppet::Pops::Evaluator::DeferredValue
102
- if v.arguments.any? { |arg| arg.is_a?(Puppet::Pops::Types::PSensitiveType) }
101
+ # If the resolved value is a DeferredValue and it has an argument of type
102
+ # PSensitiveType, mark it as sensitive. Since DeferredValues can nest,
103
+ # we must walk all arguments, e.g. the DeferredValue may call the `epp`
104
+ # function, where one of its arguments is a DeferredValue to call the
105
+ # `vault:lookup` function.
106
+ #
107
+ # The DeferredValue.resolve method will unwrap the sensitive during
108
+ # catalog application
109
+ #
110
+ if contains_sensitive_args?(v)
103
111
  mark_sensitive_parameters(r, k)
104
112
  end
105
113
  end
@@ -109,6 +117,33 @@ class DeferredResolver
109
117
  end
110
118
  end
111
119
 
120
+ # Return true if x contains an argument that is an instance of PSensitiveType:
121
+ #
122
+ # Deferred('new', [Sensitive, 'password'])
123
+ #
124
+ # Or an instance of PSensitiveType::Sensitive:
125
+ #
126
+ # Deferred('join', [['a', Sensitive('b')], ':'])
127
+ #
128
+ # Since deferred values can nest, descend into Arrays and Hash keys and values,
129
+ # short-circuiting when the first occurrence is found.
130
+ #
131
+ def contains_sensitive_args?(x)
132
+ case x
133
+ when @deferred_class
134
+ contains_sensitive_args?(x.arguments)
135
+ when Array
136
+ x.any? { |v| contains_sensitive_args?(v) }
137
+ when Hash
138
+ x.any? { |k, v| contains_sensitive_args?(k) || contains_sensitive_args?(v) }
139
+ when Puppet::Pops::Types::PSensitiveType, Puppet::Pops::Types::PSensitiveType::Sensitive
140
+ true
141
+ else
142
+ false
143
+ end
144
+ end
145
+ private :contains_sensitive_args?
146
+
112
147
  def mark_sensitive_parameters(r, k)
113
148
  unless r.sensitive_parameters.include?(k.to_sym)
114
149
  r.sensitive_parameters = (r.sensitive_parameters + [k.to_sym]).freeze
@@ -76,7 +76,8 @@ module Runtime3ResourceSupport
76
76
  end
77
77
 
78
78
  def self.resource_to_ptype(resource)
79
- nil if resource.nil?
79
+ return nil if resource.nil?
80
+
80
81
  # inference returns the meta type since the 3x Resource is an alternate way to describe a type
81
82
  Puppet::Pops::Types::TypeCalculator.singleton().infer(resource).type
82
83
  end
@@ -443,12 +443,6 @@ module Runtime3Support
443
443
  resource.valid_parameter?(name)
444
444
  end
445
445
 
446
- def resource_to_ptype(resource)
447
- nil if resource.nil?
448
- # inference returns the meta type since the 3x Resource is an alternate way to describe a type
449
- type_calculator.infer(resource).type
450
- end
451
-
452
446
  # This is the same type of "truth" as used in the current Puppet DSL.
453
447
  #
454
448
  def is_true?(value, o)
@@ -12,8 +12,22 @@ Puppet::Type.type(:file).provide :posix do
12
12
  require 'etc'
13
13
  require_relative '../../../puppet/util/selinux'
14
14
 
15
- def self.post_resource_eval
16
- Selinux.matchpathcon_fini if Puppet::Util::SELinux.selinux_support?
15
+ class << self
16
+ def selinux_handle
17
+ return nil unless Puppet::Util::SELinux.selinux_support?
18
+
19
+ # selabel_open takes 3 args: backend, options, and nopt. The backend param
20
+ # is a constant, SELABEL_CTX_FILE, which happens to be 0. Since options is
21
+ # nil, nopt can be 0 since nopt represents the # of options specified.
22
+ @selinux_handle ||= Selinux.selabel_open(Selinux::SELABEL_CTX_FILE, nil, 0)
23
+ end
24
+
25
+ def post_resource_eval
26
+ if @selinux_handle
27
+ Selinux.selabel_close(@selinux_handle)
28
+ @selinux_handle = nil
29
+ end
30
+ end
17
31
  end
18
32
 
19
33
  def uid2name(id)
@@ -83,6 +83,7 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
83
83
  custom_environment[:PATH] = windows_path_without_puppet_bin
84
84
  end
85
85
 
86
+ # This uses an unusual form of passing the command and args as [<cmd>, [<arg1>, <arg2>, ...]]
86
87
  execute(cmd, { :failonfail => true, :combine => true, :custom_environment => custom_environment })
87
88
  end
88
89
 
@@ -29,7 +29,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
29
29
 
30
30
  # Checks if a given name is a group
31
31
  def self.group?(name)
32
- !pacman("-Sg", name).empty?
32
+ !pacman('--sync', '--groups', name).empty?
33
33
  rescue Puppet::ExecutionFailure
34
34
  # pacman returns an expected non-zero exit code when the name is not a group
35
35
  false
@@ -74,7 +74,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
74
74
  # returns a hash package => version of installed packages
75
75
  def self.get_installed_packages
76
76
  packages = {}
77
- execpipe([command(:pacman), "-Q"]) do |pipe|
77
+ execpipe([command(:pacman), "--query"]) do |pipe|
78
78
  # pacman -Q output is 'packagename version-rel'
79
79
  regex = /^(\S+)\s(\S+)/
80
80
  pipe.each_line do |line|
@@ -96,7 +96,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
96
96
  groups = {}
97
97
  begin
98
98
  # Build a hash of group name => list of packages
99
- command = [command(:pacman), "-Sgg"]
99
+ command = [command(:pacman), '--sync', '-gg']
100
100
  command << filter if filter
101
101
  execpipe(command) do |pipe|
102
102
  pipe.each_line do |line|
@@ -134,14 +134,14 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
134
134
  resource_name = @resource[:name]
135
135
 
136
136
  # If target is a group, construct the group version
137
- return pacman("-Sp", "--print-format", "%n %v", resource_name).lines.map(&:chomp).sort.join(', ') if self.class.group?(resource_name)
137
+ return pacman("--sync", "--print", "--print-format", "%n %v", resource_name).lines.map(&:chomp).sort.join(', ') if self.class.group?(resource_name)
138
138
 
139
139
  # Start by querying with pacman first
140
140
  # If that fails, retry using yaourt against the AUR
141
141
  pacman_check = true
142
142
  begin
143
143
  if pacman_check
144
- output = pacman "-Sp", "--print-format", "%v", resource_name
144
+ output = pacman "--sync", "--print", "--print-format", "%v", resource_name
145
145
  output.chomp
146
146
  else
147
147
  output = yaourt "-Qma", resource_name
@@ -210,8 +210,8 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
210
210
 
211
211
  cmd = %w[--noconfirm --noprogressbar]
212
212
  cmd += uninstall_options if @resource[:uninstall_options]
213
- cmd << "-R"
214
- cmd << '-s' if is_group
213
+ cmd << "--remove"
214
+ cmd << '--recursive' if is_group
215
215
  cmd << '--nosave' if purge_configs
216
216
  cmd << resource_name
217
217
 
@@ -248,8 +248,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
248
248
  else
249
249
  fail _("Source %{source} is not supported by pacman") % { source: source }
250
250
  end
251
- pacman "--noconfirm", "--noprogressbar", "-S"
252
- pacman "--noconfirm", "--noprogressbar", "-U", source
251
+ pacman "--noconfirm", "--noprogressbar", "--update", source
253
252
  end
254
253
 
255
254
  def install_from_repo
@@ -260,7 +259,7 @@ Puppet::Type.type(:package).provide :pacman, :parent => Puppet::Provider::Packag
260
259
 
261
260
  cmd = %w[--noconfirm --needed --noprogressbar]
262
261
  cmd += install_options if @resource[:install_options]
263
- cmd << "-S" << resource_name
262
+ cmd << "--sync" << resource_name
264
263
 
265
264
  if self.class.yaourt?
266
265
  yaourt(*cmd)
@@ -115,11 +115,12 @@ Puppet::Type.type(:package).provide :pkgutil, :parent => :sun, :source => :sun d
115
115
 
116
116
  # Identify common types of pkgutil noise as it downloads catalogs etc
117
117
  def self.noise?(line)
118
- true if line =~ /^#/
119
- true if line =~ /^Checking integrity / # use_gpg
120
- true if line =~ /^gpg: / # gpg verification
121
- true if line =~ /^=+> / # catalog fetch
122
- true if line =~ /\d+:\d+:\d+ URL:/ # wget without -q
118
+ return true if line =~ /^#/
119
+ return true if line =~ /^Checking integrity / # use_gpg
120
+ return true if line =~ /^gpg: / # gpg verification
121
+ return true if line =~ /^=+> / # catalog fetch
122
+ return true if line =~ /\d+:\d+:\d+ URL:/ # wget without -q
123
+
123
124
  false
124
125
  end
125
126
 
@@ -8,20 +8,7 @@ Puppet::Type.type(:package).provide :puppet_gem, :parent => :gem do
8
8
 
9
9
  confine :true => Puppet.runtime[:facter].value(:aio_agent_version)
10
10
 
11
- def self.windows_gemcmd
12
- puppet_dir = ENV.fetch('PUPPET_DIR', nil)
13
- if puppet_dir
14
- File.join(puppet_dir.to_s, 'bin', 'gem.bat')
15
- else
16
- File.join(Gem.default_bindir, 'gem.bat')
17
- end
18
- end
19
-
20
- if Puppet::Util::Platform.windows?
21
- commands :gemcmd => windows_gemcmd
22
- else
23
- commands :gemcmd => "/opt/puppetlabs/puppet/bin/gem"
24
- end
11
+ commands :gemcmd => Puppet.run_mode.gem_cmd
25
12
 
26
13
  def uninstall
27
14
  super
@@ -30,7 +17,9 @@ Puppet::Type.type(:package).provide :puppet_gem, :parent => :gem do
30
17
  end
31
18
 
32
19
  def self.execute_gem_command(command, command_options, custom_environment = {})
33
- custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig' unless Puppet::Util::Platform.windows?
20
+ if (pkg_config_path = Puppet.run_mode.pkg_config_path)
21
+ custom_environment['PKG_CONFIG_PATH'] = pkg_config_path
22
+ end
34
23
  super(command, command_options, custom_environment)
35
24
  end
36
25
  end
@@ -41,8 +41,14 @@ config = Puppet::Util::Reference.newreference(:configuration, :depth => 1, :doc
41
41
  val = '$confdir/hiera.yaml. However, for backwards compatibility, if a file exists at $codedir/hiera.yaml, Puppet uses that instead.'
42
42
  when 'certname'
43
43
  val = "the Host's fully qualified domain name, as determined by Facter"
44
+ when 'hostname'
45
+ val = "(the system's fully qualified hostname)"
46
+ when 'domain'
47
+ val = "(the system's own domain)"
44
48
  when 'srv_domain'
45
49
  val = 'example.com'
50
+ when 'http_user_agent'
51
+ val = 'Puppet/<version> Ruby/<version> (<architecture>)'
46
52
  end
47
53
 
48
54
  # Leave out the section information; it was apparently confusing people.
@@ -95,6 +101,5 @@ config.header = <<~EOT
95
101
 
96
102
  [confguide]: https://puppet.com/docs/puppet/latest/config_about_settings.html
97
103
 
98
- * * *
99
104
 
100
105
  EOT
@@ -33,6 +33,16 @@ class Puppet::Resource::Type
33
33
  DOUBLE_COLON = '::'
34
34
  EMPTY_ARRAY = [].freeze
35
35
 
36
+ LOOKAROUND_OPERATORS = {
37
+ "(" => 'LP',
38
+ "?" => "QU",
39
+ "<" => "LT",
40
+ ">" => "GT",
41
+ "!" => "EX",
42
+ "=" => "EQ",
43
+ ")" => 'RP'
44
+ }.freeze
45
+
36
46
  attr_accessor :file, :line, :doc, :code, :parent, :resource_type_collection, :override
37
47
  attr_reader :namespace, :arguments, :behaves_like, :module_name
38
48
 
@@ -196,7 +206,11 @@ class Puppet::Resource::Type
196
206
 
197
207
  def name
198
208
  if type == :node && name_is_regex?
199
- "__node_regexp__#{@name.source.downcase.gsub(/[^-\w:.]/, '').sub(/^\.+/, '')}"
209
+ # Normalize lookarround regex patthern
210
+ internal_name = @name.source.downcase.gsub(/\(\?[^)]*\)/) do |str|
211
+ str.gsub(/./) { |ch| LOOKAROUND_OPERATORS[ch] || ch }
212
+ end
213
+ "__node_regexp__#{internal_name.gsub(/[^-\w:.]/, '').sub(/^\.+/, '')}"
200
214
  else
201
215
  @name
202
216
  end
@@ -25,15 +25,6 @@ module Puppet::Scheduler
25
25
  end
26
26
  end
27
27
 
28
- # Recalculates splay.
29
- #
30
- # @param splay_limit [Integer] the maximum time (in seconds) to delay before an agent's first run.
31
- # @return @splay [Integer] a random integer less than or equal to the splay limit that represents the seconds to
32
- # delay before next agent run.
33
- def splay_limit=(splay_limit)
34
- @splay = calculate_splay(splay_limit)
35
- end
36
-
37
28
  private
38
29
 
39
30
  def calculate_splay(limit)
@@ -81,11 +81,11 @@ class Puppet::Settings
81
81
  end
82
82
 
83
83
  def self.hostname_fact
84
- Puppet.runtime[:facter].value 'networking.hostname'
84
+ Puppet.runtime[:facter].value('networking.hostname')
85
85
  end
86
86
 
87
87
  def self.domain_fact
88
- Puppet.runtime[:facter].value 'networking.domain'
88
+ Puppet.runtime[:facter].value('networking.domain')
89
89
  end
90
90
 
91
91
  def self.default_config_file_name
@@ -235,9 +235,13 @@ class Puppet::Transaction::ResourceHarness
235
235
  end
236
236
 
237
237
  def noop(event, param, current_value, audit_message)
238
- event.message = param.format(_("current_value %s, should be %s (noop)"),
239
- param.is_to_s(current_value),
240
- param.should_to_s(param.should)) + audit_message.to_s
238
+ if param.sensitive
239
+ event.message = param.format(_("current_value %s, should be %s (noop)"),
240
+ param.is_to_s(current_value),
241
+ param.should_to_s(param.should)) + audit_message.to_s
242
+ else
243
+ event.message = "#{param.change_to_s(current_value, param.should)} (noop)#{audit_message}"
244
+ end
241
245
  event.status = "noop"
242
246
  end
243
247
 
@@ -437,13 +437,12 @@ module Puppet
437
437
  actually contain `myfile`, the exec will keep running every time
438
438
  Puppet runs.
439
439
 
440
- This parameter can also take an array of files and the command will
441
- not run if **any** of these files exist. For example:
440
+ This parameter can also take an array of files, and the command will
441
+ not run if **any** of these files exist. Consider this example:
442
442
 
443
443
  creates => ['/tmp/file1', '/tmp/file2'],
444
444
 
445
- will only run the command if both files don't exist.
446
-
445
+ The command is only run if both files don't exist.
447
446
  EOT
448
447
 
449
448
  accept_arrays
@@ -7,11 +7,13 @@ require_relative '../../../puppet/util/checksums'
7
7
  Puppet::Type.type(:file).newparam(:checksum) do
8
8
  include Puppet::Util::Checksums
9
9
 
10
+ # The default is defined in Puppet.default_digest_algorithm
10
11
  desc "The checksum type to use when determining whether to replace a file's contents.
11
12
 
12
- The default checksum type is #{Puppet.default_digest_algorithm}."
13
+ The default checksum type is sha256."
13
14
 
14
- newvalues(*Puppet::Util::Checksums.known_checksum_types)
15
+ # The values are defined in Puppet::Util::Checksums.known_checksum_types
16
+ newvalues(:sha256, :sha256lite, :md5, :md5lite, :sha1, :sha1lite, :sha512, :sha384, :sha224, :mtime, :ctime, :none)
15
17
 
16
18
  defaultto do
17
19
  Puppet[:digest_algorithm].to_sym
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Puppet
4
4
  Puppet::Type.type(:file).newproperty(:ctime) do
5
- desc %q(A read-only state to check the file ctime. On most modern \*nix-like
5
+ desc "A read-only state to check the file ctime. On most modern \*nix-like
6
6
  systems, this is the time of the most recent change to the owner, group,
7
- permissions, or content of the file.)
7
+ permissions, or content of the file."
8
8
 
9
9
  def retrieve
10
10
  current_value = :absent
@@ -2,8 +2,8 @@
2
2
 
3
3
  module Puppet
4
4
  Puppet::Type.type(:file).newproperty(:mtime) do
5
- desc %q(A read-only state to check the file mtime. On \*nix-like systems, this
6
- is the time of the most recent change to the content of the file.)
5
+ desc "A read-only state to check the file mtime. On \*nix-like systems, this
6
+ is the time of the most recent change to the content of the file."
7
7
 
8
8
  def retrieve
9
9
  current_value = :absent
@@ -40,11 +40,12 @@ module Puppet
40
40
  end
41
41
 
42
42
  def retrieve_default_context(property)
43
+ return nil if Puppet::Util::Platform.windows?
43
44
  if @resource[:selinux_ignore_defaults] == :true
44
45
  return nil
45
46
  end
46
47
 
47
- context = get_selinux_default_context(@resource[:path], @resource[:ensure])
48
+ context = get_selinux_default_context_with_handle(@resource[:path], provider.class.selinux_handle, @resource[:ensure])
48
49
  unless context
49
50
  return nil
50
51
  end
@@ -85,7 +86,7 @@ module Puppet
85
86
  end
86
87
 
87
88
  Puppet::Type.type(:file).newparam(:selinux_ignore_defaults) do
88
- desc "If this is set then Puppet will not ask SELinux (via matchpathcon) to
89
+ desc "If this is set, Puppet will not call the SELinux function selabel_lookup to
89
90
  supply defaults for the SELinux attributes (seluser, selrole,
90
91
  seltype, and selrange). In general, you should leave this set at its
91
92
  default and only set it to true when you need Puppet to not try to fix
@@ -98,7 +99,7 @@ module Puppet
98
99
  Puppet::Type.type(:file).newproperty(:seluser, :parent => Puppet::SELFileContext) do
99
100
  desc "What the SELinux user component of the context of the file should be.
100
101
  Any valid SELinux user component is accepted. For example `user_u`.
101
- If not specified it defaults to the value returned by matchpathcon for
102
+ If not specified, it defaults to the value returned by selabel_lookup for
102
103
  the file, if any exists. Only valid on systems with SELinux support
103
104
  enabled."
104
105
 
@@ -109,7 +110,7 @@ module Puppet
109
110
  Puppet::Type.type(:file).newproperty(:selrole, :parent => Puppet::SELFileContext) do
110
111
  desc "What the SELinux role component of the context of the file should be.
111
112
  Any valid SELinux role component is accepted. For example `role_r`.
112
- If not specified it defaults to the value returned by matchpathcon for
113
+ If not specified, it defaults to the value returned by selabel_lookup for
113
114
  the file, if any exists. Only valid on systems with SELinux support
114
115
  enabled."
115
116
 
@@ -120,7 +121,7 @@ module Puppet
120
121
  Puppet::Type.type(:file).newproperty(:seltype, :parent => Puppet::SELFileContext) do
121
122
  desc "What the SELinux type component of the context of the file should be.
122
123
  Any valid SELinux type component is accepted. For example `tmp_t`.
123
- If not specified it defaults to the value returned by matchpathcon for
124
+ If not specified, it defaults to the value returned by selabel_lookup for
124
125
  the file, if any exists. Only valid on systems with SELinux support
125
126
  enabled."
126
127
 
@@ -131,8 +132,8 @@ module Puppet
131
132
  Puppet::Type.type(:file).newproperty(:selrange, :parent => Puppet::SELFileContext) do
132
133
  desc "What the SELinux range component of the context of the file should be.
133
134
  Any valid SELinux range component is accepted. For example `s0` or
134
- `SystemHigh`. If not specified it defaults to the value returned by
135
- matchpathcon for the file, if any exists. Only valid on systems with
135
+ `SystemHigh`. If not specified, it defaults to the value returned by
136
+ selabel_lookup for the file, if any exists. Only valid on systems with
136
137
  SELinux support enabled and that have support for MCS (Multi-Category
137
138
  Security)."
138
139
 
@@ -44,22 +44,20 @@ module Puppet
44
44
 
45
45
  raise Puppet::Error, "Could not remove existing file" if Puppet::FileSystem.exist?(@resource[:path])
46
46
 
47
- Dir.chdir(File.dirname(@resource[:path])) do
48
- Puppet::Util::SUIDManager.asuser(@resource.asuser) do
49
- mode = @resource.should(:mode)
50
- if mode
51
- Puppet::Util.withumask(0o00) do
52
- Puppet::FileSystem.symlink(target, @resource[:path])
53
- end
54
- else
47
+ Puppet::Util::SUIDManager.asuser(@resource.asuser) do
48
+ mode = @resource.should(:mode)
49
+ if mode
50
+ Puppet::Util.withumask(0o00) do
55
51
  Puppet::FileSystem.symlink(target, @resource[:path])
56
52
  end
53
+ else
54
+ Puppet::FileSystem.symlink(target, @resource[:path])
57
55
  end
56
+ end
58
57
 
59
- @resource.send(:property_fix)
58
+ @resource.send(:property_fix)
60
59
 
61
- :link_created
62
- end
60
+ :link_created
63
61
  end
64
62
 
65
63
  def insync?(currentvalue)
@@ -301,12 +301,13 @@ module Puppet
301
301
  command => '/opt/ruby/bin/gem',
302
302
  }
303
303
 
304
- Each provider defines a package management command; and uses the first
304
+ Each provider defines a package management command and uses the first
305
305
  instance of the command found in the PATH.
306
306
 
307
307
  Providers supporting the targetable feature allow you to specify the
308
- absolute path of the package management command; useful when multiple
309
- instances of the command are installed, or the command is not in the PATH.
308
+ absolute path of the package management command. Specifying the absolute
309
+ path is useful when multiple instances of the command are installed, or
310
+ the command is not in the PATH.
310
311
  EOT
311
312
 
312
313
  isnamevar
@@ -231,7 +231,7 @@ module Puppet
231
231
  * OS X 10.8 and higher use salted SHA512 PBKDF2 hashes. When managing passwords
232
232
  on these systems, the `salt` and `iterations` attributes need to be specified as
233
233
  well as the password.
234
- * macOS 10.15 and higher require the salt to be 32-bytes. Since Puppet's user
234
+ * macOS 10.15 and later require the salt to be 32 bytes. Because Puppet's user
235
235
  resource requires the value to be hex encoded, the length of the salt's
236
236
  string must be 64.
237
237
  * Windows passwords can be managed only in cleartext, because there is no Windows
@@ -9,6 +9,7 @@ require 'time'
9
9
  module Puppet::Util::Checksums
10
10
  module_function
11
11
 
12
+ # If you modify this, update puppet/type/file/checksum.rb too
12
13
  KNOWN_CHECKSUMS = [
13
14
  :sha256, :sha256lite,
14
15
  :md5, :md5lite,
@@ -323,7 +323,7 @@ module Puppet::Util::Execution
323
323
  unless options[:squelch]
324
324
  # if we opened a pipe, we need to clean it up.
325
325
  reader.close if reader
326
- stdout.close! if Puppet::Util::Platform.windows?
326
+ stdout.close! if stdout && Puppet::Util::Platform.windows?
327
327
  end
328
328
  end
329
329
 
@@ -72,11 +72,11 @@ class Puppet::Util::Profiler::Aggregate < Puppet::Util::Profiler::WallClock
72
72
 
73
73
  class Timer
74
74
  def initialize
75
- @start = Time.now
75
+ @start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_second)
76
76
  end
77
77
 
78
78
  def stop
79
- Time.now - @start
79
+ Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_second) - @start
80
80
  end
81
81
  end
82
82
  end
@@ -21,11 +21,11 @@ class Puppet::Util::Profiler::WallClock < Puppet::Util::Profiler::Logging
21
21
  FOUR_DECIMAL_DIGITS = '%0.4f'
22
22
 
23
23
  def initialize
24
- @start = Time.now
24
+ @start = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_second)
25
25
  end
26
26
 
27
27
  def stop
28
- @time = Time.now - @start
28
+ @time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_second) - @start
29
29
  @time
30
30
  end
31
31