Change soft-fail to use the config, rather than env
[rbx.git] / tools / rubuildius / matzbot / lib / daemon.rb
blob3992915a27512dfadc68feacceedea15e7f87b66
1 # http://www.bigbold.com/snippets/posts/show/2265
2 # (but hacked)
3 require 'fileutils'
5 module MatzBot 
6   module Daemonize
7     extend self
9     WorkingDirectory = File.expand_path(FileUtils.pwd)  
11     def pid_fn
12       File.join(WorkingDirectory, "matzbot.pid")
13     end
14     
15     def daemonize(config)
16       case config[:daemonize]
17       when 'start'
18         start(config)
19       when 'stop'
20         stop
21       when 'restart'
22         stop
23         start(config)
24       else
25         puts "Invalid command. Please specify start, stop or restart."
26         exit
27       end
28     end
29     
30     def start(config)
31       fork do
32         Process.setsid
33         exit if fork
34         store(Process.pid)
35         Dir.chdir WorkingDirectory
36         File.umask 0000
37         STDIN.reopen "/dev/null"
38         STDOUT.reopen "/dev/null", "a"
39         STDERR.reopen STDOUT
40         trap("TERM") do 
41           MatzBot::Session.save
42           exit
43         end
44         begin
45           Client.start(config)
46         ensure
47           stop
48         end
49       end
50     end
51   
52     def stop
53       unless File.file? pid_fn
54         puts "Pid file not found. Is the daemon started?"
55         exit
56       end
57       pid = recall
58       FileUtils.rm pid_fn
59       puts "Process killed."
60       Process.kill("TERM", pid) rescue nil
61     end
63     def store(pid=Process.pid)
64       if File.file? pid_fn
65         puts "** Already started with PID #{File.read(pid_fn)}"
66         exit!
67       else
68         File.open(pid_fn, 'w') { |f| f << pid }
69       end
70     end
71     
72     def recall
73       IO.read(pid_fn).to_i rescue nil
74     end
75   end
76 end