Module: AppDeploy::Daemon

Defined in:
lib/app-deploy/daemon.rb

Class Method Summary collapse

Class Method Details

.change_privilege(user, group) ⇒ Object

extracted from thin Change privileges of the process to the specified user and group.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/app-deploy/daemon.rb', line 34

def change_privilege user, group

  uid, gid = Process.euid, Process.egid
  target_uid = Etc.getpwnam(user).uid
  target_gid = Etc.getgrnam(group).gid

  if uid != target_uid || gid != target_gid
    puts "Changing process privilege to #{user}:#{group}"

    # Change process ownership
    Process.initgroups(user, target_gid)
    Process::GID.change_privilege(target_gid)
    Process::UID.change_privilege(target_uid)
  end

rescue Errno::EPERM => e
  puts "Couldn't change user and group to #{user}:#{group}: #{e}"
end

.daemonize(pid_path, log_path, user, group, chdir) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/app-deploy/daemon.rb', line 11

def daemonize pid_path, log_path, user, group, chdir
  Dir.chdir(chdir) if chdir

  user  ||= Etc.getpwuid(Process.uid).name
  group ||= Etc.getpwuid(Process.gid).name

  Daemon.change_privilege(user, group)

  cwd = Dir.pwd
  ::Daemonize.daemonize(log_path)
  Dir.chdir(cwd)

  Daemon.write_pid(pid_path)

  at_exit{
    puts "Stopping #{pid_path}..."
    Daemon.remove_pid(pid_path)
  }
end

.remove_pid(path) ⇒ Object



59
60
61
# File 'lib/app-deploy/daemon.rb', line 59

def remove_pid path
  File.delete(path) if File.exist?(path)
end

.write_pid(path) ⇒ Object



53
54
55
56
57
# File 'lib/app-deploy/daemon.rb', line 53

def write_pid path
  FileUtils.mkdir_p(File.dirname(path))
  File.open(path, 'w'){ |f| f.write(Process.pid) }
  File.chmod(0644, path)
end