# class Chef::Daemon

### Attributes

name[RW]
runlock[RW]

### Public Instance 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) 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 82
    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 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] 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 74
    def pid_from_file
      File.read(pid_file).chomp.to_i
    rescue Errno::ENOENT, Errno::EACCES
      nil
    end