lib/puppet/provider/augeas/augeas.rb in puppet-0.24.9 vs lib/puppet/provider/augeas/augeas.rb in puppet-0.25.0
- old
+ new
@@ -37,16 +37,16 @@
"insert" => [ :string, :string, :path ],
"get" => [ :path, :comparator, :string ],
"match" => [ :path, :glob ],
"size" => [:comparator, :int],
"include" => [:string],
- "eq" => [:glob],
- "noteq" => [:glob]
+ "==" => [:glob],
+ "!=" => [:glob]
}
COMMANDS["ins"] = COMMANDS["insert"]
- COMMANDS["remove"] = COMMANDS["rm"]
+ COMMANDS["remove"] = COMMANDS["rm"]
attr_accessor :aug
# Extracts an 2 dimensional array of commands which are in the
# form of command path value.
@@ -60,19 +60,19 @@
if (context.length > 0)
context << "/" if context[-1, 1] != "/"
end
if data.is_a?(String)
- s = data
- data = []
- s.each_line { |line| data << line }
+ data = data.split($/)
end
args = []
data.each do |line|
+ line.strip!
+ next if line.nil? || line.empty?
argline = []
sc = StringScanner.new(line)
- cmd = sc.scan(/\w+/)
+ cmd = sc.scan(/\w+|==|!=/)
formals = COMMANDS[cmd]
fail("Unknown command #{cmd}") unless formals
argline << cmd
narg = 0
formals.each do |f|
@@ -80,21 +80,22 @@
narg += 1
if f == :path
start = sc.pos
nbracket = 0
begin
- sc.skip(/[^\]\[\s]+/)
+ sc.skip(/([^\]\[\s\\]|\\.)+/)
ch = sc.getch
nbracket += 1 if ch == "["
nbracket -= 1 if ch == "]"
fail("unmatched [") if nbracket < 0
end until nbracket == 0 && (sc.eos? || ch =~ /\s/)
len = sc.pos - start
len -= 1 unless sc.eos?
unless p = sc.string[start, len]
fail("missing path argument #{narg} for #{cmd}")
end
+ p.chomp!("/")
if p[0,1] != "$" && p[0,1] != "/"
argline << context + p
else
argline << p
end
@@ -106,51 +107,51 @@
sc.getch
else
argline << sc.scan(/[^\s]+/)
end
unless argline[-1]
- fail(raise Exception, "missing string argument #{narg} for #{cmd}")
+ fail("missing string argument #{narg} for #{cmd}")
end
elsif f == :comparator
argline << sc.scan(/(==|!=|=~|<|<=|>|>=)/)
unless argline[-1]
- puts sc.rest()
- fail(raise Exception, "invalid comparator for command #{cmd}")
+ puts sc.rest
+ fail("invalid comparator for command #{cmd}")
end
elsif f == :int
argline << sc.scan(/\d+/).to_i
elsif f== :glob
- argline << sc.rest()
+ argline << sc.rest
end
end
args << argline
end
return args
end
def open_augeas
- if (@aug.nil?)
- flags = 0
- (flags = 1 << 2 ) if self.resource[:type_check] == :true
- root = self.resource[:root]
- load_path = self.resource[:load_path]
+ unless @aug
+ flags = Augeas::NONE
+ flags = Augeas::TYPE_CHECK if resource[:type_check] == :true
+ root = resource[:root]
+ load_path = resource[:load_path]
debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
- @aug = Augeas.open(root, load_path,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")
+ if get_augeas_version >= "0.3.6"
+ debug("Augeas version #{get_augeas_version} is installed")
end
end
@aug
end
def close_augeas
- if (!@aug.nil?)
- @aug.close()
+ if @aug
+ @aug.close
debug("Closed the augeas connection")
- @aug = nil;
+ @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
@@ -158,78 +159,73 @@
def process_get(cmd_array)
return_value = false
#validate and tear apart the command
fail ("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length < 4
- cmd = cmd_array.shift()
- path = cmd_array.shift()
- comparator = cmd_array.shift()
+ cmd = cmd_array.shift
+ path = cmd_array.shift
+ comparator = cmd_array.shift
arg = cmd_array.join(" ")
#check the value in augeas
result = @aug.get(path) || ''
- unless result.nil?
- case comparator
- when "!=":
- return_value = true if !(result == arg)
- when "=~":
- regex = Regexp.new(arg)
- loc = result=~ regex
- return_value = true if ! loc.nil?
- else
- return_value = true if (result.send(comparator, arg))
- end
+ case comparator
+ when "!="
+ return_value = (result != arg)
+ when "=~"
+ regex = Regexp.new(arg)
+ return_value = (result =~ regex)
+ else
+ return_value = (result.send(comparator, arg))
end
- return_value
+ return !!return_value
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)
return_value = false
#validate and tear apart the command
fail("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length < 3
- cmd = cmd_array.shift()
- path = cmd_array.shift()
+ cmd = cmd_array.shift
+ path = cmd_array.shift
# Need to break apart the clause
- clause_array = parse_commands(cmd_array.shift())[0]
- verb = clause_array.shift()
+ clause_array = parse_commands(cmd_array.shift)[0]
+ verb = clause_array.shift
#Get the values from augeas
- result = @aug.match(path) || ''
+ result = @aug.match(path) || []
# Now do the work
- unless (result.nil?)
- case verb
- when "size":
- fail("Invalid command: #{cmd_array.join(" ")}") if clause_array.length != 2
- comparator = clause_array.shift()
- arg = clause_array.shift()
- return_value = true if (result.size.send(comparator, arg))
- when "include":
- arg = clause_array.shift()
- return_value = true if result.include?(arg)
- when "eq":
- begin
- arg = clause_array.shift()
- new_array = eval arg
- return_value = true if result == new_array
- rescue
- fail("Invalid array in command: #{cmd_array.join(" ")}")
- end
- when "noteq":
- begin
- arg = clause_array.shift()
- new_array = eval arg
- return_value = true if result != new_array
- rescue
- fail("Invalid array in command: #{cmd_array.join(" ")}")
- end
+ case verb
+ when "size"
+ fail("Invalid command: #{cmd_array.join(" ")}") if clause_array.length != 2
+ comparator = clause_array.shift
+ arg = clause_array.shift
+ return_value = (result.size.send(comparator, arg))
+ when "include"
+ arg = clause_array.shift
+ return_value = result.include?(arg)
+ when "=="
+ begin
+ arg = clause_array.shift
+ new_array = eval arg
+ return_value = (result == new_array)
+ rescue
+ fail("Invalid array in command: #{cmd_array.join(" ")}")
end
+ when "!="
+ begin
+ arg = clause_array.shift
+ new_array = eval arg
+ return_value = (result != new_array)
+ rescue
+ fail("Invalid array in command: #{cmd_array.join(" ")}")
+ end
end
- return_value
+ return !!return_value
end
def get_augeas_version
return @aug.get("/augeas/version") || ""
end
@@ -238,105 +234,110 @@
return @aug.set("/augeas/save", mode)
end
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?
force = resource[:force]
return_value = true
- self.open_augeas()
- filter = resource[:onlyif]
- unless (filter == "")
- cmd_array = parse_commands(filter)[0]
- command = cmd_array[0];
- begin
- case command
- when "get" then return_value = process_get(cmd_array)
- when "match" then return_value = process_match(cmd_array)
+ begin
+ open_augeas
+ filter = resource[:onlyif]
+ unless filter == ""
+ cmd_array = parse_commands(filter)[0]
+ command = cmd_array[0];
+ begin
+ case command
+ when "get"; return_value = process_get(cmd_array)
+ when "match"; return_value = process_match(cmd_array)
+ end
+ rescue Exception => e
+ fail("Error sending command '#{command}' with params #{cmd_array[1..-1].inspect}/#{e.message}")
end
- rescue Exception => e
- fail("Error sending command '#{command}' with params #{cmd_array[1..-1].inspect}/#{e.message}")
end
- end
- 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")
+ 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 get_augeas_version >= "0.3.6"
+ debug("Will attempt to save and only run if files changed")
+ set_augeas_save_mode(SAVE_NOOP)
+ 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
+ ensure
+ close_augeas
end
- self.close_augeas()
return return_value
end
def execute_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)
- end
+ begin
+ open_augeas
+ if get_augeas_version >= "0.3.6"
+ set_augeas_save_mode(SAVE_OVERWRITE)
+ end
- self.do_execute_changes()
+ do_execute_changes
- success = @aug.save()
- if (success != true)
- fail("Save failed with return code #{success}")
+ success = @aug.save
+ if success != true
+ fail("Save failed with return code #{success}")
+ end
+ ensure
+ close_augeas
end
- self.close_augeas()
return :executed
end
# Actually execute the augeas changes.
def do_execute_changes
commands = parse_commands(resource[:changes])
commands.each do |cmd_array|
fail("invalid command #{cmd_array.join[" "]}") if cmd_array.length < 2
command = cmd_array[0]
- cmd_array.shift()
+ cmd_array.shift
begin
case command
- when "set":
+ when "set"
debug("sending command '#{command}' with params #{cmd_array.inspect}")
- @aug.set(cmd_array[0], cmd_array[1])
- when "rm", "remove":
+ aug.set(cmd_array[0], cmd_array[1])
+ when "rm", "remove"
debug("sending command '#{command}' with params #{cmd_array.inspect}")
- @aug.rm(cmd_array[0])
- when "clear":
+ aug.rm(cmd_array[0])
+ when "clear"
debug("sending command '#{command}' with params #{cmd_array.inspect}")
@aug.clear(cmd_array[0])
when "insert", "ins"
label = cmd_array[0]
where = cmd_array[1]
path = cmd_array[2]
case where
- when "before": before = true
- when "after": before = false
+ 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()}")
+ 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