[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, experimental, updated. debian/2.6.8-1-844-g7ec39d5

Hector Rivas Gandara keymon at gmail.com
Tue May 10 08:03:52 UTC 2011


The following commit has been merged in the experimental branch:
commit fb339cbbc17cd14ba34df624fe9a2b9c74640eb5
Author: Hector Rivas Gandara <keymon at gmail.com>
Date:   Mon Jan 10 08:30:28 2011 +0100

    (#5432) Use AIX native commands to manage users and groups
    
    More elegant Array|String => String conversion in AixObject.
    Fixed some bugs and code/comments cleaned.

diff --git a/lib/puppet/provider/aixobject.rb b/lib/puppet/provider/aixobject.rb
index dcb3bff..9506c67 100755
--- a/lib/puppet/provider/aixobject.rb
+++ b/lib/puppet/provider/aixobject.rb
@@ -1,18 +1,10 @@
 #
-# Common code for AIX providers
-#
+# Common code for AIX providers. This class implements basic structure for
+# AIX resources. 
 # Author::    Hector Rivas Gandara <keymon at gmail.com>
 #
-#  
 class Puppet::Provider::AixObject < Puppet::Provider
-  desc "User management for AIX! Users are managed with mkuser, rmuser, chuser, lsuser"
-
-  # Constants
-  # Loadable AIX I/A module for users and groups. By default we manage compat.
-  # TODO:: add a type parameter to change this
-  class << self 
-    attr_accessor :ia_module
-  end  
+  desc "Generic AIX resource provider"
 
   # The real provider must implement these functions.
   def lscmd(value=@resource[:name])
@@ -35,7 +27,6 @@ class Puppet::Provider::AixObject < Puppet::Provider
     raise Puppet::Error, "Method not defined #{@resource.class.name} #{@resource.name}: #{detail}"
   end
 
-
   # Valid attributes to be managed by this provider.
   # It is a list of hashes
   #  :aix_attr      AIX command attribute name
@@ -45,6 +36,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
   class << self 
     attr_accessor :attribute_mapping
   end
+
+  # Mapping from Puppet property to AIX attribute.
   def self.attribute_mapping_to
     if ! @attribute_mapping_to
       @attribute_mapping_to = {}
@@ -57,6 +50,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
     @attribute_mapping_to
   end    
+
+  # Mapping from AIX attribute to Puppet property.
   def self.attribute_mapping_from
     if ! @attribute_mapping_from
       @attribute_mapping_from = {}
@@ -73,7 +68,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
   # This functions translates a key and value using the given mapping.
   # Mapping can be nil (no translation) or a hash with this format
   # {:key => new_key, :method => translate_method}
-  # It returns a list [key, value]
+  # It returns a list with the pair [key, value]
   def translate_attr(key, value, mapping)
     return [key, value] unless mapping
     return nil unless mapping[key]
@@ -85,35 +80,12 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
     [mapping[key][:key], new_value]
   end
-
-  # Gets the given command line argument for the given key, value and mapping.
-  def get_arg(key, value, mapping)
-    arg = nil
-    if ret = self.translate_attr(key, val, mapping)
-      new_key = ret[0]
-      new_val = ret[1]
-      
-      # Arrays are separated by commas
-      if new_val.is_a? Array
-        value = new_val.join(",")
-      else
-        value = new_val.to_s
-      end
-      
-      # Get the needed argument
-      if mapping[key][:to_arg]
-        arg = method(mapping[key][:to_arg]).call(new_key, value)
-      else
-        arg = (new_key.to_s + "=" + value )
-      end
-    end
-    return arg
-  end
-  
   
-  # Reads and attribute.
-  # Here we implement the default behaviour.
-  # Subclasses must reimplement this.
+  # Loads an AIX attribute (key=value) and stores it in the given hash with
+  # puppet semantics. It translates the pair using the given mapping.
+  #
+  # This operation works with each property one by one,
+  # subclasses must reimplement this if more complex operations are needed
   def load_attribute(key, value, mapping, objectinfo)
     if mapping.nil?
       objectinfo[key] = value
@@ -129,6 +101,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
     return objectinfo
   end
   
+  # Gets the given command line argument for the given key and value,
+  # using the given mapping to translate key and value.
+  # All the objectinfo hash (@resource or @property_hash) is passed.
+  #
+  # This operation works with each property one by one,
+  # and default behaviour is return the arguments as key=value pairs.
+  # Subclasses must reimplement this if more complex operations/arguments
+  # are needed
+  # 
   def get_arguments(key, value, mapping, objectinfo)
     if mapping.nil?
       new_key = key
@@ -146,11 +127,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
 
     # convert it to string
-    if new_value.is_a? Array
-      new_value = new_value.join(",")
-    else
-      new_value = new_value.to_s
-    end
+    new_value = Array(new_value).join(',')
 
     if new_key
       return [ "#{new_key}=#{new_value}" ] 
@@ -159,9 +136,10 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
   end
   
-  # Convert the provider properties to AIX command arguments (string)
-  # This function will translate each value/key and generate the argument.
-  # By default, arguments are created as aix_key=aix_value
+  # Convert the provider properties (hash) to AIX command arguments
+  # (list of strings)
+  # This function will translate each value/key and generate the argument using
+  # the get_arguments function.
   def hash2args(hash, mapping=self.class.attribute_mapping_to)
     return "" unless hash 
     arg_list = []
@@ -171,12 +149,14 @@ class Puppet::Provider::AixObject < Puppet::Provider
     arg_list
   end
 
-  # Parse AIX command attributes in a format of space separated of key=value
-  # pairs: "uid=100 groups=a,b,c"
-  # It returns and return provider hash.
+  # Parse AIX command attributes from the output of an AIX command, that
+  # which format is a list of space separated of key=value pairs:
+  # "uid=100 groups=a,b,c". 
+  # It returns an hash. 
   #
   # If a mapping is provided, the keys are translated as defined in the
-  # mapping hash. Only values included in mapping will be added
+  # mapping hash. And only values included in mapping will be added
+  #
   # NOTE: it will ignore the items not including '='
   def parse_attr_list(str, mapping=self.class.attribute_mapping_from)
     properties = {}
@@ -201,17 +181,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
     properties.empty? ? nil : properties
   end
 
-  # Parse AIX colon separated list of attributes, using given list of keys
-  # to name the attributes. This function is useful to parse the output
-  # of commands like lsfs -c:
+  # Parse AIX command output in a colon separated list of attributes,
+  # This function is useful to parse the output of commands like lsfs -c:
   #   #MountPoint:Device:Vfs:Nodename:Type:Size:Options:AutoMount:Acct
   #   /:/dev/hd4:jfs2::bootfs:557056:rw:yes:no
   #   /home:/dev/hd1:jfs2:::2129920:rw:yes:no
   #   /usr:/dev/hd2:jfs2::bootfs:9797632:rw:yes:no
   #
   # If a mapping is provided, the keys are translated as defined in the
-  # mapping hash. Only values included in mapping will be added
-  # NOTE: it will ignore the items not including '='
+  # mapping hash. And only values included in mapping will be added
   def parse_colon_list(str, key_list, mapping=self.class.attribute_mapping_from)
     properties = {}
     attrs = []
@@ -227,8 +205,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
     
   end
   
-  # Default parsing function for colon separated list or attributte list
-  # (key=val pairs). It will choose the method depending of the first line.
+  # Default parsing function for AIX commands.
+  # It will choose the method depending of the first line.
   # For the colon separated list it will:
   #  1. Get keys from first line.
   #  2. Parse next line.
@@ -242,7 +220,9 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
   end
 
-  # Retrieve what we can about our object
+  # Retrieve all the information of an existing resource.
+  # It will execute 'lscmd' command and parse the output, using the mapping
+  # 'attribute_mapping_from' to translate the keys and values.
   def getinfo(refresh = false)
     if @objectinfo.nil? or refresh == true
       # Execute lsuser, split all attributes and add them to a dict.
@@ -259,7 +239,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
     @objectinfo
   end
 
-  # Retrieve what we can about our object, without translate the values.
+  # Like getinfo, but it will not use the mapping to translate the keys and values.
+  # It might be usefult to retrieve some raw information.
   def getosinfo(refresh = false)
     if @objectosinfo .nil? or refresh == true
       getinfo(refresh)
@@ -269,7 +250,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
 
 
   # List all elements of given type. It works for colon separated commands and
-  # list commands. 
+  # list commands.
+  # It returns a list of names.
   def list_all
     names = []
     begin
@@ -301,6 +283,17 @@ class Puppet::Provider::AixObject < Puppet::Provider
     !!getinfo(true) # !! => converts to bool
   end
 
+  # Return all existing instances  
+  # The method for returning a list of provider instances.  Note that it returns
+  # providers, preferably with values already filled in, not resources.
+  def self.instances
+    objects=[]
+    self.list_all().each { |entry|
+      objects << new(:name => entry, :ensure => :present)
+    }
+    objects
+  end
+
   #- **ensure**
   #    The basic state that the object should be in.  Valid values are
   #    `present`, `absent`, `role`.
@@ -313,17 +306,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
   end
 
-  # Return all existing instances  
-  # The method for returning a list of provider instances.  Note that it returns
-  # providers, preferably with values already filled in, not resources.
-  def self.instances
-    objects=[]
-    self.list_all().each { |entry|
-      objects << new(:name => entry, :ensure => :present)
-    }
-    objects
-  end
-
+  # Create a new instance of the resource
   def create
     if exists?
       info "already exists"
@@ -338,6 +321,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
     end
   end 
 
+  # Delete this instance of the resource
   def delete
     unless exists?
       info "already absent"
@@ -353,8 +337,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
   end
 
   #--------------------------------
-  # Call this method when the object is initialized, 
-  # create getter/setter methods for each property our resource type supports.
+  # Call this method when the object is initialized.
+  # It creates getter/setter methods for each property our resource type supports.
   # If setter or getter already defined it will not be overwritten
   def self.mk_resource_methods
     [resource_type.validproperties, resource_type.parameters].flatten.each do |prop|
@@ -363,8 +347,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
       define_method(prop.to_s + "=") { |*vals| set(prop, *vals) } unless public_method_defined?(prop.to_s + "=")
     end
   end
-  #
-
+  
   # Define the needed getters and setters as soon as we know the resource type
   def self.resource_type=(resource_type)
     super
@@ -404,8 +387,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
   def initialize(resource)
     super
     @objectinfo = nil
-    # FIXME: Initiallize this properly.
-    self.class.ia_module="compat"
+    @objectosinfo = nil
   end  
 
 end
diff --git a/lib/puppet/provider/group/aix.rb b/lib/puppet/provider/group/aix.rb
index ceb8898..ecdef60 100755
--- a/lib/puppet/provider/group/aix.rb
+++ b/lib/puppet/provider/group/aix.rb
@@ -9,7 +9,7 @@ require 'puppet/provider/aixobject'
 Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject do
   desc "Group management for AIX! Users are managed with mkgroup, rmgroup, lsgroup, chgroup"
 
-    # This will the the default provider for this platform
+  # This will the the default provider for this platform
   defaultfor :operatingsystem => :aix
   confine :operatingsystem => :aix
 
@@ -35,17 +35,19 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
   #  :aix_attr      AIX command attribute name
   #  :puppet_prop   Puppet propertie name
   #  :to            Method to adapt puppet property to aix command value. Optional.
-  #  :from            Method to adapt aix command value to puppet property. Optional
+  #  :from          Method to adapt aix command value to puppet property. Optional
   self.attribute_mapping = [
     #:name => :name,
     {:aix_attr => :id,       :puppet_prop => :gid },
     {:aix_attr => :users,    :puppet_prop => :members,
       :from => :users_from_attr},
+    {:aix_attr => :attributes, :puppet_prop => :attributes},
   ]
   
   #--------------
-  # Command lines
+  # Command definition
   
+  # Return the IA module arguments based on the resource param ia_load_module
   def get_ia_module_args
     if @resource[:ia_load_module]
       ["-R", @resource[:ia_load_module].to_s]
@@ -54,7 +56,6 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
     end
   end
   
-  
   def lscmd(value=@resource[:name])
     [self.class.command(:list)] +
       self.get_ia_module_args +
@@ -76,12 +77,8 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
       extra_attrs + [@resource[:name]]
   end
 
-  def modifycmd(hash = property_hash, translate=true)
-    if translate
-      args = self.hash2args(hash)
-    else 
-      args = self.hash2args(hash, nil)
-    end
+  def modifycmd(hash = property_hash)
+    args = self.hash2args(hash)
     return nil if args.empty?
     
     [self.class.command(:modify)] +
@@ -96,6 +93,8 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
   end
 
 
+  #--------------
+  # Overwrite get_arguments to add the attributes arguments
   def get_arguments(key, value, mapping, objectinfo)
     # In the case of attributes, return a list of key=vlaue
     if key == :attributes
@@ -106,11 +105,6 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
     super(key, value, mapping, objectinfo)
   end
 
-  # Force convert users it a list.
-  def users_from_attr(value)
-    (value.is_a? String) ? value.split(',') : value
-  end
-
   def filter_attributes(hash)
     # Return only not managed attributtes.
     hash.select {
@@ -128,7 +122,7 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
   def attributes=(attr_hash)
     #self.class.validate(param, value)
     param = :attributes
-    cmd = modifycmd({param => filter_attributes(attr_hash)}, false)
+    cmd = modifycmd({param => filter_attributes(attr_hash)})
     if cmd 
       begin
         execute(cmd)
@@ -138,5 +132,10 @@ Puppet::Type.type(:group).provide :aix, :parent => Puppet::Provider::AixObject d
     end
   end
 
+  # Force convert users it a list.
+  def users_from_attr(value)
+    (value.is_a? String) ? value.split(',') : value
+  end
+
 
 end
diff --git a/lib/puppet/provider/user/aix.rb b/lib/puppet/provider/user/aix.rb
index c231da8..032d2b5 100755
--- a/lib/puppet/provider/user/aix.rb
+++ b/lib/puppet/provider/user/aix.rb
@@ -1,12 +1,11 @@
 #
-# User Puppet provider for AIX. It uses standar commands to manage users:
+# User Puppet provider for AIX. It uses standard commands to manage users:
 #  mkuser, rmuser, lsuser, chuser
 #
 # Notes:
 # - AIX users can have expiry date defined with minute granularity,
 #   but puppet does not allow it. There is a ticket open for that (#5431)
 # - AIX maximum password age is in WEEKs, not days
-# - I force the compat IA module. 
 #
 # See  http://projects.puppetlabs.com/projects/puppet/wiki/Development_Provider_Development
 # for more information
@@ -47,7 +46,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
   #  value !~ /\s/
   #end
 
-  # User attributes to ignore
+  # User attributes to ignore from AIX output.
   def self.attribute_ignore
     []
   end
@@ -59,23 +58,26 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
   #  :aix_attr      AIX command attribute name
   #  :puppet_prop   Puppet propertie name
   #  :to            Method to adapt puppet property to aix command value. Optional.
-  #  :from            Method to adapt aix command value to puppet property. Optional
+  #  :from          Method to adapt aix command value to puppet property. Optional
   self.attribute_mapping = [
     #:name => :name,
-    {:aix_attr => :pgrp,     :puppet_prop => :gid,
+    {:aix_attr => :pgrp,       :puppet_prop => :gid,
         :to => :gid_to_attr, :from => :gid_from_attr},
-    {:aix_attr => :id,       :puppet_prop => :uid},
-    {:aix_attr => :groups,   :puppet_prop => :groups},
-    {:aix_attr => :home,     :puppet_prop => :home},
-    {:aix_attr => :shell,    :puppet_prop => :shell},
-    {:aix_attr => :expires,  :puppet_prop => :expiry,
+    {:aix_attr => :id,         :puppet_prop => :uid},
+    {:aix_attr => :groups,     :puppet_prop => :groups},
+    {:aix_attr => :home,       :puppet_prop => :home},
+    {:aix_attr => :shell,      :puppet_prop => :shell},
+    {:aix_attr => :expires,    :puppet_prop => :expiry,
         :to => :expiry_to_attr, :from => :expiry_from_attr},
-    {:aix_attr => :maxage,   :puppet_prop => :password_max_age},
-    {:aix_attr => :minage,   :puppet_prop => :password_min_age},
+    {:aix_attr => :maxage,     :puppet_prop => :password_max_age},
+    {:aix_attr => :minage,     :puppet_prop => :password_min_age},
+    {:aix_attr => :attributes, :puppet_prop => :attributes},
   ]
   
   #--------------
-  # Command lines
+  # Command definition
+  
+  # Return the IA module arguments based on the resource param ia_load_module
   def get_ia_module_args
     if @resource[:ia_load_module]
       ["-R", @resource[:ia_load_module].to_s]
@@ -84,6 +86,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
     end
   end
   
+  # List groups and Ids
   def lsgroupscmd(value=@resource[:name])
     [command(:lsgroup)] +
       self.get_ia_module_args +
@@ -108,13 +111,10 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
       extra_attrs + [@resource[:name]]
   end
 
-  # Get modify command
-  def modifycmd(hash = property_hash, translate=true)
-    if translate
-      args = self.hash2args(hash)
-    else 
-      args = self.hash2args(hash, nil)
-    end
+  # Get modify command. Set translate=false if no mapping must be used.
+  # Needed for special properties like "attributes"
+  def modifycmd(hash = property_hash)
+    args = self.hash2args(hash)
     return nil if args.empty?
     
     [self.class.command(:modify)] + self.get_ia_module_args +
@@ -141,6 +141,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
         unless value and value.is_a? Hash
       return value.select { |k,v| true }.map { |pair| pair.join("=") }
     end
+        
     super(key, value, mapping, objectinfo)
   end
   
@@ -179,6 +180,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
     verify_group(value)
   end
 
+  # Get the group gid from its name
   def gid_from_attr(value)
     groupid_by_name(value)
   end
@@ -281,7 +283,7 @@ Puppet::Type.type(:user).provide :aix, :parent => Puppet::Provider::AixObject do
   def attributes=(attr_hash)
     #self.class.validate(param, value)
     param = :attributes
-    cmd = modifycmd({param => filter_attributes(attr_hash)}, false)
+    cmd = modifycmd({param => filter_attributes(attr_hash)})
     if cmd 
       begin
         execute(cmd)

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list