easy-serve 0.13 → 0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f0c7199f4598926d54910efbcc21489ea6b9793
4
- data.tar.gz: 46a5d4023cce3f45a79e536c083c1a419da4355f
3
+ metadata.gz: 54d0c42681120ccf4085716d6641aadb098b1dbd
4
+ data.tar.gz: 92dd12a3d68e9f19a6f42eb19cac6c9bf587cf30
5
5
  SHA512:
6
- metadata.gz: 5656ded4b61e2e2b7a20355e8ffe82a5dba46665eabb5d6f79333bc7a67c74b25282d3cc146dfb7bb419640dfafa4dfbcfe8974e2ece491d7bd5b6449d749cc7
7
- data.tar.gz: 6e2d92e58745e7bd10ec19fa08a74777df0bc10c460549d703e991364f2ed1891a4d6e350a0751fb668e9c5f46a085021b68f63f840440d608bfde69c5ce85c3
6
+ metadata.gz: e7744d002ccd22b05fb35f1b6fa6cd54c0ae0f7b75acb36a453f813b93c383f7b15dcbc0093e768925ef34532217cdf58ac2d71b1e504b27204029a84aba2503
7
+ data.tar.gz: 13333b4f50f55c7b8ec5a7c2f9c57908ca637abf2500a799f1d2e05f757cfaf05ebb76c5008710531c7d13255b2eb75a1cd4fc24b1058e24c6cda00984f9ec87
data/README.md CHANGED
@@ -21,6 +21,8 @@ EasyServe takes the headache out of:
21
21
 
22
22
  * Working around poor support for dynamic port forwarding in old versions of OpenSSH.
23
23
 
24
+ * Working around a race condition in an old version of OpenSSH.
25
+
24
26
  * Choosing between -L and -R styles of tunneling, depending on whether the remote process starts independently of the services.
25
27
 
26
28
  * Avoiding race conditions in the service setup phase.
@@ -108,5 +108,5 @@ EasyServe.start do |ez|
108
108
  # Note use of \#{} to interpolate variables that are only available
109
109
  # in the binding where the code is eval-ed. Alternately, use
110
110
  # eval: %Q{...}
111
- # but then interpolation from this script is not posssible.
111
+ # but then interpolation from this script is not possible.
112
112
  end
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  require 'easy-serve/service'
7
7
 
8
8
  class EasyServe
9
- VERSION = "0.13"
9
+ VERSION = "0.14"
10
10
 
11
11
  class ServicesExistError < RuntimeError; end
12
12
 
@@ -23,7 +23,7 @@ class EasyServe
23
23
  log.formatter = EasyFormatter.new
24
24
  log
25
25
  end
26
-
26
+
27
27
  def self.null_logger
28
28
  log = Logger.new('/dev/null')
29
29
  log.level = Logger::FATAL
@@ -38,7 +38,7 @@ class EasyServe
38
38
 
39
39
  # True means do not propagate ^C to child processes.
40
40
  attr_reader :interactive
41
-
41
+
42
42
  # Is this a sibling process, started by the same parent process that
43
43
  # started the services, even if started remotely?
44
44
  # Implies not owner, but not conversely.
@@ -84,7 +84,7 @@ class EasyServe
84
84
  @ssh_sessions = []
85
85
  @tmpdir = nil
86
86
  @services = opts[:services] # name => service
87
-
87
+
88
88
  unless services
89
89
  if services_file
90
90
  @services =
@@ -115,14 +115,14 @@ class EasyServe
115
115
  def load_service_table_from_io io
116
116
  YAML.load(io).tap {@sibling = false}
117
117
  end
118
-
118
+
119
119
  def init_service_table
120
120
  @services ||= begin
121
121
  @owner = true
122
122
  {}
123
123
  end
124
124
  end
125
-
125
+
126
126
  def cleanup
127
127
  handler = trap("INT") do
128
128
  trap("INT", handler)
@@ -146,7 +146,7 @@ class EasyServe
146
146
  log.debug {"client pid=#{pid} was already waited for"}
