diff options
author | Bryan Kearney <bkearney@redhat.com> | 2009-02-23 11:21:59 -0500 |
---|---|---|
committer | Bryan Kearney <bkearney@redhat.com> | 2009-03-04 16:59:19 -0500 |
commit | 01bc88c7e2a3d5a71aec8f0727631cbf41680720 (patch) | |
tree | ec45c157432bf10ce2c7acff098ccc527b3d11bf /lib | |
parent | cedeb7982b051e00173822c8d14a794e4fb10ae7 (diff) | |
download | puppet-01bc88c7e2a3d5a71aec8f0727631cbf41680720.tar.gz puppet-01bc88c7e2a3d5a71aec8f0727631cbf41680720.tar.xz puppet-01bc88c7e2a3d5a71aec8f0727631cbf41680720.zip |
Added a force option to ensure the change is always applied, and call augeas twice to reduce the chance that data is lost
Diffstat (limited to 'lib')
-rw-r--r-- | lib/puppet/provider/augeas/augeas.rb | 102 | ||||
-rw-r--r-- | lib/puppet/type/augeas.rb | 29 |
2 files changed, 76 insertions, 55 deletions
diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb index e9471b1be..56e217a54 100644 --- a/lib/puppet/provider/augeas/augeas.rb +++ b/lib/puppet/provider/augeas/augeas.rb @@ -21,9 +21,9 @@ require 'augeas' if Puppet.features.augeas? Puppet::Type.type(:augeas).provide(:augeas) do include Puppet::Util - - confine :true => Puppet.features.augeas? - + + confine :true => Puppet.features.augeas? + has_features :parse_commands, :need_to_run?,:execute_changes SAVE_NOOP = "noop" @@ -85,14 +85,22 @@ Puppet::Type.type(:augeas).provide(:augeas) do load_path = self.resource[:load_path] debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}") @aug = Augeas.open(root, load_path,flags) - + if (self.get_augeas_version() >= "0.3.6") debug("Augeas version #{self.get_augeas_version()} is installed") end end @aug end - + + def close_augeas + if (!@aug.nil?) + @aug.close() + debug("Closed the augeas connection") + @aug = nil; + end + end + # Used by the need_to_run? method to process get filters. Returns # true if there is a match, false if otherwise # Assumes a syntax of get /files/path [COMPARATOR] value @@ -121,8 +129,8 @@ Puppet::Type.type(:augeas).provide(:augeas) do end end return_value - end - + end + # Used by the need_to_run? method to process match filters. Returns # true if there is a match, false if otherwise def process_match(cmd_array) @@ -137,7 +145,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do #Get the values from augeas result = @aug.match(path) || '' # Now do the work - if (!result.nil?) + unless (result.nil?) case verb when "size": fail("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length != 2 @@ -170,13 +178,14 @@ Puppet::Type.type(:augeas).provide(:augeas) do def files_changed? saved_files = @aug.match("/augeas/events/saved") - return saved_files.size() > 0 + return saved_files.size() > 0 end - + # Determines if augeas acutally needs to run. def need_to_run? - self.open_augeas() + force = resource[:force] return_value = true + self.open_augeas() filter = resource[:onlyif] unless (filter == "") cmd_array = filter.split @@ -193,48 +202,52 @@ Puppet::Type.type(:augeas).provide(:augeas) do end end - # 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 (self.get_augeas_version() >= "0.3.6")) - debug("Will attempt to save and only run if files changed") - self.set_augeas_save_mode(SAVE_NOOP) - self.do_execute_changes() - save_result = @aug.save() - saved_files = @aug.match("/augeas/events/saved") - if ((save_result) and (not files_changed?)) - debug("Skipping becuase no files were changed") - return_value = false - else - debug("Files changed, should execute") + unless (force) + # 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 (self.get_augeas_version() >= "0.3.6")) + debug("Will attempt to save and only run if files changed") + self.set_augeas_save_mode(SAVE_NOOP) + self.do_execute_changes() + save_result = @aug.save() + saved_files = @aug.match("/augeas/events/saved") + if ((save_result) and (not files_changed?)) + debug("Skipping becuase no files were changed") + return_value = false + else + debug("Files changed, should execute") + end end end - + self.close_augeas() return return_value - end + end def execute_changes - # if we have version 0.3.6 or greater we have already executed - # the changes. We just need to save them. If not, do the changes + # Re-connect to augeas, and re-execute the changes + self.open_augeas() if (self.get_augeas_version() >= "0.3.6") self.set_augeas_save_mode(SAVE_OVERWRITE) - else - self.do_execute_changes() end - + + self.do_execute_changes() + success = @aug.save() if (success != true) fail("Save failed with return code #{success}") end + self.close_augeas() - return :executed + return :executed end - + # Actually execute the augeas changes. def do_execute_changes - commands = resource[:changes] + commands = resource[:changes].clone() context = resource[:context] commands.each do |cmd_array| + cmd_array = cmd_array.clone() fail("invalid command #{cmd_array.join[" "]}") if cmd_array.length < 2 command = cmd_array[0] cmd_array.shift() @@ -246,32 +259,33 @@ Puppet::Type.type(:augeas).provide(:augeas) do @aug.set(cmd_array[0], cmd_array[1]) when "rm", "remove": cmd_array[0]=File.join(context, cmd_array[0]) - debug("sending command '#{command}' with params #{cmd_array.inspect}") + debug("sending command '#{command}' with params #{cmd_array.inspect}") @aug.rm(cmd_array[0]) when "clear": cmd_array[0]=File.join(context, cmd_array[0]) - debug("sending command '#{command}' with params #{cmd_array.inspect}") + debug("sending command '#{command}' with params #{cmd_array.inspect}") @aug.clear(cmd_array[0]) when "insert", "ins" - if cmd_array.size < 3 + ext_array = cmd_array[1].split(" ") ; + if cmd_array.size < 2 or ext_array.size < 2 fail("ins requires 3 parameters") end label = cmd_array[0] - where = cmd_array[1] - path = File.join(context, cmd_array[2]) + where = ext_array[0] + path = File.join(context, ext_array[1]) case where when "before": before = true when "after": before = false else fail("Invalid value '#{where}' for where param") end - debug("sending command '#{command}' with params #{[label, where, path].inspect()}") - @aug.insert(path, label, before) + debug("sending command '#{command}' with params #{[label, where, path].inspect()}") + aug.insert(path, label, before) else fail("Command '#{command}' is not supported") end rescue Exception => e fail("Error sending command '#{command}' with params #{cmd_array.inspect}/#{e.message}") end end - end - + end + end diff --git a/lib/puppet/type/augeas.rb b/lib/puppet/type/augeas.rb index c89400b5e..e0d5e10b7 100644 --- a/lib/puppet/type/augeas.rb +++ b/lib/puppet/type/augeas.rb @@ -19,10 +19,10 @@ Puppet::Type.newtype(:augeas) do include Puppet::Util - + feature :parse_commands, "Parse the command string" feature :need_to_run?, "If the command should run" - feature :execute_changes, "Actually make the changes" + feature :execute_changes, "Actually make the changes" @doc = "Apply the changes (single or array of changes) to the filesystem via the augeas tool. @@ -59,7 +59,7 @@ Puppet::Type.newtype(:augeas) do newparam (:context) do desc "Optional context path. This value is pre-pended to the paths of all changes" - defaultto "" + defaultto "" end newparam (:onlyif) do @@ -81,7 +81,7 @@ Puppet::Type.newtype(:augeas) do AN_ARRAY is in the form ['a string', 'another']" defaultto "" end - + newparam(:changes) do desc "The changes which should be applied to the filesystem. This @@ -99,7 +99,7 @@ Puppet::Type.newtype(:augeas) do If the parameter 'context' is set that value is prepended to PATH" - munge do |value| + munge do |value| provider.parse_commands(value) end end @@ -115,6 +115,13 @@ Puppet::Type.newtype(:augeas) do defaultto "" end + newparam(:force) do + desc "Optional command to force the augeas type to execute even if it thinks changes + will not be made. This does not overide the only setting. If onlyif is set, then the + foce setting will not override that result" + + defaultto false + end newparam(:type_check) do desc "Set to true if augeas should perform typechecking. Optional, defaults to false" @@ -122,7 +129,7 @@ Puppet::Type.newtype(:augeas) do defaultto :false end - + # This is the acutal meat of the code. It forces # augeas to be run and fails or not based on the augeas return # code. @@ -131,12 +138,12 @@ Puppet::Type.newtype(:augeas) do desc "The expected return code from the augeas command. Should not be set" defaultto 0 - + # Make output a bit prettier def change_to_s(currentvalue, newvalue) return "executed successfully" - end - + end + # if the onlyif resource is provided, then the value is parsed. # a return value of 0 will stop exection becuase it matches the # default value. @@ -146,12 +153,12 @@ Puppet::Type.newtype(:augeas) do else 0 end - end + end # Actually execute the command. def sync @resource.provider.execute_changes() end - end + end end |