hobo-inviqa 0.0.8 → 0.0.9.pre.alpha
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 +8 -8
- data/Gemfile.lock +4 -4
- data/README.md +1 -1
- data/Rakefile +4 -1
- data/bin/hobo +5 -0
- data/lib/hobo.rb +16 -3
- data/lib/hobo/asset_applicators/files.rb +5 -0
- data/lib/hobo/asset_applicators/sqldump.rb +15 -0
- data/lib/hobo/cli.rb +8 -3
- data/lib/hobo/helper/shell.rb +4 -1
- data/lib/hobo/helper/vm_command.rb +3 -254
- data/lib/hobo/lib/host_check.rb +4 -6
- data/lib/hobo/lib/host_check/deps.rb +2 -2
- data/lib/hobo/lib/host_check/git.rb +4 -4
- data/lib/hobo/lib/host_check/hobo.rb +51 -0
- data/lib/hobo/lib/host_check/ruby.rb +2 -2
- data/lib/hobo/lib/host_check/vagrant.rb +1 -1
- data/lib/hobo/lib/s3/local/file.rb +36 -0
- data/lib/hobo/lib/s3/local/iohandler.rb +36 -0
- data/lib/hobo/lib/s3/remote/file.rb +45 -0
- data/lib/hobo/lib/s3/remote/iohandler.rb +38 -0
- data/lib/hobo/lib/s3/sync.rb +116 -0
- data/lib/hobo/lib/seed/project.rb +3 -0
- data/lib/hobo/lib/vm/command.rb +125 -0
- data/lib/hobo/lib/vm/inspector.rb +73 -0
- data/lib/hobo/tasks/assets.rb +7 -56
- data/lib/hobo/tasks/deps.rb +1 -1
- data/lib/hobo/tasks/magento.rb +75 -0
- data/lib/hobo/tasks/system.rb +5 -2
- data/lib/hobo/util.rb +11 -0
- data/lib/hobo/version.rb +1 -1
- metadata +15 -5
- data/lib/hobo/lib/s3sync.rb +0 -216
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
Y2U1MTJhYjM5ODIwNTNlYmNlYjc1MDVjOWFmYTY3ODllMGZiOTNhNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZTgzZTk2NmZjZjZkYWI3YzkxODI0YThjY2RlODBlOTllMTFkMjMxZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDBkZjViNTdiMGQwMDQyNzAyMDdjN2ZmMDZmMWFlZTc0Yjk3YzNjYWUyMmYz
|
10
|
+
NWM0ZTJmYWNlOTk4YmQzZTdhYTAzOGYwZjNlMDUyOWJjMjlkMzkwZTYzYTQ5
|
11
|
+
OGFlNmFlYTQxMzk2MzRjY2E3MTg2OGRlZDllZWZjODgxNDc3Zjg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YTBmNDI0MjYzNmMzODQzMTA2MThjZDM3NmYwZDdiMjFlMDkzOTA4MDFiNzIx
|
14
|
+
NWZjZTA2ZjI5YTg4MjcyNTEwMDRkNmI3ZDg3NzdlNjI3ZDgxYzVmOWY1NmFh
|
15
|
+
NDM3NTYxYWIxMzg1Y2VlYzZkNjBkYjQ0NTI0MWJiOGY0YmU5NTU=
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
hobo-inviqa (0.0.
|
4
|
+
hobo-inviqa (0.0.9.pre.alpha)
|
5
5
|
aws-sdk (~> 1.34.0)
|
6
6
|
bundler (~> 1.5.2)
|
7
7
|
deepstruct (~> 0.0.5)
|
@@ -76,12 +76,12 @@ GEM
|
|
76
76
|
multi_test (0.0.3)
|
77
77
|
net-scp (1.1.2)
|
78
78
|
net-ssh (>= 2.6.5)
|
79
|
-
net-ssh (2.
|
80
|
-
net-ssh-simple (1.6.
|
79
|
+
net-ssh (2.8.0)
|
80
|
+
net-ssh-simple (1.6.5)
|
81
81
|
blockenspiel (~> 0.4.3)
|
82
82
|
hashie (>= 1.1.0)
|
83
83
|
net-scp (~> 1.1.0)
|
84
|
-
net-ssh (~> 2.
|
84
|
+
net-ssh (~> 2.8.0)
|
85
85
|
nio4r (1.0.0)
|
86
86
|
nokogiri (1.6.1)
|
87
87
|
mini_portile (~> 0.5.0)
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Many more features are planned including assisting with host machine configurati
|
|
10
10
|
|
11
11
|
# Installing & using
|
12
12
|
|
13
|
-
Full instructions for installing and using hobo are available
|
13
|
+
Full instructions for installing and using hobo are available in the [User guide](https://github.com/inviqa/hobo-gem/wiki/User-guide). For information on the task DSL, see the [DSL guide](https://github.com/inviqa/hobo-gem/wiki/Hobofile-DSL).
|
14
14
|
|
15
15
|
If you have a working development configuration (and are using OSX / linux), you may skip reading those instructions and go straight to installing the gem:
|
16
16
|
|
data/Rakefile
CHANGED
data/bin/hobo
CHANGED
@@ -8,6 +8,8 @@ require 'slop'
|
|
8
8
|
require 'teerb'
|
9
9
|
require 'tmpdir'
|
10
10
|
|
11
|
+
$HOBO_ARGV = ARGV
|
12
|
+
|
11
13
|
error_handler = Hobo::ErrorHandlers::Friendly.new
|
12
14
|
|
13
15
|
Hobo.ui = Hobo::Ui.new
|
@@ -37,6 +39,9 @@ Hobo.logger.formatter = proc do |severity, datetime, progname, msg|
|
|
37
39
|
"#{datetime.strftime("%Y-%m-%d %H:%M:%S")}: #{severity}: #{msg}\n"
|
38
40
|
end
|
39
41
|
|
42
|
+
opts = slop.to_hash
|
43
|
+
Hobo.ui.interactive = !(opts[:'non-interactive'] == true)
|
44
|
+
|
40
45
|
begin
|
41
46
|
Hobo::Lib::HostCheck.check(:filter => /not_using_system_ruby/)
|
42
47
|
Hobo.cli = Hobo::Cli.new(slop: slop)
|
data/lib/hobo.rb
CHANGED
@@ -5,6 +5,7 @@ require 'tempfile'
|
|
5
5
|
require 'shellwords'
|
6
6
|
require 'deepstruct'
|
7
7
|
require 'os'
|
8
|
+
require 'bundler'
|
8
9
|
|
9
10
|
# DSL enhancements
|
10
11
|
require 'hobo/metadata'
|
@@ -27,16 +28,27 @@ require 'hobo/error_handlers/friendly'
|
|
27
28
|
require 'hobo/config/file'
|
28
29
|
require 'hobo/logging'
|
29
30
|
require 'hobo/config'
|
31
|
+
|
32
|
+
# Asset applicators
|
30
33
|
require 'hobo/asset_applicator'
|
34
|
+
require 'hobo/asset_applicators/sqldump'
|
35
|
+
require 'hobo/asset_applicators/files'
|
31
36
|
|
32
37
|
# Asset sync
|
33
|
-
require 'hobo/lib/
|
38
|
+
require 'hobo/lib/s3/sync'
|
39
|
+
require 'hobo/lib/s3/local/file'
|
40
|
+
require 'hobo/lib/s3/local/iohandler'
|
41
|
+
require 'hobo/lib/s3/remote/file'
|
42
|
+
require 'hobo/lib/s3/remote/iohandler'
|
34
43
|
|
35
44
|
# Task helpers
|
36
45
|
require 'hobo/helper/shell'
|
37
46
|
require 'hobo/helper/file_locator'
|
38
|
-
require 'hobo/helper/vm_command'
|
39
47
|
require 'hobo/helper/http_download'
|
48
|
+
require 'hobo/helper/vm_command'
|
49
|
+
|
50
|
+
require 'hobo/lib/vm/inspector'
|
51
|
+
require 'hobo/lib/vm/command'
|
40
52
|
|
41
53
|
# Libs
|
42
54
|
require 'hobo/lib/seed/project'
|
@@ -48,7 +60,8 @@ require 'hobo/lib/host_check/git'
|
|
48
60
|
require 'hobo/lib/host_check/vagrant'
|
49
61
|
require 'hobo/lib/host_check/ruby'
|
50
62
|
require 'hobo/lib/host_check/deps'
|
63
|
+
require 'hobo/lib/host_check/hobo'
|
51
64
|
require 'hobo/lib/host_check'
|
52
65
|
|
53
66
|
# App
|
54
|
-
require 'hobo/cli'
|
67
|
+
require 'hobo/cli'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Hobo.asset_applicators.register /.*\.sql\.gz/ do |file|
|
2
|
+
matches = file.match(/^([^\.]+).*\.sql\.gz/)
|
3
|
+
db = File.basename(matches[1])
|
4
|
+
|
5
|
+
begin
|
6
|
+
shell(vm_mysql(:mysql => 'mysqladmin', :append => " create #{db.shellescape}"))
|
7
|
+
rescue Hobo::ExternalCommandError => e
|
8
|
+
Hobo.ui.warning "Already applied (#{file})"
|
9
|
+
raise e if e.exit_code != 1
|
10
|
+
next
|
11
|
+
end
|
12
|
+
|
13
|
+
Hobo.ui.title "Applying mysqldump (#{file})"
|
14
|
+
shell(vm_mysql(:auto_echo => false, :db => db) < "zcat #{file.shellescape}")
|
15
|
+
end
|
data/lib/hobo/cli.rb
CHANGED
@@ -23,7 +23,6 @@ module Hobo
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def start args = ARGV
|
26
|
-
|
27
26
|
load_user_config
|
28
27
|
load_builtin_tasks
|
29
28
|
load_hobofiles
|
@@ -37,10 +36,9 @@ module Hobo
|
|
37
36
|
@slop.parse! args
|
38
37
|
opts = @slop.to_hash
|
39
38
|
|
40
|
-
|
39
|
+
perform_host_checks unless opts[:'skip-host-checks']
|
41
40
|
|
42
41
|
@help_opts[:all] = opts[:all]
|
43
|
-
Hobo.ui.interactive = !(opts[:'non-interactive'] == true)
|
44
42
|
|
45
43
|
@slop.add_callback :empty do
|
46
44
|
show_help
|
@@ -105,6 +103,13 @@ module Hobo
|
|
105
103
|
end
|
106
104
|
end
|
107
105
|
|
106
|
+
def perform_host_checks
|
107
|
+
Hobo::Lib::HostCheck.check(
|
108
|
+
:filter => /vagrant.*|.*present|latest_hobo_version/,
|
109
|
+
:raise => true
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
108
113
|
def define_global_opts slop
|
109
114
|
slop.on '-a', '--all', 'Show hidden commands'
|
110
115
|
slop.on '-h', '--help', 'Display help'
|
data/lib/hobo/helper/shell.rb
CHANGED
@@ -40,7 +40,8 @@ module Hobo
|
|
40
40
|
:indent => 0,
|
41
41
|
:realtime => false,
|
42
42
|
:env => {},
|
43
|
-
:ignore_errors => false
|
43
|
+
:ignore_errors => false,
|
44
|
+
:exit_status => false
|
44
45
|
}.merge! opts
|
45
46
|
|
46
47
|
Hobo::Logging.logger.debug("helper.shell: Invoking '#{args.join(" ")}' with #{opts.to_s}")
|
@@ -72,6 +73,8 @@ module Hobo
|
|
72
73
|
buffer.fsync
|
73
74
|
buffer.rewind
|
74
75
|
|
76
|
+
return external.value.exitstatus if opts[:exit_status]
|
77
|
+
|
75
78
|
raise ::Hobo::ExternalCommandError.new(args.join(" "), external.value.exitstatus, buffer) if external.value.exitstatus != 0 && !opts[:ignore_errors]
|
76
79
|
|
77
80
|
return opts[:capture] ? buffer.read.strip : nil
|
@@ -3,51 +3,9 @@ require 'net/ssh/simple'
|
|
3
3
|
|
4
4
|
module Hobo
|
5
5
|
module Helper
|
6
|
-
attr_accessor :vm_project_mount_path
|
7
|
-
|
8
|
-
# Really expensive method to auto-detect where root project mount exists in VM.
|
9
|
-
# It assumes that the project root is directly mounted.
|
10
|
-
# We cache it in configuration once we find it so it only has to happen once.
|
11
|
-
def vm_project_mount_path
|
12
|
-
configured_path = maybe(Hobo.project_config.vm.project_mount_path)
|
13
|
-
return configured_path if configured_path
|
14
|
-
return @vm_project_mount_path if @vm_project_mount_path
|
15
|
-
|
16
|
-
tmp = Tempfile.new('vm_command_locator', Hobo.project_path)
|
17
|
-
tmp.write(Hobo.project_path)
|
18
|
-
|
19
|
-
locator_file = File.basename(tmp.path)
|
20
|
-
|
21
|
-
pattern = OS.windows? ? 'vboxsf' : Hobo.project_path.shellescape
|
22
|
-
|
23
|
-
# TODO genericise the command escaping from lib/hobo/patches/slop.rb to avoid nested shell escaping hell
|
24
|
-
sed = 's/.* on \(.*\) type.*/\\\1\\\/%%/g'.gsub('%%', locator_file)
|
25
|
-
locator_results = vm_shell(
|
26
|
-
"mount | grep #{pattern} | sed -e\"#{sed}\" | xargs md5sum",
|
27
|
-
:capture => true,
|
28
|
-
:pwd => '/',
|
29
|
-
:psuedo_tty => false,
|
30
|
-
:ignore_errors => true
|
31
|
-
)
|
32
|
-
|
33
|
-
tmp.close
|
34
|
-
|
35
|
-
match = locator_results.match(/^([a-z0-9]{32})\s+(.*)$/)
|
36
|
-
|
37
|
-
raise Exception.new("Unable to locate project mount point in VM") if !match
|
38
|
-
|
39
|
-
@vm_project_mount_path = File.dirname(match[2])
|
40
|
-
|
41
|
-
# Stash it in config
|
42
|
-
Hobo.project_config[:vm] ||= {}
|
43
|
-
Hobo.project_config[:vm][:project_mount_path] = @vm_project_mount_path
|
44
|
-
Hobo::Config::File.save(Hobo.project_config_file, Hobo.project_config)
|
45
|
-
|
46
|
-
return @vm_project_mount_path
|
47
|
-
end
|
48
6
|
|
49
7
|
def vm_shell command, opts = {}
|
50
|
-
shell
|
8
|
+
shell ::Hobo::Lib::Vm::Command.new(command, opts).to_s, opts
|
51
9
|
end
|
52
10
|
|
53
11
|
def vm_mysql opts = {}
|
@@ -63,225 +21,16 @@ module Hobo
|
|
63
21
|
opts[:pass] = "-p#{opts[:pass].shellescape}" unless opts[:pass].empty?
|
64
22
|
opts[:db] = opts[:db].shellescape unless opts[:db].empty?
|
65
23
|
|
66
|
-
|
24
|
+
::Hobo::Lib::Vm::Command.new "#{opts[:mysql]} #{opts[:user]} #{opts[:pass]} #{opts[:db]}".strip, opts
|
67
25
|
end
|
68
26
|
|
69
27
|
def vm_command command = nil, opts = {}
|
70
|
-
|
28
|
+
::Hobo::Lib::Vm::Command.new command, opts
|
71
29
|
end
|
72
30
|
|
73
31
|
private
|
74
32
|
|
75
|
-
class VmInspector
|
76
|
-
attr_accessor :ssh_config, :project_mount_path
|
77
|
-
|
78
|
-
def project_mount_path
|
79
|
-
#configured_path = maybe(Hobo.project_config.vm.project_mount_path)
|
80
|
-
#return configured_path if configured_path
|
81
|
-
#return @project_mount_path if @project_mount_path
|
82
|
-
|
83
|
-
tmp = Tempfile.new('vm_command_locator', Hobo.project_path)
|
84
|
-
|
85
|
-
begin
|
86
|
-
tmp.write(Hobo.project_path)
|
87
|
-
|
88
|
-
locator_file = File.basename(tmp.path)
|
89
|
-
|
90
|
-
pattern = OS.windows? ? 'vboxsf' : Hobo.project_path.shellescape
|
91
|
-
|
92
|
-
sed = 's/.* on \(.*\) type.*/\1\/%%/g'.gsub('%%', locator_file)
|
93
|
-
locator_results = VmCommand.new(
|
94
|
-
"mount | grep #{pattern} | sed -e\"#{sed}\" | xargs md5sum",
|
95
|
-
:capture => true,
|
96
|
-
:pwd => '/'
|
97
|
-
).run
|
98
|
-
ensure
|
99
|
-
tmp.unlink
|
100
|
-
end
|
101
|
-
|
102
|
-
match = locator_results.match(/^([a-z0-9]{32})\s+(.*)$/)
|
103
|
-
|
104
|
-
raise Exception.new("Unable to locate project mount point in VM") if !match
|
105
|
-
|
106
|
-
@vm_project_mount_path = File.dirname(match[2])
|
107
|
-
|
108
|
-
# Stash it in config
|
109
|
-
Hobo.project_config[:vm] ||= {}
|
110
|
-
Hobo.project_config[:vm][:project_mount_path] = @vm_project_mount_path
|
111
|
-
Hobo::Config::File.save(Hobo.project_config_file, Hobo.project_config)
|
112
|
-
|
113
|
-
return @vm_project_mount_path
|
114
|
-
end
|
115
|
-
|
116
|
-
def ssh_config
|
117
|
-
return @ssh_config if @ssh_config
|
118
|
-
config = nil
|
119
|
-
locate "*Vagrantfile" do
|
120
|
-
config = bundle_shell "vagrant ssh-config", :capture => true
|
121
|
-
end
|
122
|
-
|
123
|
-
raise Exception.new "Could not retrieve VM ssh configuration" unless config
|
124
|
-
|
125
|
-
patterns = {
|
126
|
-
:ssh_user => /^\s*User (.*)$/,
|
127
|
-
:ssh_identity => /^\s*IdentityFile (.*)$/,
|
128
|
-
:ssh_host => /^\s*HostName (.*)$/,
|
129
|
-
:ssh_port => /^\s*Port (\d+)/
|
130
|
-
}
|
131
|
-
|
132
|
-
output = {}
|
133
|
-
|
134
|
-
patterns.each do |k, pattern|
|
135
|
-
match = config.match(pattern)
|
136
|
-
output[k] = match[1] if match
|
137
|
-
end
|
138
|
-
|
139
|
-
return @ssh_config = output
|
140
|
-
end
|
141
|
-
end
|
142
33
|
|
143
|
-
class VmCommand
|
144
|
-
class << self
|
145
|
-
attr_accessor :vm_inspector
|
146
|
-
@@vm_inspector = VmInspector.new
|
147
|
-
end
|
148
|
-
|
149
|
-
attr_accessor :opts, :command
|
150
|
-
|
151
|
-
def initialize command, opts = {}
|
152
|
-
@command = command
|
153
|
-
@opts = {
|
154
|
-
:auto_echo => false,
|
155
|
-
:psuedo_tty => false,
|
156
|
-
:pwd => opts[:pwd] || @@vm_inspector.project_mount_path,
|
157
|
-
:append => ''
|
158
|
-
}.merge(opts)
|
159
|
-
end
|
160
|
-
|
161
|
-
def << pipe
|
162
|
-
pipe = "echo #{pipe.shellescape}" if opts[:auto_echo]
|
163
|
-
@pipe = pipe
|
164
|
-
@opts[:psuedo_tty] = false
|
165
|
-
return self
|
166
|
-
end
|
167
|
-
|
168
|
-
def < pipe
|
169
|
-
pipe = "echo '#{pipe.shellescape}'" if opts[:auto_echo]
|
170
|
-
@pipe_in_vm = pipe
|
171
|
-
@opts[:psuedo_tty] = false
|
172
|
-
return self
|
173
|
-
end
|
174
|
-
|
175
|
-
# TODO Refactor in to ssh helper with similar opts to shell helper
|
176
|
-
# TODO Migrate all vm_shell functionality this direction
|
177
|
-
def run
|
178
|
-
return if @command.nil?
|
179
|
-
opts = @@vm_inspector.ssh_config.merge(@opts)
|
180
|
-
|
181
|
-
Net::SSH::Simple.sync do
|
182
|
-
ssh_opts = {
|
183
|
-
:user => opts[:ssh_user],
|
184
|
-
:port => opts[:ssh_port],
|
185
|
-
:forward_agent => true,
|
186
|
-
:global_known_hosts_file => "/dev/null",
|
187
|
-
:paranoid => false,
|
188
|
-
:user_known_hosts_file => "/dev/null"
|
189
|
-
}
|
190
|
-
|
191
|
-
ssh_opts[:keys] = [opts[:ssh_identity]] if opts[:ssh_identity]
|
192
|
-
|
193
|
-
tmp = Tempfile.new "vm_command_exec"
|
194
|
-
|
195
|
-
begin
|
196
|
-
filename = File.basename(tmp.path)
|
197
|
-
remote_file = "/tmp/#{filename}"
|
198
|
-
tmp.write "#{@command}#{opts[:append]}"
|
199
|
-
tmp.close
|
200
|
-
|
201
|
-
scp_put opts[:ssh_host], tmp.path, remote_file, ssh_opts
|
202
|
-
result = ssh opts[:ssh_host], "cd #{opts[:pwd]}; exec /bin/bash #{remote_file}", ssh_opts
|
203
|
-
ssh opts[:ssh_host], "rm #{remote_file}", ssh_opts
|
204
|
-
|
205
|
-
# Throw exception if exit code not 0
|
206
|
-
|
207
|
-
return opts[:capture] ? result.stdout : result.success
|
208
|
-
ensure
|
209
|
-
tmp.unlink
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
# TODO Speed up Vagrant SSH connections
|
215
|
-
# May need to be disabled for windows (mm_send_fd: UsePrivilegeSeparation=yes not supported)
|
216
|
-
# https://gist.github.com/jedi4ever/5657094
|
217
|
-
|
218
|
-
def to_s
|
219
|
-
opts = @@vm_inspector.ssh_config.merge(@opts)
|
220
|
-
|
221
|
-
psuedo_tty = opts[:psuedo_tty] ? "-t" : ""
|
222
|
-
|
223
|
-
ssh_command = [
|
224
|
-
"ssh",
|
225
|
-
"-o 'UserKnownHostsFile /dev/null'",
|
226
|
-
"-o 'StrictHostKeyChecking no'",
|
227
|
-
"-o 'ForwardAgent yes'",
|
228
|
-
"-o 'LogLevel FATAL'",
|
229
|
-
"-p #{opts[:ssh_port]}",
|
230
|
-
"-i #{opts[:ssh_identity].shellescape}",
|
231
|
-
psuedo_tty,
|
232
|
-
"#{opts[:ssh_user].shellescape}@#{opts[:ssh_host].shellescape}"
|
233
|
-
].join(" ")
|
234
|
-
|
235
|
-
pwd_set_command = " -- \"cd #{@opts[:pwd].shellescape}; exec /bin/bash"
|
236
|
-
|
237
|
-
vm_command = [
|
238
|
-
@pipe_in_vm,
|
239
|
-
@command
|
240
|
-
].compact.join(" | ")
|
241
|
-
|
242
|
-
command = [
|
243
|
-
ssh_command + pwd_set_command,
|
244
|
-
vm_command.empty? ? nil : vm_command.shellescape
|
245
|
-
].compact.join(" -c ") + "#{opts[:append].shellescape}\""
|
246
|
-
|
247
|
-
[
|
248
|
-
@pipe,
|
249
|
-
command
|
250
|
-
].compact.join(" | ")
|
251
|
-
end
|
252
|
-
|
253
|
-
def to_str
|
254
|
-
to_s
|
255
|
-
end
|
256
|
-
|
257
|
-
private
|
258
|
-
|
259
|
-
def vagrant_config
|
260
|
-
return @@vagrant_config if @@vagrant_config
|
261
|
-
config = nil
|
262
|
-
locate "*Vagrantfile" do
|
263
|
-
config = bundle_shell "vagrant ssh-config", :capture => true
|
264
|
-
end
|
265
|
-
|
266
|
-
raise Exception.new "Could not retrieve VM ssh configuration" unless config
|
267
|
-
|
268
|
-
patterns = {
|
269
|
-
:ssh_user => /^\s+User (.*)$/,
|
270
|
-
:ssh_identity => /^\s+IdentityFile (.*)$/,
|
271
|
-
:ssh_host => /^\s+HostName (.*)$/,
|
272
|
-
:ssh_port => /^\s+Port (\d+)/
|
273
|
-
}
|
274
|
-
|
275
|
-
output = {}
|
276
|
-
|
277
|
-
patterns.each do |k, pattern|
|
278
|
-
match = config.match(pattern)
|
279
|
-
output[k] = match[1]
|
280
|
-
end
|
281
|
-
|
282
|
-
return @@vagrant_config = output
|
283
|
-
end
|
284
|
-
end
|
285
34
|
end
|
286
35
|
end
|
287
36
|
|