147
147
  end
148
148
  end
149
-
149
+
150
150
  if @owner
151
151
  services.each do |name, service|
152
152
  log.info "stopping #{name}"
@@ -161,10 +161,10 @@ class EasyServe
161
161
  end
162
162
  end
163
163
  end
164
-
164
+
165
165
  clean_tmpdir
166
166
  end
167
-
167
+
168
168
  def start_services
169
169
  return unless @owner
170
170
 
@@ -174,7 +174,7 @@ class EasyServe
174
174
  return
175
175
  end
176
176
 
177
- lock_success = with_lock_file *File.split(services_file) do
177
+ lock_success = with_lock_file(*File.split(services_file)) do
178
178
  # Successful creation of the lock file gives this process the
179
179
  # right to check and create the services_file itself.
180
180
 
@@ -225,11 +225,11 @@ class EasyServe
225
225
  Dir.mktmpdir "easy-serve-"
226
226
  end
227
227
  end
228
-
228
+
229
229
  def clean_tmpdir
230
230
  FileUtils.remove_entry @tmpdir if @tmpdir
231
231
  end
232
-
232
+
233
233
  def choose_socket_filename name, base: nil
234
234
  if base
235
235
  "#{base}-#{name}"
@@ -241,7 +241,7 @@ class EasyServe
241
241
  def self.bump_socket_filename name
242
242
  name =~ /-\d+\z/ ? name.succ : name + "-0"
243
243
  end
244
-
244
+
245
245
  def host_name
246
246
  EasyServe.host_name
247
247
  end
@@ -265,7 +265,7 @@ class EasyServe
265
265
  def EasyServe.ssh_supports_dynamic_ports_forwards
266
266
  @ssh_6 ||= (Integer(`ssh -V 2>&1`[/OpenSSH_(\d)/i, 1]) >= 6 rescue false)
267
267
  end
268
-
268
+
269
269
  MAX_TRIES = 10
270
270
 
271
271
  # Start a service named +name+. The name is referenced in #child, #local,
@@ -316,11 +316,11 @@ class EasyServe
316
316
 
317
317
  service = Service.for(name, proto, **opts)
318
318
  rd, wr = IO.pipe
319
- pid = fork do
319
+ fork do
320
320
  rd.close
321
321
  log.progname = name
322
322
  log.info "starting"
323
-
323
+
324
324
  svr = service.serve(max_tries: MAX_TRIES, log: log)
325
325
  yield svr if block_given?
326
326
  no_interrupt_if_interactive
@@ -345,7 +345,7 @@ class EasyServe
345
345
  (passive ? passive_children : children) << c
346
346
  c
347
347
  end
348
-
348
+
349
349
  # A local client runs in the same process, not a child process.
350
350
  def local *service_names
351
351
  conns = service_names.map {|sn| services[sn].connect}
@@ -356,7 +356,7 @@ class EasyServe
356
356
  end
357
357
  log.info "stopped local client"
358
358
  end
359
-
359
+
360
360
  # ^C in the irb session (parent process) should not kill the
361
361
  # service (child process)
362
362
  def no_interrupt_if_interactive
@@ -23,12 +23,12 @@ class EasyServe
23
23
  require 'drb'
24
24
  require 'yaml'
25
25
  require 'easy-serve'
26
-
26
+
27
27
  service_names = #{service_names.inspect}
28
28
  services = YAML.load(#{YAML.dump(services).inspect})
29
29
  log_level = #{log.level}
30
30
  host_uri = #{host_uri.inspect}
31
-
31
+
32
32
  EasyServe.start services: services do |ez|
33
33
  log = ez.log
34
34
  log.level = log_level
@@ -38,7 +38,7 @@ class EasyServe
38
38
  begin
39
39
  DRb.start_service(host_uri, {conns: conns})
40
40
  puts DRb.uri
41
-
41
+
42
42
  Thread.new do
43
43
  loop do
44
44
  sleep 1
@@ -49,7 +49,7 @@ class EasyServe
49
49
  end
50
50
  end
51
51
  end
52
-
52
+
53
53
  DRb.thread.join
54
54
 
55
55
  rescue => ex
@@ -61,10 +61,10 @@ class EasyServe
61
61
  puts "ez error", ex, ex.backtrace
62
62
  end
63
63
  }
