summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBryan Kearney <bkearney@redhat.com>2009-02-23 11:21:59 -0500
committerBryan Kearney <bkearney@redhat.com>2009-03-04 16:59:19 -0500
commit01bc88c7e2a3d5a71aec8f0727631cbf41680720 (patch)
treeec45c157432bf10ce2c7acff098ccc527b3d11bf /lib
parentcedeb7982b051e00173822c8d14a794e4fb10ae7 (diff)
downloadpuppet-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.rb102
-rw-r--r--lib/puppet/type/augeas.rb29
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