puppet 6.14.0-universal-darwin → 6.15.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +15 -15
  3. data/ext/windows/service/daemon.rb +3 -3
  4. data/lib/puppet.rb +1 -1
  5. data/lib/puppet/agent.rb +2 -10
  6. data/lib/puppet/application/agent.rb +2 -1
  7. data/lib/puppet/application/filebucket.rb +5 -14
  8. data/lib/puppet/application/ssl.rb +2 -2
  9. data/lib/puppet/configurer.rb +7 -3
  10. data/lib/puppet/configurer/plugin_handler.rb +1 -1
  11. data/lib/puppet/defaults.rb +22 -2
  12. data/lib/puppet/environments.rb +4 -5
  13. data/lib/puppet/face/plugin.rb +1 -1
  14. data/lib/puppet/file_system/file_impl.rb +13 -9
  15. data/lib/puppet/forge/repository.rb +1 -1
  16. data/lib/puppet/functions/call.rb +1 -1
  17. data/lib/puppet/functions/reduce.rb +2 -4
  18. data/lib/puppet/http.rb +2 -0
  19. data/lib/puppet/http/client.rb +191 -52
  20. data/lib/puppet/http/external_client.rb +96 -0
  21. data/lib/puppet/http/redirector.rb +34 -0
  22. data/lib/puppet/http/resolver.rb +46 -3
  23. data/lib/puppet/http/resolver/server_list.rb +75 -15
  24. data/lib/puppet/http/resolver/settings.rb +22 -2
  25. data/lib/puppet/http/resolver/srv.rb +28 -2
  26. data/lib/puppet/http/response.rb +63 -1
  27. data/lib/puppet/http/retry_after_handler.rb +39 -0
  28. data/lib/puppet/http/service.rb +67 -1
  29. data/lib/puppet/http/service/ca.rb +71 -9
  30. data/lib/puppet/http/service/compiler.rb +213 -11
  31. data/lib/puppet/http/service/file_server.rb +105 -4
  32. data/lib/puppet/http/service/report.rb +36 -3
  33. data/lib/puppet/http/session.rb +59 -8
  34. data/lib/puppet/indirector/catalog/rest.rb +2 -1
  35. data/lib/puppet/indirector/facts/rest.rb +2 -1
  36. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  37. data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
  38. data/lib/puppet/indirector/node/rest.rb +2 -1
  39. data/lib/puppet/indirector/report/yaml.rb +23 -0
  40. data/lib/puppet/indirector/status/rest.rb +2 -1
  41. data/lib/puppet/metatype/manager.rb +80 -80
  42. data/lib/puppet/network/http/base_pool.rb +6 -1
  43. data/lib/puppet/network/http/pool.rb +2 -4
  44. data/lib/puppet/network/http_pool.rb +1 -0
  45. data/lib/puppet/node/environment.rb +11 -1
  46. data/lib/puppet/pal/pal_impl.rb +1 -29
  47. data/lib/puppet/parser/compiler.rb +14 -7
  48. data/lib/puppet/parser/functions.rb +18 -13
  49. data/lib/puppet/pops/loaders.rb +7 -5
  50. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  51. data/lib/puppet/provider/package/apt.rb +61 -1
  52. data/lib/puppet/provider/package/dnfmodule.rb +39 -12
  53. data/lib/puppet/provider/package/gem.rb +41 -7
  54. data/lib/puppet/provider/package/pacman.rb +2 -5
  55. data/lib/puppet/provider/package/pip.rb +105 -33
  56. data/lib/puppet/provider/package/pip3.rb +0 -2
  57. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  58. data/lib/puppet/provider/package/pkgng.rb +16 -4
  59. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  60. data/lib/puppet/provider/package/rpm.rb +6 -213
  61. data/lib/puppet/provider/package/yum.rb +92 -19
  62. data/lib/puppet/provider/service/systemd.rb +2 -1
  63. data/lib/puppet/reports/http.rb +13 -11
  64. data/lib/puppet/resource/type_collection.rb +20 -16
  65. data/lib/puppet/ssl.rb +1 -0
  66. data/lib/puppet/ssl/host.rb +4 -4
  67. data/lib/puppet/ssl/oids.rb +1 -0
  68. data/lib/puppet/ssl/state_machine.rb +50 -33
  69. data/lib/puppet/transaction/report.rb +2 -2
  70. data/lib/puppet/type.rb +6 -1
  71. data/lib/puppet/type/file/source.rb +4 -2
  72. data/lib/puppet/type/package.rb +25 -2
  73. data/lib/puppet/type/user.rb +0 -19
  74. data/lib/puppet/util/at_fork.rb +1 -1
  75. data/lib/puppet/util/autoload.rb +3 -0
  76. data/lib/puppet/util/instance_loader.rb +14 -10
  77. data/lib/puppet/util/package/version/debian.rb +175 -0
  78. data/lib/puppet/util/package/version/gem.rb +15 -0
  79. data/lib/puppet/util/package/version/pip.rb +167 -0
  80. data/lib/puppet/util/package/version/range.rb +50 -0
  81. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  82. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  83. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  84. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  85. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  86. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  87. data/lib/puppet/util/package/version/rpm.rb +73 -0
  88. data/lib/puppet/util/pidlock.rb +13 -7
  89. data/lib/puppet/util/platform.rb +5 -0
  90. data/lib/puppet/util/rpm_compare.rb +193 -0
  91. data/lib/puppet/util/windows/adsi.rb +2 -2
  92. data/lib/puppet/util/windows/process.rb +15 -14
  93. data/lib/puppet/util/windows/security.rb +1 -0
  94. data/lib/puppet/util/windows/sid.rb +3 -3
  95. data/lib/puppet/version.rb +1 -1
  96. data/locales/puppet.pot +207 -201
  97. data/man/man5/puppet.conf.5 +11 -3
  98. data/man/man8/puppet-agent.8 +1 -1
  99. data/man/man8/puppet-apply.8 +1 -1
  100. data/man/man8/puppet-catalog.8 +1 -1
  101. data/man/man8/puppet-config.8 +1 -1
  102. data/man/man8/puppet-describe.8 +1 -1
  103. data/man/man8/puppet-device.8 +1 -1
  104. data/man/man8/puppet-doc.8 +1 -1
  105. data/man/man8/puppet-epp.8 +1 -1
  106. data/man/man8/puppet-facts.8 +1 -1
  107. data/man/man8/puppet-filebucket.8 +1 -1
  108. data/man/man8/puppet-generate.8 +1 -1
  109. data/man/man8/puppet-help.8 +1 -1
  110. data/man/man8/puppet-key.8 +1 -1
  111. data/man/man8/puppet-lookup.8 +1 -1
  112. data/man/man8/puppet-man.8 +1 -1
  113. data/man/man8/puppet-module.8 +1 -1
  114. data/man/man8/puppet-node.8 +1 -1
  115. data/man/man8/puppet-parser.8 +1 -1
  116. data/man/man8/puppet-plugin.8 +1 -1
  117. data/man/man8/puppet-report.8 +1 -1
  118. data/man/man8/puppet-resource.8 +1 -1
  119. data/man/man8/puppet-script.8 +1 -1
  120. data/man/man8/puppet-ssl.8 +1 -1
  121. data/man/man8/puppet-status.8 +1 -1
  122. data/man/man8/puppet.8 +2 -2
  123. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  124. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  125. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  126. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  127. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
  128. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  129. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  130. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  131. data/spec/integration/application/agent_spec.rb +329 -0
  132. data/spec/integration/application/apply_spec.rb +132 -3
  133. data/spec/integration/application/filebucket_spec.rb +190 -0
  134. data/spec/integration/application/plugin_spec.rb +50 -0
  135. data/spec/integration/http/client_spec.rb +34 -40
  136. data/spec/integration/indirector/report/yaml.rb +83 -0
  137. data/spec/integration/module_tool/forge_spec.rb +2 -15
  138. data/spec/integration/network/http_pool_spec.rb +11 -19
  139. data/spec/integration/node/environment_spec.rb +15 -0
  140. data/spec/integration/util/windows/adsi_spec.rb +1 -1
  141. data/spec/lib/puppet/test_ca.rb +2 -2
  142. data/spec/lib/puppet_spec/https.rb +10 -7
  143. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  144. data/spec/shared_contexts/https.rb +29 -0
  145. data/spec/unit/agent_spec.rb +33 -25
  146. data/spec/unit/application/agent_spec.rb +5 -1
  147. data/spec/unit/application/device_spec.rb +2 -2
  148. data/spec/unit/application/filebucket_spec.rb +22 -2
  149. data/spec/unit/configurer_spec.rb +1 -1
  150. data/spec/unit/defaults_spec.rb +24 -1
  151. data/spec/unit/environments_spec.rb +8 -0
  152. data/spec/unit/file_system_spec.rb +10 -0
  153. data/spec/unit/http/client_spec.rb +105 -46
  154. data/spec/unit/http/external_client_spec.rb +201 -0
  155. data/spec/unit/http/resolver_spec.rb +20 -0
  156. data/spec/unit/http/service/ca_spec.rb +25 -2
  157. data/spec/unit/http/service/compiler_spec.rb +184 -6
  158. data/spec/unit/http/service/file_server_spec.rb +35 -3
  159. data/spec/unit/http/service/report_spec.rb +3 -1
  160. data/spec/unit/http/service_spec.rb +3 -3
  161. data/spec/unit/http/session_spec.rb +56 -7
  162. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  163. data/spec/unit/network/http/pool_spec.rb +3 -3
  164. data/spec/unit/node/environment_spec.rb +16 -0
  165. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  166. data/spec/unit/provider/package/apt_spec.rb +30 -0
  167. data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
  168. data/spec/unit/provider/package/gem_spec.rb +40 -0
  169. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  170. data/spec/unit/provider/package/pip_spec.rb +26 -3
  171. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  172. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  173. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  174. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  175. data/spec/unit/provider/package/yum_spec.rb +235 -1
  176. data/spec/unit/provider/service/systemd_spec.rb +10 -1
  177. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  178. data/spec/unit/puppet_pal_2pec.rb +0 -29
  179. data/spec/unit/reports/http_spec.rb +70 -52
  180. data/spec/unit/ssl/host_spec.rb +4 -2
  181. data/spec/unit/ssl/oids_spec.rb +1 -0
  182. data/spec/unit/ssl/state_machine_spec.rb +38 -6
  183. data/spec/unit/transaction/report_spec.rb +4 -0
  184. data/spec/unit/util/at_fork_spec.rb +2 -2
  185. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  186. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  187. data/spec/unit/util/package/version/range_spec.rb +154 -0
  188. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  189. data/spec/unit/util/pidlock_spec.rb +83 -47
  190. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  191. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  192. data/spec/unit/util/windows/sid_spec.rb +2 -2
  193. data/tasks/generate_cert_fixtures.rake +15 -1
  194. metadata +51 -6
  195. data/spec/integration/faces/plugin_spec.rb +0 -63
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Gt < Simple
6
+ def to_s
7
+ ">#{@version}"
8
+ end
9
+ def include?(version)
10
+ version > @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class GtEq < Simple
6
+ def to_s
7
+ ">=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version >= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Lt< Simple
6
+ def to_s
7
+ "<#{@version}"
8
+ end
9
+ def include?(version)
10
+ version < @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'puppet/util/package/version/range/simple'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class LtEq < Simple
6
+ def to_s
7
+ "<=#{@version}"
8
+ end
9
+ def include?(version)
10
+ version <= @version
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class MinMax
6
+ def initialize(min, max)
7
+ @min = min
8
+ @max = max
9
+ end
10
+ def to_s
11
+ "#{@min} #{@max}"
12
+ end
13
+ def to_gem_version
14
+ "#{@min}, #{@max}"
15
+ end
16
+ def include?(version)
17
+ @min.include?(version) && @max.include?(version)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ require 'puppet/util/package/version/range'
2
+
3
+ module Puppet::Util::Package::Version
4
+ class Range
5
+ class Simple
6
+ def initialize(version)
7
+ @version = version
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ require 'puppet/util/rpm_compare'
3
+
4
+ module Puppet::Util::Package::Version
5
+ class Rpm < Numeric
6
+ # provides Rpm parsing and comparison
7
+ extend Puppet::Util::RpmCompare
8
+ include Puppet::Util::RpmCompare
9
+ include Comparable
10
+
11
+ class ValidationFailure < ArgumentError; end
12
+
13
+ attr_reader :epoch, :version, :release, :arch
14
+
15
+ def self.parse(ver)
16
+ raise ValidationFailure unless ver.is_a?(String)
17
+ version = rpm_parse_evr(ver)
18
+ new(version[:epoch], version[:version], version[:release], version[:arch]).freeze
19
+ end
20
+
21
+ def to_s
22
+ version_found = ''
23
+ version_found += "#{@epoch}:" if @epoch
24
+ version_found += @version
25
+ version_found += "-#{@release}" if @release
26
+ version_found
27
+ end
28
+ alias inspect to_s
29
+
30
+ def eql?(other)
31
+ other.is_a?(self.class) &&
32
+ @epoch.eql?(other.epoch) &&
33
+ @version.eql?(other.version) &&
34
+ @release.eql?(other.release) &&
35
+ @arch.eql?(other.arch)
36
+ end
37
+ alias == eql?
38
+
39
+ def <=>(other)
40
+ raise ArgumentError, _("Cannot compare, as %{other} is not a Rpm Version") % { other: other } unless other.is_a?(self.class)
41
+
42
+ rpm_compareEVR(self.to_s, other.to_s)
43
+ end
44
+
45
+ private
46
+
47
+ # overwrite rpm_compareEVR to treat no epoch as zero epoch
48
+ # in order to compare version correctly
49
+ #
50
+ # returns 1 if a is newer than b,
51
+ # 0 if they are identical
52
+ # -1 if a is older than b
53
+ def rpm_compareEVR(a, b)
54
+ a_hash = rpm_parse_evr(a)
55
+ b_hash = rpm_parse_evr(b)
56
+
57
+ a_hash[:epoch] ||= '0'
58
+ b_hash[:epoch] ||= '0'
59
+
60
+ rc = compare_values(a_hash[:epoch], b_hash[:epoch])
61
+ return rc unless rc == 0
62
+
63
+ super(a, b)
64
+ end
65
+
66
+ def initialize(epoch, version, release, arch)
67
+ @epoch = epoch
68
+ @version = version
69
+ @release = release
70
+ @arch = arch
71
+ end
72
+ end
73
+ end
@@ -57,7 +57,9 @@ class Puppet::Util::Pidlock
57
57
  end
