service_manager 0.6 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/service_manager/service.rb +29 -7
  2. metadata +6 -5
@@ -1,16 +1,17 @@
1
1
  require "thread"
2
+ require "timeout"
2
3
  class ServiceManager::Service
3
4
  CHDIR_SEMAPHORE = Mutex.new
4
- NORMAL_COLOR = 37
5
+ ANSI_COLOR_RESET = 0
5
6
 
6
- attr_accessor :name, :host, :port, :cwd, :reload_uri, :start_cmd, :process, :loaded_cue, :timeout, :color
7
+ attr_accessor :name, :host, :port, :cwd, :reload_uri, :start_cmd, :process, :loaded_cue, :timeout, :color, :pid_file
7
8
 
8
9
  class ServiceDidntStart < Exception; end
9
10
 
10
11
  def initialize(options = {})
11
12
  options.each { |k,v| send("#{k}=", v) }
12
13
  self.host ||= "localhost"
13
- self.color ||= NORMAL_COLOR
14
+ self.color ||= ANSI_COLOR_RESET
14
15
  self.timeout ||= 30
15
16
  raise ArgumentError, "You need to provide a name for this app service" unless name
16
17
  end
@@ -20,7 +21,7 @@ class ServiceManager::Service
20
21
  end
21
22
 
22
23
  def server_info_hash
23
- {:name => name, :host => host, :port => port}
24
+ {:name => name, :host => host, :port => port, :pid_file => pid_file}
24
25
  end
25
26
 
26
27
  def watch_for_cue
@@ -92,12 +93,23 @@ class ServiceManager::Service
92
93
 
93
94
  # detects if the service is running on the configured host and port (will return true if we weren't the ones who started it)
94
95
  def running?
95
- TCPSocket.listening_service?(:port => port, :host => host)
96
+ if pid_file
97
+ running_via_pid_file?
98
+ else
99
+ TCPSocket.listening_service?(:port => port, :host => host)
100
+ end
96
101
  end
97
102
 
98
103
  protected
104
+
105
+ def running_via_pid_file?
106
+ Process.kill(0, File.read(pid_file).to_i)
107
+ rescue Errno::ESRCH, Errno::ENOENT
108
+ return false
109
+ end
110
+
99
111
  def colorize(output)
100
- "\e[0;#{color}m#{output}\e[0;#{NORMAL_COLOR}m"
112
+ "\e[0;#{color}m#{output}\e[0;#{ANSI_COLOR_RESET}m"
101
113
  end
102
114
 
103
115
  def colorized_service_name
@@ -115,11 +127,21 @@ protected
115
127
  else
116
128
  start_output_stream_thread
117
129
  begin
118
- TCPSocket.wait_for_service_with_timeout({:host => host, :port => port, :timeout => timeout})
130
+ if pid_file
131
+ wait_for_server_with_timeout
132
+ else
133
+ TCPSocket.wait_for_service_with_timeout({:host => host, :port => port, :timeout => timeout})
134
+ end
119
135
  rescue SocketError
120
136
  raise ServiceDidntStart
121
137
  end
122
138
  end
123
139
  true
124
140
  end
141
+
142
+ def wait_for_server_with_timeout
143
+ Timeout::timeout(timeout) do
144
+ sleep 0.25 while !running_via_pid_file?
145
+ end
146
+ end
125
147
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: service_manager
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
5
- prerelease: false
4
+ hash: 3
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 6
9
- version: "0.6"
9
+ - 2
10
+ version: 0.6.2
10
11
  platform: ruby
11
12
  authors:
12
13
  - Tim Harper
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-09-20 00:00:00 -06:00
18
+ date: 2011-07-28 00:00:00 -06:00
18
19
  default_executable: start_services
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
@@ -97,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
98
  requirements: []
98
99
 
99
100
  rubyforge_project:
100
- rubygems_version: 1.3.7
101
+ rubygems_version: 1.5.0
101
102
  signing_key:
102
103
  specification_version: 3
103
104
  summary: service_manager