[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. debian/0.24.6-1-356-g5718585
root
root at dhcp231-81.rdu.redhat.com
Fri Jan 23 14:21:32 UTC 2009
The following commit has been merged in the master branch:
commit 9fd1756a8aa56c5d73957a70d5a31a1f6e4223d7
Author: Bryan Kearney <bkearney at redhat.com>
Date: Mon Oct 27 13:04:25 2008 -0400
Split Augeas up into a provider and a type.
diff --git a/lib/puppet/type/augeas.rb b/lib/puppet/provider/augeas.rb
similarity index 61%
copy from lib/puppet/type/augeas.rb
copy to lib/puppet/provider/augeas.rb
index 55f68b3..eaaa043 100644
--- a/lib/puppet/type/augeas.rb
+++ b/lib/puppet/provider/augeas.rb
@@ -19,131 +19,42 @@
require 'augeas' if Puppet.features.augeas?
-Puppet::Type.newtype(:augeas) do
+Puppet::Type.type(:augeas).provide(:augeas) do
+#class Puppet::Provider::Augeas < Puppet::Provider
include Puppet::Util
-
- confine "The augeas Ruby bindings are not available" => Puppet.features.augeas?
-
- @doc = "Apply the changes (single or array of changes) to the filesystem
- via the augeas tool.
-
- Requires:
- - augeas to be installed (http://www.augeas.net)
- - ruby-augeas bindings
-
- Sample usage with a string:
- augeas{\"test1\" :
- context => \"/files/etc/sysconfig/firstboot\",
- changes => \"set RUN_FIRSTBOOT YES\"
- onlyif => \"match other_value size > 0\"
- }
-
- Sample usage with an array and custom lenses:
- augeas{\"jboss_conf\":
- context => \"/files\",
- changes => [
- \"set /etc/jbossas/jbossas.conf/JBOSS_IP $ipaddress\",
- \"set /etc/jbossas/jbossas.conf/JAVA_HOME /usr\"
- ],
- load_path => \"$/usr/share/jbossas/lenses\",
- }
- "
-
- newparam (:name) do
- desc "The name of this task. Used for uniqueness"
- isnamevar
- end
-
- newparam (:context) do
- desc "Optional context path. This value is pre-pended to the paths of all changes"
- defaultto ""
- end
-
- newparam (:onlyif) do
- desc "Optional augeas command and comparisons to control the execution of this type.
- Supported onlyif syntax:
- get [AUGEAS_PATH] [COMPARATOR] [STRING]
- match [MATCH_PATH] size [COMPARATOR] [INT]
- match [MATCH_PATH] include [STRING]
- match [MATCH_PATH] == [AN_ARRAY]
-
- where
- AUGEAS_PATH is a valid path scoped by the context
- MATCH_PATH is a valid match synatx scoped by the context
- COMPARATOR is in the set [> >= != == <= <]
- STRING is a string
- INT is a number
- 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
- can be either a string which contains a command or an array of commands.
- Commands supported are:
-
- set [PATH] [VALUE] Sets the value VALUE at loction PATH
- rm [PATH] Removes the node at location PATH
- remove [PATH] Synonym for rm
- clear [PATH] Keeps the node at PATH, but removes the value.
- ins [PATH] Inserts an empty node at PATH.
- insert [PATH] Synonym for ins
-
- If the parameter 'context' is set that that value is prepended to PATH"
-
- # Extracts an 2 dimensional array of commands which are in the
- # form of command path value.
- # The input can be
- # - A string with one command
- # - A string with many commands per line
- # - An array of strings.
- def parse_tokens(data)
- commands = Array.new()
- if data.is_a?(String)
- data.each_line do |line|
- cmd_array = Array.new()
- tokens = line.split(" ")
- cmd = tokens.shift()
- file = tokens.shift()
- other = tokens.join(" ")
- cmd_array << cmd if !cmd.nil?
- cmd_array << file if !file.nil?
- cmd_array << other if other != ""
- commands << cmd_array
- end
- elsif data.is_a?(Array)
- data.each do |datum|
- commands.concat(parse_tokens(datum))
- end
+
+ confine "The augeas Ruby bindings are not available" => Puppet.features.augeas?
+
+
+ # Extracts an 2 dimensional array of commands which are in the
+ # form of command path value.
+ # The input can be
+ # - A string with one command
+ # - A string with many commands per line
+ # - An array of strings.
+ self.def parse_commands(data)
+ commands = Array.new()
+ if data.is_a?(String)
+ data.each_line do |line|
+ cmd_array = Array.new()
+ tokens = line.split(" ")
+ cmd = tokens.shift()
+ file = tokens.shift()
+ other = tokens.join(" ")
+ cmd_array << cmd if !cmd.nil?
+ cmd_array << file if !file.nil?
+ cmd_array << other if other != ""
+ commands << cmd_array
+ end
+ elsif data.is_a?(Array)
+ data.each do |datum|
+ commands.concat(parse_commands(datum))
end
-
- return commands
- end
-
- munge do |value|
- self.parse_tokens(value)
end
- end
- newparam(:root) do
- desc "A file system path; all files loaded by Augeas are loaded underneath ROOT"
- defaultto "/"
+ return commands
end
-
- newparam(:load_path) do
- desc "Optional colon separated list of directories; these directories are searched for schema definitions"
- defaultto ""
- end
-
-
- newparam(:type_check) do
- desc "Set to true if augeas should perform typechecking. Optional, defaults to false"
- newvalues(:true, :false)
-
- 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.
diff --git a/lib/puppet/provider/augeas/augeas.rb b/lib/puppet/provider/augeas/augeas.rb
new file mode 100644
index 0000000..a487e2a
--- /dev/null
+++ b/lib/puppet/provider/augeas/augeas.rb
@@ -0,0 +1,188 @@
+#--
+# Copyright (C) 2008 Red Hat Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Author: Bryan Kearney <bkearney at redhat.com>
+
+require 'augeas' if Puppet.features.augeas?
+
+Puppet::Type.type(:augeas).provide(:augeas) do
+#class Puppet::Provider::Augeas < Puppet::Provider
+ include Puppet::Util
+
+ confine :true => Puppet.features.augeas?
+
+ has_features :parse_commands, :need_to_run?,:execute_changes
+
+ # Extracts an 2 dimensional array of commands which are in the
+ # form of command path value.
+ # The input can be
+ # - A string with one command
+ # - A string with many commands per line
+ # - An array of strings.
+ def parse_commands(data)
+ commands = Array.new()
+ if data.is_a?(String)
+ data.each_line do |line|
+ cmd_array = Array.new()
+ tokens = line.split(" ")
+ cmd = tokens.shift()
+ file = tokens.shift()
+ other = tokens.join(" ")
+ cmd_array << cmd if !cmd.nil?
+ cmd_array << file if !file.nil?
+ cmd_array << other if other != ""
+ commands << cmd_array
+ end
+ elsif data.is_a?(Array)
+ data.each do |datum|
+ commands.concat(parse_commands(datum))
+ end
+ end
+
+ return commands
+ end
+
+ def open_augeas
+ flags = 0
+ (flags = 1 << 2 ) if self.resource[:type_check] == :true
+ root = self.resource[:root]
+ load_path = self.resource[:load_path]
+ debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
+ Augeas.open(root, load_path,flags)
+ 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
+ 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()
+ arg = cmd_array.join(" ")
+
+ #check the value in augeas
+ aug = open_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
+ end
+ 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 < 4
+ cmd = cmd_array.shift()
+ path = cmd_array.shift()
+ verb = cmd_array.shift()
+
+ #Get the values from augeas
+ aug = open_augeas()
+ result = aug.match(path) || ''
+ # Now do the work
+ if (!result.nil?)
+ case verb
+ when "size":
+ fail("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length != 2
+ comparator = cmd_array.shift()
+ arg = cmd_array.shift().to_i
+ return_value = true if (result.size.send(comparator, arg))
+ when "include":
+ arg = cmd_array.join(" ")
+ return_value = true if result.include?(arg)
+ when "==":
+ begin
+ arg = cmd_array.join(" ")
+ new_array = eval arg
+ return_value = true if result == new_array
+ rescue
+ fail("Invalid array in command: #{cmd_array.join(" ")}")
+ end
+ end
+ end
+ return_value
+ end
+
+ # Determines if augeas acutally needs to run.
+ def need_to_run?
+ return_value = true
+ filter = resource[:onlyif]
+ unless (filter == "")
+ cmd_array = filter.split
+ command = cmd_array[0];
+ cmd_array[1]= File.join(resource[:context], cmd_array[1])
+ begin
+ data = nil
+ case command
+ when "get" then return_value = process_get(cmd_array)
+ when "match" then 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
+ end
+ return_value
+ end
+
+ # Actually execute the augeas changes.
+ def execute_changes
+ aug = open_augeas
+ commands = self.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[0]=File.join(resource[:context], cmd_array[0])
+ debug("sending command '#{command}' with params #{cmd_array.inspect}")
+ begin
+ case command
+ when "set": aug.set(cmd_array[0], cmd_array[1])
+ when "rm", "remove": aug.rm(cmd_array[0])
+ when "clear": aug.clear(cmd_array[0])
+ when "insert", "ins": aug.insert(cmd_array[0])
+ 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
+ success = aug.save()
+ if (success != true)
+ fail("Save failed with return code #{success}")
+ end
+
+ return :executed
+ end
+
+end
diff --git a/lib/puppet/type/augeas.rb b/lib/puppet/type/augeas.rb
index 55f68b3..20b5bbb 100644
--- a/lib/puppet/type/augeas.rb
+++ b/lib/puppet/type/augeas.rb
@@ -11,18 +11,18 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
-# You should have received a copy of the GNU Lesser General Public
+# You should have received a copy of the GNU Lesser General Publicretu
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author: Bryan Kearney <bkearney at redhat.com>
-require 'augeas' if Puppet.features.augeas?
-
Puppet::Type.newtype(:augeas) do
include Puppet::Util
-
- confine "The augeas Ruby bindings are not available" => Puppet.features.augeas?
+
+ feature :parse_commands, "Parse the command string"
+ feature :need_to_run?, "If the command should run"
+ feature :execute_changes, "Actually make the changes"
@doc = "Apply the changes (single or array of changes) to the filesystem
via the augeas tool.
@@ -56,7 +56,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
@@ -76,7 +76,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
@@ -92,40 +92,12 @@ Puppet::Type.newtype(:augeas) do
If the parameter 'context' is set that that value is prepended to PATH"
- # Extracts an 2 dimensional array of commands which are in the
- # form of command path value.
- # The input can be
- # - A string with one command
- # - A string with many commands per line
- # - An array of strings.
- def parse_tokens(data)
- commands = Array.new()
- if data.is_a?(String)
- data.each_line do |line|
- cmd_array = Array.new()
- tokens = line.split(" ")
- cmd = tokens.shift()
- file = tokens.shift()
- other = tokens.join(" ")
- cmd_array << cmd if !cmd.nil?
- cmd_array << file if !file.nil?
- cmd_array << other if other != ""
- commands << cmd_array
- end
- elsif data.is_a?(Array)
- data.each do |datum|
- commands.concat(parse_tokens(datum))
- end
- end
-
- return commands
- end
-
- munge do |value|
- self.parse_tokens(value)
+ munge do |value|
+ provider.parse_commands(value)
end
end
+
newparam(:root) do
desc "A file system path; all files loaded by Augeas are loaded underneath ROOT"
defaultto "/"
@@ -143,7 +115,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.
@@ -152,138 +124,27 @@ Puppet::Type.newtype(:augeas) do
desc "The expected return code from the augeas command. Should not be set"
defaultto 0
-
- def open_augeas
- flags = 0
- (flags = 1 << 2 ) if self.resource[:type_check] == :true
- root = self.resource[:root]
- load_path = self.resource[:load_path]
- debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
- Augeas.open(root, load_path,flags)
- end
-
+
# Make output a bit prettier
def change_to_s(currentvalue, newvalue)
return "executed successfully"
- end
-
- # method to handle the onlif get strings.
- # Assumes a syntax of get /files/path [COMPARATOR] value
- def process_get(cmd_array)
- return_value = 0
-
- #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()
- arg = cmd_array.join(" ")
-
- #check the value in augeas
- aug = open_augeas()
- result = aug.get(path) || ''
- unless result.nil?
- case comparator
- when "!=":
- return_value = :need_to_run if !(result == arg)
- when "=~":
- regex = Regexp.new(arg)
- loc = result=~ regex
- return_value = :need_to_run if ! loc.nil?
- else
- return_value = :need_to_run if (result.send(comparator, arg))
- end
- end
- return_value
- end
-
- # This will handle the following cases
- def process_match(cmd_array)
- return_value = 0
-
- #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()
- verb = cmd_array.shift()
-
- #Get the values from augeas
- aug = open_augeas()
- result = aug.match(path) || ''
- # Now do the work
- if (!result.nil?)
- case verb
- when "size":
- fail("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length != 2
- comparator = cmd_array.shift()
- arg = cmd_array.shift().to_i
- return_value = :need_to_run if (result.size.send(comparator, arg))
- when "include":
- arg = cmd_array.join(" ")
- return_value = :need_to_run if result.include?(arg)
- when "==":
- begin
- arg = cmd_array.join(" ")
- new_array = eval arg
- return_value = :need_to_run if result == new_array
- rescue
- fail("Invalid array in command: #{cmd_array.join(" ")}")
- end
- end
- end
- return_value
- 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.
def retrieve
- return_value = :need_to_run
- filter = self.resource[:onlyif]
- unless (filter == "")
- cmd_array = filter.split
- command = cmd_array[0];
- cmd_array[1]= File.join(resource[:context], cmd_array[1])
- begin
- case command
- when "get" then return_value = process_get(cmd_array)
- when "match" then 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
+ if @resource.provider.need_to_run?()
+ :need_to_run
+ else
+ 0
end
- return_value
- end
+ end
# Actually execute the command.
def sync
- aug = open_augeas
- commands = self.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[0]=File.join(resource[:context], cmd_array[0])
- debug("sending command '#{command}' with params #{cmd_array.inspect}")
- begin
- case command
- when "set": aug.set(cmd_array[0], cmd_array[1])
- when "rm", "remove": aug.rm(cmd_array[0])
- when "clear": aug.clear(cmd_array[0])
- when "insert", "ins": aug.insert(cmd_array[0])
- 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
- success = aug.save()
- if (success != true)
- fail("Save failed with return code #{success}")
- end
-
- return :executed
+ @resource.provider.execute_changes()
end
- end
+ end
+
end
--
Puppet packaging for Debian
More information about the Pkg-puppet-devel
mailing list