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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/ansible.cfg +10 -1
  4. data/exe/.qb_interop_receive +3 -10
  5. data/exe/qb +8 -2
  6. data/lib/python/qb/__init__.py +6 -0
  7. data/{roles/qb/ruby/rspec/setup/tasks/persistence.yml → lib/python/qb/ansible/__init__.py} +0 -0
  8. data/lib/python/qb/ansible/modules/__init__.py +0 -0
  9. data/lib/python/qb/ansible/modules/docker/__init__.py +0 -0
  10. data/lib/python/qb/ansible/modules/docker/client.py +177 -0
  11. data/lib/python/qb/ansible/modules/docker/image_manager.py +754 -0
  12. data/lib/python/qb/ipc/__init__.py +0 -0
  13. data/lib/python/qb/ipc/stdio/__init__.py +99 -0
  14. data/lib/python/qb/ipc/stdio/logging.py +151 -0
  15. data/lib/qb.rb +3 -3
  16. data/lib/qb/ansible/cmds/playbook.rb +5 -14
  17. data/lib/qb/ansible/env.rb +36 -6
  18. data/lib/qb/ansible/module.rb +396 -152
  19. data/lib/qb/ansible/module/response.rb +195 -0
  20. data/lib/qb/ansible/modules.rb +42 -0
  21. data/lib/qb/ansible/modules/docker/image.rb +273 -0
  22. data/lib/qb/cli.rb +5 -18
  23. data/lib/qb/cli/run.rb +2 -2
  24. data/lib/qb/data.rb +22 -0
  25. data/lib/qb/data/immutable.rb +39 -0
  26. data/lib/qb/docker.rb +2 -0
  27. data/lib/qb/docker/cli.rb +430 -0
  28. data/lib/qb/docker/image.rb +207 -0
  29. data/lib/qb/docker/image/name.rb +309 -0
  30. data/lib/qb/docker/image/tag.rb +113 -0
  31. data/lib/qb/docker/repo.rb +0 -0
  32. data/lib/qb/errors.rb +17 -3
  33. data/lib/qb/execution.rb +83 -0
  34. data/lib/qb/ipc.rb +48 -0
  35. data/lib/qb/ipc/stdio.rb +32 -0
  36. data/lib/qb/ipc/stdio/client.rb +267 -0
  37. data/lib/qb/ipc/stdio/server.rb +229 -0
  38. data/lib/qb/ipc/stdio/server/in_service.rb +18 -0
  39. data/lib/qb/ipc/stdio/server/log_service.rb +168 -0
  40. data/lib/qb/ipc/stdio/server/out_service.rb +20 -0
  41. data/lib/qb/ipc/stdio/server/service.rb +229 -0
  42. data/lib/qb/options.rb +360 -502
  43. data/lib/qb/options/option.rb +293 -115
  44. data/lib/qb/options/option/option_parser_concern.rb +228 -0
  45. data/lib/qb/options/types.rb +73 -0
  46. data/lib/qb/package.rb +0 -1
  47. data/lib/qb/package/version.rb +179 -58
  48. data/lib/qb/package/version/from.rb +192 -51
  49. data/lib/qb/package/version/leveled.rb +1 -1
  50. data/lib/qb/path.rb +3 -2
  51. data/lib/qb/repo/git.rb +9 -85
  52. data/lib/qb/role/default_dir.rb +2 -2
  53. data/lib/qb/role/errors.rb +2 -8
  54. data/lib/qb/util.rb +1 -2
  55. data/lib/qb/util/bundler.rb +73 -43
  56. data/lib/qb/util/decorators.rb +99 -0
  57. data/lib/qb/util/interop.rb +7 -8
  58. data/lib/qb/util/resource.rb +12 -13
  59. data/lib/qb/version.rb +10 -0
  60. data/library/path_facts +5 -10
  61. data/library/qb.module.rb +105 -0
  62. data/library/stream +6 -26
  63. data/load/ansible/module/autorun.rb +25 -0
  64. data/load/ansible/module/script.rb +123 -0
  65. data/load/rebundle.rb +39 -0
  66. data/plugins/filter/dict_filters.py +56 -0
  67. data/plugins/{filter_plugins/path_plugins.py → filter/path_filters.py} +0 -0
  68. data/plugins/{filter_plugins/ruby_interop_plugins.py → filter/ruby_interop_filters.py} +1 -17
  69. data/plugins/{filter_plugins/string_plugins.py → filter/string_filters.py} +1 -20
  70. data/plugins/{filter_plugins/version_plugins.py → filter/version_filters.py} +3 -18
  71. data/plugins/{lookup_plugins/every.py → lookup/every_lookups.py} +0 -0
  72. data/plugins/{lookup_plugins/resolve.py → lookup/resolve_lookups.py} +0 -0
  73. data/plugins/{lookup_plugins/version.py → lookup/version_lookups.py} +0 -16
  74. data/plugins/test/dict_tests.py +36 -0
  75. data/plugins/test/string_tests.py +36 -0
  76. data/qb.gemspec +7 -3
  77. data/roles/nrser.rb/library/set_fact_with_ruby.rb +3 -9
  78. data/roles/nrser.state_mate/library/state +3 -17
  79. data/roles/qb/call/meta/qb.yml +1 -1
  80. data/roles/qb/dev/ref/repo/git/meta/qb.yml +1 -1
  81. data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/defaults/main.yml +1 -1
  82. data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/main.yml +3 -2
  83. data/roles/qb/{ruby/rspec/setup → docker/mac/kubernetes}/meta/qb.yml +12 -7
  84. data/roles/qb/docker/mac/kubernetes/tasks/main.yml +45 -0
  85. data/roles/qb/git/check/clean/meta/qb.yml +1 -1
  86. data/roles/qb/git/ignore/meta/qb +10 -3
  87. data/roles/qb/git/submodule/update/library/git_submodule_update +17 -27
  88. data/roles/qb/github/pages/setup/meta/qb.yml +1 -1
  89. data/roles/qb/labs/atom/apm/meta/qb.yml +1 -1
  90. data/roles/qb/osx/git/change_case/meta/qb.yml +1 -1
  91. data/roles/qb/osx/notif/meta/qb.yml +1 -1
  92. data/roles/qb/pkg/bump/library/bump +4 -16
  93. data/roles/qb/role/qb/defaults/main.yml +2 -0
  94. data/roles/qb/role/qb/meta/qb.yml +10 -5
  95. data/roles/qb/role/qb/templates/qb.yml.j2 +7 -2
  96. data/roles/qb/role/templates/library/module.rb.j2 +12 -23
  97. data/roles/qb/role/templates/meta/main.yml.j2 +14 -1
  98. data/roles/qb/ruby/bundler/meta/qb.yml +1 -1
  99. data/roles/qb/ruby/dependency/meta/qb.yml +1 -1
  100. data/roles/qb/ruby/gem/bin_stubs/meta/qb.yml +1 -1
  101. data/roles/qb/ruby/gem/bin_stubs/templates/console +8 -2
  102. data/roles/qb/ruby/gem/build/meta/qb.yml +1 -1
  103. data/roles/qb/ruby/gem/new/meta/qb.yml +1 -1
  104. data/roles/qb/ruby/nrser/rspex/generate/meta/qb.yml +5 -5
  105. data/roles/qb/ruby/nrser/rspex/issue/meta/qb.yml +1 -1
  106. data/roles/qb/ruby/yard/clean/meta/qb.yml +1 -1
  107. data/roles/qb/ruby/yard/config/library/yard.get_output_dir +5 -15
  108. data/roles/qb/ruby/yard/config/meta/qb.yml +1 -1
  109. data/roles/qb/ruby/yard/setup/meta/qb.yml +1 -1
  110. metadata +71 -22
  111. data/lib/qb/ansible_module.rb +0 -5
  112. data/lib/qb/util/stdio.rb +0 -187
  113. data/roles/qb/ruby/rspec/setup/tasks/main.yml +0 -4