58
58
 
59
59
  def clear_if_stale
60
- return @lockfile.unlock if lock_pid.nil?
60
+ pid = lock_pid
61
+ return @lockfile.unlock if pid == nil
62
+ return if Process.pid == pid
61
63
 
62
64
  errors = [Errno::ESRCH]
63
65
  # Win32::Process now throws SystemCallError. Since this could be
@@ -65,7 +67,7 @@ class Puppet::Util::Pidlock
65
67
  errors << SystemCallError if Puppet::Util::Platform.windows?
66
68
 
67
69
  begin
68
- Process.kill(0, lock_pid)
70
+ Process.kill(0, pid)
69
71
  rescue *errors
70
72
  return @lockfile.unlock
71
73
  end
@@ -78,19 +80,23 @@ class Puppet::Util::Pidlock
78
80
 
79
81
  # Check, obtain and use the right ps argument
80
82
  begin
81
- procname = Puppet::Util::Execution.execute(["ps", ps_argument, lock_pid, "-o", "comm="]).strip
83
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
82
84
  rescue Puppet::ExecutionFailure
83
85
  ps_argument = "-p"
84
- procname = Puppet::Util::Execution.execute(["ps", ps_argument, lock_pid, "-o", "comm="]).strip
86
+ procname = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "comm="]).strip
85
87
  end
