From b6ab1697afd29b6293d133a345a4a51cd258457d Mon Sep 17 00:00:00 2001 From: Ciprian Badescu Date: Tue, 8 Oct 2019 14:30:26 +0300 Subject: [PATCH 1/3] (PUP-1537) add mark property for package This commit adds `mark` property for package providers on Debian(dpkg/apt/fink/aptitude) and Solaris(pgk) as alternative of using "held" value for `ensure`. Using "held" value for `ensure` works as before, but it shows deprecation warning and will be removed in further release. Allowed values for `mark` are "hold/none", default to "none". Mark can be specified with or without `ensure`, if `ensure` is missing it will default to "present". Mark cannot be specified together with "purged", "absent" or "held" values for `ensure`. --- .../dpkg_hold_true_package_is_latest.rb | 27 ++++++++ .../dpkg_hold_true_should_preserve_version.rb | 22 +++++++ lib/puppet/provider/package/apt.rb | 17 +++++- lib/puppet/provider/package/dpkg.rb | 19 ++++-- lib/puppet/provider/package/fink.rb | 23 ++++++- lib/puppet/provider/package/pkg.rb | 23 +++++-- lib/puppet/type/package.rb | 61 +++++++++++++++++-- spec/unit/provider/package/apt_spec.rb | 15 ++++- spec/unit/provider/package/aptitude_spec.rb | 1 + spec/unit/provider/package/dpkg_spec.rb | 24 ++++++-- spec/unit/provider/package/pkg_spec.rb | 14 ++++- 11 files changed, 218 insertions(+), 28 deletions(-) create mode 100644 acceptance/tests/provider/package/dpkg_hold_true_package_is_latest.rb create mode 100644 acceptance/tests/provider/package/dpkg_hold_true_should_preserve_version.rb diff --git a/acceptance/tests/provider/package/dpkg_hold_true_package_is_latest.rb b/acceptance/tests/provider/package/dpkg_hold_true_package_is_latest.rb new file mode 100644 index 00000000000..b626231532e --- /dev/null +++ b/acceptance/tests/provider/package/dpkg_hold_true_package_is_latest.rb @@ -0,0 +1,27 @@ +test_name "dpkg ensure held package is latest installed" do + confine :to, :platform => /debian-8-amd64/ + tag 'audit:low' + + require 'puppet/acceptance/common_utils' + extend Puppet::Acceptance::PackageUtils + extend Puppet::Acceptance::ManifestUtils + + + package = "nginx" + + agents.each do |agent| + teardown do + package_absent(agent, package, '--force-yes') + end + end + + step"Ensure that package is installed first if not present" do + expected_package_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Candidate: //p'").stdout + package_manifest = resource_manifest('package', package, mark: "hold") + + apply_manifest_on(agent, package_manifest) do |result| + installed_package_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Installed: //p'").stdout + assert_match(expected_package_version, installed_package_version) + end + end +end diff --git a/acceptance/tests/provider/package/dpkg_hold_true_should_preserve_version.rb b/acceptance/tests/provider/package/dpkg_hold_true_should_preserve_version.rb new file mode 100644 index 00000000000..2fd3202b6b8 --- /dev/null +++ b/acceptance/tests/provider/package/dpkg_hold_true_should_preserve_version.rb @@ -0,0 +1,22 @@ +test_name "dpkg ensure held package should preserve version if package is allready installed" do + confine :to, :platform => /debian-8-amd64/ + tag 'audit:low' + + require 'puppet/acceptance/common_utils' + extend Puppet::Acceptance::PackageUtils + extend Puppet::Acceptance::ManifestUtils + + package = "openssl" + + step "Ensure held should lock to specific installed version" do + existing_installed_version = on(agent.name, "dpkg -s #{package} | sed -n -e 's/Version: //p'").stdout + existing_installed_version.delete!(' ') + + package_manifest_held = resource_manifest('package', package, mark: "hold") + apply_manifest_on(agent, package_manifest_held) do + installed_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Installed: //p'").stdout + installed_version.delete!(' ') + assert_match(existing_installed_version, installed_version) + end + end +end diff --git a/lib/puppet/provider/package/apt.rb b/lib/puppet/provider/package/apt.rb index d3289e5d2e3..a214c44fd7f 100644 --- a/lib/puppet/provider/package/apt.rb +++ b/lib/puppet/provider/package/apt.rb @@ -70,7 +70,12 @@ def install cmd += install_options if @resource[:install_options] cmd << :install << str - aptget(*cmd) + self.unhold if self.properties[:mark] == :hold + begin + aptget(*cmd) + ensure + self.hold if @resource[:mark] == :hold + end end # What's the latest package version available? @@ -100,12 +105,18 @@ def run_preseed def uninstall self.run_preseed if @resource[:responsefile] - aptget "-y", "-q", :remove, @resource[:name] + args = ['-y', '-q'] + args << '--allow-change-held-packages' if self.properties[:mark] == :hold + args << :remove << @resource[:name] + aptget(*args) end def purge self.run_preseed if @resource[:responsefile] - aptget '-y', '-q', :remove, '--purge', @resource[:name] + args = ['-y', '-q'] + args << '--allow-change-held-packages' if self.properties[:mark] == :hold + args << :remove << '--purge' << @resource[:name] + aptget(*args) # workaround a "bug" in apt, that already removed packages are not purged super end diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb index e1a494eb274..edd7a757ae2 100644 --- a/lib/puppet/provider/package/dpkg.rb +++ b/lib/puppet/provider/package/dpkg.rb @@ -44,7 +44,7 @@ def self.instances # Note: self:: is required here to keep these constants in the context of what will # eventually become this Puppet::Type::Package::ProviderDpkg class. self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'} - self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$} + self::FIELDS_REGEX = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*)$} self::FIELDS= [:desired, :error, :status, :name, :ensure] # @param line [String] one line of dpkg-query output @@ -67,7 +67,7 @@ def self.parse_line(line) elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status]) hash[:ensure] = :absent end - hash[:ensure] = :held if hash[:desired] == 'hold' + hash[:mark] = :hold if hash[:desired] == 'hold' else Puppet.debug("Failed to match dpkg-query line #{line.inspect}") end @@ -83,8 +83,6 @@ def install end args = [] - # We always unhold when installing to remove any prior hold. - self.unhold if @resource[:configfiles] == :keep args << '--force-confold' @@ -93,7 +91,12 @@ def install end args << '-i' << file - dpkg(*args) + self.unhold if self.properties[:mark] == :hold + begin + dpkg(*args) + ensure + self.hold if @resource[:mark] == :hold + end end def update @@ -144,10 +147,14 @@ def purge dpkg "--purge", @resource[:name] end - def hold + def deprecated_hold if package_not_installed? self.install end + hold + end + + def hold Tempfile.open('puppet_dpkg_set_selection') do |tmpfile| tmpfile.write("#{@resource[:name]} hold\n") tmpfile.flush diff --git a/lib/puppet/provider/package/fink.rb b/lib/puppet/provider/package/fink.rb index 304d8c4e0e6..a5d0ff6bdbb 100644 --- a/lib/puppet/provider/package/fink.rb +++ b/lib/puppet/provider/package/fink.rb @@ -37,7 +37,12 @@ def install cmd << :install << str - finkcmd(cmd) + self.unhold if self.properties[:mark] == :hold + begin + finkcmd(cmd) + ensure + self.hold if @resource[:mark] == :hold + end end # What's the latest package version available? @@ -70,10 +75,22 @@ def update end def uninstall - finkcmd "-y", "-q", :remove, @model[:name] + self.unhold if self.properties[:mark] == :hold + begin + finkcmd "-y", "-q", :remove, @model[:name] + rescue StandardError, LoadError => e + self.hold if self.properties[:mark] == :hold + raise e + end end def purge - aptget '-y', '-q', 'remove', '--purge', @resource[:name] + self.unhold if self.properties[:mark] == :hold + begin + aptget '-y', '-q', 'remove', '--purge', @resource[:name] + rescue StandardError, LoadError => e + self.hold if self.properties[:mark] == :hold + raise e + end end end diff --git a/lib/puppet/provider/package/pkg.rb b/lib/puppet/provider/package/pkg.rb index 44aeb2849ae..7f4bcaf9f8c 100644 --- a/lib/puppet/provider/package/pkg.rb +++ b/lib/puppet/provider/package/pkg.rb @@ -49,7 +49,7 @@ def self.ifo_flag(flags) ).merge( case flags[1..1] when 'f' - {:ensure => 'held'} + {:mark => :hold} when '-' {} else @@ -107,6 +107,10 @@ def self.parse_line(line) end).merge({:provider => self.name}) end + def deprecated_hold + hold + end + def hold pkg(:freeze, @resource[:name]) end @@ -201,8 +205,6 @@ def latest def install(nofail = false) name = @resource[:name] should = @resource[:ensure] - # always unhold if explicitly told to install/update - self.unhold is = self.query if is[:ensure].to_sym == :absent command = 'install' @@ -216,7 +218,12 @@ def install(nofail = false) unless should.is_a? Symbol name += "@#{should}" end - r = exec_cmd(command(:pkg), command, *args, name) + self.unhold if self.properties[:mark] == :hold + begin + r = exec_cmd(command(:pkg), command, *args, name) + ensure + self.hold if @resource[:mark] == :hold + end return r if nofail raise Puppet::Error, _("Unable to update %{package}") % { package: r[:out] } if r[:exit] != 0 end @@ -230,7 +237,13 @@ def uninstall cmd << '-r' end cmd << @resource[:name] - pkg cmd + self.unhold if self.properties[:mark] == :hold + begin + pkg cmd + rescue StandardError, LoadError => e + self.hold if self.properties[:mark] == :hold + raise e + end end # update the package to the latest version available diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb index 0ecd429db21..0ce5a94686a 100644 --- a/lib/puppet/type/package.rb +++ b/lib/puppet/type/package.rb @@ -54,9 +54,8 @@ module Puppet feature :holdable, "The provider is capable of placing packages on hold such that they are not automatically upgraded as a result of other package dependencies unless explicit action is taken by - a user or another package. Held is considered a superset of - installed.", - :methods => [:hold] + a user or another package.", + :methods => [:hold, :unhold] feature :install_only, "The provider accepts options to only install packages never update (kernels, etc.)" feature :install_options, "The provider accepts options to be passed to the installer command." @@ -101,7 +100,7 @@ module Puppet end newvalue(:held, :event => :package_held, :required_features => :holdable) do - provider.hold + provider.deprecated_hold end # Alias the 'present' value. @@ -611,5 +610,59 @@ def refresh provider.reinstall end end + + newproperty(:mark, :required_features => :holdable) do + mark_doc='Valid values are: hold/none' + desc <<-EOT + Set to hold to tell Debian apt/Solaris pkg to hold the package version + + #{mark_doc} + Default is "none". Mark can be specified with or without `ensure`, + if `ensure` is missing will default to "present". + + Mark cannot be specified together with "purged", "absent" or "held" + values for `ensure`. + EOT + newvalues(:hold, :none) + munge do |value| + case value + when "hold", :hold + :hold + when "none", :none + :none + else + raise ArgumentError, _('Invalid hold value %{value}. %{doc}') % { value: value.inspect, doc: mark_doc} + end + end + + def insync?(is) + @should[0] == is + end + + def should + @should[0] if @should && @should.is_a?(Array) && @should.size == 1 + end + + def retrieve + provider.properties[:mark] + end + + def sync + if @should[0] == :hold + provider.hold + else + provider.unhold + end + end + end + + validate do + if :held == @parameters[:ensure].should + warning '"ensure=>held" has been deprecated and will be removed in a future version, use "mark=hold" instead' + end + if @parameters[:mark] && [:absent, :purged, :held].include?(@parameters[:ensure].should) + raise ArgumentError, _('You cannot use "mark" property while "ensure" is one of ["absent", "purged", "held"]') + end + end end end diff --git a/spec/unit/provider/package/apt_spec.rb b/spec/unit/provider/package/apt_spec.rb index fd27a9cbfd1..0f06d2e3a95 100644 --- a/spec/unit/provider/package/apt_spec.rb +++ b/spec/unit/provider/package/apt_spec.rb @@ -32,12 +32,14 @@ it "should use 'apt-get remove' to uninstall" do expect(provider).to receive(:aptget).with("-y", "-q", :remove, name) + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.uninstall end it "should use 'apt-get purge' and 'dpkg purge' to purge" do expect(provider).to receive(:aptget).with("-y", "-q", :remove, "--purge", name) expect(provider).to receive(:dpkg).with("--purge", name) + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.purge end @@ -88,14 +90,14 @@ it "should preseed if a responsefile is provided" do resource[:responsefile] = "/my/file" expect(provider).to receive(:run_preseed) - + expect(provider).to receive(:properties).and_return({:mark => :none}) allow(provider).to receive(:aptget) provider.install end it "should check for a cdrom" do expect(provider).to receive(:checkforcdrom) - + expect(provider).to receive(:properties).and_return({:mark => :none}) allow(provider).to receive(:aptget) provider.install end @@ -106,6 +108,7 @@ expect(command[-1]).to eq(name) expect(command[-2]).to eq(:install) end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -115,6 +118,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command[-1]).to eq("#{name}=1.0") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -124,6 +128,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command).to include("--force-yes") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -132,6 +137,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command).to include("-q") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -140,6 +146,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command).to include("-y") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -149,6 +156,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command).to include("DPkg::Options::=--force-confold") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -158,6 +166,7 @@ expect(provider).to receive(:aptget) do |*command| expect(command).to include("DPkg::Options::=--force-confnew") end + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -165,6 +174,7 @@ it 'should support string install options' do resource[:install_options] = ['--foo', '--bar'] expect(provider).to receive(:aptget).with('-q', '-y', '-o', 'DPkg::Options::=--force-confold', '--foo', '--bar', :install, name) + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end @@ -172,6 +182,7 @@ it 'should support hash install options' do resource[:install_options] = ['--foo', { '--bar' => 'baz', '--baz' => 'foo' }] expect(provider).to receive(:aptget).with('-q', '-y', '-o', 'DPkg::Options::=--force-confold', '--foo', '--bar=baz', '--baz=foo', :install, name) + expect(provider).to receive(:properties).and_return({:mark => :none}) provider.install end diff --git a/spec/unit/provider/package/aptitude_spec.rb b/spec/unit/provider/package/aptitude_spec.rb index 01c12649a8e..e3d8bbecaa5 100644 --- a/spec/unit/provider/package/aptitude_spec.rb +++ b/spec/unit/provider/package/aptitude_spec.rb @@ -33,6 +33,7 @@ expect(pkg.provider).to receive(:aptitude). with('-y', '-o', 'DPkg::Options::=--force-confold', :install, 'faff'). and_return(0) + expect(pkg.provider).to receive(:properties).and_return({:mark => :none}) pkg.provider.install end diff --git a/spec/unit/provider/package/dpkg_spec.rb b/spec/unit/provider/package/dpkg_spec.rb index aa18f63dc6b..709e93f0ec1 100644 --- a/spec/unit/provider/package/dpkg_spec.rb +++ b/spec/unit/provider/package/dpkg_spec.rb @@ -126,7 +126,10 @@ def dpkg_query_execution_returns(output) it "considers the package held if its state is 'hold'" do dpkg_query_execution_returns(bash_installed_output.gsub("install","hold")) - expect(provider.query[:ensure]).to eq(:held) + query=provider.query + expect(query[:ensure]).to eq("4.2-5ubuntu3") + expect(query[:mark]).to eq(:hold) + end context "parsing tests" do @@ -184,14 +187,15 @@ def parser_test(dpkg_output_string, gold_hash, number_of_debug_logs = 0) it "uses 'dpkg -i' to install the package" do expect(resource).to receive(:[]).with(:source).and_return("mypackagefile") + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:unhold) expect(provider).to receive(:dpkg).with(any_args, "-i", "mypackagefile") - provider.install end it "keeps old config files if told to do so" do expect(resource).to receive(:[]).with(:configfiles).and_return(:keep) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:unhold) expect(provider).to receive(:dpkg).with("--force-confold", any_args) @@ -200,6 +204,7 @@ def parser_test(dpkg_output_string, gold_hash, number_of_debug_logs = 0) it "replaces old config files if told to do so" do expect(resource).to receive(:[]).with(:configfiles).and_return(:replace) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:unhold) expect(provider).to receive(:dpkg).with("--force-confnew", any_args) @@ -207,6 +212,7 @@ def parser_test(dpkg_output_string, gold_hash, number_of_debug_logs = 0) end it "ensures any hold is removed" do + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:unhold).once expect(provider).to receive(:dpkg) provider.install @@ -222,18 +228,28 @@ def parser_test(dpkg_output_string, gold_hash, number_of_debug_logs = 0) end it "installs first if package is not present and ensure holding" do + allow(provider).to receive(:execute) + allow(provider).to receive(:package_not_installed?).and_return(true) + expect(provider).to receive(:install).once + expect(provider).to receive(:hold) + provider.deprecated_hold + end + + it "skips install new package if hold is true" do allow(provider).to receive(:execute) allow(provider).to receive(:package_not_installed?).and_return(true) expect(provider).to receive(:install).once - provider.hold + expect(provider).to receive(:hold) + provider.deprecated_hold end it "skips install new package if package is allready installed" do allow(provider).to receive(:execute) allow(provider).to receive(:package_not_installed?).and_return(false) expect(provider).not_to receive(:install) - provider.hold + expect(provider).to receive(:hold) + provider.deprecated_hold end it "executes dpkg --set-selections when holding" do diff --git a/spec/unit/provider/package/pkg_spec.rb b/spec/unit/provider/package/pkg_spec.rb index 4b7ca24a38d..a423dc34a99 100644 --- a/spec/unit/provider/package/pkg_spec.rb +++ b/spec/unit/provider/package/pkg_spec.rb @@ -90,7 +90,7 @@ def self.it_should_respond_to(*actions) { 'pkg://omnios/SUNWcs@0.5.11,5.11-0.151006:20130506T161045Z i--' => {:name => 'SUNWcs', :ensure => '0.5.11,5.11-0.151006:20130506T161045Z', :status => 'installed', :provider => :pkg, :publisher => 'omnios'}, - 'pkg://omnios/incorporation/jeos/illumos-gate@11,5.11-0.151006:20130506T183443Z if-' => {:name => 'incorporation/jeos/illumos-gate', :ensure => 'held', :status => 'installed', :provider => :pkg, :publisher => 'omnios'}, + 'pkg://omnios/incorporation/jeos/illumos-gate@11,5.11-0.151006:20130506T183443Z if-' => {:name => 'incorporation/jeos/illumos-gate', :ensure => "11,5.11-0.151006:20130506T183443Z", :mark => :hold, :status => 'installed', :provider => :pkg, :publisher => 'omnios'}, 'pkg://solaris/SUNWcs@0.5.11,5.11-0.151.0.1:20101105T001108Z installed -----' => {:name => 'SUNWcs', :ensure => '0.5.11,5.11-0.151.0.1:20101105T001108Z', :status => 'installed', :provider => :pkg, :publisher => 'solaris'}, }.each do |k, v| it "[#{k}] should correctly parse" do @@ -251,6 +251,7 @@ def self.it_should_respond_to(*actions) it "should accept all licenses" do expect(provider).to receive(:query).with(no_args).and_return({:ensure => :absent}) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(Puppet::Util::Execution).to receive(:execute) .with(['/bin/pkg', 'install', *hash[:flags], 'dummy'], {:failonfail => false, :combine => true}) .and_return(Puppet::Util::Execution::ProcessOutput.new('', 0)) @@ -265,6 +266,7 @@ def self.it_should_respond_to(*actions) # Should install also check if the version installed is the same version we are asked to install? or should we rely on puppet for that? resource[:ensure] = '0.0.7,5.11-0.151006:20131230T130000Z' allow($CHILD_STATUS).to receive(:exitstatus).and_return(0) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'unfreeze', 'dummy'], {:failonfail => false, :combine => true}) expect(Puppet::Util::Execution).to receive(:execute) .with(['/bin/pkg', 'list', '-Hv', 'dummy'], {:failonfail => false, :combine => true}) @@ -277,6 +279,7 @@ def self.it_should_respond_to(*actions) it "should install specific version(2)" do resource[:ensure] = '0.0.8' + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'unfreeze', 'dummy'], {:failonfail => false, :combine => true}) expect(Puppet::Util::Execution).to receive(:execute) .with(['/bin/pkg', 'list', '-Hv', 'dummy'], {:failonfail => false, :combine => true}) @@ -290,6 +293,7 @@ def self.it_should_respond_to(*actions) it "should downgrade to specific version" do resource[:ensure] = '0.0.7' + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:query).with(no_args).and_return({:ensure => '0.0.8,5.11-0.151106:20131230T130000Z'}) allow($CHILD_STATUS).to receive(:exitstatus).and_return(0) expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'unfreeze', 'dummy'], {:failonfail => false, :combine => true}) @@ -301,6 +305,7 @@ def self.it_should_respond_to(*actions) it "should install any if version is not specified" do resource[:ensure] = :present + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:query).with(no_args).and_return({:ensure => :absent}) expect(Puppet::Util::Execution).to receive(:execute) .with(['/bin/pkg', 'install', *hash[:flags], 'dummy'], {:failonfail => false, :combine => true}) @@ -312,6 +317,7 @@ def self.it_should_respond_to(*actions) it "should install if no version was previously installed, and a specific version was requested" do resource[:ensure] = '0.0.7' + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(provider).to receive(:query).with(no_args).and_return({:ensure => :absent}) expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'unfreeze', 'dummy'], {:failonfail => false, :combine => true}) expect(Puppet::Util::Execution).to receive(:execute) @@ -325,6 +331,7 @@ def self.it_should_respond_to(*actions) resource[:ensure] = '1.0-0.151006' is = :absent expect(provider).to receive(:query).with(no_args).and_return({:ensure => is}) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(described_class).to receive(:pkg) .with(:list, '-Hvfa', 'dummy@1.0-0.151006') .and_return(Puppet::Util::Execution::ProcessOutput.new(File.read(my_fixture('dummy_implicit_version')), 0)) @@ -340,6 +347,7 @@ def self.it_should_respond_to(*actions) resource[:ensure] = '1.0-0.151006' is = '1.0,5.11-0.151006:20140219T191204Z' expect(provider).to receive(:query).with(no_args).and_return({:ensure => is}) + expect(provider).to receive(:properties).and_return({:mark => :hold}) expect(described_class).to receive(:pkg).with(:list, '-Hvfa', 'dummy@1.0-0.151006').and_return(File.read(my_fixture('dummy_implicit_version'))) expect(Puppet::Util::Execution).to receive(:execute).with(['/bin/pkg', 'update', '-n', 'dummy@1.0,5.11-0.151006:20140220T084443Z'], {:failonfail => false, :combine => true}) expect(provider).to receive(:unhold).with(no_args) @@ -398,12 +406,16 @@ def self.it_should_respond_to(*actions) it "should support current pkg version" do expect(described_class).to receive(:pkg).with(:version).and_return('630e1ffc7a19') expect(described_class).to receive(:pkg).with([:uninstall, resource[:name]]) + expect(provider).to receive(:properties).and_return({:hold => false}) + provider.uninstall end it "should support original pkg commands" do expect(described_class).to receive(:pkg).with(:version).and_return('052adf36c3f4') expect(described_class).to receive(:pkg).with([:uninstall, '-r', resource[:name]]) + expect(provider).to receive(:properties).and_return({:hold => false}) + provider.uninstall end end From 60073758fd67a8ab257f079fde6f687ae80aa3bf Mon Sep 17 00:00:00 2001 From: tkishel Date: Tue, 4 Feb 2020 14:44:08 -0800 Subject: [PATCH 2/3] (maint) document the 'other' set_server_facts Document the other set_server_facts in puppetserver. --- lib/puppet/indirector/catalog/compiler.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/puppet/indirector/catalog/compiler.rb b/lib/puppet/indirector/catalog/compiler.rb index 59ad26ebce4..431969b293d 100644 --- a/lib/puppet/indirector/catalog/compiler.rb +++ b/lib/puppet/indirector/catalog/compiler.rb @@ -387,6 +387,8 @@ def node_from_request(facts, request) # Initialize our server fact hash; we add these to each client, and they # won't change while we're running, so it's safe to cache the values. + # + # See also set_server_facts in Puppet::Server::Compiler in puppetserver. def set_server_facts @server_facts = {} From 4df9d37cbee71999e27f743a93bffcc39378a5e2 Mon Sep 17 00:00:00 2001 From: Jenkins CI Date: Wed, 5 Feb 2020 09:17:53 +0000 Subject: [PATCH 3/3] (packaging) Updating the puppet.pot file --- locales/puppet.pot | 192 +++++++++++++++++++++++---------------------- 1 file changed, 100 insertions(+), 92 deletions(-) diff --git a/locales/puppet.pot b/locales/puppet.pot index 41b623fd19a..9710c5b5519 100644 --- a/locales/puppet.pot +++ b/locales/puppet.pot @@ -1,16 +1,16 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) 2019 Puppet, Inc. +# Copyright (C) 2020 Puppet, Inc. # This file is distributed under the same license as the Puppet automation framework package. -# FIRST AUTHOR , 2019. +# FIRST AUTHOR , 2020. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Puppet automation framework 5.5.17-100-g3e6abbc\n" +"Project-Id-Version: Puppet automation framework 5.5.18-49-g561d1a4850\n" "\n" "Report-Msgid-Bugs-To: https://tickets.puppetlabs.com\n" -"POT-Creation-Date: 2019-11-13 23:16+0000\n" -"PO-Revision-Date: 2019-11-13 23:16+0000\n" +"POT-Creation-Date: 2020-02-05 09:17+0000\n" +"PO-Revision-Date: 2020-02-05 09:17+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" @@ -520,93 +520,93 @@ msgstr "" msgid "Not using cached catalog because its environment '%{catalog_env}' does not match '%{local_env}'" msgstr "" -#: ../lib/puppet/configurer.rb:96 ../lib/puppet/configurer.rb:173 +#: ../lib/puppet/configurer.rb:96 ../lib/puppet/configurer.rb:171 msgid "Using cached catalog from environment '%{catalog_env}'" msgstr "" -#: ../lib/puppet/configurer.rb:166 +#: ../lib/puppet/configurer.rb:164 msgid "Could not retrieve catalog; skipping run" msgstr "" -#: ../lib/puppet/configurer.rb:184 +#: ../lib/puppet/configurer.rb:180 msgid "Applied catalog in %{seconds} seconds" msgstr "" -#: ../lib/puppet/configurer.rb:224 +#: ../lib/puppet/configurer.rb:220 msgid "Could not select a functional puppet master from server_list: '%{server_list}'" msgstr "" #. TRANSLATORS 'server_list' is the name of a setting and should not be translated -#: ../lib/puppet/configurer.rb:227 +#: ../lib/puppet/configurer.rb:223 msgid "Selected puppet server from the `server_list` setting: %{server}:%{port}" msgstr "" -#: ../lib/puppet/configurer.rb:259 +#: ../lib/puppet/configurer.rb:254 msgid "Local environment: '%{local_env}' doesn't match the environment of the cached catalog '%{catalog_env}', switching agent to '%{catalog_env}'." msgstr "" -#: ../lib/puppet/configurer.rb:304 +#: ../lib/puppet/configurer.rb:299 msgid "Local environment: '%{local_env}' doesn't match server specified node environment '%{node_env}', switching agent to '%{node_env}'." msgstr "" -#: ../lib/puppet/configurer.rb:309 +#: ../lib/puppet/configurer.rb:304 msgid "Using configured environment '%{env}'" msgstr "" -#: ../lib/puppet/configurer.rb:313 +#: ../lib/puppet/configurer.rb:308 msgid "Unable to fetch my node definition, but the agent run will continue:" msgstr "" -#: ../lib/puppet/configurer.rb:337 +#: ../lib/puppet/configurer.rb:332 msgid "Not using catalog because its environment '%{catalog_env}' does not match agent specified environment '%{local_env}' and strict_environment_mode is set" msgstr "" -#: ../lib/puppet/configurer.rb:348 +#: ../lib/puppet/configurer.rb:343 msgid "Catalog environment didn't stabilize after %{tries} fetches, aborting run" msgstr "" -#: ../lib/puppet/configurer.rb:350 +#: ../lib/puppet/configurer.rb:345 msgid "Local environment: '%{local_env}' doesn't match server specified environment '%{catalog_env}', restarting agent run with environment '%{catalog_env}'" msgstr "" -#: ../lib/puppet/configurer.rb:369 +#: ../lib/puppet/configurer.rb:385 msgid "Failed to apply catalog: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:401 +#: ../lib/puppet/configurer.rb:417 msgid "Puppet server %{host}:%{port} is unavailable: %{code} %{reason}" msgstr "" #. TRANSLATORS 'server_list' is the name of a setting and should not be translated -#: ../lib/puppet/configurer.rb:405 +#: ../lib/puppet/configurer.rb:421 msgid "Unable to connect to server from server_list setting: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:417 ../lib/puppet/face/report.rb:47 +#: ../lib/puppet/configurer.rb:433 ../lib/puppet/face/report.rb:47 msgid "Could not send report: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:426 +#: ../lib/puppet/configurer.rb:442 msgid "Could not save last run local report: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:446 +#: ../lib/puppet/configurer.rb:462 msgid "Uploading facts for %{node} to %{server}" msgstr "" -#: ../lib/puppet/configurer.rb:457 +#: ../lib/puppet/configurer.rb:473 msgid "Failed to submit facts: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:472 +#: ../lib/puppet/configurer.rb:488 msgid "Could not run command from %{setting}: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:490 +#: ../lib/puppet/configurer.rb:506 msgid "Could not retrieve catalog from cache: %{detail}" msgstr "" -#: ../lib/puppet/configurer.rb:510 +#: ../lib/puppet/configurer.rb:526 msgid "Could not retrieve catalog from remote server: %{detail}" msgstr "" @@ -679,54 +679,54 @@ msgid "Valid values are %{values}." msgstr "" #. TRANSLATORS 'data_binding_terminus' is a setting and should not be translated -#: ../lib/puppet/defaults.rb:473 +#: ../lib/puppet/defaults.rb:480 msgid "Setting 'data_binding_terminus' is deprecated." msgstr "" #. TRANSLATORS 'hiera' should not be translated -#: ../lib/puppet/defaults.rb:475 +#: ../lib/puppet/defaults.rb:482 msgid "Convert custom terminus to hiera 5 API." msgstr "" #. TRANSLATORS 'environment_data_provider' is a setting and should not be translated -#: ../lib/puppet/defaults.rb:634 +#: ../lib/puppet/defaults.rb:641 msgid "Setting 'environment_data_provider' is deprecated." msgstr "" -#: ../lib/puppet/defaults.rb:736 +#: ../lib/puppet/defaults.rb:743 msgid "Certificate names must be lower case" msgstr "" -#: ../lib/puppet/defaults.rb:977 ../lib/puppet/settings/enum_setting.rb:13 ../lib/puppet/settings/symbolic_enum_setting.rb:14 +#: ../lib/puppet/defaults.rb:988 ../lib/puppet/settings/enum_setting.rb:13 ../lib/puppet/settings/symbolic_enum_setting.rb:14 msgid "Invalid value '%{value}' for parameter %{name}. Allowed values are '%{allowed_values}'" msgstr "" -#: ../lib/puppet/defaults.rb:1048 +#: ../lib/puppet/defaults.rb:1059 msgid "The 'caprivatedir' setting is deprecated and will be removed in Puppet 6." msgstr "" -#: ../lib/puppet/defaults.rb:1075 +#: ../lib/puppet/defaults.rb:1086 msgid "The 'capass' setting is deprecated and will be removed in Puppet 6." msgstr "" -#: ../lib/puppet/defaults.rb:1315 +#: ../lib/puppet/defaults.rb:1326 msgid "The 'ca' setting is deprecated and will be removed in Puppet 6." msgstr "" -#: ../lib/puppet/defaults.rb:1820 ../lib/puppet/settings.rb:1212 +#: ../lib/puppet/defaults.rb:1831 ../lib/puppet/settings.rb:1212 msgid "Setting %{name} is deprecated." msgstr "" #. TRANSLATORS 'pluginsync' is a setting and should not be translated -#: ../lib/puppet/defaults.rb:1871 +#: ../lib/puppet/defaults.rb:1882 msgid "Setting 'pluginsync' is deprecated." msgstr "" -#: ../lib/puppet/error.rb:69 +#: ../lib/puppet/error.rb:77 msgid "Could not parse for environment %{environment}: %{message}" msgstr "" -#: ../lib/puppet/error.rb:70 ../lib/puppet/parser/compiler.rb:41 +#: ../lib/puppet/error.rb:78 ../lib/puppet/parser/compiler.rb:41 msgid "%{message} on node %{node}" msgstr "" @@ -2514,7 +2514,7 @@ msgstr "" msgid "Could not find node '%{name}'; cannot compile" msgstr "" -#: ../lib/puppet/indirector/catalog/compiler.rb:403 +#: ../lib/puppet/indirector/catalog/compiler.rb:413 msgid "Could not retrieve fact %{fact}" msgstr "" @@ -4132,27 +4132,27 @@ msgstr "" msgid "Received a %{status_code} response from %{server_hostname}. Sleeping for %{retry_sleep} seconds before retrying the request." msgstr "" -#: ../lib/puppet/network/http/connection.rb:318 +#: ../lib/puppet/network/http/connection.rb:317 msgid "request %{uri} interrupted after %{elapsed} seconds" msgstr "" -#: ../lib/puppet/network/http/connection.rb:320 +#: ../lib/puppet/network/http/connection.rb:319 msgid "request %{uri} timed out after %{elapsed} seconds" msgstr "" -#: ../lib/puppet/network/http/connection.rb:322 +#: ../lib/puppet/network/http/connection.rb:321 msgid "request %{uri} failed: %{msg}" msgstr "" -#: ../lib/puppet/network/http/connection.rb:348 ../lib/puppet/ssl/validator/default_validator.rb:101 +#: ../lib/puppet/network/http/connection.rb:346 ../lib/puppet/ssl/validator/default_validator.rb:101 msgid "expected one of %{certnames}" msgstr "" -#: ../lib/puppet/network/http/connection.rb:350 ../lib/puppet/ssl/validator/default_validator.rb:103 +#: ../lib/puppet/network/http/connection.rb:348 ../lib/puppet/ssl/validator/default_validator.rb:103 msgid "expected %{certname}" msgstr "" -#: ../lib/puppet/network/http/connection.rb:353 ../lib/puppet/ssl/validator/default_validator.rb:106 +#: ../lib/puppet/network/http/connection.rb:351 ../lib/puppet/ssl/validator/default_validator.rb:106 msgid "Server hostname '%{host}' did not match server certificate; %{expected_certnames}" msgstr "" @@ -6400,7 +6400,7 @@ msgstr "" msgid "Options 'include_containers' and 'include_values' cannot both be false" msgstr "" -#: ../lib/puppet/pops/types/type_calculator.rb:167 +#: ../lib/puppet/pops/types/type_calculator.rb:191 msgid "TypeCalculator.enumerable is deprecated. Use iterable" msgstr "" @@ -6768,7 +6768,7 @@ msgstr "" msgid "GID must be an integer" msgstr "" -#: ../lib/puppet/provider/group/groupadd.rb:60 +#: ../lib/puppet/provider/group/groupadd.rb:44 msgid "GID %{resource} already exists, use allowdupe to force group creation" msgstr "" @@ -6990,15 +6990,15 @@ msgstr "" msgid "/etc/apt/sources.list contains a cdrom source; not installing. Use 'allowcdrom' to override this failure." msgstr "" -#: ../lib/puppet/provider/package/apt.rb:83 ../lib/puppet/provider/package/fink.rb:50 +#: ../lib/puppet/provider/package/apt.rb:88 ../lib/puppet/provider/package/fink.rb:55 msgid "Could not find latest version" msgstr "" -#: ../lib/puppet/provider/package/apt.rb:93 ../lib/puppet/provider/package/fink.rb:60 +#: ../lib/puppet/provider/package/apt.rb:98 ../lib/puppet/provider/package/fink.rb:65 msgid "Preseeding %{response} to debconf-set-selections" msgstr "" -#: ../lib/puppet/provider/package/apt.rb:97 ../lib/puppet/provider/package/fink.rb:64 +#: ../lib/puppet/provider/package/apt.rb:102 ../lib/puppet/provider/package/fink.rb:69 msgid "No responsefile specified or non existent, not preseeding anything" msgstr "" @@ -7038,7 +7038,7 @@ msgstr "" msgid "You cannot install dpkg packages without a source" msgstr "" -#: ../lib/puppet/provider/package/dpkg.rb:107 +#: ../lib/puppet/provider/package/dpkg.rb:110 msgid "source doesn't contain named package, but %{name}" msgstr "" @@ -7124,19 +7124,19 @@ msgid "" "'%{line}'" msgstr "" -#: ../lib/puppet/provider/package/openbsd.rb:49 ../lib/puppet/provider/package/opkg.rb:25 +#: ../lib/puppet/provider/package/openbsd.rb:50 ../lib/puppet/provider/package/opkg.rb:25 msgid "Failed to match line %{line}" msgstr "" -#: ../lib/puppet/provider/package/openbsd.rb:136 +#: ../lib/puppet/provider/package/openbsd.rb:137 msgid "No valid installpath found in /etc/pkg.conf and no source was set" msgstr "" -#: ../lib/puppet/provider/package/openbsd.rb:140 +#: ../lib/puppet/provider/package/openbsd.rb:141 msgid "You must specify a package source or configure an installpath in /etc/pkg.conf" msgstr "" -#: ../lib/puppet/provider/package/openbsd.rb:212 +#: ../lib/puppet/provider/package/openbsd.rb:213 msgid "%{version} is not available for this package" msgstr "" @@ -7192,27 +7192,27 @@ msgstr "" msgid "Unknown line format %{resource_name}: %{parse_line}" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:116 +#: ../lib/puppet/provider/package/pkg.rb:120 msgid "Unable to unfreeze %{package}" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:151 +#: ../lib/puppet/provider/package/pkg.rb:155 msgid "Implicit version %{should} has %{n} possible matches" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:161 +#: ../lib/puppet/provider/package/pkg.rb:165 msgid "Selecting version '%{version}' for implicit '%{should}'" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:166 +#: ../lib/puppet/provider/package/pkg.rb:170 msgid "No version of %{name} matching %{should} is installable, even though the package is currently installed" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:185 +#: ../lib/puppet/provider/package/pkg.rb:189 msgid "pkg warning: %{warnings}" msgstr "" -#: ../lib/puppet/provider/package/pkg.rb:221 ../lib/puppet/provider/package/pkg.rb:241 +#: ../lib/puppet/provider/package/pkg.rb:228 ../lib/puppet/provider/package/pkg.rb:254 msgid "Unable to update %{package}" msgstr "" @@ -7341,11 +7341,11 @@ msgstr "" msgid "Failed to update to version %{should}, got version %{version} instead" msgstr "" -#: ../lib/puppet/provider/package_targetable.rb:55 +#: ../lib/puppet/provider/package_targetable.rb:56 msgid "Provider %{name} package command is not functional on this host" msgstr "" -#: ../lib/puppet/provider/package_targetable.rb:58 +#: ../lib/puppet/provider/package_targetable.rb:59 msgid "Provider %{name} package command '%{cmd}' does not exist on this host" msgstr "" @@ -8107,11 +8107,11 @@ msgstr "" msgid "Puppet::SSL::CertificateAuthority#certificate_is_alive? is deprecated. Please use Puppet::SSL::CertificateAuthority#verify or the certificate status API to query certificate information. See https://puppet.com/docs/puppet/latest/http_api/http_certificate_status.html" msgstr "" -#: ../lib/puppet/ssl/certificate_authority.rb:497 +#: ../lib/puppet/ssl/certificate_authority.rb:498 msgid "Could not find a certificate for %{name}" msgstr "" -#: ../lib/puppet/ssl/certificate_authority.rb:506 +#: ../lib/puppet/ssl/certificate_authority.rb:507 msgid "Could not find a certificate or csr for %{name}" msgstr "" @@ -8942,6 +8942,14 @@ msgstr "" msgid "Name must be a String not %{klass}" msgstr "" +#: ../lib/puppet/type/package.rb:635 +msgid "Invalid hold value %{value}. %{doc}" +msgstr "" + +#: ../lib/puppet/type/package.rb:665 +msgid "You cannot use \"mark\" property while \"ensure\" is one of [\"absent\", \"purged\", \"held\"]" +msgstr "" + #: ../lib/puppet/type/resources.rb:15 msgid "Could not find resource type '%{name}'" msgstr "" @@ -9135,27 +9143,27 @@ msgstr "" msgid "Profile names must be provided as an array, not a comma-separated list" msgstr "" -#: ../lib/puppet/type/user.rb:703 +#: ../lib/puppet/type/user.rb:705 msgid "Each entry for purge_ssh_keys must be a string, not a %{klass}" msgstr "" -#: ../lib/puppet/type/user.rb:706 +#: ../lib/puppet/type/user.rb:708 msgid "Paths to keyfiles must be absolute, not %{entry}" msgstr "" -#: ../lib/puppet/type/user.rb:710 +#: ../lib/puppet/type/user.rb:712 msgid "purge_ssh_keys must be true, false, or an array of file names, not %{value}" msgstr "" -#: ../lib/puppet/type/user.rb:722 +#: ../lib/puppet/type/user.rb:724 msgid "purge_ssh_keys can only be true for users with a defined home directory" msgstr "" -#: ../lib/puppet/type/user.rb:729 +#: ../lib/puppet/type/user.rb:731 msgid "purge_ssh_keys value '%{value}' meta character ~ or %{home_placeholder} only allowed for users with a defined home directory" msgstr "" -#: ../lib/puppet/type/user.rb:743 +#: ../lib/puppet/type/user.rb:745 msgid "Class name must be provided." msgstr "" @@ -9266,11 +9274,11 @@ msgstr "" msgid "path may not be nil" msgstr "" -#: ../lib/puppet/util.rb:568 +#: ../lib/puppet/util.rb:591 msgid "replace_file requires a block" msgstr "" -#: ../lib/puppet/util.rb:572 +#: ../lib/puppet/util.rb:595 msgid "replace_file default_mode: %{default_mode} is invalid" msgstr "" @@ -9798,20 +9806,20 @@ msgstr "" msgid "Unable to set ownership to %{user}:%{group} for log file: %{path}" msgstr "" -#: ../lib/puppet/util/logging.rb:82 ../lib/puppet/util/logging.rb:105 +#: ../lib/puppet/util/logging.rb:80 ../lib/puppet/util/logging.rb:104 msgid "Wrapped exception:" msgstr "" #. TRANSLATORS the literals ":file", ":line", and ":key" should not be translated -#: ../lib/puppet/util/logging.rb:149 +#: ../lib/puppet/util/logging.rb:161 msgid "Need either :file and :line, or :key" msgstr "" -#: ../lib/puppet/util/logging.rb:179 +#: ../lib/puppet/util/logging.rb:191 msgid "(file & line not available)" msgstr "" -#: ../lib/puppet/util/logging.rb:281 +#: ../lib/puppet/util/logging.rb:293 msgid "(location: %{location})" msgstr "" @@ -9909,7 +9917,7 @@ msgstr "" msgid "Details: %{detail}" msgstr "" -#: ../lib/puppet/util/plist.rb:145 +#: ../lib/puppet/util/plist.rb:151 msgid "Unable to write the file %{file_path}. %{error}" msgstr "" @@ -10093,55 +10101,55 @@ msgstr "" msgid "Invalid tag '%{name}'" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:19 +#: ../lib/puppet/util/windows/adsi.rb:36 msgid "ADSI connection error: %{e}" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:42 +#: ../lib/puppet/util/windows/adsi.rb:59 msgid "Failed to get computer name" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:80 +#: ../lib/puppet/util/windows/adsi.rb:97 msgid "Must use a valid SID::Principal" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:137 +#: ../lib/puppet/util/windows/adsi.rb:162 msgid "Value must be in DOMAIN\\%{object_class} style syntax" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:163 +#: ../lib/puppet/util/windows/adsi.rb:188 msgid "Could not resolve name: %{name}" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:200 +#: ../lib/puppet/util/windows/adsi.rb:230 msgid "Subclass must implement class-level method 'list_all'!" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:254 +#: ../lib/puppet/util/windows/adsi.rb:284 msgid "Puppet is not able to create/delete domain %{object_class} objects with the %{object_class} resource." msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:258 +#: ../lib/puppet/util/windows/adsi.rb:288 msgid "%{object_class} update failed: %{error}" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:284 +#: ../lib/puppet/util/windows/adsi.rb:314 msgid "Cannot create user if group '%{name}' exists." msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:425 +#: ../lib/puppet/util/windows/adsi.rb:455 msgid "Unrecognized ADS UserFlags: %{unrecognized_flags}" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:469 +#: ../lib/puppet/util/windows/adsi.rb:499 msgid "Failed to get user name" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:506 +#: ../lib/puppet/util/windows/adsi.rb:536 msgid "Cannot delete user profile for '%{sid}' prior to Vista SP1" msgstr "" -#: ../lib/puppet/util/windows/adsi.rb:524 +#: ../lib/puppet/util/windows/adsi.rb:554 msgid "Cannot create group if user '%{name}' exists." msgstr ""