pasv_lib 0.1.1 → 0.1.2

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
- SHA1:
3
- metadata.gz: aa74128e7460dd05f4f33ceba041ef09317847fd
4
- data.tar.gz: 6f6616a982aa7d8f7f641b5fbddf6e743e789c39
2
+ SHA256:
3
+ metadata.gz: 50e4d7a31367670be250e437270f02fd37b8638fbd7a541fa91ab0ec7e35dccb
4
+ data.tar.gz: 304eab6bd2becd3995b14c92bfdd1a39adda5d73687598eea0c64faeffd03651
5
5
  SHA512:
6
- metadata.gz: eeea7fcf9d95d698e040ef08eccba270185a26e2441bb27328f8b80d949bc4aca3f9daa0cb10510b6fb4df38c36aa079b30df1d467183270cf812784efc15554
7
- data.tar.gz: b5127d3147bc32c3860559e73ee927c8ac82e5eb6104306292ac23ccd1ae6758c4ec03a0f9283036ba7ec32c78da40c33ba7f71765ecfc5988f1162e6a20ae4b
6
+ metadata.gz: 2f550d96c0a73954f1a39ddce847580197ec75bcdf0e69733926ba5d794e986c4d13f76d47a9d4872d20156b095381b052b983ded6dd364d56e414aea21b08de
7
+ data.tar.gz: d72ecf0b88674b51d0622878659d12f29d22b3bf815ec64b75eb6e120b00dc4f571744ebeb48f1c334bc91e94569ed2673b2c9e78a7bf82ad8fdd0ba04a01d5f
data/.gitignore CHANGED
@@ -10,3 +10,5 @@
10
10
 
11
11
  # rspec failure tracking
12
12
  .rspec_status
13
+
14
+ .idea
@@ -1,3 +1,3 @@
1
1
  module PasvLib
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/pasv_lib.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require "pasv_lib/version"
2
- require "systemu"
2
+ require File.join __dir__, "..", "vendor", "systemu"
3
3
 
4
4
  module PasvLib
5
5
  module CoreExtensions
@@ -35,7 +35,7 @@ module PasvLib
35
35
  include CoreExtensions::Time
36
36
 
37
37
  def run_it *a, &b
38
- exit_status, stdout, stderr = systemu *a, &b
38
+ exit_status, stdout, stderr = SystemUniversal::Run.systemu *a, &b
39
39
 
40
40
 
41
41
  puts stdout unless stdout.empty?
data/pasv_lib.gemspec CHANGED
@@ -23,6 +23,4 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.15"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec", "~> 3.0"
26
-
27
- spec.add_runtime_dependency "systemu", "~> 2.6", ">= 2.6.5"
28
26
  end
