qb 0.3.25 → 0.4.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/VERSION +1 -1
- data/ansible.cfg +10 -1
- data/exe/.qb_interop_receive +3 -10
- data/exe/qb +8 -2
- data/lib/python/qb/__init__.py +6 -0
- data/{roles/qb/ruby/rspec/setup/tasks/persistence.yml → lib/python/qb/ansible/__init__.py} +0 -0
- data/lib/python/qb/ansible/modules/__init__.py +0 -0
- data/lib/python/qb/ansible/modules/docker/__init__.py +0 -0
- data/lib/python/qb/ansible/modules/docker/client.py +177 -0
- data/lib/python/qb/ansible/modules/docker/image_manager.py +754 -0
- data/lib/python/qb/ipc/__init__.py +0 -0
- data/lib/python/qb/ipc/stdio/__init__.py +99 -0
- data/lib/python/qb/ipc/stdio/logging.py +151 -0
- data/lib/qb.rb +3 -3
- data/lib/qb/ansible/cmds/playbook.rb +5 -14
- data/lib/qb/ansible/env.rb +36 -6
- data/lib/qb/ansible/module.rb +396 -152
- data/lib/qb/ansible/module/response.rb +195 -0
- data/lib/qb/ansible/modules.rb +42 -0
- data/lib/qb/ansible/modules/docker/image.rb +273 -0
- data/lib/qb/cli.rb +5 -18
- data/lib/qb/cli/run.rb +2 -2
- data/lib/qb/data.rb +22 -0
- data/lib/qb/data/immutable.rb +39 -0
- data/lib/qb/docker.rb +2 -0
- data/lib/qb/docker/cli.rb +430 -0
- data/lib/qb/docker/image.rb +207 -0
- data/lib/qb/docker/image/name.rb +309 -0
- data/lib/qb/docker/image/tag.rb +113 -0
- data/lib/qb/docker/repo.rb +0 -0
- data/lib/qb/errors.rb +17 -3
- data/lib/qb/execution.rb +83 -0
- data/lib/qb/ipc.rb +48 -0
- data/lib/qb/ipc/stdio.rb +32 -0
- data/lib/qb/ipc/stdio/client.rb +267 -0
- data/lib/qb/ipc/stdio/server.rb +229 -0
- data/lib/qb/ipc/stdio/server/in_service.rb +18 -0
- data/lib/qb/ipc/stdio/server/log_service.rb +168 -0
- data/lib/qb/ipc/stdio/server/out_service.rb +20 -0
- data/lib/qb/ipc/stdio/server/service.rb +229 -0
- data/lib/qb/options.rb +360 -502
- data/lib/qb/options/option.rb +293 -115
- data/lib/qb/options/option/option_parser_concern.rb +228 -0
- data/lib/qb/options/types.rb +73 -0
- data/lib/qb/package.rb +0 -1
- data/lib/qb/package/version.rb +179 -58
- data/lib/qb/package/version/from.rb +192 -51
- data/lib/qb/package/version/leveled.rb +1 -1
- data/lib/qb/path.rb +3 -2
- data/lib/qb/repo/git.rb +9 -85
- data/lib/qb/role/default_dir.rb +2 -2
- data/lib/qb/role/errors.rb +2 -8
- data/lib/qb/util.rb +1 -2
- data/lib/qb/util/bundler.rb +73 -43
- data/lib/qb/util/decorators.rb +99 -0
- data/lib/qb/util/interop.rb +7 -8
- data/lib/qb/util/resource.rb +12 -13
- data/lib/qb/version.rb +10 -0
- data/library/path_facts +5 -10
- data/library/qb.module.rb +105 -0
- data/library/stream +6 -26
- data/load/ansible/module/autorun.rb +25 -0
- data/load/ansible/module/script.rb +123 -0
- data/load/rebundle.rb +39 -0
- data/plugins/filter/dict_filters.py +56 -0
- data/plugins/{filter_plugins/path_plugins.py → filter/path_filters.py} +0 -0
- data/plugins/{filter_plugins/ruby_interop_plugins.py → filter/ruby_interop_filters.py} +1 -17
- data/plugins/{filter_plugins/string_plugins.py → filter/string_filters.py} +1 -20
- data/plugins/{filter_plugins/version_plugins.py → filter/version_filters.py} +3 -18
- data/plugins/{lookup_plugins/every.py → lookup/every_lookups.py} +0 -0
- data/plugins/{lookup_plugins/resolve.py → lookup/resolve_lookups.py} +0 -0
- data/plugins/{lookup_plugins/version.py → lookup/version_lookups.py} +0 -16
- data/plugins/test/dict_tests.py +36 -0
- data/plugins/test/string_tests.py +36 -0
- data/qb.gemspec +7 -3
- data/roles/nrser.rb/library/set_fact_with_ruby.rb +3 -9
- data/roles/nrser.state_mate/library/state +3 -17
- data/roles/qb/call/meta/qb.yml +1 -1
- data/roles/qb/dev/ref/repo/git/meta/qb.yml +1 -1
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/defaults/main.yml +1 -1
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/main.yml +3 -2
- data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/qb.yml +12 -7
- data/roles/qb/docker/mac/kubernetes/tasks/main.yml +45 -0
- data/roles/qb/git/check/clean/meta/qb.yml +1 -1
- data/roles/qb/git/ignore/meta/qb +10 -3
- data/roles/qb/git/submodule/update/library/git_submodule_update +17 -27
- data/roles/qb/github/pages/setup/meta/qb.yml +1 -1
- data/roles/qb/labs/atom/apm/meta/qb.yml +1 -1
- data/roles/qb/osx/git/change_case/meta/qb.yml +1 -1
- data/roles/qb/osx/notif/meta/qb.yml +1 -1
- data/roles/qb/pkg/bump/library/bump +4 -16
- data/roles/qb/role/qb/defaults/main.yml +2 -0
- data/roles/qb/role/qb/meta/qb.yml +10 -5
- data/roles/qb/role/qb/templates/qb.yml.j2 +7 -2
- data/roles/qb/role/templates/library/module.rb.j2 +12 -23
- data/roles/qb/role/templates/meta/main.yml.j2 +14 -1
- data/roles/qb/ruby/bundler/meta/qb.yml +1 -1
- data/roles/qb/ruby/dependency/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/templates/console +8 -2
- data/roles/qb/ruby/gem/build/meta/qb.yml +1 -1
- data/roles/qb/ruby/gem/new/meta/qb.yml +1 -1
- data/roles/qb/ruby/nrser/rspex/generate/meta/qb.yml +5 -5
- data/roles/qb/ruby/nrser/rspex/issue/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/clean/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/config/library/yard.get_output_dir +5 -15
- data/roles/qb/ruby/yard/config/meta/qb.yml +1 -1
- data/roles/qb/ruby/yard/setup/meta/qb.yml +1 -1
- metadata +71 -22
- data/lib/qb/ansible_module.rb +0 -5
- data/lib/qb/util/stdio.rb +0 -187
- data/roles/qb/ruby/rspec/setup/tasks/main.yml +0 -4
|
@@ -1,22 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
# WANT_JSON
|
|
3
3
|
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
ENV.each {|k, v|
|
|
7
|
-
if k.start_with? 'QB_DEV_ENV_'
|
|
8
|
-
ENV[k.sub('QB_DEV_ENV_', '')] = v
|
|
9
|
-
end
|
|
10
|
-
}
|
|
11
|
-
require 'bundler/setup'
|
|
12
|
-
end
|
|
4
|
+
# Load QB's Ansible module autorun harness
|
|
5
|
+
load ENV['QB_AM_AUTORUN_PATH']
|
|
13
6
|
|
|
14
|
-
require 'qb'
|
|
15
|
-
require 'nrser'
|
|
16
7
|
|
|
17
8
|
class YardGetOutputDir < QB::Ansible::Module
|
|
18
9
|
|
|
19
|
-
arg :bundle_root,
|
|
10
|
+
arg :bundle_root, type: t.abs_path
|
|
20
11
|
|
|
21
12
|
def facts_for rel_dir
|
|
22
13
|
{
|
|
@@ -41,7 +32,7 @@ class YardGetOutputDir < QB::Ansible::Module
|
|
|
41
32
|
# the module will exit successfully.
|
|
42
33
|
#
|
|
43
34
|
def main
|
|
44
|
-
path = File.join
|
|
35
|
+
path = File.join bundle_root, '.yardopts'
|
|
45
36
|
|
|
46
37
|
if File.exists? path
|
|
47
38
|
contents = File.read path
|
|
@@ -54,6 +45,5 @@ class YardGetOutputDir < QB::Ansible::Module
|
|
|
54
45
|
|
|
55
46
|
default_facts
|
|
56
47
|
end # #main
|
|
48
|
+
|
|
57
49
|
end # YardGetOutputDir
|
|
58
|
-
|
|
59
|
-
YardGetOutputDir.new.run
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: qb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- nrser
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-05-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -120,42 +120,42 @@ dependencies:
|
|
|
120
120
|
requirements:
|
|
121
121
|
- - "~>"
|
|
122
122
|
- !ruby/object:Gem::Version
|
|
123
|
-
version: 0.
|
|
123
|
+
version: 0.3.3
|
|
124
124
|
type: :runtime
|
|
125
125
|
prerelease: false
|
|
126
126
|
version_requirements: !ruby/object:Gem::Requirement
|
|
127
127
|
requirements:
|
|
128
128
|
- - "~>"
|
|
129
129
|
- !ruby/object:Gem::Version
|
|
130
|
-
version: 0.
|
|
130
|
+
version: 0.3.3
|
|
131
131
|
- !ruby/object:Gem::Dependency
|
|
132
132
|
name: cmds
|
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
|
134
134
|
requirements:
|
|
135
135
|
- - "~>"
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 0.2.
|
|
137
|
+
version: 0.2.11
|
|
138
138
|
type: :runtime
|
|
139
139
|
prerelease: false
|
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
|
141
141
|
requirements:
|
|
142
142
|
- - "~>"
|
|
143
143
|
- !ruby/object:Gem::Version
|
|
144
|
-
version: 0.2.
|
|
144
|
+
version: 0.2.11
|
|
145
145
|
- !ruby/object:Gem::Dependency
|
|
146
146
|
name: state_mate
|
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
|
148
148
|
requirements:
|
|
149
149
|
- - "~>"
|
|
150
150
|
- !ruby/object:Gem::Version
|
|
151
|
-
version: 0.1.
|
|
151
|
+
version: 0.1.4
|
|
152
152
|
type: :runtime
|
|
153
153
|
prerelease: false
|
|
154
154
|
version_requirements: !ruby/object:Gem::Requirement
|
|
155
155
|
requirements:
|
|
156
156
|
- - "~>"
|
|
157
157
|
- !ruby/object:Gem::Version
|
|
158
|
-
version: 0.1.
|
|
158
|
+
version: 0.1.4
|
|
159
159
|
- !ruby/object:Gem::Dependency
|
|
160
160
|
name: parseconfig
|
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -232,6 +232,20 @@ dependencies:
|
|
|
232
232
|
- - "~>"
|
|
233
233
|
- !ruby/object:Gem::Version
|
|
234
234
|
version: '1.3'
|
|
235
|
+
- !ruby/object:Gem::Dependency
|
|
236
|
+
name: method_decorators
|
|
237
|
+
requirement: !ruby/object:Gem::Requirement
|
|
238
|
+
requirements:
|
|
239
|
+
- - "~>"
|
|
240
|
+
- !ruby/object:Gem::Version
|
|
241
|
+
version: 0.9.6
|
|
242
|
+
type: :runtime
|
|
243
|
+
prerelease: false
|
|
244
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
245
|
+
requirements:
|
|
246
|
+
- - "~>"
|
|
247
|
+
- !ruby/object:Gem::Version
|
|
248
|
+
version: 0.9.6
|
|
235
249
|
description:
|
|
236
250
|
email:
|
|
237
251
|
- neil@ztkae.com
|
|
@@ -255,7 +269,15 @@ files:
|
|
|
255
269
|
- exe/.qb_interop_receive
|
|
256
270
|
- exe/qb
|
|
257
271
|
- lib/python/qb/__init__.py
|
|
272
|
+
- lib/python/qb/ansible/__init__.py
|
|
273
|
+
- lib/python/qb/ansible/modules/__init__.py
|
|
274
|
+
- lib/python/qb/ansible/modules/docker/__init__.py
|
|
275
|
+
- lib/python/qb/ansible/modules/docker/client.py
|
|
276
|
+
- lib/python/qb/ansible/modules/docker/image_manager.py
|
|
258
277
|
- lib/python/qb/interop.py
|
|
278
|
+
- lib/python/qb/ipc/__init__.py
|
|
279
|
+
- lib/python/qb/ipc/stdio/__init__.py
|
|
280
|
+
- lib/python/qb/ipc/stdio/logging.py
|
|
259
281
|
- lib/python/qb/strings.py
|
|
260
282
|
- lib/qb.rb
|
|
261
283
|
- lib/qb/ansible.rb
|
|
@@ -264,24 +286,45 @@ files:
|
|
|
264
286
|
- lib/qb/ansible/env.rb
|
|
265
287
|
- lib/qb/ansible/env/devel.rb
|
|
266
288
|
- lib/qb/ansible/module.rb
|
|
267
|
-
- lib/qb/
|
|
289
|
+
- lib/qb/ansible/module/response.rb
|
|
290
|
+
- lib/qb/ansible/modules.rb
|
|
291
|
+
- lib/qb/ansible/modules/docker/image.rb
|
|
268
292
|
- lib/qb/cli.rb
|
|
269
293
|
- lib/qb/cli/help.rb
|
|
270
294
|
- lib/qb/cli/list.rb
|
|
271
295
|
- lib/qb/cli/play.rb
|
|
272
296
|
- lib/qb/cli/run.rb
|
|
273
297
|
- lib/qb/cli/setup.rb
|
|
298
|
+
- lib/qb/data.rb
|
|
299
|
+
- lib/qb/data/immutable.rb
|
|
300
|
+
- lib/qb/docker.rb
|
|
301
|
+
- lib/qb/docker/cli.rb
|
|
302
|
+
- lib/qb/docker/image.rb
|
|
303
|
+
- lib/qb/docker/image/name.rb
|
|
304
|
+
- lib/qb/docker/image/tag.rb
|
|
305
|
+
- lib/qb/docker/repo.rb
|
|
274
306
|
- lib/qb/errors.rb
|
|
307
|
+
- lib/qb/execution.rb
|
|
275
308
|
- lib/qb/github.rb
|
|
276
309
|
- lib/qb/github/api.rb
|
|
277
310
|
- lib/qb/github/issue.rb
|
|
278
311
|
- lib/qb/github/repo_id.rb
|
|
279
312
|
- lib/qb/github/resource.rb
|
|
280
313
|
- lib/qb/github/types.rb
|
|
314
|
+
- lib/qb/ipc.rb
|
|
315
|
+
- lib/qb/ipc/stdio.rb
|
|
316
|
+
- lib/qb/ipc/stdio/client.rb
|
|
317
|
+
- lib/qb/ipc/stdio/server.rb
|
|
318
|
+
- lib/qb/ipc/stdio/server/in_service.rb
|
|
319
|
+
- lib/qb/ipc/stdio/server/log_service.rb
|
|
320
|
+
- lib/qb/ipc/stdio/server/out_service.rb
|
|
321
|
+
- lib/qb/ipc/stdio/server/service.rb
|
|
281
322
|
- lib/qb/labs/README.md
|
|
282
323
|
- lib/qb/labs/atom/apm.rb
|
|
283
324
|
- lib/qb/options.rb
|
|
284
325
|
- lib/qb/options/option.rb
|
|
326
|
+
- lib/qb/options/option/option_parser_concern.rb
|
|
327
|
+
- lib/qb/options/types.rb
|
|
285
328
|
- lib/qb/package.rb
|
|
286
329
|
- lib/qb/package/gem.rb
|
|
287
330
|
- lib/qb/package/version.rb
|
|
@@ -301,15 +344,19 @@ files:
|
|
|
301
344
|
- lib/qb/role/search_path.rb
|
|
302
345
|
- lib/qb/util.rb
|
|
303
346
|
- lib/qb/util/bundler.rb
|
|
347
|
+
- lib/qb/util/decorators.rb
|
|
304
348
|
- lib/qb/util/docker_mixin.rb
|
|
305
349
|
- lib/qb/util/interop.rb
|
|
306
350
|
- lib/qb/util/resource.rb
|
|
307
|
-
- lib/qb/util/stdio.rb
|
|
308
351
|
- lib/qb/version.rb
|
|
309
352
|
- library/git_mkdir.py
|
|
310
353
|
- library/path_facts
|
|
354
|
+
- library/qb.module.rb
|
|
311
355
|
- library/qb_facts.py
|
|
312
356
|
- library/stream
|
|
357
|
+
- load/ansible/module/autorun.rb
|
|
358
|
+
- load/ansible/module/script.rb
|
|
359
|
+
- load/rebundle.rb
|
|
313
360
|
- node_modules/.bin/semver
|
|
314
361
|
- node_modules/semver/LICENSE
|
|
315
362
|
- node_modules/semver/README.md
|
|
@@ -318,13 +365,16 @@ files:
|
|
|
318
365
|
- node_modules/semver/range.bnf
|
|
319
366
|
- node_modules/semver/semver.js
|
|
320
367
|
- package.json
|
|
321
|
-
- plugins/
|
|
322
|
-
- plugins/
|
|
323
|
-
- plugins/
|
|
324
|
-
- plugins/
|
|
325
|
-
- plugins/
|
|
326
|
-
- plugins/
|
|
327
|
-
- plugins/
|
|
368
|
+
- plugins/filter/dict_filters.py
|
|
369
|
+
- plugins/filter/path_filters.py
|
|
370
|
+
- plugins/filter/ruby_interop_filters.py
|
|
371
|
+
- plugins/filter/string_filters.py
|
|
372
|
+
- plugins/filter/version_filters.py
|
|
373
|
+
- plugins/lookup/every_lookups.py
|
|
374
|
+
- plugins/lookup/resolve_lookups.py
|
|
375
|
+
- plugins/lookup/version_lookups.py
|
|
376
|
+
- plugins/test/dict_tests.py
|
|
377
|
+
- plugins/test/string_tests.py
|
|
328
378
|
- qb.gemspec
|
|
329
379
|
- requirements.txt
|
|
330
380
|
- roles/nrser.blockinfile/CONTRIBUTING.md
|
|
@@ -366,6 +416,10 @@ files:
|
|
|
366
416
|
- roles/qb/dev/ref/repo/git/meta/main.yml
|
|
367
417
|
- roles/qb/dev/ref/repo/git/meta/qb.yml
|
|
368
418
|
- roles/qb/dev/ref/repo/git/tasks/main.yml
|
|
419
|
+
- roles/qb/docker/mac/kubernetes/defaults/main.yml
|
|
420
|
+
- roles/qb/docker/mac/kubernetes/meta/main.yml
|
|
421
|
+
- roles/qb/docker/mac/kubernetes/meta/qb.yml
|
|
422
|
+
- roles/qb/docker/mac/kubernetes/tasks/main.yml
|
|
369
423
|
- roles/qb/dump/vars/.qb-options.yml
|
|
370
424
|
- roles/qb/dump/vars/README.md
|
|
371
425
|
- roles/qb/dump/vars/meta/main.yml
|
|
@@ -747,11 +801,6 @@ files:
|
|
|
747
801
|
- roles/qb/ruby/nrser/rspex/issue/meta/main.yml
|
|
748
802
|
- roles/qb/ruby/nrser/rspex/issue/meta/qb.yml
|
|
749
803
|
- roles/qb/ruby/nrser/rspex/issue/tasks/main.yml
|
|
750
|
-
- roles/qb/ruby/rspec/setup/defaults/main.yml
|
|
751
|
-
- roles/qb/ruby/rspec/setup/meta/main.yml
|
|
752
|
-
- roles/qb/ruby/rspec/setup/meta/qb.yml
|
|
753
|
-
- roles/qb/ruby/rspec/setup/tasks/main.yml
|
|
754
|
-
- roles/qb/ruby/rspec/setup/tasks/persistence.yml
|
|
755
804
|
- roles/qb/ruby/yard/clean/defaults/main.yml
|
|
756
805
|
- roles/qb/ruby/yard/clean/meta/main.yml
|
|
757
806
|
- roles/qb/ruby/yard/clean/meta/qb.yml
|
data/lib/qb/ansible_module.rb
DELETED
data/lib/qb/util/stdio.rb
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
# Requirements
|
|
2
|
-
# =====================================================================
|
|
3
|
-
|
|
4
|
-
# stdlib
|
|
5
|
-
require 'thread'
|
|
6
|
-
require 'socket'
|
|
7
|
-
require 'securerandom'
|
|
8
|
-
require 'fileutils'
|
|
9
|
-
require 'nrser'
|
|
10
|
-
|
|
11
|
-
# Refinements
|
|
12
|
-
# =====================================================================
|
|
13
|
-
|
|
14
|
-
require 'nrser/refinements'
|
|
15
|
-
using NRSER
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# Declarations
|
|
19
|
-
# =====================================================================
|
|
20
|
-
|
|
21
|
-
module QB; end
|
|
22
|
-
module QB::Util; end
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# Definitions
|
|
26
|
-
# =====================================================================
|
|
27
|
-
|
|
28
|
-
# Utilities for QB's standard-IO (`stdio`) handling feature.
|
|
29
|
-
#
|
|
30
|
-
# Normally, Ansible modules can't really do much with `stdio` - they return
|
|
31
|
-
# results by writing JSON to `stdout`, can't do anything useful with `stdin`,
|
|
32
|
-
# and I think things written to `stderr` don't go anywhere useful.
|
|
33
|
-
#
|
|
34
|
-
# This makes dealing with logging, error reporting and wrapping executables
|
|
35
|
-
# that report useful progress info to `stdout` or `stderr` pretty shitty.
|
|
36
|
-
#
|
|
37
|
-
# So, what we do is create streaming sockets for `stdout`, `stderr` and
|
|
38
|
-
# `stdin` in the QB process and write their paths to environment variables,
|
|
39
|
-
# which will be available to modules.
|
|
40
|
-
#
|
|
41
|
-
# {QB::Ansible::Module} automatically detects these variables and sets up
|
|
42
|
-
# `$stdout`, `$stderr` and `$stdin` to point to the sockets, which proxy
|
|
43
|
-
# back to the QB process' `stdio`.
|
|
44
|
-
#
|
|
45
|
-
# Of course other modules written in any language can also connect to these
|
|
46
|
-
# file sockets in the same manner.
|
|
47
|
-
#
|
|
48
|
-
# @note
|
|
49
|
-
# This feature only works for `localhost`. I have no idea what it will do
|
|
50
|
-
# in other cases. It doesn't seem like it should break anything, but remotely
|
|
51
|
-
# executing modules definitely won't be able to connect to the sockets on
|
|
52
|
-
# the host.
|
|
53
|
-
#
|
|
54
|
-
# @todo
|
|
55
|
-
# `stdin` support is pretty experimental / broken at this point. That would
|
|
56
|
-
# be nice to fix in the future so that programs that make use of user
|
|
57
|
-
# interaction work seamlessly through QB. This will probably require
|
|
58
|
-
# using pseudo-TTY streams or whatever.
|
|
59
|
-
#
|
|
60
|
-
module QB::Util::STDIO
|
|
61
|
-
|
|
62
|
-
# Constants
|
|
63
|
-
# =====================================================================
|
|
64
|
-
|
|
65
|
-
SOCKET_DIR = Pathname.new('/').join 'tmp', 'qb-stdio'
|
|
66
|
-
|
|
67
|
-
# STDIO as a service exposed on a UNIX socket so that modules can stream
|
|
68
|
-
# their output to it, which is in turn printed to the console `qb` is running
|
|
69
|
-
# in.
|
|
70
|
-
class Service
|
|
71
|
-
include SemanticLogger::Loggable
|
|
72
|
-
|
|
73
|
-
def initialize name
|
|
74
|
-
@name = name
|
|
75
|
-
@thread = nil
|
|
76
|
-
@server = nil
|
|
77
|
-
@socket = nil
|
|
78
|
-
@env_key = "QB_STDIO_#{ name.upcase }"
|
|
79
|
-
|
|
80
|
-
unless SOCKET_DIR.exist?
|
|
81
|
-
FileUtils.mkdir SOCKET_DIR
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
@path = SOCKET_DIR.join "#{ name }.#{ SecureRandom.uuid }.sock"
|
|
85
|
-
|
|
86
|
-
self.logger = SemanticLogger[
|
|
87
|
-
[
|
|
88
|
-
"#{ self.class.name } {",
|
|
89
|
-
" name: #{ name }",
|
|
90
|
-
" path: #{ @path.to_s }",
|
|
91
|
-
"}"
|
|
92
|
-
].join( "\n" )
|
|
93
|
-
]
|
|
94
|
-
|
|
95
|
-
logger.trace "Initialized"
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def debug *args
|
|
99
|
-
# logger.debug "#{ @debug_header }", args
|
|
100
|
-
logger.debug *args
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def open!
|
|
104
|
-
logger.trace "opening..."
|
|
105
|
-
|
|
106
|
-
# make sure env var is not already set (basically just prevents you from
|
|
107
|
-
# accidentally opening two instances with the same name)
|
|
108
|
-
if ENV.key? @env_key
|
|
109
|
-
raise <<-END.squish
|
|
110
|
-
env already contains key #{ @env_key } with value #{ ENV[@env_key] }
|
|
111
|
-
END
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
@thread = Thread.new do
|
|
115
|
-
Thread.current.name = @name
|
|
116
|
-
logger.trace "thread started."
|
|
117
|
-
|
|
118
|
-
@server = UNIXServer.new @path.to_s
|
|
119
|
-
|
|
120
|
-
while true do
|
|
121
|
-
@socket = @server.accept
|
|
122
|
-
|
|
123
|
-
work_in_thread
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# set the env key so children can find the socket path
|
|
128
|
-
ENV[@env_key] = @path.to_s
|
|
129
|
-
logger.trace "set env var", @env_key => ENV[@env_key]
|
|
130
|
-
|
|
131
|
-
logger.trace "service open."
|
|
132
|
-
end # open
|
|
133
|
-
|
|
134
|
-
def close!
|
|
135
|
-
# clean up.
|
|
136
|
-
#
|
|
137
|
-
# TODO not sure how correct this is...
|
|
138
|
-
#
|
|
139
|
-
logger.trace "closing..."
|
|
140
|
-
|
|
141
|
-
@socket.close unless @socket.nil?
|
|
142
|
-
@socket = nil
|
|
143
|
-
@server.close unless @server.nil?
|
|
144
|
-
@server = nil
|
|
145
|
-
FileUtils.rm(@path) if @path.exist?
|
|
146
|
-
@thread.kill unless @thread.nil?
|
|
147
|
-
|
|
148
|
-
logger.trace "closed."
|
|
149
|
-
end
|
|
150
|
-
end # Service
|
|
151
|
-
|
|
152
|
-
# QB STDIO Service to proxy output from modules back to the main user
|
|
153
|
-
# process.
|
|
154
|
-
class OutService < Service
|
|
155
|
-
def initialize name, dest
|
|
156
|
-
super name
|
|
157
|
-
@dest = dest
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def work_in_thread
|
|
161
|
-
while (line = @socket.gets) do
|
|
162
|
-
logger.trace "received line",
|
|
163
|
-
line: line,
|
|
164
|
-
dest: @dest
|
|
165
|
-
|
|
166
|
-
@dest.puts line
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end # OutService
|
|
170
|
-
|
|
171
|
-
# QB STDIO Service to proxy interactive user input from the main process
|
|
172
|
-
# to modules.
|
|
173
|
-
class InService < Service
|
|
174
|
-
def initialize name, src
|
|
175
|
-
super name
|
|
176
|
-
@src = src
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def work_in_thread
|
|
180
|
-
while (line = @src.gets) do
|
|
181
|
-
@socket.puts line
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
close!
|
|
185
|
-
end
|
|
186
|
-
end # InService
|
|
187
|
-
end # QB::Util::STDIO
|