86
88
 
87
- args = Puppet::Util::Execution.execute(["ps", ps_argument, lock_pid, "-o", "args="]).strip
89
+ args = Puppet::Util::Execution.execute(["ps", ps_argument, pid, "-o", "args="]).strip
88
90
  @lockfile.unlock unless procname =~ /ruby/ && args =~ /puppet/ || procname =~ /puppet(-.*)?$/
89
91
  elsif Puppet.features.microsoft_windows?
90
92
  # On Windows, we're checking if the filesystem path name of the running
91
93
  # process is our vendored ruby:
92
- exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(lock_pid)
93
- @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
94
+ begin
95
+ exe_path = Puppet::Util::Windows::Process::get_process_image_name_by_pid(pid)
96
+ @lockfile.unlock unless exe_path =~ /\\bin\\ruby.exe$/
97
+ rescue Puppet::Util::Windows::Error => e
98
+ Puppet.debug("Failed to read pidfile #{file_path}: #{e.message}")
99
+ end
94
100
  end
95
101
  end
96
102
  end
@@ -14,6 +14,11 @@ module Puppet
14
14
  end
15
15
  module_function :windows?
16
16
 
17
+ def solaris?
18
+ RUBY_PLATFORM.include?('solaris')
19
+ end
20
+ module_function :solaris?
21
+
17
22
  def default_paths
