harbour 0.0.1 → 0.0.2
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/TODO +2 -0
- data/lib/harbour.rb +20 -8
- data/lib/harbour/version.rb +1 -1
- data/spec/port_spec.rb +24 -6
- data/spec/spec_helper.rb +9 -9
- metadata +7 -17
data/TODO
CHANGED
@@ -1,3 +1,5 @@
|
|
1
1
|
Add timeout to pid, since the port may be open but no pid from lsof. Doing this will also allow the sleep(2) to be removed from start_server! in specs.
|
2
2
|
add a self.all_ports which lists all open ports, maybe returning Port objects.
|
3
3
|
raise exceptions instead of returning nil
|
4
|
+
add commands for linux, it should allow other OS's to be added as well.
|
5
|
+
Work out if there is a better way to test
|
data/lib/harbour.rb
CHANGED
@@ -4,6 +4,8 @@ module Harbour
|
|
4
4
|
class Port
|
5
5
|
attr_reader :port
|
6
6
|
|
7
|
+
class PortFailedToClose < StandardError; end
|
8
|
+
|
7
9
|
def initialize(port)
|
8
10
|
@port = port
|
9
11
|
end
|
@@ -12,30 +14,40 @@ module Harbour
|
|
12
14
|
command "nc -z localhost #{port}"
|
13
15
|
end
|
14
16
|
|
17
|
+
def closed?
|
18
|
+
!open?
|
19
|
+
end
|
20
|
+
|
15
21
|
def pid
|
16
22
|
return nil unless open?
|
17
|
-
`lsof -P | grep ':#{port}' | grep 'LISTEN' | awk '{print $2}'
|
23
|
+
`lsof -P | grep ':#{port}' | grep 'LISTEN' | awk '{print $2}'`.to_i
|
18
24
|
end
|
19
25
|
|
20
26
|
def term!(options = {})
|
21
27
|
return nil unless open?
|
22
|
-
|
23
|
-
|
28
|
+
Process.kill('TERM', pid)
|
29
|
+
ensure_closed!(options[:timeout] || 10)
|
30
|
+
rescue PortFailedToClose
|
31
|
+
raise unless options[:try_kill] == true
|
32
|
+
kill!(options)
|
24
33
|
end
|
25
34
|
|
26
35
|
def kill!(options = {})
|
27
36
|
return nil unless open?
|
28
|
-
|
29
|
-
|
37
|
+
Process.kill('KILL', pid)
|
38
|
+
ensure_closed!(options[:timeout] || 10)
|
30
39
|
end
|
31
40
|
|
32
41
|
private
|
33
42
|
|
34
|
-
def
|
43
|
+
def ensure_closed!(within = 10, step = 1)
|
44
|
+
_elasped = within
|
35
45
|
within.times do
|
36
|
-
break if
|
37
|
-
sleep(
|
46
|
+
break if closed?
|
47
|
+
sleep(step)
|
48
|
+
_elasped =- step
|
38
49
|
end
|
50
|
+
raise PortFailedToClose, "Port #{port} did not close within #{within} seconds" if _elasped < 1
|
39
51
|
end
|
40
52
|
|
41
53
|
def command(_command)
|
data/lib/harbour/version.rb
CHANGED
data/spec/port_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe Harbour::Port do
|
|
9
9
|
|
10
10
|
it '#open? returns true if port is open' do
|
11
11
|
with_server(port) do
|
12
|
-
Harbour::Port.new(
|
12
|
+
Harbour::Port.new(port).open?.should be_true
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -19,16 +19,34 @@ describe Harbour::Port do
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
describe '#term!' do
|
23
|
+
pending 'terminates process listening on port' do
|
24
|
+
# Webrick does not die on TERM
|
25
|
+
with_server(port) do
|
26
|
+
Harbour::Port.new(port).term!
|
27
|
+
port_open?(port).should be_false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'raises if port fails to close' do
|
32
|
+
# this is fragile, Webrick does not die on TERM, but may do in the future
|
33
|
+
with_server(port) do
|
34
|
+
expect { Harbour::Port.new(port).term! }.to raise_error(Harbour::Port::PortFailedToClose)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'trys to kill process if term fails' do
|
39
|
+
# this is fragile, Webrick does not die on TERM, but may do in the future
|
40
|
+
with_server(port) do
|
41
|
+
Harbour::Port.new(port, :try_kill => true).term!
|
42
|
+
port_open?(port).should be_false
|
43
|
+
end
|
26
44
|
end
|
27
45
|
end
|
28
46
|
|
29
47
|
it '#kill! terminates process listening on port' do
|
30
48
|
with_server(port) do
|
31
|
-
Harbour::Port.new(
|
49
|
+
Harbour::Port.new(port).kill!
|
32
50
|
port_open?(port).should be_false
|
33
51
|
end
|
34
52
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,27 +4,27 @@ require 'harbour'
|
|
4
4
|
|
5
5
|
RSpec.configure do |config|
|
6
6
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
-
config.run_all_when_everything_filtered = true
|
8
|
-
config.filter_run :focus
|
9
|
-
config.order = 'random'
|
7
|
+
# config.run_all_when_everything_filtered = true
|
8
|
+
# config.filter_run :focus
|
9
|
+
# config.order = 'random'
|
10
10
|
end
|
11
11
|
|
12
|
-
def with_server(port =
|
12
|
+
def with_server(port = 8000, &block)
|
13
13
|
start_server!(port)
|
14
14
|
yield
|
15
15
|
stop_server!(port)
|
16
16
|
end
|
17
17
|
|
18
18
|
def start_server!(port)
|
19
|
-
return if system "nc -z localhost #{port}"
|
19
|
+
return if system "nc -z localhost #{port} > /dev/null"
|
20
20
|
server_root = File.join(File.dirname(__FILE__), 'server')
|
21
|
-
system "cd #{server_root} && rackup -
|
22
|
-
sleep(
|
21
|
+
system "cd #{server_root} && rackup -D -s webrick -p #{port}"
|
22
|
+
sleep(1)
|
23
23
|
end
|
24
24
|
|
25
25
|
def stop_server!(port)
|
26
|
-
pid = `lsof -P | grep ':#{port}' | grep 'LISTEN' | awk '{print $2}'
|
27
|
-
|
26
|
+
pid = `lsof -P | grep ':#{port}' | grep 'LISTEN' | awk '{print $2}'`.to_i
|
27
|
+
Process.kill('KILL', pid)
|
28
28
|
end
|
29
29
|
|
30
30
|
def port_open?(port)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harbour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-10 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &2161129300 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
24
|
+
version_requirements: *2161129300
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: rack
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &2161127440 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ! '>='
|
@@ -37,12 +32,7 @@ dependencies:
|
|
37
32
|
version: '0'
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
35
|
+
version_requirements: *2161127440
|
46
36
|
description: Query and terminate processes listening on ports
|
47
37
|
email:
|
48
38
|
- kris.leech@interkonect.com
|
@@ -83,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
73
|
version: '0'
|
84
74
|
requirements: []
|
85
75
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.8.
|
76
|
+
rubygems_version: 1.8.10
|
87
77
|
signing_key:
|
88
78
|
specification_version: 3
|
89
79
|
summary: Query and terminate processes listening on ports
|