docker_toolkit 0.1.25 → 0.2.0
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/Gemfile.lock +12 -9
- data/bin/waiter.rb +3 -3
- data/docker_toolkit.gemspec +1 -3
- data/lib/docker_toolkit/version.rb +1 -1
- data/lib/docker_toolkit/watcher.rb +3 -233
- metadata +3 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8561f65ea626741850e599d9d29cb4f5cb8c24e87ef146d07a834f2bcf4d13a
|
4
|
+
data.tar.gz: 3a89ccb8404355d91a3070213b3dd1ba66e92f04351cdd0e84d4202877a56640
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 560591c6ddb48aa696cf9e0157d73c0248b9abbb2e347b31c6af45781ea29cf58de26462cc94dbb636a4d769fad1c8819076c374f52216565c13cb0601d75c9a
|
7
|
+
data.tar.gz: f7c50dbf342b5e7a6ca14c1f46656028475106d03d9e29bcec72a3797e5e84e5f4db1d0fc081a0f7d64f224261d94fd236c3507186dd8d3ba5cc1819b18b6647
|
data/Gemfile.lock
CHANGED
@@ -1,23 +1,25 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
docker_toolkit (0.
|
5
|
-
|
6
|
-
dotenv
|
7
|
-
json
|
4
|
+
docker_toolkit (0.2.0)
|
5
|
+
aggkit
|
8
6
|
|
9
7
|
GEM
|
10
8
|
remote: https://rubygems.org/
|
11
9
|
specs:
|
10
|
+
aggkit (0.4.0.9107)
|
11
|
+
diplomat
|
12
|
+
dotenv
|
13
|
+
json
|
14
|
+
tty-tree
|
12
15
|
awesome_print (1.8.0)
|
13
16
|
diff-lcs (1.3)
|
14
|
-
diplomat (2.0.
|
17
|
+
diplomat (2.0.5)
|
15
18
|
faraday (~> 0.9)
|
16
|
-
|
17
|
-
|
18
|
-
faraday (0.15.3)
|
19
|
+
dotenv (2.7.1)
|
20
|
+
faraday (0.15.4)
|
19
21
|
multipart-post (>= 1.2, < 3)
|
20
|
-
json (2.
|
22
|
+
json (2.2.0)
|
21
23
|
multipart-post (2.0.0)
|
22
24
|
rake (10.5.0)
|
23
25
|
rspec (3.8.0)
|
@@ -36,6 +38,7 @@ GEM
|
|
36
38
|
rspec-core (> 3.3)
|
37
39
|
rspec-set (0.1.3)
|
38
40
|
rspec-support (3.8.0)
|
41
|
+
tty-tree (0.2.0)
|
39
42
|
|
40
43
|
PLATFORMS
|
41
44
|
ruby
|
data/bin/waiter.rb
CHANGED
@@ -101,9 +101,9 @@ if @opts[:db]
|
|
101
101
|
@pg[:db] = "-d #{@opts[:db]}"
|
102
102
|
@pg[:user] = "-U #{@opts[:user]}" if @opts[:user]
|
103
103
|
@pg[:pass] = if @opts[:pass] && !@opts[:pass].empty?
|
104
|
-
"
|
104
|
+
"PGPASSWORD=#{@opts[:pass]}"
|
105
105
|
else
|
106
|
-
'
|
106
|
+
''
|
107
107
|
end
|
108
108
|
|
109
109
|
@pg[:host] = "-h #{@opts[:host]}" if @opts[:host]
|
@@ -181,7 +181,7 @@ end
|
|
181
181
|
def wait_for_db
|
182
182
|
log("Waiting for DB: pg://#{@opts[:user]}:#{@opts[:pass]}@#{@opts[:host]}:#{@opts[:port]}/#{@opts[:db]}...")
|
183
183
|
ret = wait_for @opts[:timeout] do
|
184
|
-
cmd = "
|
184
|
+
cmd = "#{@pg[:pass]} psql -lqt #{@pg[:user]} #{@pg[:host]} #{@pg[:port]} #{@pg[:db]} 2>/dev/null | cut -d \\| -f 1 | grep -qw #{@opts[:db]} > /dev/null 2>&1"
|
185
185
|
system(cmd)
|
186
186
|
$?.success?
|
187
187
|
end
|
data/docker_toolkit.gemspec
CHANGED
@@ -26,9 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
end
|
27
27
|
|
28
28
|
|
29
|
-
spec.add_dependency '
|
30
|
-
spec.add_dependency 'dotenv'
|
31
|
-
spec.add_dependency 'json'
|
29
|
+
spec.add_dependency 'aggkit'
|
32
30
|
|
33
31
|
spec.add_development_dependency 'bundler', '~> 1.14'
|
34
32
|
spec.add_development_dependency 'rake', '~> 10.0'
|
@@ -1,238 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'English'
|
3
|
+
require 'aggkit'
|
4
|
+
require 'aggkit/watcher'
|
3
5
|
|
4
6
|
module DockerToolkit
|
5
|
-
|
6
|
-
class Watcher
|
7
|
-
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@lock = Mutex.new
|
11
|
-
|
12
|
-
@procs = []
|
13
|
-
@code = 0
|
14
|
-
@crashed = false
|
15
|
-
@threads = []
|
16
|
-
@who = nil
|
17
|
-
@stopping = false
|
18
|
-
end
|
19
|
-
|
20
|
-
def stop_all
|
21
|
-
@stopping = true
|
22
|
-
|
23
|
-
terminating = @procs.reject do |meta|
|
24
|
-
meta[:handled] || meta[:process].exited?
|
25
|
-
end
|
26
|
-
|
27
|
-
terminating.each do |meta|
|
28
|
-
begin
|
29
|
-
meta[:stdin].close
|
30
|
-
rescue StandardError
|
31
|
-
nil
|
32
|
-
end
|
33
|
-
if meta[:termcmd].is_a? String
|
34
|
-
log "Terminating by #{meta[:termcmd].gsub('%PID%', meta[:process].pid.to_s)}..."
|
35
|
-
output = `#{meta[:termcmd].gsub('%PID%', meta[:process].pid.to_s)}`
|
36
|
-
if $?.success?
|
37
|
-
log "ok: #{output}"
|
38
|
-
else
|
39
|
-
log "Error: #{output}"
|
40
|
-
::Process.kill 'TERM', meta[:process].pid
|
41
|
-
end
|
42
|
-
else
|
43
|
-
::Process.kill 'TERM', meta[:process].pid
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
terminating.each do |meta|
|
48
|
-
begin
|
49
|
-
meta[:process].poll_for_exit(5)
|
50
|
-
rescue ChildProcess::TimeoutError
|
51
|
-
meta[:process].stop(1)
|
52
|
-
meta[:stdout].close
|
53
|
-
meta[:stderr].close
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
unless @crashed
|
58
|
-
meta = @procs.detect do |meta|
|
59
|
-
meta[:process].crashed?
|
60
|
-
end
|
61
|
-
|
62
|
-
if meta
|
63
|
-
@crashed = true
|
64
|
-
@code = meta[:process].exit_code
|
65
|
-
@who = meta[:cmd]
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
@procs.each do |meta|
|
70
|
-
begin
|
71
|
-
meta[:stdout].close
|
72
|
-
rescue StandardError
|
73
|
-
nil
|
74
|
-
end
|
75
|
-
begin
|
76
|
-
meta[:stderr].close
|
77
|
-
rescue StandardError
|
78
|
-
nil
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
Thread.new do
|
83
|
-
sleep 2
|
84
|
-
@threads.each(&:terminate)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def add(*cmd)
|
89
|
-
options = cmd.last
|
90
|
-
if options.is_a? Hash
|
91
|
-
cmd.pop
|
92
|
-
else
|
93
|
-
options = {}
|
94
|
-
end
|
95
|
-
|
96
|
-
cmd = cmd.flatten.map{|c| c.to_s.strip }.reject(&:empty?)
|
97
|
-
process = ChildProcess.build(*cmd)
|
98
|
-
|
99
|
-
rerr, werr = IO.pipe
|
100
|
-
rout, wout = IO.pipe
|
101
|
-
|
102
|
-
process.io.stdout = wout
|
103
|
-
process.io.stderr = werr
|
104
|
-
process.duplex = true
|
105
|
-
|
106
|
-
meta = {
|
107
|
-
cmd: cmd,
|
108
|
-
process: process,
|
109
|
-
stdout: rout,
|
110
|
-
stderr: rerr,
|
111
|
-
stdin: process.io.stdin,
|
112
|
-
termcmd: options[:termcmd]
|
113
|
-
}
|
114
|
-
|
115
|
-
@threads << Thread.new(meta[:stdout], STDOUT) do |io, out|
|
116
|
-
loop do
|
117
|
-
break unless synchro_readline(io, out)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
@threads << Thread.new(meta[:stderr], STDERR) do |io, out|
|
122
|
-
loop do
|
123
|
-
break unless synchro_readline(io, out)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
log "Starting #{meta[:cmd]}"
|
128
|
-
meta[:pid] = meta[:process].start.pid
|
129
|
-
|
130
|
-
@procs.push(meta)
|
131
|
-
meta
|
132
|
-
end
|
133
|
-
|
134
|
-
def synchro_readline(io, out)
|
135
|
-
str = io.gets
|
136
|
-
@lock.synchronize{ out.puts str }
|
137
|
-
true
|
138
|
-
rescue StandardError => e
|
139
|
-
false
|
140
|
-
end
|
141
|
-
|
142
|
-
def log(msg)
|
143
|
-
puts "[watcher]: #{msg}"
|
144
|
-
end
|
145
|
-
|
146
|
-
def error(msg)
|
147
|
-
STDERR.puts "[watcher]: Error: #{msg}"
|
148
|
-
end
|
149
|
-
|
150
|
-
def exec
|
151
|
-
%w[EXIT QUIT].each do |sig|
|
152
|
-
trap(sig) do
|
153
|
-
stop_all
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
|
158
|
-
%w[INT TERM].each do |sig|
|
159
|
-
trap(sig) do
|
160
|
-
log "Catch #{sig}: try exits gracefully.."
|
161
|
-
stop_all
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
trap('CLD') do |*_args|
|
166
|
-
unhandled = @procs.reject do |meta|
|
167
|
-
meta[:handled] || !meta[:process].exited?
|
168
|
-
end
|
169
|
-
|
170
|
-
completed = unhandled.any? do |meta|
|
171
|
-
log 'Child finished'
|
172
|
-
log " Process[#{meta[:pid]}]: #{meta[:cmd]}"
|
173
|
-
log " status: #{meta[:process].crashed? ? 'crashed' : 'exited'}"
|
174
|
-
log " code: #{meta[:process].exit_code}"
|
175
|
-
|
176
|
-
meta[:handled] = true
|
177
|
-
begin
|
178
|
-
meta[:stdin].close
|
179
|
-
rescue StandardError
|
180
|
-
nil
|
181
|
-
end
|
182
|
-
begin
|
183
|
-
meta[:stdout].close
|
184
|
-
rescue StandardError
|
185
|
-
nil
|
186
|
-
end
|
187
|
-
begin
|
188
|
-
meta[:stderr].close
|
189
|
-
rescue StandardError
|
190
|
-
nil
|
191
|
-
end
|
192
|
-
|
193
|
-
if !@crashed && meta[:process].crashed?
|
194
|
-
@crashed = true
|
195
|
-
@code = meta[:process].exit_code
|
196
|
-
@who = meta[:cmd]
|
197
|
-
end
|
198
|
-
|
199
|
-
unless @stopping
|
200
|
-
log 'Try exits gracefully..'
|
201
|
-
stop_all
|
202
|
-
end
|
203
|
-
|
204
|
-
true
|
205
|
-
end
|
206
|
-
|
207
|
-
unless completed
|
208
|
-
pid, status = Process.waitpid2(-1, Process::WNOHANG) rescue nil
|
209
|
-
if status
|
210
|
-
log "Subprocess finished: #{status.inspect}"
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
end
|
215
|
-
|
216
|
-
begin
|
217
|
-
yield(self)
|
218
|
-
rescue StandardError => e
|
219
|
-
@crashed = true
|
220
|
-
@code = 1
|
221
|
-
error e.inspect
|
222
|
-
error e.backtrace.last(20).join("\n")
|
223
|
-
log 'Try exits gracefully..'
|
224
|
-
stop_all
|
225
|
-
end
|
226
|
-
|
227
|
-
@threads.map(&:join)
|
228
|
-
|
229
|
-
@code = [@code || 0, 1].max if @crashed
|
230
|
-
|
231
|
-
exit(@code || 0)
|
232
|
-
end
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
end
|
237
|
-
|
7
|
+
Watcher = Aggkit::Watcher
|
238
8
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker_toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Godko Ivan
|
@@ -9,38 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-02-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
requirements:
|
18
|
-
- - ">="
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: '0'
|
21
|
-
type: :runtime
|
22
|
-
prerelease: false
|
23
|
-
version_requirements: !ruby/object:Gem::Requirement
|
24
|
-
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '0'
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: dotenv
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '0'
|
35
|
-
type: :runtime
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - ">="
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
version: '0'
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: json
|
15
|
+
name: aggkit
|
44
16
|
requirement: !ruby/object:Gem::Requirement
|
45
17
|
requirements:
|
46
18
|
- - ">="
|