18
23
  return [] if windows?
19
24
 
@@ -0,0 +1,193 @@
1
+ module Puppet::Util::RpmCompare
2
+
3
+ ARCH_LIST = %w(
4
+ noarch i386 i686 ppc ppc64 armv3l armv4b armv4l armv4tl armv5tel
5
+ armv5tejl armv6l armv7l m68kmint s390 s390x ia64 x86_64 sh3 sh4
6
+ ).freeze
7
+
8
+ ARCH_REGEX = Regexp.new(ARCH_LIST.join('|\.'))
9
+
10
+ # This is an attempt at implementing RPM's
11
+ # lib/rpmvercmp.c rpmvercmp(a, b) in Ruby.
12
+ #
13
+ # Some of the things in here look REALLY
14
+ # UGLY and/or arbitrary. Our goal is to
15
+ # match how RPM compares versions, quirks
16
+ # and all.
17
+ #
18
+ # I've kept a lot of C-like string processing
19
+ # in an effort to keep this as identical to RPM
20
+ # as possible.
21
+ #
22
+ # returns 1 if str1 is newer than str2,
23
+ # 0 if they are identical
24
+ # -1 if str1 is older than str2
25
+ def rpmvercmp(str1, str2)
26
+ return 0 if str1 == str2
27
+
28
+ front_strip_re = /^[^A-Za-z0-9~]+/
29
+
30
+ while str1.length > 0 or str2.length > 0
31
+ # trim anything that's in front_strip_re and != '~' off the beginning of each string
32
+ str1 = str1.gsub(front_strip_re, '')
33
+ str2 = str2.gsub(front_strip_re, '')
34
+
35
+ # "handle the tilde separator, it sorts before everything else"
36
+ if str1 =~ /^~/ && str2 =~ /^~/
37
+ # if they both have ~, strip it
38
+ str1 = str1[1..-1]
39
+ str2 = str2[1..-1]
40
+ next
41
+ elsif str1 =~ /^~/
42
+ return -1
43
+ elsif str2 =~ /^~/
44
+ return 1
45
+ end
46
+
47
+ break if str1.length == 0 or str2.length == 0
48
+
49
+ # "grab first completely alpha or completely numeric segment"
50
+ isnum = false
51
+ # if the first char of str1 is a digit, grab the chunk of continuous digits from each string
52
+ if str1 =~ /^[0-9]+/
53
+ if str1 =~ /^[0-9]+/
54
+ segment1 = $~.to_s
55
+ str1 = $~.post_match
56
+ else
57
+ segment1 = ''
58
+ end
59
+ if str2 =~ /^[0-9]+/
60
+ segment2 = $~.to_s
61
+ str2 = $~.post_match
62
+ else
63
+ segment2 = ''
64
+ end
65
+ isnum = true
66
+ # else grab the chunk of continuous alphas from each string (which may be '')
67
+ else
68
+ if str1 =~ /^[A-Za-z]+/
69
+ segment1 = $~.to_s
70
+ str1 = $~.post_match
71
+ else
72
+ segment1 = ''
73
+ end
74
+ if str2 =~ /^[A-Za-z]+/
75
+ segment2 = $~.to_s
76
+ str2 = $~.post_match
77
+ else
78
+ segment2 = ''
79
+ end
80
+ end
81
+
82
+ # if the segments we just grabbed from the strings are different types (i.e. one numeric one alpha),
83
+ # where alpha also includes ''; "numeric segments are always newer than alpha segments"
84
+ if segment2.length == 0
85
+ return 1 if isnum
86
+ return -1
87
+ end
88
+
89
+ if isnum
90
+ # "throw away any leading zeros - it's a number, right?"
91
+ segment1 = segment1.gsub(/^0+/, '')
92
+ segment2 = segment2.gsub(/^0+/, '')
93
+ # "whichever number has more digits wins"
94
+ return 1 if segment1.length > segment2.length
95
+ return -1 if segment1.length < segment2.length
96
+ end
97
+
98
+ # "strcmp will return which one is greater - even if the two segments are alpha
99
+ # or if they are numeric. don't return if they are equal because there might
100
+ # be more segments to compare"
101
+ rc = segment1 <=> segment2
102
+ return rc if rc != 0
103
+ end #end while loop
104
+
105
+ # if we haven't returned anything yet, "whichever version still has characters left over wins"
106
+ return 1 if str1.length > str2.length
107
+ return -1 if str1.length < str2.length
108
+ 0
109
+ end
110
+
111
+ # parse a rpm "version" specification
112
+ # this re-implements rpm's
113
+ # rpmUtils.miscutils.stringToVersion() in ruby
114
+ def rpm_parse_evr(full_version)
115
+ epoch_index = full_version.index(':')
116
+ if epoch_index
117
+ epoch = full_version[0,epoch_index]
118
+ full_version = full_version[epoch_index+1,full_version.length]
119
+ else
120
+ epoch = nil
121
+ end
122
+ begin
123
+ epoch = String(Integer(epoch))
124
+ rescue
125
+ # If there are non-digits in the epoch field, default to nil
126
+ epoch = nil
127
+ end
128
+ release_index = full_version.index('-')
129
+ if release_index
130
+ version = full_version[0,release_index]
131
+ release = full_version[release_index+1,full_version.length]
132
+ arch = release.scan(ARCH_REGEX)[0]
133
+ if arch
134
+ architecture = arch.delete('.')
135
+ release.gsub!(ARCH_REGEX, '')
136
+ end
137
+ else
138
+ version = full_version
139
+ release = nil
140
+ end
141
+ return { :epoch => epoch, :version => version, :release => release, :arch => architecture }
142
+ end
143
+
144
+ # this method is a native implementation of the
145
+ # compare_values function in rpm's python bindings,
146
+ # found in python/header-py.c, as used by rpm.
147
+ def compare_values(s1, s2)
148
+ return 0 if s1.nil? && s2.nil?
149
+ return 1 if ( not s1.nil? ) && s2.nil?
150
+ return -1 if s1.nil? && (not s2.nil?)
151
+ return rpmvercmp(s1, s2)
152
+ end
153
+
154
+ # how rpm compares two package versions:
155
+ # rpmUtils.miscutils.compareEVR(), which massages data types and then calls
156
+ # rpm.labelCompare(), found in rpm.git/python/header-py.c, which
157
+ # sets epoch to 0 if null, then compares epoch, then ver, then rel
158
+ # using compare_values() and returns the first non-0 result, else 0.
159
+ # This function combines the logic of compareEVR() and labelCompare().
160
+ #
161
+ # "version_should" can be v, v-r, or e:v-r.
162
+ # "version_is" will always be at least v-r, can be e:v-r
163
+ #
164
+ # return 1: a is newer than b
165
+ # 0: a and b are the same version
166
+ # -1: b is newer than a
167
+ def rpm_compareEVR(should, is)
168
+ # pass on to rpm labelCompare
169
+ should_hash = rpm_parse_evr(should)
170
+ is_hash = rpm_parse_evr(is)
171
+
172
+ if !should_hash[:epoch].nil?
173
+ rc = compare_values(should_hash[:epoch], is_hash[:epoch])
174
+ return rc unless rc == 0
175
+ end
176
+
177
+ rc = compare_values(should_hash[:version], is_hash[:version])
178
+ return rc unless rc == 0
179
+
180
+ # here is our special case, PUP-1244.
181
+ # if should_hash[:release] is nil (not specified by the user),
182
+ # and comparisons up to here are equal, return equal. We need to
183
+ # evaluate to whatever level of detail the user specified, so we
184
+ # don't end up upgrading or *downgrading* when not intended.
185
+ #
186
+ # This should NOT be triggered if we're trying to ensure latest.
187
+ return 0 if should_hash[:release].nil?
188
+
189
+ rc = compare_values(should_hash[:release], is_hash[:release])
190
+
191
+ return rc
192
+ end
193
+ end
@@ -180,11 +180,11 @@ module Puppet::Util::Windows::ADSI
180
180
  sids
