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 $