dante 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -66,10 +66,11 @@ This gives your binary several useful things for free:
66
66
  will start the app undaemonized in the terminal, handling trapping and stopping the process.
67
67
 
68
68
  ```
69
- ./bin/myapp -p 8080 -d -P /var/run/myapp.pid
69
+ ./bin/myapp -p 8080 -d -P /var/run/myapp.pid -l /var/log/myapp.log
70
70
  ```
71
71
 
72
72
  will daemonize and start the process, storing the pid in the specified pid file.
73
+ All stdout and stderr will be redirected to the specified logfile.
73
74
 
74
75
  ```
75
76
  ./bin/myapp -k -P /var/run/myapp.pid
@@ -128,7 +129,7 @@ You can also use dante programmatically to start, stop and restart arbitrary cod
128
129
 
129
130
  ```ruby
130
131
  # daemon start
131
- Dante::Runner.new('gitdocs').execute(:daemonize => true, :pid_path => @pid) { something! }
132
+ Dante::Runner.new('gitdocs').execute(:daemonize => true, :pid\_path => @pid, :log\_path => @log\_path) { something! }
132
133
  # daemon stop
133
134
  Dante::Runner.new('gitdocs').execute(:kill => true, :pid_path => @pid)
134
135
  # daemon restart
@@ -31,6 +31,7 @@ module Dante
31
31
  @options = {
32
32
  :host => '0.0.0.0',
33
33
  :pid_path => "/var/run/#{@name}.pid",
34
+ :log_path => false,
34
35
  :debug => true
35
36
  }.merge(defaults)
36
37
  end
@@ -69,9 +70,7 @@ module Dante
69
70
  exit if fork
70
71
  store_pid(Process.pid)
71
72
  File.umask 0000
72
- STDIN.reopen "/dev/null"
73
- STDOUT.reopen "/dev/null", "a"
74
- STDERR.reopen STDOUT
73
+ redirect_output!
75
74
  start
76
75
  end
77
76
  # Ensure process is running
@@ -158,6 +157,10 @@ module Dante
158
157
  options[:daemonize] = v
159
158
  end
160
159
 
160
+ opts.on("-l", "--log FILE", String, "Logfile for output") do |v|
161
+ options[:log_path] = v
162
+ end
163
+
161
164
  opts.on("-k", "--kill [PORT]", String, "Kill specified running daemons - leave blank to kill all.") do |v|
162
165
  options[:kill] = v
163
166
  end
@@ -199,6 +202,23 @@ module Dante
199
202
  end
200
203
  end
201
204
 
205
+ # Redirect output based on log settings (reopens stdout/stderr to specified logfile)
206
+ # If log_path is nil, redirect to /dev/null to quiet output
207
+ def redirect_output!
208
+ if log_path = options[:log_path]
209
+ FileUtils.touch log_path
210
+ File.open(log_path, 'a') do |f|
211
+ $stdout.reopen(f)
212
+ $stderr.reopen(f)
213
+ end
214
+ else # redirect to /dev/null
215
+ STDIN.reopen "/dev/null"
216
+ STDOUT.reopen "/dev/null", "a"
217
+ STDERR.reopen STDOUT
218
+ end
219
+ log_path = options[:log_path] ? options[:log_path] : "/dev/null"
220
+ end
221
+
202
222
  # Runs until the block condition is met or the timeout_seconds is exceeded
203
223
  # until_true(10) { ...return_condition... }
204
224
  def until_true(timeout_seconds, interval=1, &block)
@@ -1,3 +1,3 @@
1
1
  module Dante
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -21,7 +21,7 @@ describe "dante runner" do
21
21
  describe "with daemonize flag" do
22
22
  before do
23
23
  @process = TestingProcess.new('b')
24
- @run_options = { :daemonize => true, :pid_path => "/tmp/dante.pid", :port => 8080 }
24
+ @run_options = { :daemonize => true, :pid_path => "/tmp/dante.pid", :port => 8080, :log_path => false }
25
25
  @runner = Dante::Runner.new('test-process-2', @run_options) { |opts|
26
26
  @process.run_b!(opts[:port]) }
27
27
  @stdout = capture_stdout { @runner.execute }
@@ -49,10 +49,33 @@ describe "dante runner" do
49
49
  end
50
50
  end # daemonize
51
51
 
