lib/puppet/util.rb in puppet-0.9.2 vs lib/puppet/util.rb in puppet-0.13.0

- old
+ new

@@ -17,12 +17,12 @@ # be able to if group if group.is_a?(Integer) gid = group else - unless obj = Puppet::Type::Group[group] - obj = Puppet::Type::Group.create( + unless obj = Puppet.type(:group)[group] + obj = Puppet.type(:group).create( :name => group, :check => [:gid] ) end obj.retrieve @@ -45,12 +45,12 @@ if user # Retrieve the user id if user.is_a?(Integer) uid = user else - unless obj = Puppet::Type::User[user] - obj = Puppet::Type::User.create( + unless obj = Puppet.type(:user)[user] + obj = Puppet.type(:user).create( :name => user, :check => [:uid, :gid] ) end obj.retrieve @@ -83,10 +83,95 @@ end return retval end + # Change the process to a different user + def self.chuser + if group = Puppet[:group] + if group =~ /^\d+$/ + group = Integer(group) + else + begin + g = Etc.getgrnam(group) + rescue ArgumentError + $stderr.puts "Could not find group %s" % group + end + group = g.gid + end + unless Process.gid == group + begin + Process.egid = group + Process.gid = group + rescue + $stderr.puts "could not change to group %s" % group + exit(74) + end + end + end + + if user = Puppet[:user] + if user =~ /^\d+$/ + user = Integer(user) + else + begin + u = Etc.getpwnam(user) + rescue ArgumentError + $stderr.puts "Could not find user %s" % user + end + user = u.uid + end + unless Process.uid == user + begin + Process.euid = user + Process.uid = user + rescue + $stderr.puts "could not change to user %s" % user + exit(74) + end + end + end + end + + # Create a lock file while something is happening + def self.lock(*opts) + lock = opts[0] + ".lock" + while File.exists?(lock) + stamp = File.stat(lock).mtime.to_i + if Time.now.to_i - stamp > 5 + Puppet.notice "Lock file %s is %s seconds old; removing" % + [lock, Time.now.to_i - stamp] + File.delete(lock) + end + #Puppet.debug "%s is locked" % opts[0] + sleep 0.1 + end + File.open(lock, "w") { |f| f.print " "; f.flush } + writing = false + if opts[1] == "w" + writing = true + tmp = opts[0] + ".tmp" + orig = opts[0] + opts[0] = tmp + end + begin + File.open(*opts) { |file| yield file } + if writing + File.rename(tmp, orig) + end + rescue => detail + Puppet.err "Storage error: %s" % detail + raise + ensure + # I don't really understand how the lock file could disappear, + # but just in case... + if FileTest.exists?(lock) + File.delete(lock) + end + end + end + # Create instance methods for each of the log levels. This allows # the messages to be a little richer. Most classes will be calling this # method. def self.logmethods(klass, useself = true) Puppet::Log.eachlevel { |level| @@ -95,16 +180,16 @@ args = args.join(" ") end if useself Puppet::Log.create( :level => level, + :source => self, :message => args ) else Puppet::Log.create( :level => level, - :source => self, :message => args ) end }) } @@ -130,9 +215,18 @@ end } return true end end + + def self.symbolize(value) + case value + when String: value = value.intern + when Symbol: # nothing + else + raise ArgumentError, "'%s' must be a string or symbol" % value + end + end end end -# $Id: util.rb 743 2005-11-16 21:39:31Z luke $ +# $Id: util.rb 873 2006-02-07 23:12:33Z luke $