dapp 0.6.1 → 0.6.2
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/bin/dapp +3 -3
- data/config/en/common.yml +19 -4
- data/config/en/net_status.yml +13 -4
- data/lib/dapp.rb +48 -16
- data/lib/dapp/application.rb +75 -40
- data/lib/dapp/application/path.rb +3 -2
- data/lib/dapp/application/stages.rb +59 -0
- data/lib/dapp/artifact.rb +22 -0
- data/lib/dapp/build/stage/after_install_artifact.rb +13 -0
- data/lib/dapp/build/stage/after_setup_artifact.rb +17 -0
- data/lib/dapp/build/stage/artifact_base.rb +80 -0
- data/lib/dapp/build/stage/artifact_default.rb +62 -0
- data/lib/dapp/build/stage/base.rb +47 -12
- data/lib/dapp/build/stage/before_install.rb +6 -5
- data/lib/dapp/build/stage/before_install_artifact.rb +13 -0
- data/lib/dapp/build/stage/before_setup.rb +7 -8
- data/lib/dapp/build/stage/before_setup_artifact.rb +13 -0
- data/lib/dapp/build/stage/build_artifact.rb +32 -0
- data/lib/dapp/build/stage/docker_instructions.rb +4 -22
- data/lib/dapp/build/stage/from.rb +7 -8
- data/lib/dapp/build/stage/ga_archive.rb +1 -1
- data/lib/dapp/build/stage/ga_archive_dependencies.rb +1 -1
- data/lib/dapp/build/stage/ga_artifact_patch.rb +21 -0
- data/lib/dapp/build/stage/ga_base.rb +6 -29
- data/lib/dapp/build/stage/ga_dependencies_base.rb +4 -13
- data/lib/dapp/build/stage/ga_latest_patch.rb +2 -2
- data/lib/dapp/build/stage/import_artifact.rb +69 -0
- data/lib/dapp/build/stage/install/ga_post_install_patch.rb +1 -1
- data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +1 -1
- data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +1 -7
- data/lib/dapp/build/stage/install/install.rb +12 -7
- data/lib/dapp/build/stage/mod/logging.rb +10 -7
- data/lib/dapp/build/stage/setup/chef_cookbooks.rb +3 -4
- data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +1 -1
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +2 -2
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +2 -8
- data/lib/dapp/build/stage/setup/setup.rb +12 -7
- data/lib/dapp/builder/base.rb +13 -1
- data/lib/dapp/builder/chef.rb +125 -79
- data/lib/dapp/builder/chef/cookbook_metadata.rb +1 -1
- data/lib/dapp/builder/shell.rb +2 -3
- data/lib/dapp/cli.rb +3 -3
- data/lib/dapp/cli/base.rb +0 -2
- data/lib/dapp/cli/bp.rb +0 -4
- data/lib/dapp/cli/build.rb +3 -7
- data/lib/dapp/cli/cleanup.rb +0 -2
- data/lib/dapp/cli/list.rb +0 -2
- data/lib/dapp/cli/mrproper.rb +22 -0
- data/lib/dapp/cli/push.rb +4 -3
- data/lib/dapp/cli/run.rb +0 -2
- data/lib/dapp/cli/spush.rb +0 -2
- data/lib/dapp/cli/stage_image.rb +24 -0
- data/lib/dapp/cli/stages.rb +7 -5
- data/lib/dapp/cli/stages/cleanup_local.rb +28 -0
- data/lib/dapp/cli/stages/cleanup_repo.rb +24 -0
- data/lib/dapp/cli/stages/{flush.rb → flush_local.rb} +4 -6
- data/lib/dapp/cli/stages/{cleanup.rb → flush_repo.rb} +4 -6
- data/lib/dapp/cli/stages/pull.rb +28 -0
- data/lib/dapp/cli/stages/push.rb +24 -0
- data/lib/dapp/config/application.rb +185 -44
- data/lib/dapp/config/artifact.rb +10 -50
- data/lib/dapp/config/directive/artifact.rb +77 -0
- data/lib/dapp/config/directive/build_dir.rb +9 -0
- data/lib/dapp/config/directive/chef.rb +95 -0
- data/lib/dapp/config/directive/docker/artifact.rb +26 -0
- data/lib/dapp/config/directive/docker/base.rb +91 -0
- data/lib/dapp/config/directive/git_artifact.rb +59 -0
- data/lib/dapp/config/directive/shell/artifact.rb +38 -0
- data/lib/dapp/config/directive/shell/base.rb +85 -0
- data/lib/dapp/config/directive/tmp_dir.rb +36 -0
- data/lib/dapp/config/main.rb +1 -7
- data/lib/dapp/core_ext/hash.rb +21 -0
- data/lib/dapp/docker_registry/base.rb +60 -5
- data/lib/dapp/docker_registry/mod/request.rb +2 -14
- data/lib/dapp/git_artifact.rb +32 -23
- data/lib/dapp/git_repo/base.rb +1 -1
- data/lib/dapp/image/argument.rb +3 -3
- data/lib/dapp/image/docker.rb +13 -16
- data/lib/dapp/image/scratch.rb +29 -0
- data/lib/dapp/image/stage.rb +33 -23
- data/lib/dapp/lock/base.rb +18 -11
- data/lib/dapp/lock/file.rb +18 -16
- data/lib/dapp/prctl.rb +1 -0
- data/lib/dapp/project.rb +22 -9
- data/lib/dapp/project/command/bp.rb +2 -5
- data/lib/dapp/project/command/build.rb +1 -2
- data/lib/dapp/project/command/cleanup.rb +9 -7
- data/lib/dapp/project/command/common.rb +37 -12
- data/lib/dapp/project/command/mrproper.rb +57 -0
- data/lib/dapp/project/command/push.rb +8 -2
- data/lib/dapp/project/command/run.rb +1 -1
- data/lib/dapp/project/command/stage_image.rb +15 -0
- data/lib/dapp/project/command/stages/cleanup_local.rb +100 -0
- data/lib/dapp/project/command/stages/cleanup_repo.rb +65 -0
- data/lib/dapp/project/command/stages/common.rb +48 -0
- data/lib/dapp/project/command/stages/flush_local.rb +24 -0
- data/lib/dapp/project/command/stages/flush_repo.rb +22 -0
- data/lib/dapp/project/command/stages/pull.rb +26 -0
- data/lib/dapp/project/command/stages/push.rb +22 -0
- data/lib/dapp/project/dappfile.rb +3 -1
- data/lib/dapp/project/deps/base.rb +52 -0
- data/lib/dapp/project/deps/gitartifact.rb +36 -0
- data/lib/dapp/project/lock.rb +20 -13
- data/lib/dapp/project/logging/base.rb +20 -3
- data/lib/dapp/project/logging/i18n.rb +25 -0
- data/lib/dapp/project/logging/paint.rb +47 -0
- data/lib/dapp/project/logging/process.rb +17 -10
- data/lib/dapp/project/shellout/base.rb +74 -0
- data/lib/dapp/project/shellout/streaming.rb +49 -0
- data/lib/dapp/project/shellout/system.rb +72 -0
- data/lib/dapp/project/ssh_agent.rb +8 -9
- data/lib/dapp/version.rb +1 -1
- metadata +48 -17
- data/lib/dapp/build/stage/artifact.rb +0 -40
- data/lib/dapp/build/stage/mod/artifact.rb +0 -79
- data/lib/dapp/config/chef.rb +0 -51
- data/lib/dapp/config/docker.rb +0 -82
- data/lib/dapp/config/git_artifact.rb +0 -51
- data/lib/dapp/config/shell.rb +0 -64
- data/lib/dapp/helper/i18n.rb +0 -20
- data/lib/dapp/helper/paint.rb +0 -27
- data/lib/dapp/helper/shellout.rb +0 -63
- data/lib/dapp/helper/streaming.rb +0 -47
- data/lib/dapp/project/command/stages_cleanup.rb +0 -72
- data/lib/dapp/project/command/stages_flush.rb +0 -20
- data/lib/dapp/project/paint.rb +0 -16
data/lib/dapp/project/lock.rb
CHANGED
@@ -7,20 +7,27 @@ module Dapp
|
|
7
7
|
build_path.join('locks')
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def _lock(name)
|
11
|
+
@_locks ||= {}
|
12
|
+
@_locks[name] ||= ::Dapp::Lock::File.new(lock_path, name)
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
def lock(name, *_args, default_timeout: 300, **kwargs, &blk)
|
16
|
+
if dry_run?
|
17
|
+
yield if block_given?
|
18
|
+
else
|
19
|
+
timeout = cli_options[:lock_timeout] || default_timeout
|
20
|
+
_lock(name).synchronize(
|
21
|
+
timeout: timeout,
|
22
|
+
on_wait: proc do |&do_wait|
|
23
|
+
log_secondary_process(
|
24
|
+
t(code: 'process.waiting_resouce_lock', data: { name: name }),
|
25
|
+
short: true,
|
26
|
+
&do_wait
|
27
|
+
)
|
28
|
+
end, **kwargs, &blk
|
29
|
+
)
|
30
|
+
end
|
24
31
|
end
|
25
32
|
end # Lock
|
26
33
|
end # Project
|
@@ -17,6 +17,14 @@ module Dapp
|
|
17
17
|
cli_options[:log_verbose]
|
18
18
|
end
|
19
19
|
|
20
|
+
def introspect_error?
|
21
|
+
cli_options[:introspect_error]
|
22
|
+
end
|
23
|
+
|
24
|
+
def introspect_before_error?
|
25
|
+
cli_options[:introspect_before_error]
|
26
|
+
end
|
27
|
+
|
20
28
|
def dry_run?
|
21
29
|
cli_options[:dry_run]
|
22
30
|
end
|
@@ -26,6 +34,13 @@ module Dapp
|
|
26
34
|
log(*args, **kwargs)
|
27
35
|
end
|
28
36
|
|
37
|
+
def log_step_with_indent(step)
|
38
|
+
log_step(step)
|
39
|
+
with_log_indent do
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
29
44
|
def log_step(*args, **kwargs)
|
30
45
|
kwargs[:style] = :step
|
31
46
|
log(*args, **kwargs)
|
@@ -51,7 +66,7 @@ module Dapp
|
|
51
66
|
end
|
52
67
|
|
53
68
|
def log_time
|
54
|
-
|
69
|
+
"#{DateTime.now.strftime('%Y-%m-%dT%T%z')} "
|
55
70
|
end
|
56
71
|
|
57
72
|
def log_format_string(str, time: true, indent: true, style: nil)
|
@@ -90,8 +105,10 @@ module Dapp
|
|
90
105
|
end
|
91
106
|
end
|
92
107
|
|
93
|
-
|
94
|
-
|
108
|
+
class << self
|
109
|
+
def included(base)
|
110
|
+
base.extend(self)
|
111
|
+
end
|
95
112
|
end
|
96
113
|
|
97
114
|
protected
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Dapp
|
2
|
+
class Project
|
3
|
+
module Logging
|
4
|
+
# I18n
|
5
|
+
module I18n
|
6
|
+
def self.initialize
|
7
|
+
::I18n.load_path << Dir[File.join(Dapp.root, 'config', '**', '*')].select { |path| File.file?(path) }
|
8
|
+
::I18n.reload!
|
9
|
+
::I18n.locale = :en
|
10
|
+
end
|
11
|
+
|
12
|
+
def t(context: nil, **desc)
|
13
|
+
code = desc[:code]
|
14
|
+
data = desc[:data] || {}
|
15
|
+
paths = []
|
16
|
+
paths << [:common, context, code].join('.') if context
|
17
|
+
paths << [:common, code].join('.')
|
18
|
+
::I18n.t(*paths, **data, raise: true)
|
19
|
+
rescue ::I18n::MissingTranslationData => _e
|
20
|
+
raise ::NetStatus::Exception, code: :missing_translation, data: { code: code }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end # Helper
|
24
|
+
end
|
25
|
+
end # Dapp
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Dapp
|
2
|
+
# Project
|
3
|
+
class Project
|
4
|
+
module Logging
|
5
|
+
# Paint
|
6
|
+
module Paint
|
7
|
+
FORMAT = {
|
8
|
+
step: [:yellow, :bold],
|
9
|
+
info: [:blue],
|
10
|
+
success: [:green, :bold],
|
11
|
+
warning: [:red, :bold],
|
12
|
+
secondary: [:white, :bold],
|
13
|
+
default: [:white]
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
def self.initialize(mode)
|
17
|
+
::Paint.mode = case mode
|
18
|
+
when 'auto' then STDOUT.tty? ? 8 : 0
|
19
|
+
when 'on' then 8
|
20
|
+
when 'off' then 0
|
21
|
+
else raise
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def paint_style(name)
|
26
|
+
FORMAT[name].tap do |format|
|
27
|
+
raise if format.nil?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def paint_string(object, style_name)
|
32
|
+
::Paint[unpaint(object.to_s), *paint_style(style_name)]
|
33
|
+
end
|
34
|
+
|
35
|
+
def unpaint(str)
|
36
|
+
::Paint.unpaint(str)
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
def included(base)
|
41
|
+
base.extend(self)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end # Paint
|
45
|
+
end
|
46
|
+
end # Project
|
47
|
+
end # Dapp
|
@@ -26,19 +26,26 @@ module Dapp
|
|
26
26
|
log "#{formatted_message}#{formatted_status}"
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
# rubocop:disable Metrics/ParameterLists
|
30
|
+
def log_process(message, process: nil, short: false, quiet: false, style: {}, status: {}, &blk)
|
31
|
+
return yield if quiet
|
32
|
+
|
30
33
|
style[:message] ||= DEFAULT_STYLE[:message]
|
31
34
|
style[:process] ||= DEFAULT_STYLE[:process]
|
32
35
|
style[:failed] ||= DEFAULT_STYLE[:failed]
|
33
36
|
style[:success] ||= DEFAULT_STYLE[:success]
|
34
37
|
|
38
|
+
status[:success] ||= t(code: 'status.success.default')
|
39
|
+
status[:failed] ||= t(code: 'status.failed.default')
|
40
|
+
|
35
41
|
if log_verbose? && !short
|
36
42
|
process ||= t(code: 'status.process.default')
|
37
|
-
log_process_verbose(message, process: process, style: style, &blk)
|
43
|
+
log_process_verbose(message, process: process, style: style, status: status, &blk)
|
38
44
|
else
|
39
|
-
log_process_short(message, style: style, &blk)
|
45
|
+
log_process_short(message, style: style, status: status, &blk)
|
40
46
|
end
|
41
47
|
end
|
48
|
+
# rubocop:enable Metrics/ParameterLists
|
42
49
|
|
43
50
|
def log_secondary_process(message, **kwargs, &blk)
|
44
51
|
log_process(message, **kwargs.merge(style: { message: :secondary, success: :secondary }), &blk)
|
@@ -46,19 +53,19 @@ module Dapp
|
|
46
53
|
|
47
54
|
protected
|
48
55
|
|
49
|
-
def log_process_verbose(message, process:, style: {}, &blk)
|
56
|
+
def log_process_verbose(message, process:, style: {}, status: {}, &blk)
|
50
57
|
process = paint_string(rjust(process, message), style[:process])
|
51
58
|
info = paint_string(message, style[:message]) + process
|
52
59
|
success_message = paint_string(slice(message), style[:message]) +
|
53
|
-
paint_string(rjust(
|
54
|
-
failed_message = paint_string(slice(message) + rjust(
|
60
|
+
paint_string(rjust(status[:success], message), style[:success])
|
61
|
+
failed_message = paint_string(slice(message) + rjust(status[:failed], message), style[:failed])
|
55
62
|
log_process_default(info, success_message, failed_message, &blk)
|
56
63
|
end
|
57
64
|
|
58
|
-
def log_process_short(message, style: {}, &blk)
|
65
|
+
def log_process_short(message, style: {}, status: {}, &blk)
|
59
66
|
info = "#{paint_string(slice(message), style[:message])} ... "
|
60
|
-
success_message = paint_string(rjust(
|
61
|
-
failed_message = paint_string(rjust(
|
67
|
+
success_message = paint_string(rjust(status[:success], info), style[:success])
|
68
|
+
failed_message = paint_string(rjust(status[:failed], info), style[:failed])
|
62
69
|
log_process_default(info, success_message, failed_message, inline: true, &blk)
|
63
70
|
end
|
64
71
|
|
@@ -90,7 +97,7 @@ module Dapp
|
|
90
97
|
def free_space(str)
|
91
98
|
base_time = log_time? ? log_time.length : 0
|
92
99
|
indent = log_indent.length
|
93
|
-
str =
|
100
|
+
str = unpaint(str.to_s).length
|
94
101
|
time = 15
|
95
102
|
terminal_width - base_time - str - indent - time
|
96
103
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Dapp
|
2
|
+
class Project
|
3
|
+
# Shellout
|
4
|
+
module Shellout
|
5
|
+
# Base
|
6
|
+
module Base
|
7
|
+
include Streaming
|
8
|
+
|
9
|
+
def shellout(*args, **kwargs)
|
10
|
+
env = nil
|
11
|
+
|
12
|
+
Base.default_env_keys.each do |env_key|
|
13
|
+
env_key = env_key.to_s.upcase
|
14
|
+
env ||= {}
|
15
|
+
env[env_key] = ENV[env_key]
|
16
|
+
end
|
17
|
+
|
18
|
+
param_env = (kwargs.delete(:env) || kwargs.delete(:environment))
|
19
|
+
param_env = param_env.map { |key, value| [key.to_s.upcase, value.to_s] }.to_h if param_env
|
20
|
+
|
21
|
+
env = (env || {}).merge(param_env) if param_env
|
22
|
+
kwargs[:env] = env if env
|
23
|
+
|
24
|
+
do_shellout = -> { ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command }
|
25
|
+
if defined? ::Bundler
|
26
|
+
::Bundler.with_clean_env { do_shellout.call }
|
27
|
+
else
|
28
|
+
do_shellout.call
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def shellout!(*args, **kwargs)
|
33
|
+
shellout_with_logging(**kwargs) do |options|
|
34
|
+
shellout(*args, **options).tap(&:error!)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def shellout_pack(command)
|
39
|
+
"eval $(#{echo_path} #{Base64.strict_encode64(command)} | base64 --decode)"
|
40
|
+
end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
def included(base)
|
44
|
+
base.extend(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
def default_env_keys
|
48
|
+
@default_env_keys ||= []
|
49
|
+
end
|
50
|
+
end # << self
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
def shellout_with_logging(log_verbose: false, **kwargs)
|
55
|
+
return yield(**kwargs) unless instance_of? Project
|
56
|
+
|
57
|
+
begin
|
58
|
+
stream = Stream.new
|
59
|
+
if log_verbose && log_verbose?
|
60
|
+
kwargs[:live_stream] = Proxy::Base.new(stream, STDOUT, with_time: log_time?)
|
61
|
+
else
|
62
|
+
kwargs[:live_stdout] = Proxy::Base.new(stream, with_time: log_time?)
|
63
|
+
end
|
64
|
+
kwargs[:live_stderr] = Proxy::Error.new(stream, with_time: log_time?)
|
65
|
+
|
66
|
+
yield(**kwargs)
|
67
|
+
rescue ::Mixlib::ShellOut::ShellCommandFailed => e
|
68
|
+
raise Error::Shellout, code: class_to_lowercase(e.class), data: { stream: stream.show }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end # Helper
|
74
|
+
end # Dapp
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Dapp
|
2
|
+
class Project
|
3
|
+
module Shellout
|
4
|
+
# Streaming
|
5
|
+
module Streaming
|
6
|
+
# Stream
|
7
|
+
class Stream
|
8
|
+
def buffer
|
9
|
+
@buffer ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(string)
|
13
|
+
buffer << string
|
14
|
+
end
|
15
|
+
|
16
|
+
def show
|
17
|
+
buffer.join.strip
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Proxy
|
22
|
+
module Proxy
|
23
|
+
# Base
|
24
|
+
class Base
|
25
|
+
def initialize(*streams, with_time: false)
|
26
|
+
@streams = streams
|
27
|
+
@with_time = with_time
|
28
|
+
end
|
29
|
+
|
30
|
+
def <<(str)
|
31
|
+
@streams.each { |s| s << format_string(str) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def format_string(str)
|
35
|
+
str.lines.map { |l| "#{Project.log_time if @with_time}#{l.strip}\n" }.join
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Error
|
40
|
+
class Error < Base
|
41
|
+
def format_string(str)
|
42
|
+
"#{Project.paint_string(super.strip, :warning)}\n"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end # Helper
|
49
|
+
end # Dapp
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Dapp
|
2
|
+
# Project
|
3
|
+
class Project
|
4
|
+
module Shellout
|
5
|
+
# System
|
6
|
+
module System
|
7
|
+
SYSTEM_SHELLOUT_IMAGE = 'ubuntu:14.04'.freeze
|
8
|
+
SYSTEM_SHELLOUT_VERSION = 2
|
9
|
+
|
10
|
+
def system_shellout_container_name
|
11
|
+
"dapp_system_shellout_#{hashsum [SYSTEM_SHELLOUT_VERSION,
|
12
|
+
SYSTEM_SHELLOUT_IMAGE,
|
13
|
+
Deps::Base::BASE_VERSION,
|
14
|
+
Deps::Gitartifact::GITARTIFACT_VERSION]}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def system_shellout_container
|
18
|
+
@system_shellout_container ||= begin
|
19
|
+
lock(system_shellout_container_name) do
|
20
|
+
if shellout("docker inspect #{system_shellout_container_name}").exitstatus.nonzero?
|
21
|
+
volumes_from = [base_container, gitartifact_container]
|
22
|
+
log_secondary_process(t(code: 'process.system_shellout_container_loading'), short: true) do
|
23
|
+
shellout! ['docker run --detach --privileged', '--restart always',
|
24
|
+
"--name #{system_shellout_container_name}",
|
25
|
+
*volumes_from.map { |container| "--volumes-from #{container}" },
|
26
|
+
'--volume /:/.system_shellout_root',
|
27
|
+
"#{SYSTEM_SHELLOUT_IMAGE} #{bash_path} -ec 'while true ; do sleep 1 ; done'"].join(' ')
|
28
|
+
|
29
|
+
shellout! ["docker exec #{system_shellout_container_name}",
|
30
|
+
"bash -ec '#{[
|
31
|
+
'mkdir -p /.system_shellout_root/.dapp',
|
32
|
+
'mount --rbind /.dapp /.system_shellout_root/.dapp'
|
33
|
+
].join(' && ')}'"].join(' ')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
system_shellout_container_name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def system_shellout(command, **kwargs)
|
43
|
+
shellout _to_system_shellout_command(command), **kwargs
|
44
|
+
end
|
45
|
+
|
46
|
+
def system_shellout!(command, **kwargs)
|
47
|
+
shellout! _to_system_shellout_command(command), **kwargs
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def _to_system_shellout_command(command)
|
53
|
+
cmd = shellout_pack ["cd #{Dir.pwd}", command].join(' && ')
|
54
|
+
"docker exec #{system_shellout_container} chroot /.system_shellout_root bash -ec '#{[
|
55
|
+
*System.default_env_keys.map do |env_key|
|
56
|
+
env_key = env_key.to_s.upcase
|
57
|
+
"export #{env_key}=#{ENV[env_key]}"
|
58
|
+
end, cmd
|
59
|
+
].join(' && ')}'"
|
60
|
+
end
|
61
|
+
|
62
|
+
public
|
63
|
+
|
64
|
+
class << self
|
65
|
+
def default_env_keys
|
66
|
+
@default_env_keys ||= []
|
67
|
+
end
|
68
|
+
end # << self
|
69
|
+
end # System
|
70
|
+
end
|
71
|
+
end # Project
|
72
|
+
end # Dapp
|
@@ -5,12 +5,13 @@ module Dapp
|
|
5
5
|
module SshAgent
|
6
6
|
class << self
|
7
7
|
def included(_base)
|
8
|
-
::Dapp::
|
8
|
+
::Dapp::Project::Shellout::Base.default_env_keys << 'SSH_AUTH_SOCK'
|
9
|
+
::Dapp::Project::Shellout::System.default_env_keys << 'SSH_AUTH_SOCK'
|
9
10
|
end
|
10
11
|
end # << self
|
11
12
|
|
12
13
|
def run_ssh_agent
|
13
|
-
raise
|
14
|
+
raise 'Cannot fork dapp process: there are active file locks' unless ::Dapp::Lock::File.counter.zero?
|
14
15
|
|
15
16
|
sock_name = "dapp-ssh-#{SecureRandom.uuid}"
|
16
17
|
|
@@ -22,10 +23,10 @@ module Dapp
|
|
22
23
|
|
23
24
|
@ssh_agent_pid = nil
|
24
25
|
|
25
|
-
Signal.trap('INT') {
|
26
|
+
Signal.trap('INT') {}
|
26
27
|
Signal.trap('TERM') { Process.kill('TERM', @ssh_agent_pid) if @ssh_agent_pid }
|
27
28
|
|
28
|
-
@ssh_agent_pid =
|
29
|
+
@ssh_agent_pid = Process.fork do
|
29
30
|
STDOUT.reopen '/dev/null', 'a'
|
30
31
|
STDERR.reopen '/dev/null', 'a'
|
31
32
|
exec 'ssh-agent', '-d', '-a', sock_path
|
@@ -36,9 +37,7 @@ module Dapp
|
|
36
37
|
|
37
38
|
begin
|
38
39
|
::Timeout.timeout(10) do
|
39
|
-
until File.exist? sock_path
|
40
|
-
sleep 0.001
|
41
|
-
end
|
40
|
+
sleep 0.001 until File.exist? sock_path
|
42
41
|
end
|
43
42
|
rescue ::Timeout::Error
|
44
43
|
raise ::Dapp::Error::Project, code: :cannot_run_ssh_agent
|
@@ -47,7 +46,7 @@ module Dapp
|
|
47
46
|
end
|
48
47
|
|
49
48
|
def add_ssh_key(ssh_key_path)
|
50
|
-
shellout! "ssh-add #{ssh_key_path}", env: {SSH_AUTH_SOCK: ssh_auth_sock(force_run_agent: true)}
|
49
|
+
shellout! "ssh-add #{ssh_key_path}", env: { SSH_AUTH_SOCK: ssh_auth_sock(force_run_agent: true) }
|
51
50
|
end
|
52
51
|
|
53
52
|
def ssh_auth_sock(force_run_agent: false)
|
@@ -70,7 +69,7 @@ module Dapp
|
|
70
69
|
raise ::Dapp::Error::Project, code: :ssh_key_not_found,
|
71
70
|
data: { path: ssh_key } unless File.exist? ssh_key
|
72
71
|
|
73
|
-
File.chmod
|
72
|
+
File.chmod 0o600, ssh_key
|
74
73
|
add_ssh_key ssh_key
|
75
74
|
end
|
76
75
|
end
|