data/vendor/systemu.rb ADDED
@@ -0,0 +1,416 @@
1
+ # encoding: utf-8
2
+
3
+ # Copyright (c) 2010, Ara T. Howard
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # * Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ #
27
+
28
+ # This is a modified version of systemu by me (Ryan Moore).
29
+
30
+ require 'tmpdir'
31
+ require 'socket'
32
+ require 'fileutils'
33
+ require 'rbconfig'
34
+ require 'thread'
35
+
36
+ # Change to this to not pollute Object.
37
+
38
+ class SystemUniversal
39
+ class Run
40
+ def self.systemu(*a, &b)
41
+ Object::SystemUniversal.new(*a, &b).systemu
42
+ end
43
+ end
44
+
45
+ #
46
+ # error class
47
+ #
48
+ class Error < RuntimeError
49
+ end
50
+
51
+ #
52
+ # constants
53
+ #
54
+ SystemUniversal::VERSION = '2.6.5' unless SystemUniversal.send(:const_defined?, :VERSION)
55
+ def SystemUniversal.version() SystemUniversal::VERSION end
56
+ def version() SystemUniversal::VERSION end
57
+ def SystemUniversal.description
58
+ "universal capture of stdout and stderr and handling of child process pid for windows, *nix, etc."
59
+ end
60
+ #
61
+ # class methods
62
+ #
63
+
64
+ @host = Socket.gethostname
65
+ @ppid = Process.ppid
66
+ @pid = Process.pid
67
+ @turd = ENV['SYSTEMU_TURD']
68
+ @ruby = nil
69
+
70
+ def self.ruby
71
+ return @ruby if @ruby
72
+
73
+ c = begin; ::RbConfig::CONFIG; rescue NameError; ::Config::CONFIG; end
74
+ ruby = File.join(c['bindir'], c['ruby_install_name']) << c['EXEEXT']
75
+ @ruby = if system(ruby, '-e', '42')
76
+ ruby
77
+ else
78
+ system('ruby', '-e', '42') ? 'ruby' : warn('no ruby in PATH/CONFIG')
79
+ end
80
+ end
81
+
82
+ class << SystemUniversal
83
+ %w( host ppid pid turd ).each{|a| attr_accessor a}
84
+
85
+ def quote(*words)
86
+ words.map{|word| word.inspect}.join(' ')
87
+ end
88
+ end
89
+
90
+ #
91
+ # instance methods
92
+ #
93
+
94
+ def initialize argv, opts = {}, &block
95
+ getopt = getopts opts
96
+
97
+ @argv = argv
98
+ @block = block
99
+
100
+ @stdin = getopt[ ['stdin', 'in', '0', 0] ]
101
+ @stdout = getopt[ ['stdout', 'out', '1', 1] ]
102
+ @stderr = getopt[ ['stderr', 'err', '2', 2] ]
103
+ @env = getopt[ 'env' ]
104
+ @cwd = getopt[ 'cwd' ]
105
+
106
+ @host = getopt[ 'host', self.class.host ]
107
+ @ppid = getopt[ 'ppid', self.class.ppid ]
108
+ @pid = getopt[ 'pid', self.class.pid ]
109
+ @ruby = getopt[ 'ruby', self.class.ruby ]
110
+ end
111
+
112
+ def systemu
113
+ tmpdir do |tmp|
114
+ c = child_setup tmp
115
+ status = nil
116
+
117
+ begin
118
+ thread = nil
119
+
120
+ quietly{
121
+ IO.popen "#{ quote(@ruby) } #{ quote(c['program']) }", 'rb+' do |pipe|
122
+ line = pipe.gets
123
+ case line
124
+ when %r/^pid: \d+$/
125
+ cid = Integer line[%r/\d+/]
126
+ else
127
+ begin
128
+ buf = pipe.read
129
+ buf = "#{ line }#{ buf }"
130
+ e = Marshal.load buf
131
+ raise unless Exception === e
132
+ raise e
133
+ rescue
134
+ raise Error "systemu: Error - process interrupted!\n#{ buf }\n"
135
+ end
136
+ end
137
+ thread = new_thread cid, @block if @block
138
+ pipe.read rescue nil
139
+ end
140
+ }
141
+ status = $?
142
+ ensure
143
+ if thread
144
+ begin
145
+ class << status
146
+ attr 'thread'
147
+ end
148
+ status.instance_eval{ @thread = thread }
149
+ rescue
150
+ 42
151
+ end
152
+ end
153
+ end
154
+
155
+ if @stdout or @stderr
156
+ open(c['stdout'], 'rb'){|f| relay f => @stdout} if @stdout
157
+ open(c['stderr'], 'rb'){|f| relay f => @stderr} if @stderr
158
+ status
159
+ else
160
+ [status, open(c['stdout'], 'rb'){|f| f.read}, open(c['stderr'], 'rb'){|f| f.read}]
161
+ end
162
+ end
163
+ end
164
+
165
+ def quote *args, &block
166
+ SystemUniversal.quote(*args, &block)
167
+ end
168
+
169
+ def new_thread child_pid, block
170
+ q = Queue.new
171
+ Thread.new(child_pid) do |cid|
172
+ current = Thread.current
173
+ current.abort_on_exception = true
174
+ q.push current
175
+ block.call cid
176
+ end
177
+ q.pop
178
+ end
179
+
180
+ def child_setup tmp
181
+ stdin = File.expand_path(File.join(tmp, 'stdin'))
182
+ stdout = File.expand_path(File.join(tmp, 'stdout'))
183
+ stderr = File.expand_path(File.join(tmp, 'stderr'))
184
+ program = File.expand_path(File.join(tmp, 'program'))
185
+ config = File.expand_path(File.join(tmp, 'config'))
186
+
187
+ if @stdin
188
+ open(stdin, 'wb'){|f| relay @stdin => f}
189
+ else
190
+ FileUtils.touch stdin
191
+ end
192
+ FileUtils.touch stdout
193
+ FileUtils.touch stderr
194
+
195
+ c = {}
196
+ c['argv'] = @argv
197
+ c['env'] = @env
198
+ c['cwd'] = @cwd
199
+ c['stdin'] = stdin
200
+ c['stdout'] = stdout
201
+ c['stderr'] = stderr
202
+ c['program'] = program
203
+ open(config, 'wb'){|f| Marshal.dump(c, f)}
204
+
205
+ open(program, 'wb'){|f| f.write child_program(config)}
206
+
207
+ c
208
+ end
209
+
210
+ def quietly
211
+ v = $VERBOSE
212
+ $VERBOSE = nil
213
+ yield
214
+ ensure
215
+ $VERBOSE = v
216
+ end
217
+
218
+ def child_program config
219
+ <<-program
220
+ # encoding: utf-8
221
+
222
+ PIPE = STDOUT.dup
223
+ begin
224
+ config = Marshal.load(IO.read('#{ config }',:mode=>"rb"))
225
+
226
+ argv = config['argv']
227
+ env = config['env']
228
+ cwd = config['cwd']
229
+ stdin = config['stdin']
230
+ stdout = config['stdout']
231
+ stderr = config['stderr']
232
+
233
+ Dir.chdir cwd if cwd
234
+ env.each{|k,v| ENV[k.to_s] = v.to_s} if env
235
+
236
+ STDIN.reopen stdin
237
+ STDOUT.reopen stdout
238
+ STDERR.reopen stderr
239
+
240
+ PIPE.puts "pid: \#{ Process.pid }"
241
+ PIPE.flush ### the process is ready yo!
242
+ PIPE.close
243
+
244
+ exec *argv
245
+ rescue Exception => e
246
+ PIPE.write Marshal.dump(e) rescue nil
247
+ exit 42
248
+ end
249
+ program
250
+ end
251
+
252
+ def relay srcdst
253
+ src, dst, _ = srcdst.to_a.first
254
+ if src.respond_to? 'read'
255
+ while((buffer = src.read(8192))); dst << buffer; end
256
+ else
257
+ if src.respond_to?(:each_line)
258
+ src.each_line{|buf| dst << buf}
259
+ else
260
+ src.each{|buf| dst << buf}
261
+ end
262
+ end
263
+ end
264
+
265
+ def slug_for(*args)
266
+ options = args.last.is_a?(Hash) ? args.pop : {}
267
+ join = (options[:join] || options['join'] || '_').to_s
268
+ string = args.flatten.compact.join(join)
269
+ words = string.to_s.scan(%r|[/\w]+|)
270
+ words.map!{|word| word.gsub %r|[^/0-9a-zA-Z_-]|, ''}
271
+ words.delete_if{|word| word.nil? or word.strip.empty?}
272
+ words.join(join).downcase.gsub('/', (join * 2))
273
+ end
274
+
275
+ def tmpdir d = Dir.tmpdir, max = 42, &b
276
+ i = -1 and loop{
277
+ i += 1
278
+
279
+ tmp = File.join(d, slug_for("systemu_#{ @host }_#{ @ppid }_#{ @pid }_#{ rand }_#{ i += 1 }"))
280
+
281
+ begin
282
+ Dir.mkdir tmp
283
+ rescue Errno::EEXIST
284
+ raise Error if i >= max
285
+ next
286
+ end
287
+
288
+ break(
289
+ if b
290
+ begin
291
+ b.call tmp
292
+ ensure
293
+ FileUtils.rm_rf tmp unless SystemU.turd
294
+ end
295
+ else
296
+ tmp
297
+ end
298
+ )
299
+ }
300
+ end
301
+
302
+ def getopts opts = {}
303
+ lambda do |*args|
304
+ keys, default, _ = args
305
+ catch(:opt) do
306
+ [keys].flatten.each do |key|
307
+ [key, key.to_s, key.to_s.intern].each do |k|
308
+ throw :opt, opts[k] if opts.has_key?(k)
309
+ end
310
+ end
311
+ default
312
+ end
313
+ end
314
+ end
315
+ end
316
+
317
+ # some monkeypatching for JRuby
318
+ if defined? JRUBY_VERSION
319
+ require 'jruby'
320
+ java_import org.jruby.RubyProcess
321
+
322
+ class SystemUniversal
323
+ def systemu
324
+ split_argv = JRuby::PathHelper.smart_split_command @argv
325
+ process = java.lang.Runtime.runtime.exec split_argv.to_java(:string)
326
+
327
+ stdout, stderr = [process.input_stream, process.error_stream].map do |stream|
328
+ StreamReader.new(stream)
329
+ end
330
+
331
+ field = process.get_class.get_declared_field("pid")
332
+ field.set_accessible(true)
333
+ pid = field.get(process)
334
+ _thread = new_thread pid, @block if @block
335
+ exit_code = process.wait_for
336
+ [
337
+ RubyProcess::RubyStatus.new_process_status(JRuby.runtime, exit_code, pid),
338
+ stdout.join,
339
+ stderr.join
340
+ ]
341
+ end
342
+
343
+ class StreamReader
344
+ def initialize(stream)
345
+ @data = ""
346
+ @thread = Thread.new do
347
+ reader = java.io.BufferedReader.new java.io.InputStreamReader.new(stream)
348
+
349
+ while line = reader.read_line
350
+ @data << line << "\n"
351
+ end
352
+ end
353
+ end
354
+
355
+ def join
356
+ @thread.join
357
+ @data
358
+ end
359
+ end
360
+ end
361
+ end
362
+
363
+
364
+
365
+ SystemU = SystemUniversal unless defined? SystemU
366
+ Systemu = SystemUniversal unless defined? Systemu
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+ if $0 == __FILE__
381
+ #
382
+ # date
383
+ #
384
+ date = %q( ruby -e" t = Time.now; STDOUT.puts t; STDERR.puts t " )
385
+
386
+ status, stdout, stderr = systemu date
387
+ p [status, stdout, stderr]
388
+
389
+ status = systemu date, 1=>(stdout = '')
390
+ p [status, stdout]
391
+
392
+ status = systemu date, 2=>(stderr = '')
393
+ p [status, stderr]
394
+ #
395
+ # sleep
396
+ #
397
+ sleep = %q( ruby -e" p(sleep(1)) " )
398
+ status, stdout, stderr = systemu sleep
399
+ p [status, stdout, stderr]
400
+
401
+ sleep = %q( ruby -e" p(sleep(42)) " )
402
+ status, stdout, stderr = systemu(sleep){|cid| Process.kill 9, cid}
403
+ p [status, stdout, stderr]
404
+ #
405
+ # env
406
+ #
407
+ env = %q( ruby -e" p ENV['A'] " )
408
+ status, stdout, stderr = systemu env, :env => {'A' => 42}
409
+ p [status, stdout, stderr]
410
+ #
411
+ # cwd
412
+ #
413
+ env = %q( ruby -e" p Dir.pwd " )
414
+ status, stdout, stderr = systemu env, :cwd => Dir.tmpdir
415
+ p [status, stdout, stderr]
416
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pasv_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Moore
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-31 00:00:00.000000000 Z
11
+ date: 2019-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,26 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: systemu
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '2.6'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 2.6.5
65
- type: :runtime
66
- prerelease: false
67
- version_requirements: !ruby/object:Gem::Requirement
68
- requirements:
69
- - - "~>"
70
- - !ruby/object:Gem::Version
71
- version: '2.6'
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: 2.6.5
75
55
  description:
76
56
  email:
77
57
  - moorer@udel.edu
@@ -91,6 +71,7 @@ files:
91
71
  - lib/pasv_lib.rb
92
72
  - lib/pasv_lib/version.rb
93
73
  - pasv_lib.gemspec
74
+ - vendor/systemu.rb
94
75
  homepage: http://www.github.com/mooreryan/pasv_lib
95
76
  licenses: []
96
77
  metadata: {}
@@ -109,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
90
  - !ruby/object:Gem::Version
110
91
  version: '0'
111
92
  requirements: []
112
- rubyforge_project:
113
- rubygems_version: 2.6.14
93
+ rubygems_version: 3.0.1
114
94
  signing_key:
115
95
  specification_version: 4
116
96
  summary: Library code for PASV