[puppet] Cherry-pick various augeas fixes from upstream (bz#771097)
Todd Zullinger
tmz at fedoraproject.org
Wed Jan 4 21:28:30 UTC 2012
commit 9844a131e2b1674bf0bc2d29a0a8f1aa43a8d4e5
Author: Todd Zullinger <tmz at pobox.com>
Date: Sun Jan 1 23:13:08 2012 -0500
Cherry-pick various augeas fixes from upstream (bz#771097)
When augeas reached 0.10.0, various version tests failed. This is fixed
in the 2.7.x branch of puppet, but a few other changes were also made
since then, making a very minimal cherry-pick fix difficult. The other
changes are reasonably small and are also worth of backporting to our
2.6.x packages.
puppet-2.6.13-misc-augeas-improvements.patch | 490 ++++++++++++++++++++++++++
puppet.spec | 10 +
2 files changed, 500 insertions(+), 0 deletions(-)
---
diff --git a/puppet-2.6.13-misc-augeas-improvements.patch b/puppet-2.6.13-misc-augeas-improvements.patch
new file mode 100644
index 0000000..9eadb26
--- /dev/null
+++ b/puppet-2.6.13-misc-augeas-improvements.patch
@@ -0,0 +1,490 @@
+From 0614d2293dff0fabd0e9674d3113b050373491a6 Mon Sep 17 00:00:00 2001
+From: Michael Knox <mike at sysam.com.au>
+Date: Fri, 18 Mar 2011 22:37:00 +1100
+Subject: [PATCH/puppet 1/3] (#2728) Add diff output for changes made by
+ Augeas provider
+
+Utilising Augeas's SAVE_NEWFILE mode (similar to augtool -n) to
+determine the changes that will be made be made by Augeas.
+Output a unified diff to info
+
+handle non-default root, and multiple files correctly
+
+Adding tests for Augeas diff functionality
+Add test for non-default :root when diff'ing
+Ensure that multiple files are diffed if changed, not just one
+
+Signed-off-by: Josh Cooper <josh at puppetlabs.com>
+Reviewed-by: Jacob Helwig <jacob at puppetlabs.com>
+
+Conflicts:
+
+ spec/unit/provider/augeas/augeas_spec.rb
+
+Merged-to-2.6.x-by: Todd Zullinger <tmz at pobox.com>
+---
+ lib/puppet/provider/augeas/augeas.rb | 59 ++++++++++----
+ spec/unit/provider/augeas/augeas_spec.rb | 131 +++++++++++++++++++++++++++++-
+ 2 files changed, 172 insertions(+), 18 deletions(-)
+
+diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
+index 7dbd062..1ddb886 100644
+--- a/lib/puppet/provider/augeas/augeas.rb
++++ b/lib/puppet/provider/augeas/augeas.rb
+@@ -19,9 +19,12 @@
+
+ require 'augeas' if Puppet.features.augeas?
+ require 'strscan'
++require 'puppet/util'
++require 'puppet/util/diff'
+
+ Puppet::Type.type(:augeas).provide(:augeas) do
+ include Puppet::Util
++ include Puppet::Util::Diff
+
+ confine :true => Puppet.features.augeas?
+
+@@ -29,6 +32,8 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+
+ SAVE_NOOP = "noop"
+ SAVE_OVERWRITE = "overwrite"
++ SAVE_NEWFILE = "newfile"
++ SAVE_BACKUP = "backup"
+
+ COMMANDS = {
+ "set" => [ :path, :string ],
+@@ -248,11 +253,6 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ @aug.set("/augeas/save", mode)
+ end
+
+- def files_changed?
+- saved_files = @aug.match("/augeas/events/saved")
+- saved_files.size > 0
+- end
+-
+ # Determines if augeas acutally needs to run.
+ def need_to_run?
+ force = resource[:force]
+@@ -281,20 +281,33 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ # actually do the save.
+ if return_value and get_augeas_version >= "0.3.6"
+ debug("Will attempt to save and only run if files changed")
+- set_augeas_save_mode(SAVE_NOOP)
++ set_augeas_save_mode(SAVE_NEWFILE)
+ do_execute_changes
+ save_result = @aug.save
+ saved_files = @aug.match("/augeas/events/saved")
+- if save_result and not files_changed?
+- debug("Skipping because no files were changed")
+- return_value = false
+- else
++ if save_result and saved_files.size > 0
++ root = resource[:root].sub(/^\/$/, "")
++ saved_files.each do |key|
++ saved_file = @aug.get(key).to_s.sub(/^\/files/, root)
++ if Puppet[:show_diff]
++ print diff(saved_file, saved_file + ".augnew")
++ end
++ if resource.noop?
++ File.delete(saved_file + ".augnew")
++ end
++ end
+ debug("Files changed, should execute")
++ return_value = true
++ else
++ debug("Skipping because no files were changed or save failed")
++ return_value = false
+ end
+ end
+ end
+ ensure
+- close_augeas
++ if not return_value or resource.noop?
++ close_augeas
++ end
+ end
+ return_value
+ end
+@@ -303,12 +316,24 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ # Re-connect to augeas, and re-execute the changes
+ begin
+ open_augeas
+- set_augeas_save_mode(SAVE_OVERWRITE) if get_augeas_version >= "0.3.6"
+-
+- do_execute_changes
+-
+- success = @aug.save
+- fail("Save failed with return code #{success}") if success != true
++ saved_files = @aug.match("/augeas/events/saved")
++ if saved_files
++ saved_files.each do |key|
++ root = resource[:root].sub(/^\/$/, "")
++ saved_file = @aug.get(key).to_s.sub(/^\/files/, root)
++ if File.exists?(saved_file + ".augnew")
++ success = File.rename(saved_file + ".augnew", saved_file)
++ debug(saved_file + ".augnew moved to " + saved_file)
++ fail("Rename failed with return code #{success}") if success != 0
++ end
++ end
++ else
++ debug("No saved files, re-executing augeas")
++ set_augeas_save_mode(SAVE_OVERWRITE) if get_augeas_version >= "0.3.6"
++ do_execute_changes
++ success = @aug.save
++ fail("Save failed with return code #{success}") if success != true
++ end
+ ensure
+ close_augeas
+ end
+diff --git a/spec/unit/provider/augeas/augeas_spec.rb b/spec/unit/provider/augeas/augeas_spec.rb
+index 07b6320..764362f 100644
+--- a/spec/unit/provider/augeas/augeas_spec.rb
++++ b/spec/unit/provider/augeas/augeas_spec.rb
+@@ -5,7 +5,6 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
+ provider_class = Puppet::Type.type(:augeas).provider(:augeas)
+
+ describe provider_class do
+-
+ describe "command parsing" do
+ before do
+ @resource = stub("resource")
+@@ -253,6 +252,7 @@ describe provider_class do
+ it "should handle no filters" do
+ resource = stub("resource")
+ resource.stubs(:[]).returns(false).then.returns("").then.returns("")
++ resource.stubs(:noop?).returns(false)
+ augeas_stub = stub("augeas", :match => ["set", "of", "values"])
+ augeas_stub.stubs("close")
+ provider = provider_class.new(resource)
+@@ -264,6 +264,7 @@ describe provider_class do
+ it "should return true when a get filter matches" do
+ resource = stub("resource")
+ resource.stubs(:[]).returns(false).then.returns("get path == value").then.returns("")
++ resource.stubs(:noop?).returns(false)
+ provider = provider_class.new(resource)
+ augeas_stub = stub("augeas", :get => "value")
+ augeas_stub.stubs("close")
+@@ -286,6 +287,7 @@ describe provider_class do
+ it "should return true when a match filter matches" do
+ resource = stub("resource")
+ resource.stubs(:[]).returns(false).then.returns("match path size == 3").then.returns("")
++ resource.stubs(:noop?).returns(false)
+ provider = provider_class.new(resource)
+ augeas_stub = stub("augeas", :match => ["set", "of", "values"])
+ augeas_stub.stubs("close")
+@@ -316,6 +318,132 @@ describe provider_class do
+ provider.stubs(:get_augeas_version).returns("0.3.5")
+ provider.need_to_run?.should == false
+ end
++
++ #Ticket 5211 testing
++ it "should return true when a size != the provided value" do
++ resource = stub("resource")
++ resource.stubs(:[]).returns(false).then.returns("match path size != 17").then.returns("")
++ resource.stubs(:noop?).returns(false)
++ provider = provider_class.new(resource)
++ augeas_stub = stub("augeas", :match => ["set", "of", "values"])
++ augeas_stub.stubs("close")
++ provider.aug= augeas_stub
++ provider.stubs(:get_augeas_version).returns("0.3.5")
++ provider.need_to_run?.should == true
++ end
++
++ #Ticket 5211 testing
++ it "should return false when a size doeas equal the provided value" do
++ resource = stub("resource")
++ resource.stubs(:[]).returns(false).then.returns("match path size != 3").then.returns("")
++ provider = provider_class.new(resource)
++ augeas_stub = stub("augeas", :match => ["set", "of", "values"])
++ augeas_stub.stubs("close")
++ provider.aug= augeas_stub
++ provider.stubs(:get_augeas_version).returns("0.3.5")
++ provider.need_to_run?.should == false
++ end
++
++ # Ticket 2728 (diff files)
++ describe "and Puppet[:show_diff] is set" do
++ before do
++ Puppet[:show_diff] = true
++
++ @resource = Puppet::Type.type(:augeas).new(:name => "test")
++ @provider = provider_class.new(@resource)
++ @augeas_stub = stub("augeas")
++ @provider.aug = @augeas_stub
++
++ @augeas_stub.stubs("get").with("/augeas/version").returns("0.7.2")
++ @augeas_stub.stubs(:set).returns(true)
++ @augeas_stub.stubs(:save).returns(true)
++ end
++
++ it "should call diff when a file is shown to have been changed" do
++ file = "/etc/hosts"
++
++ @resource[:context] = "/files"
++ @resource[:changes] = ["set #{file}/foo bar"]
++
++ @augeas_stub.stubs(:match).with("/augeas/events/saved").returns(["/augeas/events/saved"])
++ @augeas_stub.stubs(:get).with("/augeas/events/saved").returns(["/files#{file}"])
++ @augeas_stub.expects(:set).with("/augeas/save", "newfile")
++ @augeas_stub.expects(:close).never()
++
++ @provider.expects("diff").with("#{file}", "#{file}.augnew").returns("")
++ @provider.should be_need_to_run
++ end
++
++ it "should call diff for each file thats changed" do
++ file1 = "/etc/hosts"
++ file2 = "/etc/resolv.conf"
++
++ @resource[:context] = "/files"
++ @resource[:changes] = ["set #{file1}/foo bar", "set #{file2}/baz biz"]
++
++ @augeas_stub.stubs(:match).with("/augeas/events/saved").returns(["/augeas/events/saved[1]", "/augeas/events/saved[2]"])
++ @augeas_stub.stubs(:get).with("/augeas/events/saved[1]").returns(["/files#{file1}"])
++ @augeas_stub.stubs(:get).with("/augeas/events/saved[2]").returns(["/files#{file2}"])
++ @augeas_stub.expects(:set).with("/augeas/save", "newfile")
++ @augeas_stub.expects(:close).never()
++
++ @provider.expects(:diff).with("#{file1}", "#{file1}.augnew").returns("")
++ @provider.expects(:diff).with("#{file2}", "#{file2}.augnew").returns("")
++ @provider.should be_need_to_run
++ end
++
++ describe "and resource[:root] is set" do
++ it "should call diff when a file is shown to have been changed" do
++ root = "/tmp/foo"
++ file = "/etc/hosts"
++
++ @resource[:context] = "/files"
++ @resource[:changes] = ["set #{file}/foo bar"]
++ @resource[:root] = root
++
++ @augeas_stub.stubs(:match).with("/augeas/events/saved").returns(["/augeas/events/saved"])
++ @augeas_stub.stubs(:get).with("/augeas/events/saved").returns(["/files#{file}"])
++ @augeas_stub.expects(:set).with("/augeas/save", "newfile")
++ @augeas_stub.expects(:close).never()
++
++ @provider.expects(:diff).with("#{root}#{file}", "#{root}#{file}.augnew").returns("")
++ @provider.should be_need_to_run
++ end
++ end
++
++ it "should not call diff if no files change" do
++ file = "/etc/hosts"
++
++ @resource[:context] = "/files"
++ @resource[:changes] = ["set #{file}/foo bar"]
++
++ @augeas_stub.stubs(:match).with("/augeas/events/saved").returns([])
++ @augeas_stub.expects(:set).with("/augeas/save", "newfile")
++ @augeas_stub.expects(:get).with("/augeas/events/saved").never()
++ @augeas_stub.expects(:close)
++
++ @provider.expects(:diff).never()
++ @provider.should_not be_need_to_run
++ end
++
++ it "should cleanup when in noop mode" do
++ file = "/etc/hosts"
++
++ @resource[:noop] = true
++ @resource[:context] = "/files"
++ @resource[:changes] = ["set #{file}/foo bar"]
++
++ @augeas_stub.stubs(:match).with("/augeas/events/saved").returns(["/augeas/events/saved"])
++ @augeas_stub.stubs(:get).with("/augeas/events/saved").returns(["/files#{file}"])
++ @augeas_stub.expects(:set).with("/augeas/save", "newfile")
++ @augeas_stub.expects(:close)
++
++ File.expects(:delete).with(file + ".augnew")
++
++ @provider.expects(:diff).with("#{file}", "#{file}.augnew").returns("")
++ @provider.should be_need_to_run
++ end
++ end
+ end
+
+ describe "augeas execution integration" do
+@@ -326,6 +454,7 @@ describe provider_class do
+ @augeas = stub("augeas")
+ @provider.aug= @augeas
+ @provider.stubs(:get_augeas_version).returns("0.3.5")
++ @augeas.stubs(:match).with("/augeas/events/saved")
+ end
+
+ it "should handle set commands" do
+--
+1.7.6
+
+
+From 7fca361f2c936f3b8db72b19a2e81b2dada0c0bf Mon Sep 17 00:00:00 2001
+From: Daniel Pittman <daniel at puppetlabs.com>
+Date: Fri, 9 Sep 2011 14:06:19 -0700
+Subject: [PATCH/puppet 2/3] (#2744) Display file diffs through the Puppet log
+ system.
+
+When Puppet generated a diff between the file on disk, it previously just
+printed it directly. This means that the user can view it, but it is lost in
+the rest of the system - monitoring, logs, and reports have no visibility of
+this.
+
+Better, then, to send it through our regular logging system, so that the
+content is visible in all the places that it might be viewed by the user or
+monitored by machines.
+
+Signed-off-by: Daniel Pittman <daniel at puppetlabs.com>
+---
+ lib/puppet/provider/augeas/augeas.rb | 2 +-
+ lib/puppet/type/file/content.rb | 2 +-
+ lib/puppet/util/diff.rb | 2 +-
+ spec/unit/type/file/content_spec.rb | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
+index 1ddb886..82410c4 100644
+--- a/lib/puppet/provider/augeas/augeas.rb
++++ b/lib/puppet/provider/augeas/augeas.rb
+@@ -290,7 +290,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ saved_files.each do |key|
+ saved_file = @aug.get(key).to_s.sub(/^\/files/, root)
+ if Puppet[:show_diff]
+- print diff(saved_file, saved_file + ".augnew")
++ notice "\n" + diff(saved_file, saved_file + ".augnew")
+ end
+ if resource.noop?
+ File.delete(saved_file + ".augnew")
+diff --git a/lib/puppet/type/file/content.rb b/lib/puppet/type/file/content.rb
+index 8271832..dd402cc 100755
+--- a/lib/puppet/type/file/content.rb
++++ b/lib/puppet/type/file/content.rb
+@@ -100,7 +100,7 @@ module Puppet
+
+ if ! result and Puppet[:show_diff]
+ write_temporarily do |path|
+- print diff(@resource[:path], path)
++ notice "\n" + diff(@resource[:path], path)
+ end
+ end
+ result
+diff --git a/lib/puppet/util/diff.rb b/lib/puppet/util/diff.rb
+index 73e1bc0..131241b 100644
+--- a/lib/puppet/util/diff.rb
++++ b/lib/puppet/util/diff.rb
+@@ -67,7 +67,7 @@ module Puppet::Util::Diff
+ tempfile.open
+ tempfile.print string
+ tempfile.close
+- print diff(path, tempfile.path)
++ notice "\n" + diff(path, tempfile.path)
+ tempfile.delete
+ end
+ end
+diff --git a/spec/unit/type/file/content_spec.rb b/spec/unit/type/file/content_spec.rb
+index bd2b2ad..9de4550 100755
+--- a/spec/unit/type/file/content_spec.rb
++++ b/spec/unit/type/file/content_spec.rb
+@@ -179,7 +179,7 @@ describe content do
+ it "should display a diff if the current contents are different from the desired content" do
+ @content.should = "some content"
+ @content.expects(:diff).returns("my diff").once
+- @content.expects(:print).with("my diff").once
++ @content.expects(:notice).with("\nmy diff").once
+
+ @content.safe_insync?("other content")
+ end
+--
+1.7.6
+
+
+From 61d5ae176079784b5a0bccf9b999fb4c3193369b Mon Sep 17 00:00:00 2001
+From: Josh Cooper <josh at puppetlabs.com>
+Date: Fri, 30 Dec 2011 10:28:16 -0800
+Subject: [PATCH/puppet 3/3] Merge branch 'tickets/2.7.x/11414' of
+ https://github.com/domcleal/puppet into 2.7.x
+
+* 'tickets/2.7.x/11414' of https://github.com/domcleal/puppet:
+ (#11414) Test Augeas versions correctly with versioncmp
+ (#11414) Save/execute changes on versions of Augeas < 0.3.6
+---
+ lib/puppet/provider/augeas/augeas.rb | 10 ++++++----
+ spec/unit/provider/augeas/augeas_spec.rb | 4 ++--
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
+index 82410c4..8785c78 100644
+--- a/lib/puppet/provider/augeas/augeas.rb
++++ b/lib/puppet/provider/augeas/augeas.rb
+@@ -21,10 +21,12 @@ require 'augeas' if Puppet.features.augeas?
+ require 'strscan'
+ require 'puppet/util'
+ require 'puppet/util/diff'
++require 'puppet/util/package'
+
+ Puppet::Type.type(:augeas).provide(:augeas) do
+ include Puppet::Util
+ include Puppet::Util::Diff
++ include Puppet::Util::Package
+
+ confine :true => Puppet.features.augeas?
+
+@@ -148,7 +150,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
+ @aug = Augeas::open(root, load_path,flags)
+
+- debug("Augeas version #{get_augeas_version} is installed") if get_augeas_version >= "0.3.6"
++ debug("Augeas version #{get_augeas_version} is installed") if versioncmp(get_augeas_version, "0.3.6") >= 0
+
+ if resource[:incl]
+ aug.set("/augeas/load/Xfm/lens", resource[:lens])
+@@ -279,7 +281,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ # If we have a verison of augeas which is at least 0.3.6 then we
+ # can make the changes now, see if changes were made, and
+ # actually do the save.
+- if return_value and get_augeas_version >= "0.3.6"
++ if return_value and versioncmp(get_augeas_version, "0.3.6") >= 0
+ debug("Will attempt to save and only run if files changed")
+ set_augeas_save_mode(SAVE_NEWFILE)
+ do_execute_changes
+@@ -317,7 +319,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ begin
+ open_augeas
+ saved_files = @aug.match("/augeas/events/saved")
+- if saved_files
++ unless saved_files.empty?
+ saved_files.each do |key|
+ root = resource[:root].sub(/^\/$/, "")
+ saved_file = @aug.get(key).to_s.sub(/^\/files/, root)
+@@ -329,7 +331,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
+ end
+ else
+ debug("No saved files, re-executing augeas")
+- set_augeas_save_mode(SAVE_OVERWRITE) if get_augeas_version >= "0.3.6"
++ set_augeas_save_mode(SAVE_OVERWRITE) if versioncmp(get_augeas_version, "0.3.6") >= 0
+ do_execute_changes
+ success = @aug.save
+ fail("Save failed with return code #{success}") if success != true
+diff --git a/spec/unit/provider/augeas/augeas_spec.rb b/spec/unit/provider/augeas/augeas_spec.rb
+index 764362f..c9d5f06 100644
+--- a/spec/unit/provider/augeas/augeas_spec.rb
++++ b/spec/unit/provider/augeas/augeas_spec.rb
+@@ -354,7 +354,7 @@ describe provider_class do
+ @augeas_stub = stub("augeas")
+ @provider.aug = @augeas_stub
+
+- @augeas_stub.stubs("get").with("/augeas/version").returns("0.7.2")
++ @augeas_stub.stubs("get").with("/augeas/version").returns("0.10.0")
+ @augeas_stub.stubs(:set).returns(true)
+ @augeas_stub.stubs(:save).returns(true)
+ end
+@@ -454,7 +454,7 @@ describe provider_class do
+ @augeas = stub("augeas")
+ @provider.aug= @augeas
+ @provider.stubs(:get_augeas_version).returns("0.3.5")
+- @augeas.stubs(:match).with("/augeas/events/saved")
++ @augeas.stubs(:match).with("/augeas/events/saved").returns([])
+ end
+
+ it "should handle set commands" do
+--
+1.7.6
+
diff --git a/puppet.spec b/puppet.spec
index b540357..618d24c 100644
--- a/puppet.spec
+++ b/puppet.spec
@@ -14,6 +14,14 @@ Source0: http://downloads.puppetlabs.com/%{name}/%{name}-%{version}.tar.g
Source1: http://downloads.puppetlabs.com/%{name}/%{name}-%{version}.tar.gz.asc
# https://projects.puppetlabs.com/issues/9167
Patch0: 0001-9167-Do-not-sent-tagmail-reports-if-no-changes.patch
+# Various augeas improvements from 2.7.x, mostly needed to fix bz#771097
+# (upstream #11414)
+# http://projects.puppetlabs.com/issues/2728
+# http://projects.puppetlabs.com/issues/2744
+# http://projects.puppetlabs.com/issues/8808
+# http://projects.puppetlabs.com/issues/11414
+# https://bugzilla.redhat.com/771097
+Patch1: puppet-2.6.13-misc-augeas-improvements.patch
Group: System Environment/Base
@@ -69,6 +77,7 @@ The server can also function as a certificate authority and file server.
%prep
%setup -q
%patch0 -p1
+%patch1 -p1
patch -s -p1 < conf/redhat/rundir-perms.patch
%build
@@ -257,6 +266,7 @@ rm -rf %{buildroot}
%changelog
* Wed Dec 14 2011 Todd Zullinger <tmz at pobox.com> - 2.6.13-1
- Update to 2.6.13
+- Cherry-pick various augeas fixes from upstream (bz#771097)
* Sun Oct 23 2011 Todd Zullinger <tmz at pobox.com> - 2.6.12-1
- Update to 2.6.12, fixes CVE-2011-3872
More information about the scm-commits
mailing list