summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorMichael Knox <mike@sysam.com.au>2011-03-18 22:37:00 +1100
committerJosh Cooper <josh@puppetlabs.com>2011-06-02 17:11:12 -0700
commit8eb0e16afdcd328fd562a7ffa026a6481c14413c (patch)
tree192e1f1f73e6ed28a15587bf049ccc3979adff82 /lib/puppet
parent4ad88017d3b8b8000325f5165520a6c21b48c469 (diff)
downloadpuppet-8eb0e16afdcd328fd562a7ffa026a6481c14413c.tar.gz
puppet-8eb0e16afdcd328fd562a7ffa026a6481c14413c.tar.xz
puppet-8eb0e16afdcd328fd562a7ffa026a6481c14413c.zip
(#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@puppetlabs.com> Reviewed-by: Jacob Helwig <jacob@puppetlabs.com>
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/provider/augeas/augeas.rb59
1 files changed, 42 insertions, 17 deletions
diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
index a16f54bd7..95142568e 100644
--- a/lib/puppet/provider/augeas/augeas.rb
+++ b/lib/puppet/provider/augeas/augeas.rb
@@ -15,9 +15,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?
@@ -25,6 +28,8 @@ Puppet::Type.type(:augeas).provide(:augeas) do
SAVE_NOOP = "noop"
SAVE_OVERWRITE = "overwrite"
+ SAVE_NEWFILE = "newfile"
+ SAVE_BACKUP = "backup"
COMMANDS = {
"set" => [ :path, :string ],
@@ -254,11 +259,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]
@@ -287,20 +287,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
@@ -309,12 +322,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