diff options
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/statechange.rb | 6 | ||||
-rw-r--r-- | lib/puppet/transaction.rb | 7 | ||||
-rw-r--r-- | lib/puppet/type.rb | 2 | ||||
-rwxr-xr-x | lib/puppet/type/group.rb | 20 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/netinfo.rb | 70 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/objectadd.rb | 15 | ||||
-rw-r--r-- | lib/puppet/type/nameservice/posix.rb | 64 | ||||
-rwxr-xr-x | lib/puppet/type/user.rb | 56 |
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 |