Parent

Files

Class/Module Index [+]

Quicksearch

Chef::Daemon

Attributes

name[RW]

Public Class Methods

_change_privilege(user, group=user) click to toggle source

Change privileges of the process to be the specified user and group

Parameters

user<String>

The user to change the process to.

group<String>

The group to change the process to.

Alternatives

If group is left out, the user will be used (changing to user:user)

# File lib/chef/daemon.rb, line 164
def _change_privilege(user, group=user)
  uid, gid = Process.euid, Process.egid

  begin
    target_uid = Etc.getpwnam(user).uid
  rescue ArgumentError => e
    Chef::Application.fatal!("Failed to get UID for user #{user}, does it exist? #{e.message}")
    return false
  end
   
  begin
    target_gid = Etc.getgrnam(group).gid
  rescue ArgumentError => e
    Chef::Application.fatal!("Failed to get GID for group #{group}, does it exist? #{e.message}")
    return false
  end

  if (uid != target_uid) or (gid != target_gid)
    Process.initgroups(user, target_gid)
    Process::GID.change_privilege(target_gid)
    Process::UID.change_privilege(target_uid)
  end
  true
rescue Errno::EPERM => e
  Chef::Application.fatal!("Permission denied when trying to change #{uid}:#{gid} to #{target_uid}:#{target_gid}. #{e.message}")
end
change_privilege() click to toggle source

Change process user/group to those specified in Chef::Config

# File lib/chef/daemon.rb, line 143
def change_privilege
  Dir.chdir("/")

  if Chef::Config[:user] and Chef::Config[:group]
    Chef::Log.info("About to change privilege to #{Chef::Config[:user]}:#{Chef::Config[:group]}")
    _change_privilege(Chef::Config[:user], Chef::Config[:group])
  elsif Chef::Config[:user]
    Chef::Log.info("About to change privilege to #{Chef::Config[:user]}")
    _change_privilege(Chef::Config[:user])
  end
end
daemonize(name) click to toggle source

Daemonize the current process, managing pidfiles and process uid/gid

Parameters

name<String>

The name to be used for the pid file

# File lib/chef/daemon.rb, line 33
def daemonize(name)
  @name = name
  pid = pid_from_file
  unless running?
    remove_pid_file()
    Chef::Log.info("Daemonizing..")
    begin
      exit if fork
      Process.setsid
      exit if fork
      Chef::Log.info("Forked, in #{Process.pid}. Privileges: #{Process.euid} #{Process.egid}")
      File.umask Chef::Config[:umask]
      $stdin.reopen("/dev/null")
      $stdout.reopen("/dev/null", "a")
      $stderr.reopen($stdout)
      save_pid_file
      at_exit { remove_pid_file }
    rescue NotImplementedError => e
      Chef::Application.fatal!("There is no fork: #{e.message}")
    end
  else
    Chef::Application.fatal!("Chef is already running pid #{pid}")
  end
end
forked?() click to toggle source

Check if this process if forked from a Chef daemon

Returns

Boolean

True if this process is forked False if this process is not forked

# File lib/chef/daemon.rb, line 83
def forked?
  if running? and Process.ppid == pid_from_file.to_i
    # chef daemon is running and this process is a child of it
    true
  elsif not running? and Process.ppid == 1
    # an orphaned fork, its parent becomes init, launchd, etc. after chef daemon dies
    true
  else
    false
  end
end
pid_file() click to toggle source

Gets the pid file for @name

Returns

String

Location of the pid file for @name

# File lib/chef/daemon.rb, line 99
def pid_file
   Chef::Config[:pid_file] or "/tmp/#{@name}.pid"
end
pid_from_file() click to toggle source

Suck the pid out of pid_file

Returns

Integer

The PID from pid_file

nil

Returned if the pid_file does not exist.

# File lib/chef/daemon.rb, line 110
def pid_from_file
  File.read(pid_file).chomp.to_i
rescue Errno::ENOENT, Errno::EACCES
  nil
end
remove_pid_file() click to toggle source

Delete the PID from the filesystem

# File lib/chef/daemon.rb, line 135
def remove_pid_file
  if not forked? then
    FileUtils.rm(pid_file) if File.exists?(pid_file)
  end
end
running?() click to toggle source

Check if Chef is running based on the pid_file

Returns

Boolean

True if Chef is running False if Chef is not running

# File lib/chef/daemon.rb, line 64
def running?
  if pid_from_file.nil?
    false
  else
    Process.kill(0, pid_from_file)
    true
  end
rescue Errno::ESRCH, Errno::ENOENT
  false
rescue Errno::EACCES => e
  Chef::Application.fatal!("You don't have access to the PID file at #{pid_file}: #{e.message}")
end
save_pid_file() click to toggle source

Store the PID on the filesystem This uses the Chef::Config option, or "/tmp/name.pid" otherwise

# File lib/chef/daemon.rb, line 119
def save_pid_file
  file = pid_file
  begin
    FileUtils.mkdir_p(File.dirname(file))
  rescue Errno::EACCES => e
    Chef::Application.fatal!("Failed store pid in #{File.dirname(file)}, permission denied: #{e.message}")
  end

  begin
    File.open(file, "w") { |f| f.write(Process.pid.to_s) }
  rescue Errno::EACCES => e
    Chef::Application.fatal!("Couldn't write to pidfile #{file}, permission denied: #{e.message}")
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.