diff options
-rwxr-xr-x | lib/puppet/type/group.rb | 74 | ||||
-rwxr-xr-x | lib/puppet/type/nameservice.rb | 3 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/netinfo.rb | 34 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/objectadd.rb | 52 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/posix.rb | 44 | ||||
-rwxr-xr-x | lib/puppet/type/user.rb | 35 | ||||
-rwxr-xr-x | test/types/tc_user.rb | 1 |
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 } |