52
+ describe "with daemonize flag and log file specified" do
53
+ before do
54
+ @logfile = '/tmp/dante-logging.log'
55
+ FileUtils.rm(@logfile) if File.exist?(@logfile)
56
+ @process = TestingProcess.new('c')
57
+ @run_options = { :daemonize => true, :pid_path => "/tmp/dante.pid", :port => 8081, :log_path => @logfile, :debug => false }
58
+ @runner = Dante::Runner.new('test-process-2', @run_options) { |opts|
59
+ @process.run_c!(opts[:port]) }
60
+ @runner.execute
61
+ sleep(1)
62
+ end
63
+
64
+ it "can properly handles log to file and aborts on INT" do
65
+ refute_equal 0, @pid = `cat /tmp/dante.pid`.to_i
66
+ Process.kill "INT", @pid
67
+ sleep(1) # Wait to complete
68
+ @output = File.read(@logfile)
69
+ assert_match /Started on 8081!!/, @output
70
+ assert_match /Interrupt!!/, @output
71
+ assert_match /Closing!!/, @output
72
+ end
73
+ end
74
+
52
75
  describe "with execute accepting block" do
53
76
  before do
54
77
  @process = TestingProcess.new('b')
55
- @run_options = { :daemonize => true, :pid_path => "/tmp/dante.pid", :port => 8080 }
78
+ @run_options = { :daemonize => true, :pid_path => "/tmp/dante.pid", :port => 8080, :log_path => false }
56
79
  @runner = Dante::Runner.new('test-process-2', @run_options)
57
80
  @stdout = capture_stdout { @runner.execute { |opts| @process.run_b!(opts[:port]) } }
58
81
  sleep(1)
@@ -53,4 +53,15 @@ class TestingProcess
53
53
  @tmp.close
54
54
  end
55
55
  end # run_b!
56
+
57
+ # For logging test
58
+ def run_c!(port=9091)
59
+ puts "Started on #{port}!!"
60
+ sleep(100)
61
+ rescue Interrupt
62
+ puts "Interrupt!!"
63
+ exit
64
+ ensure
65
+ puts "Closing!!"
66
+ end
56
67
  end # TestingProcess
metadata CHANGED
@@ -1,13 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dante
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
4
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 2
10
- version: 0.1.2
5
+ version: 0.1.3
11
6
  platform: ruby
12
7
  authors:
13
8
  - Nathan Esquenazi
@@ -15,8 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2011-12-06 00:00:00 -08:00
19
- default_executable:
13
+ date: 2012-01-31 00:00:00 Z
20
14
  dependencies:
21
15
  - !ruby/object:Gem::Dependency
22
16
  name: rake
@@ -26,9 +20,6 @@ dependencies:
26
20
  requirements:
27
21
  - - ">="
28
22
  - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
23
  version: "0"
33
24
  type: :development
34
25
  version_requirements: *id001
@@ -40,9 +31,6 @@ dependencies:
40
31
  requirements:
41
32
  - - ">="
42
33
  - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
34
  version: "0"
47
35
  type: :development
48
36
  version_requirements: *id002
@@ -54,9 +42,6 @@ dependencies:
54
42
  requirements:
55
43
  - - ">="
56
44
  - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
45
  version: "0"
61
46
  type: :development
62
47
  version_requirements: *id003
@@ -82,7 +67,6 @@ files:
82
67
  - test/dante_test.rb
83
68
  - test/runner_test.rb
84
69
  - test/test_helper.rb
85
- has_rdoc: true
86
70
  homepage: https://github.com/bazaarlabs/dante
87
71
  licenses: []
88
72
 
@@ -96,23 +80,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
80
  requirements:
97
81
  - - ">="
98
82
  - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
83
  version: "0"
103
84
  required_rubygems_version: !ruby/object:Gem::Requirement
104
85
  none: false
105
86
  requirements:
106
87
  - - ">="
107
88
  - !ruby/object:Gem::Version
108
- hash: 3
109
- segments:
110
- - 0
111
89
  version: "0"
112
90
  requirements: []
113
91
 
114
92
  rubyforge_project: dante
115
- rubygems_version: 1.6.2
93
+ rubygems_version: 1.8.12
116
94
  signing_key:
117
95
  specification_version: 3
118
96
  summary: Turn any process into a demon