summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-01-29 19:35:33 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2007-01-29 19:35:33 +0000
commit6c61f0cc1c3607cd61215c73aaa2cc9c13386f8b (patch)
treee0ad729333f4ee0fe4537414fbdef27eed449ced /lib
parent8198e7e4861e9f98773176f78c23e1246399186a (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.rb27
-rw-r--r--lib/puppet/provider/nameservice/netinfo.rb13
-rw-r--r--lib/puppet/provider/user/netinfo.rb22
-rwxr-xr-xlib/puppet/type/group.rb21
-rwxr-xr-xlib/puppet/type/user.rb36
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