class Chef::Daemon

Attributes

name[RW]
runlock[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 103
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) || (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 82
def change_privilege
  Dir.chdir("/")

  if Chef::Config[:user] && 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 35
def daemonize(name)
  @name = name
  @runlock = RunLock.new(pid_file)
  if runlock.test
    # We've acquired the daemon lock. Now daemonize.
    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)
      runlock.save_pid
    rescue NotImplementedError => e
      Chef::Application.fatal!("There is no fork: #{e.message}")
    end
  else
    Chef::Application.fatal!("Chef is already running pid #{pid_from_file}")
  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 63
def pid_file
  Chef::Config[:pid_file] || "/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 74
def pid_from_file
  File.read(pid_file).chomp.to_i
rescue Errno::ENOENT, Errno::EACCES
  nil
end