Module: RackDaemon

Defined in:
lib/app-deploy/rack_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.



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

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



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

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

  RackDaemon.change_privilege(user, group)

  cwd = Dir.pwd
  Daemonize.daemonize(log_path, 'rack-cluster')
  Dir.chdir(cwd)

  RackDaemon.write_pid(pid_path)

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

.remove_pid(path) ⇒ Object



58
59
60
# File 'lib/app-deploy/rack_daemon.rb', line 58

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

.write_pid(path) ⇒ Object



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

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