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.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -15
- data/ext/windows/service/daemon.rb +3 -3
- data/lib/puppet.rb +1 -1
- data/lib/puppet/agent.rb +2 -10
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/filebucket.rb +5 -14
- data/lib/puppet/application/ssl.rb +2 -2
- data/lib/puppet/configurer.rb +7 -3
- data/lib/puppet/configurer/plugin_handler.rb +1 -1
- data/lib/puppet/defaults.rb +22 -2
- data/lib/puppet/environments.rb +4 -5
- data/lib/puppet/face/plugin.rb +1 -1
- data/lib/puppet/file_system/file_impl.rb +13 -9
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/functions/call.rb +1 -1
- data/lib/puppet/functions/reduce.rb +2 -4
- data/lib/puppet/http.rb +2 -0
- data/lib/puppet/http/client.rb +191 -52
- data/lib/puppet/http/external_client.rb +96 -0
- data/lib/puppet/http/redirector.rb +34 -0
- data/lib/puppet/http/resolver.rb +46 -3
- data/lib/puppet/http/resolver/server_list.rb +75 -15
- data/lib/puppet/http/resolver/settings.rb +22 -2
- data/lib/puppet/http/resolver/srv.rb +28 -2
- data/lib/puppet/http/response.rb +63 -1
- data/lib/puppet/http/retry_after_handler.rb +39 -0
- data/lib/puppet/http/service.rb +67 -1
- data/lib/puppet/http/service/ca.rb +71 -9
- data/lib/puppet/http/service/compiler.rb +213 -11
- data/lib/puppet/http/service/file_server.rb +105 -4
- data/lib/puppet/http/service/report.rb +36 -3
- data/lib/puppet/http/session.rb +59 -8
- data/lib/puppet/indirector/catalog/rest.rb +2 -1
- data/lib/puppet/indirector/facts/rest.rb +2 -1
- data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
- data/lib/puppet/indirector/file_metadata/rest.rb +4 -2
- data/lib/puppet/indirector/node/rest.rb +2 -1
- data/lib/puppet/indirector/report/yaml.rb +23 -0
- data/lib/puppet/indirector/status/rest.rb +2 -1
- data/lib/puppet/metatype/manager.rb +80 -80
- data/lib/puppet/network/http/base_pool.rb +6 -1
- data/lib/puppet/network/http/pool.rb +2 -4
- data/lib/puppet/network/http_pool.rb +1 -0
- data/lib/puppet/node/environment.rb +11 -1
- data/lib/puppet/pal/pal_impl.rb +1 -29
- data/lib/puppet/parser/compiler.rb +14 -7
- data/lib/puppet/parser/functions.rb +18 -13
- data/lib/puppet/pops/loaders.rb +7 -5
- data/lib/puppet/provider/group/windows_adsi.rb +3 -3
- data/lib/puppet/provider/package/apt.rb +61 -1
- data/lib/puppet/provider/package/dnfmodule.rb +39 -12
- data/lib/puppet/provider/package/gem.rb +41 -7
- data/lib/puppet/provider/package/pacman.rb +2 -5
- data/lib/puppet/provider/package/pip.rb +105 -33
- data/lib/puppet/provider/package/pip3.rb +0 -2
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +16 -4
- data/lib/puppet/provider/package/puppet_gem.rb +6 -2
- data/lib/puppet/provider/package/rpm.rb +6 -213
- data/lib/puppet/provider/package/yum.rb +92 -19
- data/lib/puppet/provider/service/systemd.rb +2 -1
- data/lib/puppet/reports/http.rb +13 -11
- data/lib/puppet/resource/type_collection.rb +20 -16
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/host.rb +4 -4
- data/lib/puppet/ssl/oids.rb +1 -0
- data/lib/puppet/ssl/state_machine.rb +50 -33
- data/lib/puppet/transaction/report.rb +2 -2
- data/lib/puppet/type.rb +6 -1
- data/lib/puppet/type/file/source.rb +4 -2
- data/lib/puppet/type/package.rb +25 -2
- data/lib/puppet/type/user.rb +0 -19
- data/lib/puppet/util/at_fork.rb +1 -1
- data/lib/puppet/util/autoload.rb +3 -0
- data/lib/puppet/util/instance_loader.rb +14 -10
- data/lib/puppet/util/package/version/debian.rb +175 -0
- data/lib/puppet/util/package/version/gem.rb +15 -0
- data/lib/puppet/util/package/version/pip.rb +167 -0
- data/lib/puppet/util/package/version/range.rb +50 -0
- data/lib/puppet/util/package/version/range/gt.rb +14 -0
- data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/lt.rb +14 -0
- data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
- data/lib/puppet/util/package/version/range/min_max.rb +21 -0
- data/lib/puppet/util/package/version/range/simple.rb +11 -0
- data/lib/puppet/util/package/version/rpm.rb +73 -0
- data/lib/puppet/util/pidlock.rb +13 -7
- data/lib/puppet/util/platform.rb +5 -0
- data/lib/puppet/util/rpm_compare.rb +193 -0
- data/lib/puppet/util/windows/adsi.rb +2 -2
- data/lib/puppet/util/windows/process.rb +15 -14
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/util/windows/sid.rb +3 -3
- data/lib/puppet/version.rb +1 -1
- data/locales/puppet.pot +207 -201
- data/man/man5/puppet.conf.5 +11 -3
- 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/ssl/unknown-127.0.0.1-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
- data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
- data/spec/fixtures/ssl/unknown-ca.pem +59 -0
- data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list-enabled.txt} +2 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
- data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
- data/spec/integration/application/agent_spec.rb +329 -0
- data/spec/integration/application/apply_spec.rb +132 -3
- data/spec/integration/application/filebucket_spec.rb +190 -0
- data/spec/integration/application/plugin_spec.rb +50 -0
- data/spec/integration/http/client_spec.rb +34 -40
- data/spec/integration/indirector/report/yaml.rb +83 -0
- data/spec/integration/module_tool/forge_spec.rb +2 -15
- data/spec/integration/network/http_pool_spec.rb +11 -19
- data/spec/integration/node/environment_spec.rb +15 -0
- data/spec/integration/util/windows/adsi_spec.rb +1 -1
- data/spec/lib/puppet/test_ca.rb +2 -2
- data/spec/lib/puppet_spec/https.rb +10 -7
- data/spec/lib/puppet_spec/puppetserver.rb +119 -0
- data/spec/shared_contexts/https.rb +29 -0
- data/spec/unit/agent_spec.rb +33 -25
- data/spec/unit/application/agent_spec.rb +5 -1
- data/spec/unit/application/device_spec.rb +2 -2
- data/spec/unit/application/filebucket_spec.rb +22 -2
- data/spec/unit/configurer_spec.rb +1 -1
- data/spec/unit/defaults_spec.rb +24 -1
- data/spec/unit/environments_spec.rb +8 -0
- data/spec/unit/file_system_spec.rb +10 -0
- data/spec/unit/http/client_spec.rb +105 -46
- data/spec/unit/http/external_client_spec.rb +201 -0
- data/spec/unit/http/resolver_spec.rb +20 -0
- data/spec/unit/http/service/ca_spec.rb +25 -2
- data/spec/unit/http/service/compiler_spec.rb +184 -6
- data/spec/unit/http/service/file_server_spec.rb +35 -3
- data/spec/unit/http/service/report_spec.rb +3 -1
- data/spec/unit/http/service_spec.rb +3 -3
- data/spec/unit/http/session_spec.rb +56 -7
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
- data/spec/unit/network/http/pool_spec.rb +3 -3
- data/spec/unit/node/environment_spec.rb +16 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
- data/spec/unit/provider/package/apt_spec.rb +30 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +33 -14
- data/spec/unit/provider/package/gem_spec.rb +40 -0
- data/spec/unit/provider/package/pacman_spec.rb +6 -21
- data/spec/unit/provider/package/pip_spec.rb +26 -3
- data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
- data/spec/unit/provider/package/pkgng_spec.rb +38 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
- data/spec/unit/provider/package/rpm_spec.rb +0 -212
- data/spec/unit/provider/package/yum_spec.rb +235 -1
- data/spec/unit/provider/service/systemd_spec.rb +10 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
- data/spec/unit/puppet_pal_2pec.rb +0 -29
- data/spec/unit/reports/http_spec.rb +70 -52
- data/spec/unit/ssl/host_spec.rb +4 -2
- data/spec/unit/ssl/oids_spec.rb +1 -0
- data/spec/unit/ssl/state_machine_spec.rb +38 -6
- data/spec/unit/transaction/report_spec.rb +4 -0
- data/spec/unit/util/at_fork_spec.rb +2 -2
- data/spec/unit/util/package/version/debian_spec.rb +83 -0
- data/spec/unit/util/package/version/pip_spec.rb +464 -0
- data/spec/unit/util/package/version/range_spec.rb +154 -0
- data/spec/unit/util/package/version/rpm_spec.rb +121 -0
- data/spec/unit/util/pidlock_spec.rb +83 -47
- data/spec/unit/util/rpm_compare_spec.rb +196 -0
- data/spec/unit/util/windows/adsi_spec.rb +4 -4
- data/spec/unit/util/windows/sid_spec.rb +2 -2
- data/tasks/generate_cert_fixtures.rake +15 -1
- metadata +51 -6
- data/spec/integration/faces/plugin_spec.rb +0 -63
@@ -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,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
|
data/lib/puppet/util/pidlock.rb
CHANGED
@@ -57,7 +57,9 @@ class Puppet::Util::Pidlock
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def clear_if_stale
|
60
|
-
|
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,
|
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,
|
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,
|
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,
|
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
|
-
|
93
|
-
|
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
|
data/lib/puppet/util/platform.rb
CHANGED
@@ -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
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
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
|