rush 0.5.1 → 0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +1 -1
- data/lib/rush/entry.rb +4 -4
- data/lib/rush/local.rb +20 -9
- data/lib/rush/process.rb +7 -3
- data/lib/rush/process_set.rb +2 -2
- data/lib/rush/remote.rb +2 -2
- data/spec/entry_spec.rb +2 -2
- data/spec/local_spec.rb +18 -4
- data/spec/remote_spec.rb +2 -2
- metadata +31 -31
data/Rakefile
CHANGED
data/lib/rush/entry.rb
CHANGED
@@ -62,17 +62,17 @@ class Rush::Entry
|
|
62
62
|
false
|
63
63
|
end
|
64
64
|
|
65
|
-
# Timestamp of entry
|
66
|
-
def
|
65
|
+
# Timestamp of most recent change to the entry (permissions, contents, etc).
|
66
|
+
def changed_at
|
67
67
|
stat[:ctime]
|
68
68
|
end
|
69
69
|
|
70
|
-
# Timestamp
|
70
|
+
# Timestamp of last modification of the contents.
|
71
71
|
def last_modified
|
72
72
|
stat[:mtime]
|
73
73
|
end
|
74
74
|
|
75
|
-
# Timestamp that entry was last accessed
|
75
|
+
# Timestamp that entry was last accessed (read from or written to).
|
76
76
|
def last_accessed
|
77
77
|
stat[:atime]
|
78
78
|
end
|
data/lib/rush/local.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'yaml'
|
3
|
+
require 'timeout'
|
3
4
|
|
4
5
|
# Rush::Box uses a connection object to execute all rush commands. If the box
|
5
6
|
# is local, Rush::Connection::Local is created. The local connection is the
|
@@ -280,14 +281,24 @@ class Rush::Connection::Local
|
|
280
281
|
end
|
281
282
|
|
282
283
|
# Terminate a process, by pid.
|
283
|
-
def kill_process(pid)
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
284
|
+
def kill_process(pid, options={})
|
285
|
+
# time to wait before terminating the process, in seconds
|
286
|
+
wait = options[:wait] || 3
|
287
|
+
|
288
|
+
if wait > 0
|
289
|
+
::Process.kill('TERM', pid)
|
290
|
+
|
291
|
+
# keep trying until it's dead (technique borrowed from god)
|
292
|
+
begin
|
293
|
+
Timeout.timeout(wait) do
|
294
|
+
loop do
|
295
|
+
return if !process_alive(pid)
|
296
|
+
sleep 0.5
|
297
|
+
::Process.kill('TERM', pid) rescue nil
|
298
|
+
end
|
299
|
+
end
|
300
|
+
rescue Timeout::Error
|
301
|
+
end
|
291
302
|
end
|
292
303
|
|
293
304
|
::Process.kill('KILL', pid) rescue nil
|
@@ -373,7 +384,7 @@ class Rush::Connection::Local
|
|
373
384
|
when 'size' then size(params[:full_path])
|
374
385
|
when 'processes' then YAML.dump(processes)
|
375
386
|
when 'process_alive' then process_alive(params[:pid]) ? '1' : '0'
|
376
|
-
when 'kill_process' then kill_process(params[:pid].to_i)
|
387
|
+
when 'kill_process' then kill_process(params[:pid].to_i, YAML.load(params[:payload]))
|
377
388
|
when 'bash' then bash(params[:payload], params[:user], params[:background] == 'true')
|
378
389
|
else
|
379
390
|
raise UnknownAction
|
data/lib/rush/process.rb
CHANGED
@@ -22,7 +22,11 @@ class Rush::Process
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def inspect # :nodoc:
|
25
|
-
|
25
|
+
if box.to_s != 'localhost'
|
26
|
+
"#{box} #{@pid}: #{@cmdline}"
|
27
|
+
else
|
28
|
+
"#{@pid}: #{@cmdline}"
|
29
|
+
end
|
26
30
|
end
|
27
31
|
|
28
32
|
# Returns the Rush::Process parent of this process.
|
@@ -41,8 +45,8 @@ class Rush::Process
|
|
41
45
|
end
|
42
46
|
|
43
47
|
# Terminate the process.
|
44
|
-
def kill
|
45
|
-
box.connection.kill_process(pid)
|
48
|
+
def kill(options={})
|
49
|
+
box.connection.kill_process(pid, options)
|
46
50
|
end
|
47
51
|
|
48
52
|
def ==(other) # :nodoc:
|
data/lib/rush/process_set.rb
CHANGED
@@ -32,8 +32,8 @@ class Rush::ProcessSet
|
|
32
32
|
end
|
33
33
|
|
34
34
|
# Kill all processes in the set.
|
35
|
-
def kill
|
36
|
-
processes.each { |p| p.kill }
|
35
|
+
def kill(options={})
|
36
|
+
processes.each { |p| p.kill(options) }
|
37
37
|
end
|
38
38
|
|
39
39
|
# Check status of all processes in the set, returns an array of booleans.
|
data/lib/rush/remote.rb
CHANGED
@@ -78,8 +78,8 @@ class Rush::Connection::Remote
|
|
78
78
|
transmit(:action => 'process_alive', :pid => pid)
|
79
79
|
end
|
80
80
|
|
81
|
-
def kill_process(pid)
|
82
|
-
transmit(:action => 'kill_process', :pid => pid)
|
81
|
+
def kill_process(pid, options={})
|
82
|
+
transmit(:action => 'kill_process', :pid => pid, :payload => YAML.dump(options))
|
83
83
|
end
|
84
84
|
|
85
85
|
def bash(command, user, background)
|
data/spec/entry_spec.rb
CHANGED
@@ -30,8 +30,8 @@ describe Rush::Entry do
|
|
30
30
|
Rush::Entry.new('/1/2/../3').full_path.should == '/1/3'
|
31
31
|
end
|
32
32
|
|
33
|
-
it "knows its
|
34
|
-
@entry.
|
33
|
+
it "knows its changed_at time" do
|
34
|
+
@entry.changed_at.should == File.stat(@filename).ctime
|
35
35
|
end
|
36
36
|
|
37
37
|
it "knows its last_modified time" do
|
data/spec/local_spec.rb
CHANGED
@@ -96,8 +96,8 @@ describe Rush::Connection::Local do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
it "receive -> kill_process" do
|
99
|
-
@con.should_receive(:kill_process).with(123).and_return(true)
|
100
|
-
@con.receive(:action => 'kill_process', :pid => '123')
|
99
|
+
@con.should_receive(:kill_process).with(123, :wait => 10).and_return(true)
|
100
|
+
@con.receive(:action => 'kill_process', :pid => '123', :payload => YAML.dump(:wait => 10))
|
101
101
|
end
|
102
102
|
|
103
103
|
it "receive -> bash (foreground)" do
|
@@ -288,11 +288,25 @@ EOPS
|
|
288
288
|
@con.process_alive(99999).should be_false
|
289
289
|
end
|
290
290
|
|
291
|
-
it "kills a process by pid" do
|
292
|
-
|
291
|
+
it "kills a process by pid sending a TERM" do
|
292
|
+
@con.stub!(:process_alive).and_return(false)
|
293
|
+
::Process.should_receive(:kill).with('TERM', 123).once
|
293
294
|
@con.kill_process(123)
|
294
295
|
end
|
295
296
|
|
297
|
+
it "kills a process by pid sending a KILL signal if TERM doesn't work" do
|
298
|
+
@con.stub!(:process_alive).and_return(true)
|
299
|
+
::Process.should_receive(:kill).with('TERM', 123).at_least(:twice)
|
300
|
+
::Process.should_receive(:kill).with('KILL', 123)
|
301
|
+
@con.kill_process(123)
|
302
|
+
end
|
303
|
+
|
304
|
+
it "kills a process by pid without sending TERM if :wait is zero" do
|
305
|
+
::Process.should_not_receive(:kill).with('TERM', 123)
|
306
|
+
::Process.should_receive(:kill).with('KILL', 123)
|
307
|
+
@con.kill_process(123, :wait => 0)
|
308
|
+
end
|
309
|
+
|
296
310
|
it "does not raise an error if the process is already dead" do
|
297
311
|
::Process.should_receive(:kill).and_raise(Errno::ESRCH)
|
298
312
|
lambda { @con.kill_process(123) }.should_not raise_error
|
data/spec/remote_spec.rb
CHANGED
@@ -93,8 +93,8 @@ describe Rush::Connection::Local do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it "transmits kill_process" do
|
96
|
-
@con.should_receive(:transmit).with(:action => 'kill_process', :pid => 123)
|
97
|
-
@con.kill_process(123)
|
96
|
+
@con.should_receive(:transmit).with(:action => 'kill_process', :pid => 123, :payload => YAML.dump(:wait => 10))
|
97
|
+
@con.kill_process(123, :wait => 10)
|
98
98
|
end
|
99
99
|
|
100
100
|
it "transmits bash" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rush
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: "0.6"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Wiggins
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-16 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -45,51 +45,51 @@ files:
|
|
45
45
|
- Rakefile
|
46
46
|
- bin/rush
|
47
47
|
- bin/rushd
|
48
|
-
- lib/rush.rb
|
49
48
|
- lib/rush
|
50
|
-
- lib/rush/
|
49
|
+
- lib/rush/access.rb
|
50
|
+
- lib/rush/array_ext.rb
|
51
|
+
- lib/rush/box.rb
|
52
|
+
- lib/rush/commands.rb
|
51
53
|
- lib/rush/config.rb
|
52
|
-
- lib/rush/
|
53
|
-
- lib/rush/
|
54
|
+
- lib/rush/dir.rb
|
55
|
+
- lib/rush/embeddable_shell.rb
|
54
56
|
- lib/rush/entry.rb
|
55
|
-
- lib/rush/
|
57
|
+
- lib/rush/exceptions.rb
|
56
58
|
- lib/rush/file.rb
|
59
|
+
- lib/rush/find_by.rb
|
60
|
+
- lib/rush/fixnum_ext.rb
|
61
|
+
- lib/rush/head_tail.rb
|
57
62
|
- lib/rush/local.rb
|
58
|
-
- lib/rush/
|
59
|
-
- lib/rush/shell.rb
|
60
|
-
- lib/rush/server.rb
|
63
|
+
- lib/rush/process.rb
|
61
64
|
- lib/rush/process_set.rb
|
62
|
-
- lib/rush/array_ext.rb
|
63
65
|
- lib/rush/remote.rb
|
64
|
-
- lib/rush/
|
65
|
-
- lib/rush/
|
66
|
-
- lib/rush/
|
67
|
-
- lib/rush/
|
66
|
+
- lib/rush/search_results.rb
|
67
|
+
- lib/rush/server.rb
|
68
|
+
- lib/rush/shell.rb
|
69
|
+
- lib/rush/ssh_tunnel.rb
|
68
70
|
- lib/rush/string_ext.rb
|
69
|
-
- lib/rush
|
70
|
-
- lib/rush/exceptions.rb
|
71
|
-
- lib/rush/access.rb
|
72
|
-
- spec/remote_spec.rb
|
73
|
-
- spec/rush_spec.rb
|
74
|
-
- spec/base.rb
|
75
|
-
- spec/ssh_tunnel_spec.rb
|
76
|
-
- spec/local_spec.rb
|
77
|
-
- spec/embeddable_shell_spec.rb
|
71
|
+
- lib/rush.rb
|
78
72
|
- spec/access_spec.rb
|
79
|
-
- spec/file_spec.rb
|
80
|
-
- spec/string_ext_spec.rb
|
81
73
|
- spec/array_ext_spec.rb
|
74
|
+
- spec/base.rb
|
75
|
+
- spec/box_spec.rb
|
82
76
|
- spec/commands_spec.rb
|
83
77
|
- spec/config_spec.rb
|
84
|
-
- spec/fixnum_ext_spec.rb
|
85
|
-
- spec/search_results_spec.rb
|
86
|
-
- spec/process_spec.rb
|
87
|
-
- spec/shell_spec.rb
|
88
78
|
- spec/dir_spec.rb
|
79
|
+
- spec/embeddable_shell_spec.rb
|
89
80
|
- spec/entry_spec.rb
|
81
|
+
- spec/file_spec.rb
|
90
82
|
- spec/find_by_spec.rb
|
91
|
-
- spec/
|
83
|
+
- spec/fixnum_ext_spec.rb
|
84
|
+
- spec/local_spec.rb
|
92
85
|
- spec/process_set_spec.rb
|
86
|
+
- spec/process_spec.rb
|
87
|
+
- spec/remote_spec.rb
|
88
|
+
- spec/rush_spec.rb
|
89
|
+
- spec/search_results_spec.rb
|
90
|
+
- spec/shell_spec.rb
|
91
|
+
- spec/ssh_tunnel_spec.rb
|
92
|
+
- spec/string_ext_spec.rb
|
93
93
|
has_rdoc: true
|
94
94
|
homepage: http://rush.heroku.com/
|
95
95
|
post_install_message:
|