diff options
| author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-01-29 19:35:33 +0000 |
|---|---|---|
| committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2007-01-29 19:35:33 +0000 |
| commit | 6c61f0cc1c3607cd61215c73aaa2cc9c13386f8b (patch) | |
| tree | e0ad729333f4ee0fe4537414fbdef27eed449ced /lib | |
| parent | 8198e7e4861e9f98773176f78c23e1246399186a (diff) | |
Fixing #463. I redid all the autogen stuff so it can handle autogenerating string values for stupid os x.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2114 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/puppet/provider/nameservice.rb | 27 | ||||
| -rw-r--r-- | lib/puppet/provider/nameservice/netinfo.rb | 13 | ||||
| -rw-r--r-- | lib/puppet/provider/user/netinfo.rb | 22 | ||||
| -rwxr-xr-x | lib/puppet/type/group.rb | 21 | ||||
| -rwxr-xr-x | lib/puppet/type/user.rb | 36 |
5 files changed, 43 insertions, 76 deletions
diff --git a/lib/puppet/provider/nameservice.rb b/lib/puppet/provider/nameservice.rb index b10ac34ad..da2de7d57 100644 --- a/lib/puppet/provider/nameservice.rb +++ b/lib/puppet/provider/nameservice.rb @@ -109,10 +109,27 @@ class Puppet::Provider::NameService < Puppet::Provider @ops[state.name] || ("-" + state.name) end end + + # Autogenerate a value. Mostly used for uid/gid, but also used heavily with netinfo, because netinfo is stupid. + def autogen(field) + field = symbolize(field) + id_generators = {:user => :uid, :group => :gid} + if id_generators[@model.class.name] == field + return autogen_id(field) + else + if defined?(AUTOGEN_DEFAULTS) and value = AUTOGEN_DEFAULTS[field] + return value + elsif respond_to?("autogen_%s" % [field]) + return send("autogen_%s" % field) + else + return nil + end + end + end # Autogenerate either a uid or a gid. This is hard-coded: we can only # generate one field type per class. - def autogen + def autogen_id(field) highest = 0 group = method = nil @@ -141,14 +158,6 @@ class Puppet::Provider::NameService < Puppet::Provider return @@prevauto end - def autogen_gid - autogen(@model.class.name) - end - - def autogen_uid - autogen(@model.class.name) - end - def create self.ensure = :present end diff --git a/lib/puppet/provider/nameservice/netinfo.rb b/lib/puppet/provider/nameservice/netinfo.rb index 3cac8f0a7..b5e3d0536 100644 --- a/lib/puppet/provider/nameservice/netinfo.rb +++ b/lib/puppet/provider/nameservice/netinfo.rb @@ -108,7 +108,7 @@ class NetInfo < Puppet::Provider::NameService line2hash(line, params) } end - + # How to add an object. def addcmd creatorcmd("-create") @@ -136,18 +136,9 @@ class NetInfo < Puppet::Provider::NameService # Because our stupid type can't create the whole thing at once, # we have to do this hackishness. Yay. if arg == :present - # We need to generate the id if it's missing. @model.class.validstates.each do |name| next if name == :ensure - unless val = @model.should(name) - if (@model.class.name == :user and name == :uid) or - (@model.class.name == :group and name == :gid) - val = autogen() - else - # No value, and it's not required, so skip it. - next - end - end + next unless val = @model.should(name) || autogen(name) self.send(name.to_s + "=", val) end end diff --git a/lib/puppet/provider/user/netinfo.rb b/lib/puppet/provider/user/netinfo.rb index 6f82d1d34..de35213c1 100644 --- a/lib/puppet/provider/user/netinfo.rb +++ b/lib/puppet/provider/user/netinfo.rb @@ -3,13 +3,24 @@ require 'puppet/provider/nameservice/netinfo' Puppet::Type.type(:user).provide :netinfo, :parent => Puppet::Provider::NameService::NetInfo do - desc "User management in NetInfo." + desc "User management in NetInfo. Note that NetInfo is not smart enough to fill in default information + for users, so this provider will use default settings for home (``/var/empty``), shell (``/usr/bin/false``), + and comment (the user name, capitalized). These defaults are only used when the user is created." commands :nireport => "nireport", :niutil => "niutil" options :comment, :key => "realname" defaultfor :operatingsystem => :darwin + AUTOGEN_DEFAULTS = { + :home => "/var/empty", + :shell => "/usr/bin/false" + } + + def autogen_comment + return @model[:name].capitalize + end + def gid=(value) unless value.is_a?(Integer) raise ArgumentError, "gid= only accepts integers, not %s(%s)" % [value.class, value.inspect] @@ -43,7 +54,14 @@ Puppet::Type.type(:user).provide :netinfo, :parent => Puppet::Provider::NameServ # This is really lame. We have to iterate over each # of the groups and add us to them. def groups=(groups) - groups = groups.split(/\s*,\s*/) + case groups + when Fixnum: + groups = [groups.to_s] + when String + groups = groups.split(/\s*,\s*/) + else + raise Puppet::DevError, "got invalid groups value %s of type %s" % [groups.class, groups] + end # Get just the groups we need to modify diff = groups - (@is || []) diff --git a/lib/puppet/type/group.rb b/lib/puppet/type/group.rb index d68d03515..f4eb03cac 100755 --- a/lib/puppet/type/group.rb +++ b/lib/puppet/type/group.rb @@ -100,27 +100,6 @@ module Puppet differences across systems and thus is not recommended. The GID is picked according to local system standards." - def autogen - highest = 0 - - # Make sure we don't use the same value multiple times - if defined? @@prevauto - @@prevauto += 1 - else - Etc.group { |group| - if group.gid > highest - unless group.gid > 65000 - highest = group.gid - end - end - } - - @@prevauto = highest + 1 - end - - return @@prevauto - end - def retrieve @is = provider.gid end diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb index 952524826..e27436c68 100755 --- a/lib/puppet/type/user.rb +++ b/lib/puppet/type/user.rb @@ -98,7 +98,9 @@ module Puppet being created, if no user ID is specified then one will be chosen automatically, which will likely result in the same user having different IDs on different systems, which is not - recommended." + recommended. This is especially noteworthy if you use Puppet to manage + the same user on both Darwin and other platforms, since Puppet does the + ID generation for you on Darwin, but the tools do so on other platforms." munge do |value| case value @@ -106,14 +108,6 @@ module Puppet if value =~ /^[-0-9]+$/ value = Integer(value) end - when Symbol - unless value == :absent or value == :auto - self.devfail "Invalid UID %s" % value - end - - if value == :auto - value = autogen() - end end return value @@ -172,40 +166,16 @@ module Puppet newstate(:comment) do desc "A description of the user. Generally is a user's full name." - - defaultto do - if @parent.managed? - "%s User" % @parent.title.capitalize - end - end end newstate(:home) do desc "The home directory of the user. The directory must be created separately and is not currently checked for existence." - - defaultto do - unless defined? @@os - @@os = Facter.value(:operatingsystem) - end - if @parent.managed? and @@os == "Darwin" - "/var/empty" - end - end end newstate(:shell) do desc "The user's login shell. The shell must exist and be executable." - - defaultto do - unless defined? @@os - @@os = Facter.value(:operatingsystem) - end - if @@os == "Darwin" and @parent.managed? - "/usr/bin/false" - end - end end newstate(:groups) do |