181
181
  end
182
182
 
183
- def name_sid_hash(names)
183
+ def name_sid_hash(names, allow_unresolved = false)
184
184
  return {} if names.nil? || names.empty?
185
185
 
186
186
  sids = names.map do |name|
187
- sid = Puppet::Util::Windows::SID.name_to_principal(name)
187
+ sid = Puppet::Util::Windows::SID.name_to_principal(name, allow_unresolved)
188
188
  raise Puppet::Error.new( _("Could not resolve name: %{name}") % { name: name } ) if !sid
189
189
  [sid.sid, sid]
190
190
  end
@@ -122,21 +122,22 @@ module Puppet::Util::Windows::Process
122
122
  def get_process_image_name_by_pid(pid)
123
123
  image_name = ""
124
124
 
125
- open_process(PROCESS_QUERY_INFORMATION, false, pid) do |phandle|
126
-
127
- FFI::MemoryPointer.new(:dword, 1) do |exe_name_length_ptr|
128
- # UTF is 2 bytes/char:
129
- max_chars = MAX_PATH_LENGTH + 1
130
- exe_name_length_ptr.write_dword(max_chars)
131
- FFI::MemoryPointer.new(:wchar, max_chars) do |exe_name_ptr|
132
- use_win32_path_format = 0
133
- result = QueryFullProcessImageNameW(phandle, use_win32_path_format, exe_name_ptr, exe_name_length_ptr)
134
- if result == FFI::WIN32_FALSE
135
- raise Puppet::Util::Windows::Error.new(
136
- "QueryFullProcessImageNameW(phandle, #{use_win32_path_format}, " +
137
- "exe_name_ptr, #{max_chars}")
125
+ Puppet::Util::Windows::Security.with_privilege(Puppet::Util::Windows::Security::SE_DEBUG_NAME) do
126
+ open_process(PROCESS_QUERY_INFORMATION, false, pid) do |phandle|
127
+ FFI::MemoryPointer.new(:dword, 1) do |exe_name_length_ptr|
128
+ # UTF is 2 bytes/char:
129
+ max_chars = MAX_PATH_LENGTH + 1
130
+ exe_name_length_ptr.write_dword(max_chars)
131
+ FFI::MemoryPointer.new(:wchar, max_chars) do |exe_name_ptr|
132
+ use_win32_path_format = 0
133
+ result = QueryFullProcessImageNameW(phandle, use_win32_path_format, exe_name_ptr, exe_name_length_ptr)
134
+ if result == FFI::WIN32_FALSE
135
+ raise Puppet::Util::Windows::Error.new(
136
+ "QueryFullProcessImageNameW(phandle, #{use_win32_path_format}, " +
137
+ "exe_name_ptr, #{max_chars}")
138
+ end
139
+ image_name = exe_name_ptr.read_wide_string(exe_name_length_ptr.read_dword)
138
140
  end
139
- image_name = exe_name_ptr.read_wide_string(exe_name_length_ptr.read_dword)
140
141
  end
141
142
  end
142
143
  end