@@ -11,7 +11,7 @@ description: null
11
11
  # generalize in the future.
12
12
  requirements:
13
13
  gems:
14
- qb: ~> 0.3.0
14
+ qb: '>= 0.3.0'
15
15
 
16
16
  # prefix for role variables
17
17
  var_prefix: null
@@ -15,7 +15,7 @@ description: >-
15
15
  # Gemspec-style requirements. Right now only `.gems.qb` is used.
16
16
  requirements:
17
17
  gems:
18
- qb: ~> 0.3.0
18
+ qb: '>= 0.3.0'
19
19
 
20
20
  # Prefix for role variables
21
21
  var_prefix: clean
@@ -1,22 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
  # WANT_JSON
3
3
 
4
- # init bundler in dev env
5
- if ENV['QB_DEV_ENV']
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, NRSER::Types.abs_path
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 @bundle_root, '.yardopts'
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
@@ -15,7 +15,7 @@ description: >-
15
15
  # Gemspec-style requirements. Right now only `.gems.qb` is used.
16
16
  requirements:
17
17
  gems:
18
- qb: ~> 0.3.0
18
+ qb: '>= 0.3.0'
19
19
 
20
20
  # Prefix for role variables
21
21
  var_prefix: config
@@ -12,7 +12,7 @@ description: >-
12
12
  # generalize in the future.
13
13
  requirements:
14
14
  gems:
15
- qb: ~> 0.3.0
15
+ qb: '>= 0.3.0'
16
16
 
17
17
  # prefix for role variables
18
18
  var_prefix: yard
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.3.25
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-03-20 00:00:00.000000000 Z
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.2.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.2.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.10
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.10
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.3
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.3
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/ansible_module.rb
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/filter_plugins/path_plugins.py
322
- - plugins/filter_plugins/ruby_interop_plugins.py
323
- - plugins/filter_plugins/string_plugins.py
324
- - plugins/filter_plugins/version_plugins.py
325
- - plugins/lookup_plugins/every.py
326
- - plugins/lookup_plugins/resolve.py
327
- - plugins/lookup_plugins/version.py
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
@@ -1,5 +0,0 @@
1
- require_relative './ansible/module'
2
-
3
- module QB
4
- AnsibleModule = QB::Ansible::Module
5
- end # QB
@@ -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