summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2005-09-17 02:44:32 +0000
committerluke <luke@980ebf18-57e1-0310-9a29-db15c13687c0>2005-09-17 02:44:32 +0000
commit106d397bc0de9512b24724c5b3ed95db501671ea (patch)
treed6faae5ea8e1d5801893921b5f382ad0ff85c936 /lib/puppet
parent42deabbe80de28ca7e086568cdb0fe670415893b (diff)
downloadpuppet-106d397bc0de9512b24724c5b3ed95db501671ea.tar.gz
puppet-106d397bc0de9512b24724c5b3ed95db501671ea.tar.xz
puppet-106d397bc0de9512b24724c5b3ed95db501671ea.zip
Users and groups now nearly work on normal machines and on os x, and I think I have a decent platform for expansion to some of the other important elements like hosts (probably most important after users and groups). Some tests are still failing on os x, because netinfo sucks, but I will hopefully be able to figure out a solution soon. Stupid OS X and NetInfo.
git-svn-id: https://reductivelabs.com/svn/puppet/trunk@684 980ebf18-57e1-0310-9a29-db15c13687c0
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/statechange.rb6
-rw-r--r--lib/puppet/transaction.rb7
-rw-r--r--lib/puppet/type.rb2
-rwxr-xr-xlib/puppet/type/group.rb20
-rw-r--r--lib/puppet/type/nameservice/netinfo.rb70
-rw-r--r--lib/puppet/type/nameservice/objectadd.rb15
-rw-r--r--lib/puppet/type/nameservice/posix.rb64
-rwxr-xr-xlib/puppet/type/user.rb56
8 files changed, 204 insertions, 36 deletions
diff --git a/lib/puppet/statechange.rb b/lib/puppet/statechange.rb
index 0dd6aa858..cd5195616 100644
--- a/lib/puppet/statechange.rb
+++ b/lib/puppet/statechange.rb
@@ -121,7 +121,7 @@ module Puppet
self
end
unless @state.insync?
- Puppet.info "Rolling %s backward" % self
+ Puppet.info "Backing %s" % self
return self.go
else
Puppet.debug "rollback is already in sync: %s vs. %s" %
@@ -141,7 +141,9 @@ module Puppet
#---------------------------------------------------------------
def to_s
- return "change %s.%s" % [@transaction.object_id, self.object_id]
+ return "change %s.%s(%s)" %
+ [@transaction.object_id, self.object_id, @state.change_to_s]
+ #return "change %s.%s" % [@transaction.object_id, self.object_id]
end
end
end
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 2b8d93bbf..b44393efd 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -58,8 +58,13 @@ class Transaction
#@@changed.push change.state.parent
rescue => detail
Puppet.err("%s failed: %s" % [change,detail])
+ if Puppet[:debug] and detail.respond_to?(:stack)
+ puts detail.stack
+ end
next
- # FIXME this should support using onerror to determine behaviour
+ # FIXME this should support using onerror to determine
+ # behaviour; or more likely, the client calling us
+ # should do so
end
if events.nil?
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index 49190596a..a9ae147ac 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -1065,7 +1065,7 @@ class Type < Puppet::Element
states.each { |state|
unless state.insync?
- #Puppet.debug("%s is not in sync" % state)
+ Puppet.debug("%s is not in sync" % state)
insync = false
end
}
diff --git a/lib/puppet/type/group.rb b/lib/puppet/type/group.rb
index c4421e57f..eb15907af 100755
--- a/lib/puppet/type/group.rb
+++ b/lib/puppet/type/group.rb
@@ -25,10 +25,23 @@ module Puppet
:gid
end
+ def autogen
+ highest = 0
+ Etc.group { |group|
+ if group.gid > highest
+ unless group.gid > 65000
+ highest = group.gid
+ end
+ end
+ }
+
+ return highest + 1
+ end
+
def should=(gid)
case gid
when String
- if gid =~ /^[0-9]+$/
+ if gid =~ /^[-0-9]+$/
gid = Integer(gid)
else
raise Puppet::Error, "Invalid GID %s" % gid
@@ -41,6 +54,11 @@ module Puppet
unless gid == :auto or gid == :notfound
raise Puppet::DevError, "Invalid GID %s" % gid
end
+ if gid == :auto
+ unless self.class.autogen?
+ gid = autogen
+ end
+ end
end
Puppet.info "Setting gid to %s" % gid
diff --git a/lib/puppet/type/nameservice/netinfo.rb b/lib/puppet/type/nameservice/netinfo.rb
index bd0fa2dda..35d7348d8 100644
--- a/lib/puppet/type/nameservice/netinfo.rb
+++ b/lib/puppet/type/nameservice/netinfo.rb
@@ -8,13 +8,6 @@ module Puppet
class Type
# Return the NetInfo directory in which a given object type is stored.
# Defaults to the type's name if @netinfodir is unset.
- def self.netinfodir
- if defined? @netinfodir and @netinfodir
- return @netinfodir
- else
- return @name
- end
- end
end
module NameService
@@ -47,6 +40,7 @@ module Puppet
if output == ""
return false
else
+ #Puppet.debug "%s exists: %s" % [obj.name, output]
return true
end
end
@@ -60,17 +54,21 @@ module Puppet
end
class NetInfoState < POSIX::POSIXState
+ def self.allatonce?
+ false
+ end
+
def self.netinfokey
if defined? @netinfokey and @netinfokey
return @netinfokey
else
- return @name
+ return self.name
end
end
def retrieve
dir = @parent.class.netinfodir
- cmd = ["nireport", "/" "/%s" % dir, "name"]
+ cmd = ["nireport", "/", "/%s" % dir, "name"]
if key = self.class.netinfokey
cmd << key.to_s
@@ -79,16 +77,22 @@ module Puppet
"Could not find netinfokey for state %s" %
self.class.name
end
+ Puppet.debug "Executing %s" % cmd.join(" ").inspect
output = %x{#{cmd.join(" ")} 2>&1}.split("\n").each { |line|
- name, value = line.chomp.split(/\s+/)
-
- if name == @parent.name
- if value =~ /^\d+$/
- @is = Integer(value)
- else
- @is = value
+ if line =~ /^(\w+)\s+(.+)$/
+ name = $1
+ value = $2.sub(/\s+$/, '')
+
+ if name == @parent.name
+ if value =~ /^[-0-9]+$/
+ @is = Integer(value)
+ else
+ @is = value
+ end
end
+ else
+ raise Puppet::DevError, "Could not match %s" % line
end
}
@@ -108,7 +112,11 @@ module Puppet
cmd << "/" << "/%s/%s" %
[@parent.class.netinfodir, @parent.name]
- cmd.join(" ")
+ #if arg == "-create"
+ # return [cmd.join(" "), self.modifycmd].join(";")
+ #else
+ return cmd.join(" ")
+ #end
end
def deletecmd
@@ -132,7 +140,33 @@ module Puppet
end
end
- class GroupGID < NetInfoState; end
+ class GroupGID < NetInfoState
+ end
+
+ class UserUID < NetInfoState
+ end
+
+ class UserGID < NetInfoState
+ end
+
+ class UserComment < NetInfoState
+ @netinfokey = "realname"
+ end
+
+ class UserHome < NetInfoState
+ end
+
+ class UserShell < NetInfoState
+ end
+
+ class UserLocked < NetInfoState
+ end
+
+ class UserExpire < NetInfoState
+ end
+
+ class UserInactive < NetInfoState
+ end
end
end
end
diff --git a/lib/puppet/type/nameservice/objectadd.rb b/lib/puppet/type/nameservice/objectadd.rb
index 02b43f669..0a6842955 100644
--- a/lib/puppet/type/nameservice/objectadd.rb
+++ b/lib/puppet/type/nameservice/objectadd.rb
@@ -34,6 +34,10 @@ module Puppet
end
class ObjectAddGroup < POSIX::POSIXState
+ def self.allatonce?
+ true
+ end
+
def addcmd
cmd = ["groupadd"]
if gid = @parent.should(:gid)
@@ -62,9 +66,14 @@ module Puppet
class GroupGID < ObjectAddGroup
@objectaddflag = "-g"
+ @autogen = true
end
class ObjectAddUser < POSIX::POSIXState
+ def self.allatonce?
+ true
+ end
+
def addcmd
cmd = ["useradd"]
@parent.eachstate { |state|
@@ -98,10 +107,12 @@ module Puppet
end
class UserUID < ObjectAddUser
@objectaddflag = "-u"
+ @autogen = true
end
class UserGID < ObjectAddUser
@objectaddflag = "-g"
+ @autogen = true
end
class UserComment < ObjectAddUser
@@ -110,10 +121,12 @@ module Puppet
class UserHome < ObjectAddUser
@objectaddflag = "-d"
+ @autogen = true
end
class UserShell < ObjectAddUser
@objectaddflag = "-s"
+ @autogen = true
end
class UserLocked < ObjectAddUser
@@ -121,10 +134,12 @@ module Puppet
class UserExpire < ObjectAddUser
@objectaddflag = "-e"
+ @autogen = true
end
class UserInactive < ObjectAddUser
@objectaddflag = "-f"
+ @autogen = true
end
end
end
diff --git a/lib/puppet/type/nameservice/posix.rb b/lib/puppet/type/nameservice/posix.rb
index caa125f31..33d364dda 100644
--- a/lib/puppet/type/nameservice/posix.rb
+++ b/lib/puppet/type/nameservice/posix.rb
@@ -20,6 +20,22 @@ module Puppet
class POSIXState < Puppet::State
class << self
attr_accessor :extender
+
+ def autogen?
+ if defined? @autogen
+ return @autogen
+ else
+ return false
+ end
+ end
+
+ def optional?
+ if defined? @optional
+ return @optional
+ else
+ return false
+ end
+ end
end
def self.doc
@@ -80,15 +96,26 @@ module Puppet
end
def sync
- obj = @parent.getinfo
-
+ event = nil
+ if @is == :notfound
+ self.retrieve
+ if @is == @should
+ return nil
+ end
+ end
# if the object needs to be created or deleted,
# depend on another method to do it all at once
if @is == :notfound or @should == :notfound
- return syncname()
+ event = syncname()
+
+ # if the whole object is created at once, just return
+ # an event saying so
+ if self.class.allatonce?
+ return event
+ end
end
- if obj.nil?
+ unless @parent.exists?
raise Puppet::DevError,
"%s %s does not exist; cannot set %s" %
[@parent.class.name, @parent.name, self.class.name]
@@ -102,24 +129,27 @@ module Puppet
output = %x{#{cmd} 2>&1}
+
unless $? == 0
raise Puppet::Error, "Could not modify %s on %s %s: %s" %
[self.class.name, @parent.class.name,
@parent.name, output]
end
- return "#{@parent.class.name}_modified".intern
+ if event
+ return event
+ else
+ return "#{@parent.class.name}_modified".intern
+ end
end
private
def syncname
- obj = @parent.getinfo
-
cmd = nil
event = nil
if @should == :notfound
# we need to remove the object...
- if obj.nil?
+ unless @parent.exists?
# the group already doesn't exist
return nil
end
@@ -129,10 +159,8 @@ module Puppet
cmd = self.deletecmd
type = "delete"
else
- unless obj.nil?
- raise Puppet::DevError,
- "Got told to create a %s that already exists" %
- @parent.class.name
+ if @parent.exists?
+ return nil
end
# blah blah, define elsewhere, blah blah
@@ -148,6 +176,18 @@ module Puppet
[type, @parent.class.name, @parent.name, output]
end
+ # we want object creation to show up as one event,
+ # not many
+ unless self.class.allatonce?
+ if type == "create"
+ Puppet.info "syncing everyone"
+ @parent.eachstate { |state|
+ Puppet.info "syncing %s" % state.name
+ state.sync
+ }
+ end
+ end
+
return "#{@parent.class.name}_#{type}d".intern
end
end
diff --git a/lib/puppet/type/user.rb b/lib/puppet/type/user.rb
index 32b4bca18..43374d1f4 100755
--- a/lib/puppet/type/user.rb
+++ b/lib/puppet/type/user.rb
@@ -19,6 +19,38 @@ module Puppet
def self.name
:uid
end
+
+ def autogen
+ highest = 0
+ Etc.passwd { |user|
+ if user.uid > highest
+ unless user.uid > 65000
+ highest = user.uid
+ end
+ end
+ }
+
+ return highest + 1
+ end
+
+ def should=(value)
+ case value
+ when String
+ if value =~ /^[-0-9]+$/
+ value = Integer(value)
+ end
+ when Symbol
+ unless value == :notfound or value == :auto
+ raise Puppet::DevError, "Invalid UID %s" % value
+ end
+
+ if value == :auto
+ value = autogen()
+ end
+ end
+
+ @should = value
+ end
end
module UserGID
@@ -34,7 +66,7 @@ module Puppet
def should=(gid)
method = :getgrgid
if gid.is_a?(String)
- if gid =~ /^[0-9]+$/
+ if gid =~ /^[-0-9]+$/
gid = Integer(gid)
else
method = :getgrnam
@@ -51,6 +83,7 @@ module Puppet
[gid, detail]
end
+ Puppet.notice "setting gid to %s" % ginfo.gid.inspect
@should = ginfo.gid
end
end
@@ -64,6 +97,10 @@ module Puppet
:comment
end
+ def self.optional?
+ true
+ end
+
def self.posixmethod
:gecos
end
@@ -186,6 +223,10 @@ module Puppet
@netinfodir = "users"
+ def exists?
+ self.class.statemodule.exists?(self)
+ end
+
def getinfo(refresh = false)
if @userinfo.nil? or refresh == true
begin
@@ -202,6 +243,19 @@ module Puppet
@userinfo = nil
super
+ self.class.states.each { |state|
+ next if @states.include?(state.name)
+
+ unless state.autogen? or state.optional?
+ if state.method_defined?(:autogen)
+ self[state.name] = :auto
+ else
+ raise Puppet::Error,
+ "Users require a value for %s" % state.name
+ end
+ end
+ }
+
if @states.empty?
self[:comment] = self[:name]
end