From 8eb0e16afdcd328fd562a7ffa026a6481c14413c Mon Sep 17 00:00:00 2001 From: Michael Knox Date: Fri, 18 Mar 2011 22:37:00 +1100 Subject: (#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 Reviewed-by: Jacob Helwig --- lib/puppet/provider/augeas/augeas.rb | 59 +++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 17 deletions(-) (limited to 'lib') 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 -- cgit From c5448b79e690d72536f4d98b636f450d37de627a Mon Sep 17 00:00:00 2001 From: Dan Bode Date: Sun, 22 May 2011 21:54:58 -0400 Subject: (#7624) Auditing should not be enabled by default for purged resources. - Auditing creates logging messages as of 2.6.5 so it should not be enabled by default. - This patch removes the :audit => :all settting from resources created via self.instances (which is used for purging). Please note that we believe this change to be safe, and *should* not result in user-visible behavioural differences when you use the `instances` method on a type, but we can't give you a perfect assurance of that. If you do have code that depends on the current behaviour, and it misbehaves after this patch, please let us know so we can weep ^W find another solution that works for everyone. Reviewed-By: Daniel Pittman Reviewed-By: Nigel Kersten --- lib/puppet/type.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb index 1dbf12451..586bb46f6 100644 --- a/lib/puppet/type.rb +++ b/lib/puppet/type.rb @@ -886,7 +886,7 @@ class Type end provider_instances[instance.name] = instance - new(:name => instance.name, :provider => instance, :audit => :all) + new(:name => instance.name, :provider => instance) end end.flatten.compact end -- cgit From 31bf55c2f9c090c40e48f38c5f64e4373a402261 Mon Sep 17 00:00:00 2001 From: nfagerlund Date: Mon, 23 May 2011 11:14:03 -0700 Subject: (#7632) Make secret_agent application compatible with secret_agent face Running `puppet secret_agent` was failing with an error in validate_args (in interface/action.rb), because the application was trying to pass the certname as an argument to the synchronize action. Also, it was trying to submit the report a second time. Reviewing the code with Nick0, we found that the application wasn't inheriting from FaceBase and was duplicating a lot of work, and were able to resolve the issue by basically deleting the whole thing. This patch makes secret_agent behave like the other Faces apps, and makes synchronize the default action of the secret_agent face. We left the `run_mode :agent` line in the application because of bug #7802. Paired-with: Nick Lewis --- lib/puppet/application/secret_agent.rb | 21 ++------------------- lib/puppet/face/secret_agent.rb | 1 + 2 files changed, 3 insertions(+), 19 deletions(-) (limited to 'lib') diff --git a/lib/puppet/application/secret_agent.rb b/lib/puppet/application/secret_agent.rb index d704d14b2..6bdbc9232 100644 --- a/lib/puppet/application/secret_agent.rb +++ b/lib/puppet/application/secret_agent.rb @@ -1,23 +1,6 @@ -require 'puppet/application' +require 'puppet/application/face_base' require 'puppet/face' -class Puppet::Application::Secret_agent < Puppet::Application - should_parse_config +class Puppet::Application::Secret_agent < Puppet::Application::FaceBase run_mode :agent - - option("--debug", "-d") - option("--verbose", "-v") - - def setup - if options[:debug] or options[:verbose] - Puppet::Util::Log.level = options[:debug] ? :debug : :info - end - - Puppet::Util::Log.newdestination(:console) - end - - def run_command - report = Puppet::Face[:secret_agent, '0.0.1'].synchronize(Puppet[:certname]) - Puppet::Face[:report, '0.0.1'].submit(report) - end end diff --git a/lib/puppet/face/secret_agent.rb b/lib/puppet/face/secret_agent.rb index 105850cd3..79241da72 100644 --- a/lib/puppet/face/secret_agent.rb +++ b/lib/puppet/face/secret_agent.rb @@ -15,6 +15,7 @@ Puppet::Face.define(:secret_agent, '0.0.1') do EOT action(:synchronize) do + default summary "Run secret_agent once." arguments "[-v | --verbose] [-d | --debug]" # Remove this once options are introspectible description <<-'EOT' -- cgit From d4e6c268aecabdbf36ece126f960ce2384576fcc Mon Sep 17 00:00:00 2001 From: Luke Kaines Date: Mon, 6 Jun 2011 15:33:49 -0700 Subject: (#7624) Manually fetch all properties in instances. When we removed the `:audit => :all` flag on creation of an instance from a Puppet type, we stopped fetching all the properties. This had flow-on consequences that were visible from the outside; while some places did their own work to ensure that properties were fetched, others didn't. We now open-code the loop that creates and fetches those properties, to ensure that we have the same data without going through the :audit machinery. This resolves the excessive logging, and also eliminates the behavioural change that we introduced in the previous commit. Reviewed-By: Daniel Pittman --- lib/puppet/type.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb index 586bb46f6..558491a7f 100644 --- a/lib/puppet/type.rb +++ b/lib/puppet/type.rb @@ -876,6 +876,12 @@ class Type # Put the default provider first, then the rest of the suitable providers. provider_instances = {} providers_by_source.collect do |provider| + all_properties = self.properties.find_all do |property| + provider.supports_parameter?(property) + end.collect do |property| + property.name + end + provider.instances.collect do |instance| # We always want to use the "first" provider instance we find, unless the resource # is already managed and has a different provider set @@ -886,7 +892,9 @@ class Type end provider_instances[instance.name] = instance - new(:name => instance.name, :provider => instance) + result = new(:name => instance.name, :provider => instance) + properties.each { |name| result.newattr(name) } + result end end.flatten.compact end -- cgit