diff options
author | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-08-14 06:21:03 +0000 |
---|---|---|
committer | luke <luke@980ebf18-57e1-0310-9a29-db15c13687c0> | 2006-08-14 06:21:03 +0000 |
commit | 12452ee9ca294563f2e2724ff36f179004f9846f (patch) | |
tree | bee6053e8164f4a8dbf214f1898fafecb1d61f2f /lib/puppet/type/user.rb | |
parent | 4d6120a1f77cfe76fafbe32caa5d853449562376 (diff) | |
download | puppet-12452ee9ca294563f2e2724ff36f179004f9846f.tar.gz puppet-12452ee9ca294563f2e2724ff36f179004f9846f.tar.xz puppet-12452ee9ca294563f2e2724ff36f179004f9846f.zip |
Merging r1468 from the implementations branch with r1438 from when the branch was first created.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@1469 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet/type/user.rb')
-rwxr-xr-x | lib/puppet/type/user.rb | 204 |
1 files changed, 75 insertions, 129 deletions
diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb index 4aec9efc3..3a78d9669 100755 --- a/lib/puppet/type/user.rb +++ b/lib/puppet/type/user.rb @@ -4,47 +4,35 @@ require 'puppet/type/state' require 'puppet/type/nameservice' module Puppet - newtype(:user, Puppet::Type::NSSType) do - case Facter["operatingsystem"].value - when "Darwin": - @parentstate = Puppet::NameService::NetInfo::NetInfoState - @parentmodule = Puppet::NameService::NetInfo - when "FreeBSD": - @parentstate = Puppet::NameService::PW::PWUser - @parentmodule = Puppet::NameService::PW - else - @parentstate = Puppet::NameService::ObjectAdd::ObjectAddUser - @parentmodule = Puppet::NameService::ObjectAdd - end - - newstate(:ensure, @parentstate) do - newvalue(:present) do + newtype(:user) do + newstate(:ensure) do + newvalue(:present, :event => :user_created) do # Verify that they have provided everything necessary, if we # are trying to manage the user - if @parent.managed? - @parent.class.states.each { |state| - next if stateobj = @parent.state(state.name) - next if state.name == :ensure - - unless state.autogen? or state.isoptional? - if state.method_defined?(:autogen) - @parent[state.name] = :auto - else - @parent.fail "Users require a value for %s" % - state.name - end - end - } - - #if @states.empty? - # @parent[:comment] = @parent[:name] - #end - end - self.syncname(:present) +# if @parent.managed? +# @parent.class.states.each { |state| +# next if stateobj = @parent.state(state.name) +# next if state.name == :ensure +# +# unless state.autogen? or state.isoptional? +# if state.method_defined?(:autogen) +# @parent[state.name] = :auto +# else +# @parent.fail "Users require a value for %s" % +# state.name +# end +# end +# } +# +# #if @states.empty? +# # @parent[:comment] = @parent[:name] +# #end +# end + provider.create end - newvalue(:absent) do - self.syncname(:absent) + newvalue(:absent, :event => :user_removed) do + provider.delete end desc "The basic state that the object should be in." @@ -80,12 +68,13 @@ module Puppet end def retrieve - if @parent.exists? + if provider.exists? @is = :present else @is = :absent end end + # The default 'sync' method only selects among a list of registered # values. def sync @@ -106,28 +95,13 @@ module Puppet end - newstate(:uid, @parentstate) do + newstate(:uid) do desc "The user ID. Must be specified numerically. For new users 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." - isautogen - - def autogen - highest = 0 - Etc.passwd { |user| - if user.uid > highest - unless user.uid > 65000 - highest = user.uid - end - end - } - - return highest + 1 - end - munge do |value| case value when String @@ -148,12 +122,10 @@ module Puppet end end - newstate(:gid, @parentstate) do + newstate(:gid) do desc "The user's primary group. Can be specified numerically or by name." - isautogen - munge do |gid| method = :getgrgid case gid @@ -197,37 +169,27 @@ module Puppet end - newstate(:comment, @parentstate) do + newstate(:comment) do desc "A description of the user. Generally is a user's full name." - - isoptional - - @posixmethod = :gecos end - newstate(:home, @parentstate) do + newstate(:home) do desc "The home directory of the user. The directory must be created separately and is not currently checked for existence." - - isautogen - @posixmethod = :dir end - newstate(:shell, @parentstate) do + newstate(:shell) do desc "The user's login shell. The shell must exist and be executable." - isautogen end - newstate(:groups, @parentstate) do + newstate(:groups) do desc "The groups of which the user is a member. The primary group should not be listed. Multiple groups should be specified as an array." - isoptional - def should_to_s - self.should + self.should.join(",") end def is_to_s @@ -244,18 +206,22 @@ module Puppet @should ||= [] if @parent[:membership] == :inclusive - @should.sort.join(",") + @should.sort else members = @should if @is.is_a?(Array) members += @is end - members.uniq.sort.join(",") + members.uniq.sort end end def retrieve - @is = grouplist() + if tmp = provider.groups + @is = tmp.split(",") + else + @is = :absent + end end def insync? @@ -278,14 +244,8 @@ module Puppet end def sync - if respond_to? :setgrouplist - # Pass them the group list, so that the :membership logic - # is all in this class, not in parent classes. - setgrouplist(self.should) - return :user_modified - else - super - end + provider.groups = self.should.join(",") + :user_changed end end @@ -293,25 +253,23 @@ module Puppet # so i'm disabling them for now # FIXME Puppet::State::UserLocked is currently non-functional - #newstate(:locked, @parentstate) do + #newstate(:locked) do # desc "The expected return code. An error will be returned if the # executed command returns something else." #end # FIXME Puppet::State::UserExpire is currently non-functional - #newstate(:expire, @parentstate) do + #newstate(:expire) do # desc "The expected return code. An error will be returned if the # executed command returns something else." # @objectaddflag = "-e" - # isautogen #end # FIXME Puppet::State::UserInactive is currently non-functional - #newstate(:inactive, @parentstate) do + #newstate(:inactive) do # desc "The expected return code. An error will be returned if the # executed command returns something else." # @objectaddflag = "-f" - # isautogen #end newparam(:name) do @@ -353,8 +311,6 @@ module Puppet for Mac OS X, NetInfo is used. This is currently unconfigurable, but if you desperately need it to be so, please contact us." - @netinfodir = "users" - # Autorequire the group, if it's around autorequire(:group) do #return nil unless @states.include?(:gid) @@ -384,7 +340,7 @@ module Puppet } end - if @states.include?(:groups) and groups = @states[:groups].should.split(",") + if @states.include?(:groups) and groups = @states[:groups].should autos += groups end @@ -400,55 +356,45 @@ module Puppet end end - # List all found users - def self.listbyname + def self.list_by_name users = [] - Etc.setpwent - while ent = Etc.getpwent - users << ent.name + defaultprovider.listbyname do |user| + users << user end - Etc.endpwent - return users end - def exists? - self.class.parentmodule.exists?(self) - end - - def getinfo(refresh = false) - if @userinfo.nil? or refresh == true - begin - @userinfo = Etc.getpwnam(self[:name]) - rescue ArgumentError => detail - @userinfo = nil - end - end - - @userinfo - end - - def initialize(hash) - @userinfo = nil - super + def self.list + defaultprovider.list - unless defined? @states - raise "wtf?" + self.collect do |user| + user end end def retrieve - info = self.getinfo(true) - - if info.nil? - # the user does not exist - @states.each { |name, state| + absent = false + states().each { |state| + if absent state.is = :absent - } - return - else - super - end + else + state.retrieve + end + + if state.name == :ensure and state.is == :absent + absent = true + next + end + } + #if provider.exists? + # super + #else + # # the user does not exist + # @states.each { |name, state| + # state.is = :absent + # } + # return + #end end end end |