qb 0.3.25 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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