+1. I don't love the looking-for-id section, but I can't think of another
way to do it.

On Mon, Oct 11, 2010 at 3:58 PM, Nigel Kersten <[email protected]> wrote:

>
> Signed-off-by: Nigel Kersten <[email protected]>
> ---
>  .../provider/nameservice/directoryservice.rb       |   34
> +++++++++++++++++++-
>  1 files changed, 33 insertions(+), 1 deletions(-)
>
> diff --git a/lib/puppet/provider/nameservice/directoryservice.rb
> b/lib/puppet/provider/nameservice/directoryservice.rb
> index 965a2aa..106d99e 100644
> --- a/lib/puppet/provider/nameservice/directoryservice.rb
> +++ b/lib/puppet/provider/nameservice/directoryservice.rb
> @@ -321,6 +321,31 @@ class DirectoryService < Puppet::Provider::NameService
>     password_hash
>   end
>
> +  # Unlike most other *nixes, OS X doesn't provide built in functionality
> +  # for automatically assigning uids and gids to accounts, so we set up
> these
> +  # methods for consumption by functionality like --mkusers
> +  # By default we restrict to a reasonably sane range for system accounts
> +  def self.next_system_id(id_type, min_id=20)
> +    dscl_args = ['.', '-list']
> +    if id_type == 'uid'
> +      dscl_args << '/Users' << 'uid'
> +    elsif id_type == 'gid'
> +      dscl_args << '/Groups' << 'gid'
> +    else
> +      fail("Invalid id_type #{id_type}. Only 'uid' and 'gid' supported")
> +    end
> +    dscl_out = dscl(dscl_args)
> +    # We're ok with throwing away negative uids here.
> +    ids = dscl_out.split.compact.collect { |l| l.to_i if l.match(/^\d+$/)
> }
> +    ids.compact!.sort! { |a,b| a.to_f <=> b.to_f }
> +    # We're just looking for an unused id in our sorted array.
> +    ids.each_index do |i|
> +      next_id = ids[i] + 1
> +      return next_id if ids[i+1] != next_id and next_id >= min_id
> +    end
> +  end
> +
> +
>   def ensure=(ensure_value)
>     super
>     # We need to loop over all valid properties for the type we're
> @@ -422,7 +447,14 @@ class DirectoryService < Puppet::Provider::NameService
>     # Now we create all the standard properties
>     Puppet::Type.type(@resource.class.name).validproperties.each do
> |property|
>       next if property == :ensure
> -      if value = @resource.should(property) and value != ""
> +      value = @resource.should(property)
> +      if property == :gid and value.nil?
> +        value = self.class.next_system_id(id_type='gid')
> +      end
> +      if property == :uid and value.nil?
> +        value = self.class.next_system_id(id_type='uid')
> +      end
> +      if value != "" and not value.nil?
>         if property == :members
>           add_members(nil, value)
>         else
> --
> 1.7.2.3
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Developers" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<puppet-dev%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to