dip 5.0.0 → 7.1.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/README.md +34 -35
- data/exe/dip +7 -7
- data/lib/dip.rb +1 -1
- data/lib/dip/cli.rb +29 -24
- data/lib/dip/cli/console.rb +7 -7
- data/lib/dip/cli/dns.rb +31 -31
- data/lib/dip/cli/nginx.rb +25 -25
- data/lib/dip/cli/ssh.rb +25 -22
- data/lib/dip/command.rb +29 -18
- data/lib/dip/commands/compose.rb +18 -16
- data/lib/dip/commands/console.rb +5 -5
- data/lib/dip/commands/dns.rb +12 -12
- data/lib/dip/commands/list.rb +3 -3
- data/lib/dip/commands/nginx.rb +8 -8
- data/lib/dip/commands/provision.rb +2 -2
- data/lib/dip/commands/run.rb +40 -18
- data/lib/dip/commands/ssh.rb +19 -11
- data/lib/dip/config.rb +20 -6
- data/lib/dip/environment.rb +6 -6
- data/lib/dip/ext/hash.rb +1 -1
- data/lib/dip/interaction_tree.rb +4 -16
- data/lib/dip/version.rb +1 -1
- metadata +35 -8
data/lib/dip/commands/ssh.rb
CHANGED
|
@@ -1,50 +1,58 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "shellwords"
|
|
4
|
-
require_relative
|
|
4
|
+
require_relative "../command"
|
|
5
5
|
|
|
6
6
|
module Dip
|
|
7
7
|
module Commands
|
|
8
8
|
module SSH
|
|
9
9
|
class Up < Dip::Command
|
|
10
|
-
def initialize(key:, volume:, interactive:)
|
|
10
|
+
def initialize(key:, volume:, interactive:, user: nil)
|
|
11
11
|
@key = key
|
|
12
12
|
@volume = volume
|
|
13
13
|
@interactive = interactive
|
|
14
|
+
@user = user
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def execute
|
|
17
|
-
|
|
18
|
+
exec_subprocess("docker", "volume create --name ssh_data", out: File::NULL, err: File::NULL)
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
exec_subprocess(
|
|
21
|
+
"docker",
|
|
22
|
+
"run #{user_args}--detach --volume ssh_data:/ssh --name=ssh-agent whilp/ssh-agent"
|
|
23
|
+
)
|
|
20
24
|
|
|
21
25
|
key = Dip.env.interpolate(@key)
|
|
22
|
-
|
|
26
|
+
exec_subprocess("docker", "run #{container_args} whilp/ssh-agent ssh-add #{key}")
|
|
23
27
|
end
|
|
24
28
|
|
|
25
29
|
private
|
|
26
30
|
|
|
31
|
+
def user_args
|
|
32
|
+
"-u #{@user} " if @user
|
|
33
|
+
end
|
|
34
|
+
|
|
27
35
|
def container_args
|
|
28
|
-
result = %w
|
|
36
|
+
result = %w[--rm]
|
|
29
37
|
volume = Dip.env.interpolate(@volume)
|
|
30
38
|
result << "--volume ssh_data:/ssh"
|
|
31
39
|
result << "--volume #{volume}:#{volume}"
|
|
32
40
|
result << "--interactive --tty" if @interactive
|
|
33
|
-
result.join(
|
|
41
|
+
result.join(" ")
|
|
34
42
|
end
|
|
35
43
|
end
|
|
36
44
|
|
|
37
45
|
class Down < Dip::Command
|
|
38
46
|
def execute
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
exec_subprocess("docker", "stop ssh-agent", panic: false, out: File::NULL, err: File::NULL)
|
|
48
|
+
exec_subprocess("docker", "rm -v ssh-agent", panic: false, out: File::NULL, err: File::NULL)
|
|
49
|
+
exec_subprocess("docker", "volume rm ssh_data", panic: false, out: File::NULL, err: File::NULL)
|
|
42
50
|
end
|
|
43
51
|
end
|
|
44
52
|
|
|
45
53
|
class Status < Dip::Command
|
|
46
54
|
def execute
|
|
47
|
-
|
|
55
|
+
exec_subprocess("docker", "inspect --format '{{.State.Status}}' ssh-agent")
|
|
48
56
|
end
|
|
49
57
|
end
|
|
50
58
|
end
|
data/lib/dip/config.rb
CHANGED
|
@@ -13,6 +13,15 @@ module Dip
|
|
|
13
13
|
class Config
|
|
14
14
|
DEFAULT_PATH = "dip.yml"
|
|
15
15
|
|
|
16
|
+
CONFIG_DEFAULTS = {
|
|
17
|
+
environment: {},
|
|
18
|
+
compose: {},
|
|
19
|
+
interation: {},
|
|
20
|
+
provision: []
|
|
21
|
+
}.freeze
|
|
22
|
+
|
|
23
|
+
ConfigKeyMissingError = Class.new(ArgumentError)
|
|
24
|
+
|
|
16
25
|
class ConfigFinder
|
|
17
26
|
attr_reader :file_path
|
|
18
27
|
|
|
@@ -20,10 +29,10 @@ module Dip
|
|
|
20
29
|
@override = override
|
|
21
30
|
|
|
22
31
|
@file_path = if ENV["DIP_FILE"]
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
Pathname.new(prepared_name(ENV["DIP_FILE"]))
|
|
33
|
+
else
|
|
34
|
+
find(Pathname.new(work_dir))
|
|
35
|
+
end
|
|
27
36
|
end
|
|
28
37
|
|
|
29
38
|
def exist?
|
|
@@ -78,7 +87,7 @@ module Dip
|
|
|
78
87
|
|
|
79
88
|
%i[environment compose interaction provision].each do |key|
|
|
80
89
|
define_method(key) do
|
|
81
|
-
config[key]
|
|
90
|
+
config[key] || (raise config_missing_error(key))
|
|
82
91
|
end
|
|
83
92
|
end
|
|
84
93
|
|
|
@@ -106,7 +115,12 @@ module Dip
|
|
|
106
115
|
override_finder = ConfigFinder.new(work_dir, override: true)
|
|
107
116
|
config.deep_merge!(self.class.load_yaml(override_finder.file_path)) if override_finder.exist?
|
|
108
117
|
|
|
109
|
-
@config = config
|
|
118
|
+
@config = CONFIG_DEFAULTS.merge(config)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def config_missing_error(config_key)
|
|
122
|
+
msg = "config for %<key>s is not defined in %<path>s" % {key: config_key, path: finder.file_path}
|
|
123
|
+
ConfigKeyMissingError.new(msg)
|
|
110
124
|
end
|
|
111
125
|
end
|
|
112
126
|
end
|
data/lib/dip/environment.rb
CHANGED
|
@@ -4,7 +4,7 @@ require "pathname"
|
|
|
4
4
|
|
|
5
5
|
module Dip
|
|
6
6
|
class Environment
|
|
7
|
-
VAR_REGEX =
|
|
7
|
+
VAR_REGEX = /\$\{?(?<var_name>[a-zA-Z_][a-zA-Z0-9_]*)\}?/.freeze
|
|
8
8
|
SPECIAL_VARS = %i[os work_dir_rel_path].freeze
|
|
9
9
|
|
|
10
10
|
attr_reader :vars
|
|
@@ -26,8 +26,8 @@ module Dip
|
|
|
26
26
|
vars.fetch(name) { ENV[name] }
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
def fetch(name)
|
|
30
|
-
vars.fetch(name) { ENV.fetch(name)
|
|
29
|
+
def fetch(name, &block)
|
|
30
|
+
vars.fetch(name) { ENV.fetch(name, &block) }
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def []=(key, value)
|
|
@@ -35,18 +35,18 @@ module Dip
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def interpolate(value)
|
|
38
|
-
value.gsub(VAR_REGEX) do
|
|
38
|
+
value.gsub(VAR_REGEX) do |match|
|
|
39
39
|
var_name = Regexp.last_match[:var_name]
|
|
40
40
|
|
|
41
41
|
if special_vars.key?(var_name)
|
|
42
42
|
fetch(var_name) { send(special_vars[var_name]) }
|
|
43
43
|
else
|
|
44
|
-
|
|
44
|
+
fetch(var_name) { match }
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
alias_method :replace, :interpolate
|
|
50
50
|
|
|
51
51
|
private
|
|
52
52
|
|
data/lib/dip/ext/hash.rb
CHANGED
|
@@ -24,7 +24,7 @@ module ActiveSupportHashHelpers
|
|
|
24
24
|
merge!(other_hash) do |key, this_val, other_val|
|
|
25
25
|
if this_val.is_a?(Hash) && other_val.is_a?(Hash)
|
|
26
26
|
this_val.deep_merge(other_val, &block)
|
|
27
|
-
elsif
|
|
27
|
+
elsif block
|
|
28
28
|
block.call(key, this_val, other_val)
|
|
29
29
|
else
|
|
30
30
|
other_val
|
data/lib/dip/interaction_tree.rb
CHANGED
|
@@ -58,9 +58,10 @@ module Dip
|
|
|
58
58
|
def build_command(entry)
|
|
59
59
|
{
|
|
60
60
|
description: entry[:description],
|
|
61
|
-
service: entry
|
|
62
|
-
command: entry[:command],
|
|
63
|
-
|
|
61
|
+
service: entry[:service],
|
|
62
|
+
command: entry[:command].to_s.strip,
|
|
63
|
+
shell: entry.fetch(:shell, true),
|
|
64
|
+
default_args: entry[:default_args].to_s.strip,
|
|
64
65
|
environment: entry[:environment] || {},
|
|
65
66
|
compose: {
|
|
66
67
|
method: entry.dig(:compose, :method) || entry[:compose_method] || "run",
|
|
@@ -76,19 +77,6 @@ module Dip
|
|
|
76
77
|
entry[:description] ||= nil
|
|
77
78
|
end
|
|
78
79
|
|
|
79
|
-
def prepare_default_args(args)
|
|
80
|
-
return [] if args.nil?
|
|
81
|
-
|
|
82
|
-
case args
|
|
83
|
-
when Array
|
|
84
|
-
args
|
|
85
|
-
when String
|
|
86
|
-
args.shellsplit
|
|
87
|
-
else
|
|
88
|
-
raise ArgumentError, "Unknown type for default_args: #{args.inspect}"
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
80
|
def compose_run_options(value)
|
|
93
81
|
return [] unless value
|
|
94
82
|
|
data/lib/dip/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dip
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 7.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- bibendi
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-04-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -87,19 +87,47 @@ dependencies:
|
|
|
87
87
|
- !ruby/object:Gem::Version
|
|
88
88
|
version: '3.0'
|
|
89
89
|
- !ruby/object:Gem::Dependency
|
|
90
|
-
name:
|
|
90
|
+
name: standard
|
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
|
92
92
|
requirements:
|
|
93
93
|
- - "~>"
|
|
94
94
|
- !ruby/object:Gem::Version
|
|
95
|
-
version: '0
|
|
95
|
+
version: '1.0'
|
|
96
96
|
type: :development
|
|
97
97
|
prerelease: false
|
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
99
99
|
requirements:
|
|
100
100
|
- - "~>"
|
|
101
101
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0
|
|
102
|
+
version: '1.0'
|
|
103
|
+
- !ruby/object:Gem::Dependency
|
|
104
|
+
name: rubocop-rake
|
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
|
106
|
+
requirements:
|
|
107
|
+
- - "~>"
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0.5'
|
|
110
|
+
type: :development
|
|
111
|
+
prerelease: false
|
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
113
|
+
requirements:
|
|
114
|
+
- - "~>"
|
|
115
|
+
- !ruby/object:Gem::Version
|
|
116
|
+
version: '0.5'
|
|
117
|
+
- !ruby/object:Gem::Dependency
|
|
118
|
+
name: rubocop-rspec
|
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '2.2'
|
|
124
|
+
type: :development
|
|
125
|
+
prerelease: false
|
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '2.2'
|
|
103
131
|
- !ruby/object:Gem::Dependency
|
|
104
132
|
name: simplecov
|
|
105
133
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -176,15 +204,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
176
204
|
requirements:
|
|
177
205
|
- - ">="
|
|
178
206
|
- !ruby/object:Gem::Version
|
|
179
|
-
version: '2.
|
|
207
|
+
version: '2.5'
|
|
180
208
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
209
|
requirements:
|
|
182
210
|
- - ">="
|
|
183
211
|
- !ruby/object:Gem::Version
|
|
184
212
|
version: '0'
|
|
185
213
|
requirements: []
|
|
186
|
-
|
|
187
|
-
rubygems_version: 2.7.7
|
|
214
|
+
rubygems_version: 3.1.2
|
|
188
215
|
signing_key:
|
|
189
216
|
specification_version: 4
|
|
190
217
|
summary: Ruby gem CLI tool for better interacting docker-compose files.
|