64
-
64
+
65
65
  ssh.close_write
66
66
  result = ssh.gets
67
-
67
+
68
68
  if !result
69
69
  raise RemoteError, "problem with ssh connection to remote"
70
70
  else
@@ -79,7 +79,7 @@ class EasyServe
79
79
  ssh.gets # consume the "."
80
80
  end
81
81
  end
82
-
82
+
83
83
  log.debug "remote is at #{uri}"
84
84
  ro = DRbObject.new_with_uri(uri)
85
85
  conns = ro[:conns]
@@ -12,7 +12,7 @@ def EasyServe.manage_remote_eval_client msg
12
12
  services_list.each do |service|
13
13
  services[service.name] = service
14
14
  end
15
-
15
+
16
16
  log_args = msg["log"]
17
17
  log =
18
18
  case log_args
@@ -29,7 +29,7 @@ def EasyServe.manage_remote_eval_client msg
29
29
  log.level = log_level
30
30
  log.formatter = nil if $VERBOSE
31
31
 
32
- ez.local *service_names do |*conns|
32
+ ez.local(*service_names) do |*conns|
33
33
  begin
34
34
  pr = eval "proc do |conns, host, log| #{eval_string}; end"
35
35
  pr[conns, host, log]
@@ -43,7 +43,7 @@ def EasyServe.manage_remote_eval_client msg
43
43
  puts ex.backtrace
44
44
  end
45
45
  end
46
-
46
+
47
47
  log.info "done"
48
48
  end
49
49
  rescue LoadError, ScriptError, StandardError => ex
@@ -15,7 +15,7 @@ def EasyServe.manage_remote_run_client msg
15
15
  services_list.each do |service|
16
16
  services[service.name] = service
17
17
  end
18
-
18
+
19
19
  ### opt for tmpdir and send files to it via ssh
20
20
  Dir.chdir(dir) if dir
21
21
  load file
@@ -36,7 +36,7 @@ def EasyServe.manage_remote_run_client msg
36
36
  log.level = log_level
37
37
  log.formatter = nil if $VERBOSE
38
38
 
39
- ez.local *service_names do |*conns|
39
+ ez.local(*service_names) do |*conns|
40
40
  begin
41
41
  cl = Object.const_get(class_name)
42
42
  ro = cl.new(conns, host, log, *args)
@@ -45,7 +45,7 @@ def EasyServe.manage_remote_run_client msg
45
45
  puts "ez error", ex.inspect, ex.backtrace
46
46
  end
47
47
  end
48
-
48
+
49
49
  log.info "done"
50
50
  end
51
51
  rescue LoadError, ScriptError, StandardError => ex
@@ -57,7 +57,7 @@ class EasyServe
57
57
  SERVICE_CLASS[:unix] = self
58
58
 
59
59
  attr_reader :path
60
-
60
+
61
61
  def initialize name, path: nil
62
62
  super name
63
63
  @path = path
@@ -67,7 +67,7 @@ class EasyServe
67
67
  super.tap do |svr|
68
68
  found_path = svr.addr[1]
69
69
  log.debug "#{inspect} is listening at #{found_path}"
70
-
70
+
71
71
  if found_path != path
72
72
  log.error "Unexpected path: #{found_path} != #{path}"
73
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy-serve
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.13'
4
+ version: '0.14'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel VanderWerf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-05 00:00:00.000000000 Z
11
+ date: 2014-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  version: '0'
99
99
  requirements: []
100
100
  rubyforge_project:
101
- rubygems_version: 2.2.2
101
+ rubygems_version: 2.4.1
102
102
  signing_key:
103
103
  specification_version: 4
104
104
  summary: Framework for starting tcp/unix services and connected clients under one