voltos 0.3.0.rc13 → 0.3.0.rc14
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.
- checksums.yaml +4 -4
- data/exe/voltos +4 -75
- data/exe/voltos-cli +0 -0
- data/lib/voltos/exe.rb +146 -0
- data/lib/voltos/logger.rb +26 -0
- data/lib/voltos/version.rb +1 -1
- data/voltos.gemspec +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f69a0b9facf15ca91edcc3aacdb778fc2a1d8f2
|
4
|
+
data.tar.gz: fd98f3520fc48862d4c46e8679c9eb8c9ce781d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfb16c318abf9d9776d71a3898de74f1fe3700b1dcbbd0e16997e0774cc28bbd4f9be5650d9aa239ee7f98f5bc6dfbeaf157f1ba44a5e23803a75f9e38ec35d6
|
7
|
+
data.tar.gz: 6946992dfd179d36970d063b4096f8cb614a3e0b309f6f46008a2ece34506ee2df787aa8845191e3372f3d992c8a073ee14281925431373de9ac6da2963a7142
|
data/exe/voltos
CHANGED
@@ -1,79 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require '
|
4
|
-
require 'readline'
|
5
|
-
|
6
|
-
def run_as_tty(bin, args)
|
7
|
-
STDOUT.sync = true
|
8
|
-
status = PTY.spawn(bin, *args) do |stdout, stdin, pid|
|
9
|
-
stdout.sync = true
|
10
|
-
Thread.new do
|
11
|
-
loop do
|
12
|
-
STDOUT.print stdout.getc
|
13
|
-
end
|
14
|
-
end
|
15
|
-
Thread.new do
|
16
|
-
loop do
|
17
|
-
input = Readline.readline("", true)
|
18
|
-
if input.nil?
|
19
|
-
stdout.flush
|
20
|
-
stdout.close
|
21
|
-
stdin.close
|
22
|
-
end
|
23
|
-
stdin.puts input.strip
|
24
|
-
end
|
25
|
-
end
|
26
|
-
begin
|
27
|
-
Process::waitpid(pid) rescue nil
|
28
|
-
rescue SystemExit, Interrupt
|
29
|
-
Process.kill('INT', pid)
|
30
|
-
Process::waitpid(pid) rescue nil
|
31
|
-
retry
|
32
|
-
rescue EOFError
|
33
|
-
rescue IOError, Errno::EIO
|
34
|
-
end
|
35
|
-
end
|
36
|
-
status
|
37
|
-
end
|
38
|
-
|
39
|
-
def run_as_daemon(bin, args)
|
40
|
-
process = nil
|
41
|
-
Open3.popen3(bin, *ARGV) do |stdin, stdout, stderr, thread|
|
42
|
-
Thread.new do
|
43
|
-
while !stdin.closed? do
|
44
|
-
input = Readline.readline("", true).strip
|
45
|
-
stdin.puts input
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
errThread = Thread.new do
|
50
|
-
while !stderr.eof? do
|
51
|
-
putc stderr.readchar
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
outThread = Thread.new do
|
56
|
-
while !stdout.eof? do
|
57
|
-
putc stdout.readchar
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
begin
|
62
|
-
Process::waitpid(thread.pid) rescue nil
|
63
|
-
errThread.join
|
64
|
-
outThread.join
|
65
|
-
process = thread.value
|
66
|
-
rescue SystemExit, Interrupt
|
67
|
-
retry
|
68
|
-
end
|
69
|
-
end
|
70
|
-
return process.exitstatus if process
|
71
|
-
end
|
2
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'voltos/exe'
|
72
4
|
|
73
5
|
bin = "#{Gem.bin_path('voltos', 'voltos')}-cli"
|
74
|
-
|
75
|
-
|
76
|
-
else
|
77
|
-
status = run_as_daemon(bin, ARGV)
|
78
|
-
end
|
6
|
+
process = Voltos::Process.new
|
7
|
+
status = process.run(bin, *ARGV)
|
79
8
|
exit(status.to_i)
|
data/exe/voltos-cli
ADDED
Binary file
|
data/lib/voltos/exe.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'voltos/logger'
|
2
|
+
require 'pty'
|
3
|
+
require 'open3'
|
4
|
+
require 'readline'
|
5
|
+
|
6
|
+
module Voltos
|
7
|
+
class Process
|
8
|
+
def initialize(input = STDIN, output = STDOUT, err = STDOUT)
|
9
|
+
Readline.input = input
|
10
|
+
@in = input
|
11
|
+
@out = output
|
12
|
+
@err = err
|
13
|
+
end
|
14
|
+
|
15
|
+
def tty?
|
16
|
+
STDIN.tty?
|
17
|
+
end
|
18
|
+
|
19
|
+
def pid=(pid)
|
20
|
+
logger.debug "Storing spawned process pid: #{pid}"
|
21
|
+
@pid = pid
|
22
|
+
end
|
23
|
+
|
24
|
+
def pid
|
25
|
+
@pid
|
26
|
+
end
|
27
|
+
|
28
|
+
def run(command, *args)
|
29
|
+
logger.debug "Running: #{command} #{args.join(' ')}"
|
30
|
+
Signal.trap('INT') do
|
31
|
+
ctrl_c!
|
32
|
+
end
|
33
|
+
Signal.trap('TERM') do
|
34
|
+
ctrl_c!
|
35
|
+
end
|
36
|
+
if tty?
|
37
|
+
run_as_tty(command, *args)
|
38
|
+
else
|
39
|
+
run_as_daemon(command, *args)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def ctrl_c!
|
44
|
+
pid_to_kill = pid || ::Process.pid
|
45
|
+
logger.debug "Sending ^C to: #{pid_to_kill}"
|
46
|
+
::Process.kill('TERM', pid_to_kill)
|
47
|
+
::Process.waitall
|
48
|
+
end
|
49
|
+
|
50
|
+
def ctrl_d!
|
51
|
+
logger.debug "Sending ^D"
|
52
|
+
@process_stdin.close if @process_stdin
|
53
|
+
@process_stdout.close if @process_stdout
|
54
|
+
logger.debug "Sent."
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def logger
|
59
|
+
return @logger if @logger
|
60
|
+
@logger = Voltos::Logger
|
61
|
+
end
|
62
|
+
|
63
|
+
def run_as_tty(bin, *args)
|
64
|
+
@out.sync = true
|
65
|
+
status = PTY.spawn(bin, *args) do |stdout, stdin, pid|
|
66
|
+
self.pid = pid
|
67
|
+
@process_stdin = stdin
|
68
|
+
@process_stdout = stdout
|
69
|
+
stdout.sync = true
|
70
|
+
Thread.new do
|
71
|
+
loop do
|
72
|
+
@out.print stdout.getc
|
73
|
+
end
|
74
|
+
end
|
75
|
+
Thread.new do
|
76
|
+
loop do
|
77
|
+
input = Readline.readline('', true)
|
78
|
+
if input.nil?
|
79
|
+
logger.debug "Cleaning up STDIN & STDOUT..."
|
80
|
+
stdout.flush
|
81
|
+
stdout.close
|
82
|
+
stdin.close
|
83
|
+
end
|
84
|
+
stdin.puts input.strip
|
85
|
+
end
|
86
|
+
end
|
87
|
+
begin
|
88
|
+
logger.debug "Waiting for process to finish: #{pid}"
|
89
|
+
::Process::waitpid(pid) rescue nil
|
90
|
+
::Process.waitall
|
91
|
+
logger.debug "Process finished."
|
92
|
+
while out = stdout.getc do
|
93
|
+
@out.print out
|
94
|
+
end
|
95
|
+
rescue SystemExit, Interrupt
|
96
|
+
logger.debug "Rescued interrupt."
|
97
|
+
ctrl_c!
|
98
|
+
retry
|
99
|
+
rescue EOFError
|
100
|
+
logger.debug "Rescued EOF."
|
101
|
+
rescue IOError, Errno::EIO
|
102
|
+
logger.debug "Rescued IOError."
|
103
|
+
end
|
104
|
+
end
|
105
|
+
status
|
106
|
+
end
|
107
|
+
|
108
|
+
def run_as_daemon(bin, *args)
|
109
|
+
process = nil
|
110
|
+
Open3.popen3(bin, *args) do |stdin, stdout, stderr, thread|
|
111
|
+
self.pid = thread.pid
|
112
|
+
Thread.new do
|
113
|
+
while !stdin.closed? do
|
114
|
+
input = Readline.readline('', true).strip
|
115
|
+
stdin.puts input
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
errThread = Thread.new do
|
120
|
+
while !stderr.eof? do
|
121
|
+
@err.putc stderr.readchar
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
outThread = Thread.new do
|
126
|
+
while !stdout.eof? do
|
127
|
+
putc stdout.readchar
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
begin
|
132
|
+
logger.debug "Waiting for process to finish #{thread.pid}."
|
133
|
+
Process::waitpid(thread.pid) rescue nil
|
134
|
+
errThread.join
|
135
|
+
outThread.join
|
136
|
+
logger.debug "Process finished."
|
137
|
+
process = thread.value
|
138
|
+
rescue SystemExit, Interrupt
|
139
|
+
logger.debug "Rescued interrupt."
|
140
|
+
retry
|
141
|
+
end
|
142
|
+
end
|
143
|
+
return process.exitstatus if process
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'logger'
|
2
|
+
module Voltos
|
3
|
+
module Logger
|
4
|
+
@@levels = ["FATAL", "ERROR", "WARN", "INFO", "DEBUG"]
|
5
|
+
@@levels.each do |level|
|
6
|
+
define_singleton_method level.downcase.to_sym do |msg|
|
7
|
+
logger.send(level.downcase.to_sym, 'Voltos Process - ' + msg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.logger
|
12
|
+
return @logger if @logger
|
13
|
+
@logger = ::Logger.new(STDOUT)
|
14
|
+
@logger.level = ::Logger::WARN
|
15
|
+
if level = ENV["LOG_LEVEL"]
|
16
|
+
if @@levels.include? level.upcase
|
17
|
+
@logger.level = ::Logger.const_get(level.upcase.to_sym)
|
18
|
+
else
|
19
|
+
@logger.warn "Log level '#{level.upcase}' is unknown. Supported levels are: #{levels.join(", ")}."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@logger
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
data/lib/voltos/version.rb
CHANGED
data/voltos.gemspec
CHANGED
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
# spec.add_development_dependency "curb", '~> 0'
|
34
34
|
# spec.add_development_dependency "json", '~> 1.8.3'
|
35
35
|
spec.add_development_dependency 'json', '~> 1.8', '>= 1.8.3'
|
36
|
+
spec.add_development_dependency 'byebug', '> 0'
|
36
37
|
|
37
38
|
# spec.add_development_dependency "bundler"
|
38
39
|
# spec.add_development_dependency "rake"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: voltos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.
|
4
|
+
version: 0.3.0.rc14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel May
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,6 +72,20 @@ dependencies:
|
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 1.8.3
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: byebug
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: curb
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,9 +132,12 @@ files:
|
|
118
132
|
- bin/console
|
119
133
|
- bin/setup
|
120
134
|
- exe/voltos
|
135
|
+
- exe/voltos-cli
|
121
136
|
- ext/Makefile
|
122
137
|
- ext/extconf.rb
|
123
138
|
- lib/voltos.rb
|
139
|
+
- lib/voltos/exe.rb
|
140
|
+
- lib/voltos/logger.rb
|
124
141
|
- lib/voltos/rails.rb
|
125
142
|
- lib/voltos/version.rb
|
126
143
|
- voltos.gemspec
|