summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xlib/puppet/type/group.rb74
-rwxr-xr-xlib/puppet/type/nameservice.rb3
-rw-r--r--lib/puppet/type/nameservice/netinfo.rb34
-rw-r--r--lib/puppet/type/nameservice/objectadd.rb52
-rw-r--r--lib/puppet/type/nameservice/posix.rb44
-rwxr-xr-xlib/puppet/type/user.rb35
-rwxr-xr-xtest/types/tc_user.rb1
7 files changed, 147 insertions, 96 deletions
diff --git a/lib/puppet/type/group.rb b/lib/puppet/type/group.rb
index 80b83f000..c4421e57f 100755
--- a/lib/puppet/type/group.rb
+++ b/lib/puppet/type/group.rb
@@ -9,6 +9,7 @@
require 'etc'
require 'facter'
require 'puppet/type/state'
+require 'puppet/type/nameservice'
module Puppet
class State
@@ -25,16 +26,21 @@ module Puppet
end
def should=(gid)
- if gid.is_a?(String)
+ case gid
+ when String
if gid =~ /^[0-9]+$/
gid = Integer(gid)
else
raise Puppet::Error, "Invalid GID %s" % gid
end
- end
-
- if gid.is_a?(Integer) and gid < 0
- raise Puppet::Error, "GIDs must be positive"
+ when Integer
+ unless gid >= 0
+ raise Puppet::Error, "GIDs must be positive"
+ end
+ when Symbol
+ unless gid == :auto or gid == :notfound
+ raise Puppet::DevError, "Invalid GID %s" % gid
+ end
end
Puppet.info "Setting gid to %s" % gid
@@ -46,21 +52,38 @@ module Puppet
class Type
class Group < Type
- statemodule = nil
+ statenames = [
+ "GroupGID"
+ ]
case Facter["operatingsystem"].value
when "Darwin":
- statemodule = Puppet::NameService::NetInfo::NetInfoGroup
+ @statemodule = Puppet::NameService::NetInfo
else
- statemodule = Puppet::NameService::ObjectAdd::ObjectAddGroup
+ @statemodule = Puppet::NameService::ObjectAdd
end
- @states = statemodule.substates
+ @states = statenames.collect { |name|
+ fullname = @statemodule.to_s + "::" + name
+ begin
+ eval(fullname)
+ rescue NameError
+ raise Puppet::DevError, "Could not retrieve state class %s" %
+ fullname
+ end
+ }.each { |klass|
+ klass.complete
+ }
@name = :group
@namevar = :name
@parameters = [:name]
+ class << self
+ attr_accessor :netinfodir
+ attr_accessor :statemodule
+ end
+
@netinfodir = "groups"
@paramdoc[:name] = "The group name. While naming limitations vary by
@@ -72,22 +95,7 @@ module Puppet
membership must be managed on individual users."
def exists?
- case @@extender
- when "NInfo":
- cmd = "nidump -r /groups/%s /" % self.name
- output = %x{#{cmd} 2>/dev/null}
- if output == ""
- return false
- else
- return true
- end
- else
- if self.getinfo
- return true
- else
- return false
- end
- end
+ self.class.statemodule.exists?(self)
end
def getinfo(refresh = false)
@@ -112,20 +120,8 @@ module Puppet
super
else
# the group does not exist
-
- # unless we're in noop mode, we need to auto-pick a gid if
- # there hasn't been one specified
- unless @states.include?(:gid) or self.noop
- highest = 0
- Etc.group { |group|
- if group.gid > highest
- unless group.gid > 65000
- highest = group.gid
- end
- end
- }
-
- self[:gid] = highest + 1
+ unless @states.include?(:gid)
+ self[:gid] = :auto
end
@states.each { |name, state|
diff --git a/lib/puppet/type/nameservice.rb b/lib/puppet/type/nameservice.rb
new file mode 100755
index 000000000..2e289936a
--- /dev/null
+++ b/lib/puppet/type/nameservice.rb
@@ -0,0 +1,3 @@
+require 'puppet/type/nameservice/posix'
+require 'puppet/type/nameservice/netinfo'
+require 'puppet/type/nameservice/objectadd'
diff --git a/lib/puppet/type/nameservice/netinfo.rb b/lib/puppet/type/nameservice/netinfo.rb
index 3a86bb9e4..bd0fa2dda 100644
--- a/lib/puppet/type/nameservice/netinfo.rb
+++ b/lib/puppet/type/nameservice/netinfo.rb
@@ -1,6 +1,9 @@
# Manage NetInfo POSIX objects. Probably only used on OS X, but I suppose
# it could be used elsewhere.
+require 'puppet'
+require 'puppet/type/nameservice/posix'
+
module Puppet
class Type
# Return the NetInfo directory in which a given object type is stored.
@@ -36,6 +39,18 @@ module Puppet
end
end
+ def self.exists?(obj)
+ cmd = "nidump -r /%s/%s /" %
+ [obj.class.netinfodir, obj.name]
+
+ output = %x{#{cmd} 2>/dev/null}
+ if output == ""
+ return false
+ else
+ return true
+ end
+ end
+
def self.flush
output = %x{lookupd -flushcache 2>&1}
@@ -113,26 +128,11 @@ module Puppet
"Could not find netinfokey for state %s" %
self.class.name
end
- cmd.join(" "
- end
- end
-
- class NetInfoGroup < NetInfoState
- @subs = []
- def self.inherited(sub)
- @subs << sub
- mod = "Puppet::State::%s" %
- sub.to_s.sub(/.+::/,'')
- sub.include(eval(mod))
- end
-
- def self.substates
- @subs
+ cmd.join(" ")
end
-
end
- class NetInfoGID < NetInfoState; end
+ class GroupGID < NetInfoState; end
end
end
end
diff --git a/lib/puppet/type/nameservice/objectadd.rb b/lib/puppet/type/nameservice/objectadd.rb
index f58ce7739..02b43f669 100644
--- a/lib/puppet/type/nameservice/objectadd.rb
+++ b/lib/puppet/type/nameservice/objectadd.rb
@@ -1,5 +1,7 @@
+require 'puppet'
+
module Puppet
- class Type
+ class State
def self.objectaddflag
if defined? @objectaddflag and @objectaddflag
return @objectaddflag
@@ -23,12 +25,23 @@ module Puppet
end
end
+ def self.exists?(obj)
+ if obj.getinfo
+ return true
+ else
+ return false
+ end
+ end
+
class ObjectAddGroup < POSIX::POSIXState
def addcmd
cmd = ["groupadd"]
if gid = @parent.should(:gid)
- cmd << "-g" << gid
+ unless gid == :auto
+ cmd << "-g" << gid
+ end
end
+ cmd << @parent.name
return cmd.join(" ")
end
@@ -40,7 +53,7 @@ module Puppet
def modifycmd
[
"groupmod",
- self.class.xaddflag,
+ self.class.objectaddflag,
"'%s'" % @should,
@parent.name
].join(" ")
@@ -52,30 +65,6 @@ module Puppet
end
class ObjectAddUser < POSIX::POSIXState
- class << self
- attr_accessor :extender
- end
-
- @subs = []
- def self.inherited(sub)
- @subs << sub
- mod = "Puppet::State::%s" %
- sub.to_s.sub(/.+::/,'')
- begin
- modklass = eval(mod)
- rescue NameError
- raise Puppet::Error,
- "Could not find extender module for %s" % sub.to_s
- end
- sub.include(modklass)
-
- sub.extender = modklass
- end
-
- def self.substates
- @subs
- end
-
def addcmd
cmd = ["useradd"]
@parent.eachstate { |state|
@@ -83,6 +72,13 @@ module Puppet
# have spaces in it
cmd << state.class.objectaddflag << "'%s'" % state.should
}
+ # stupid fedora
+ case Facter["distro"].value
+ when "Fedora", "RedHat":
+ cmd << "-M"
+ else
+ end
+ cmd << @parent.name
cmd.join(" ")
end
@@ -109,7 +105,7 @@ module Puppet
end
class UserComment < ObjectAddUser
- @objectaddflag = "-d"
+ @objectaddflag = "-c"
end
class UserHome < ObjectAddUser
diff --git a/lib/puppet/type/nameservice/posix.rb b/lib/puppet/type/nameservice/posix.rb
index c2faefa74..caa125f31 100644
--- a/lib/puppet/type/nameservice/posix.rb
+++ b/lib/puppet/type/nameservice/posix.rb
@@ -1,3 +1,5 @@
+require 'puppet'
+
module Puppet
class Type
def self.posixmethod
@@ -16,6 +18,10 @@ module Puppet
# a subclass of these classes to actually modify the system.
module POSIX
class POSIXState < Puppet::State
+ class << self
+ attr_accessor :extender
+ end
+
def self.doc
if defined? @extender
@extender.doc
@@ -24,33 +30,55 @@ module Puppet
end
end
+ def self.complete
+ mod = "Puppet::State::%s" %
+ self.to_s.sub(/.+::/,'')
+ begin
+ modklass = eval(mod)
+ rescue NameError
+ raise Puppet::Error,
+ "Could not find extender module %s for %s" %
+ [mod, self.to_s]
+ end
+ include modklass
+
+ self.extender = modklass
+ end
+
def self.posixmethod
if defined? @extender
if @extender.respond_to?(:posixmethod)
+ return @extender.posixmethod
else
- return @name
+ return @extender.name
end
else
- return @name
+ raise Puppet::DevError,
+ "%s could not retrieve posixmethod" % self
end
end
def self.name
@extender.name
end
+
# we use the POSIX interfaces to retrieve all information,
# so we don't have to worry about abstracting that across
# the system
def retrieve
if obj = @parent.getinfo(true)
- method = self.class.posixmethod
- @is = obj.send(method)
+ if method = self.class.posixmethod || self.class.name
+ @is = obj.send(method)
+ else
+ raise Puppet::DevError,
+ "%s has no posixmethod" % self.class
+ end
else
@is = :notfound
end
-
end
+
def sync
obj = @parent.getinfo
@@ -70,6 +98,8 @@ module Puppet
# or its parent class
cmd = self.modifycmd
+ Puppet.debug "Executing %s" % cmd.inspect
+
output = %x{#{cmd} 2>&1}
unless $? == 0
@@ -109,6 +139,7 @@ module Puppet
cmd = self.addcmd
type = "create"
end
+ Puppet.debug "Executing %s" % cmd.inspect
output = %x{#{cmd} 2>&1}
@@ -119,9 +150,6 @@ module Puppet
return "#{@parent.class.name}_#{type}d".intern
end
-
- class POSIXGID
- end
end
end
end
diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb
index d42e7c078..32b4bca18 100755
--- a/lib/puppet/type/user.rb
+++ b/lib/puppet/type/user.rb
@@ -3,6 +3,7 @@
require 'etc'
require 'facter'
require 'puppet/type/state'
+require 'puppet/type/nameservice'
module Puppet
class State
@@ -87,6 +88,8 @@ module Puppet
def self.doc
"The user's login shell. The shell must exist and be
executable."
+ end
+
def self.name
:shell
end
@@ -131,15 +134,39 @@ module Puppet
class Type
class User < Type
- statemodule = nil
+ statenames = [
+ "UserUID",
+ "UserGID",
+ "UserComment",
+ "UserHome",
+ "UserShell"
+ ]
+ @statemodule = nil
case Facter["operatingsystem"].value
when "Darwin":
- statemodule = Puppet::NameService::NetInfo::NetInfoUser
+ @statemodule = Puppet::NameService::NetInfo
else
- statemodule = Puppet::NameService::ObjectAdd::ObjectAddUser
+ @statemodule = Puppet::NameService::ObjectAdd
+ end
+
+ class << self
+ attr_accessor :netinfodir
+ attr_accessor :statemodule
end
- @states = statemodule.substates
+ @states = []
+
+ @states = statenames.collect { |name|
+ fullname = @statemodule.to_s + "::" + name
+ begin
+ eval(fullname)
+ rescue NameError
+ raise Puppet::DevError, "Could not retrieve state class %s" %
+ fullname
+ end
+ }.each { |klass|
+ klass.complete
+ }
@parameters = [
:name
diff --git a/test/types/tc_user.rb b/test/types/tc_user.rb
index 0e0072b96..fd1e7d8e6 100755
--- a/test/types/tc_user.rb
+++ b/test/types/tc_user.rb
@@ -146,6 +146,7 @@ class TestUser < TestPuppet
group = Etc.getgrnam(gid)
rescue ArgumentError => detail
false
+ next
end
old != group.gid
}