summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
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