convox_installer 1.0.7 → 2.0.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/.rubocop.yml +23 -1
- data/.vscode/settings.json +2 -2
- data/Gemfile +2 -2
- data/README.md +8 -5
- data/convox_installer.gemspec +18 -17
- data/examples/full_installation.rb +75 -75
- data/lib/convox/client.rb +133 -94
- data/lib/convox.rb +1 -1
- data/lib/convox_installer/config.rb +38 -33
- data/lib/convox_installer/requirements.rb +27 -18
- data/lib/convox_installer/version.rb +1 -1
- data/lib/convox_installer.rb +7 -7
- data/spec/lib/convox/client_spec.rb +92 -56
- data/spec/lib/convox_installer/config_spec.rb +141 -141
- data/spec/lib/convox_installer/requirements_spec.rb +63 -34
- data/spec/spec_helper.rb +1 -1
- metadata +21 -20
data/lib/convox/client.rb
CHANGED
@@ -1,40 +1,77 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require 'logger'
|
4
|
+
require 'json'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'rubygems'
|
6
7
|
|
7
8
|
module Convox
|
8
9
|
class Client
|
9
|
-
CONVOX_DIR = File.expand_path(
|
10
|
-
AUTH_FILE = File.join(CONVOX_DIR,
|
11
|
-
HOST_FILE = File.join(CONVOX_DIR,
|
10
|
+
CONVOX_DIR = File.expand_path('~/.convox').freeze
|
11
|
+
AUTH_FILE = File.join(CONVOX_DIR, 'auth')
|
12
|
+
HOST_FILE = File.join(CONVOX_DIR, 'host')
|
12
13
|
|
13
14
|
attr_accessor :logger, :config
|
14
15
|
|
16
|
+
def cli_version_string
|
17
|
+
return @cli_version_string if @cli_version_string
|
18
|
+
|
19
|
+
cli_version_string ||= `convox --version`
|
20
|
+
return unless $CHILD_STATUS.success?
|
21
|
+
|
22
|
+
@cli_version_string = cli_version_string.chomp
|
23
|
+
end
|
24
|
+
|
25
|
+
def cli_version
|
26
|
+
return unless cli_version_string.is_a?(String)
|
27
|
+
|
28
|
+
if cli_version_string.match?(/^\d+\.\d+\.\d+/)
|
29
|
+
@cli_version ||= Gem::Version.new(version_string)
|
30
|
+
end
|
31
|
+
@cli_version
|
32
|
+
end
|
33
|
+
|
34
|
+
def convox_2_cli?
|
35
|
+
return false unless cli_version_string.is_a?(String)
|
36
|
+
|
37
|
+
cli_version_string.match?(/^20\d+$/)
|
38
|
+
end
|
39
|
+
|
40
|
+
def convox_3_cli?
|
41
|
+
return false if !cli_version_string.is_a?(String) ||
|
42
|
+
convox_2_cli? ||
|
43
|
+
!cli_version_string.match?(/^\d+\.\d+\.\d+/)
|
44
|
+
|
45
|
+
cli_version = Gem::Version.new(cli_version_string)
|
46
|
+
cli_version >= Gem::Version.new('3.0.0') &&
|
47
|
+
cli_version < Gem::Version.new('4.0.0')
|
48
|
+
end
|
49
|
+
|
15
50
|
def auth
|
16
51
|
load_auth_from_file
|
17
52
|
end
|
18
53
|
|
19
54
|
def initialize(options = {})
|
20
|
-
@logger = Logger.new(
|
55
|
+
@logger = Logger.new($stdout)
|
21
56
|
logger.level = options[:log_level] || Logger::INFO
|
22
57
|
@config = options[:config] || {}
|
23
58
|
end
|
24
59
|
|
25
60
|
def backup_convox_host_and_rack
|
61
|
+
FileUtils.mkdir_p CONVOX_DIR
|
62
|
+
|
26
63
|
%w[host rack].each do |f|
|
27
64
|
path = File.join(CONVOX_DIR, f)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
65
|
+
next unless File.exist?(path)
|
66
|
+
|
67
|
+
bak_file = "#{path}.bak"
|
68
|
+
logger.info "Moving existing #{path} to #{bak_file}..."
|
69
|
+
FileUtils.mv(path, bak_file)
|
33
70
|
end
|
34
71
|
end
|
35
72
|
|
36
73
|
def install_convox
|
37
|
-
require_config(%i[
|
74
|
+
require_config(%i[aws_region stack_name])
|
38
75
|
region = config.fetch(:aws_region)
|
39
76
|
stack_name = config.fetch(:stack_name)
|
40
77
|
|
@@ -45,39 +82,37 @@ module Convox
|
|
45
82
|
end
|
46
83
|
|
47
84
|
require_config(%i[
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
85
|
+
aws_region
|
86
|
+
aws_access_key_id
|
87
|
+
aws_secret_access_key
|
88
|
+
stack_name
|
89
|
+
instance_type
|
90
|
+
])
|
54
91
|
|
55
92
|
logger.info "Installing Convox (#{stack_name})..."
|
56
93
|
|
57
94
|
env = {
|
58
|
-
|
59
|
-
|
60
|
-
|
95
|
+
'AWS_REGION' => region,
|
96
|
+
'AWS_ACCESS_KEY_ID' => config.fetch(:aws_access_key_id),
|
97
|
+
'AWS_SECRET_ACCESS_KEY' => config.fetch(:aws_secret_access_key)
|
61
98
|
}
|
62
|
-
command = %
|
99
|
+
command = %(rack install aws \
|
63
100
|
--name "#{config.fetch(:stack_name)}" \
|
64
101
|
"InstanceType=#{config.fetch(:instance_type)}" \
|
65
|
-
"BuildInstance="
|
102
|
+
"BuildInstance=")
|
66
103
|
|
67
104
|
run_convox_command!(command, env)
|
68
105
|
end
|
69
106
|
|
70
107
|
def rack_already_installed?
|
71
|
-
require_config(%i[
|
108
|
+
require_config(%i[aws_region stack_name])
|
72
109
|
|
73
|
-
unless File.exist?(AUTH_FILE)
|
74
|
-
raise "Could not find auth file at #{AUTH_FILE}!"
|
75
|
-
end
|
110
|
+
return unless File.exist?(AUTH_FILE)
|
76
111
|
|
77
112
|
region = config.fetch(:aws_region)
|
78
113
|
stack_name = config.fetch(:stack_name)
|
79
114
|
|
80
|
-
auth.each do |host,
|
115
|
+
auth.each do |host, _password|
|
81
116
|
if host.match?(/^#{stack_name}-\d+\.#{region}\.elb\.amazonaws\.com$/)
|
82
117
|
return true
|
83
118
|
end
|
@@ -85,8 +120,8 @@ module Convox
|
|
85
120
|
false
|
86
121
|
end
|
87
122
|
|
88
|
-
def
|
89
|
-
require_config(%i[
|
123
|
+
def validate_convox_auth_and_write_host!
|
124
|
+
require_config(%i[aws_region stack_name])
|
90
125
|
|
91
126
|
unless File.exist?(AUTH_FILE)
|
92
127
|
raise "Could not find auth file at #{AUTH_FILE}!"
|
@@ -97,7 +132,7 @@ module Convox
|
|
97
132
|
|
98
133
|
match_count = 0
|
99
134
|
matching_host = nil
|
100
|
-
auth.each do |host,
|
135
|
+
auth.each do |host, _password|
|
101
136
|
if host.match?(/^#{stack}-\d+\.#{region}\.elb\.amazonaws\.com$/)
|
102
137
|
matching_host = host
|
103
138
|
match_count += 1
|
@@ -105,36 +140,36 @@ module Convox
|
|
105
140
|
end
|
106
141
|
|
107
142
|
if match_count == 1
|
108
|
-
|
143
|
+
write_host(matching_host)
|
109
144
|
return matching_host
|
110
145
|
end
|
111
146
|
|
112
|
-
if match_count > 1
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
147
|
+
error_message = if match_count > 1
|
148
|
+
'Found multiple matching hosts for '
|
149
|
+
else
|
150
|
+
'Could not find matching authentication for '
|
151
|
+
end
|
117
152
|
error_message += "region: #{region}, stack: #{stack}"
|
118
153
|
raise error_message
|
119
154
|
end
|
120
155
|
|
121
|
-
def
|
156
|
+
def write_host(host)
|
122
157
|
logger.debug "Setting convox host to #{host} (in #{HOST_FILE})..."
|
123
|
-
File.open(HOST_FILE,
|
158
|
+
File.open(HOST_FILE, 'w') { |f| f.puts host }
|
124
159
|
end
|
125
160
|
|
126
161
|
def validate_convox_rack!
|
127
162
|
require_config(%i[
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
logger.debug
|
163
|
+
aws_region
|
164
|
+
stack_name
|
165
|
+
instance_type
|
166
|
+
])
|
167
|
+
logger.debug 'Validating that convox rack has the correct attributes...'
|
133
168
|
{
|
134
|
-
provider:
|
169
|
+
provider: 'aws',
|
135
170
|
region: config.fetch(:aws_region),
|
136
171
|
type: config.fetch(:instance_type),
|
137
|
-
name: config.fetch(:stack_name)
|
172
|
+
name: config.fetch(:stack_name)
|
138
173
|
}.each do |k, v|
|
139
174
|
convox_value = convox_rack_data[k.to_s]
|
140
175
|
if convox_value != v
|
@@ -142,15 +177,16 @@ module Convox
|
|
142
177
|
"but was: '#{convox_value}'"
|
143
178
|
end
|
144
179
|
end
|
145
|
-
logger.debug
|
180
|
+
logger.debug '=> Convox rack has the correct attributes.'
|
146
181
|
true
|
147
182
|
end
|
148
183
|
|
149
184
|
def convox_rack_data
|
150
185
|
@convox_rack_data ||= begin
|
151
|
-
logger.debug
|
186
|
+
logger.debug 'Fetching convox rack attributes...'
|
152
187
|
convox_output = `convox api get /system`
|
153
|
-
raise
|
188
|
+
raise 'convox command failed!' unless $CHILD_STATUS.success?
|
189
|
+
|
154
190
|
JSON.parse(convox_output)
|
155
191
|
end
|
156
192
|
end
|
@@ -162,17 +198,18 @@ module Convox
|
|
162
198
|
app_name = config.fetch(:convox_app_name)
|
163
199
|
|
164
200
|
logger.info "Creating app: #{app_name}..."
|
165
|
-
logger.info
|
166
|
-
|
201
|
+
logger.info '=> Documentation: ' \
|
202
|
+
'https://docs.convox.com/deployment/creating-an-application'
|
167
203
|
|
168
204
|
run_convox_command! "apps create #{app_name} --wait"
|
169
205
|
|
170
206
|
retries = 0
|
171
207
|
loop do
|
172
208
|
break if convox_app_exists?
|
209
|
+
|
173
210
|
if retries > 5
|
174
211
|
raise "Something went wrong while creating the #{app_name} app! " \
|
175
|
-
|
212
|
+
'(Please wait a few moments and then restart the installation script.)'
|
176
213
|
end
|
177
214
|
logger.info "Waiting for #{app_name} to be ready..."
|
178
215
|
sleep 3
|
@@ -183,9 +220,9 @@ module Convox
|
|
183
220
|
end
|
184
221
|
|
185
222
|
def set_default_app_for_directory!
|
186
|
-
logger.info
|
187
|
-
FileUtils.mkdir_p File.expand_path(
|
188
|
-
File.open(File.expand_path(
|
223
|
+
logger.info 'Setting default app in ./.convox/app...'
|
224
|
+
FileUtils.mkdir_p File.expand_path('./.convox')
|
225
|
+
File.open(File.expand_path('./.convox/app'), 'w') do |f|
|
189
226
|
f.puts config.fetch(:convox_app_name)
|
190
227
|
end
|
191
228
|
end
|
@@ -196,11 +233,11 @@ module Convox
|
|
196
233
|
|
197
234
|
logger.debug "Looking for existing #{app_name} app..."
|
198
235
|
convox_output = `convox api get /apps`
|
199
|
-
raise
|
236
|
+
raise 'convox command failed!' unless $CHILD_STATUS.success?
|
200
237
|
|
201
238
|
apps = JSON.parse(convox_output)
|
202
239
|
apps.each do |app|
|
203
|
-
if app[
|
240
|
+
if app['name'] == app_name
|
204
241
|
logger.debug "=> Found #{app_name} app."
|
205
242
|
return true
|
206
243
|
end
|
@@ -217,9 +254,9 @@ module Convox
|
|
217
254
|
logger.info "#{bucket_name} S3 bucket already exists!"
|
218
255
|
else
|
219
256
|
logger.info "Creating S3 bucket resource (#{bucket_name})..."
|
220
|
-
run_convox_command!
|
257
|
+
run_convox_command! 'rack resources create s3 ' \
|
221
258
|
"--name \"#{bucket_name}\" " \
|
222
|
-
|
259
|
+
'--wait'
|
223
260
|
|
224
261
|
retries = 0
|
225
262
|
loop do
|
@@ -227,14 +264,14 @@ module Convox
|
|
227
264
|
|
228
265
|
if retries > 10
|
229
266
|
raise "Something went wrong while creating the #{bucket_name} S3 bucket! " \
|
230
|
-
|
267
|
+
'(Please wait a few moments and then restart the installation script.)'
|
231
268
|
end
|
232
|
-
logger.debug
|
269
|
+
logger.debug 'Waiting for S3 bucket to be ready...'
|
233
270
|
sleep 3
|
234
271
|
retries += 1
|
235
272
|
end
|
236
273
|
|
237
|
-
logger.debug
|
274
|
+
logger.debug '=> S3 bucket created!'
|
238
275
|
end
|
239
276
|
|
240
277
|
set_s3_bucket_cors_policy
|
@@ -245,7 +282,7 @@ module Convox
|
|
245
282
|
bucket_name = config.fetch(:s3_bucket_name)
|
246
283
|
logger.debug "Looking up S3 bucket resource: #{bucket_name}"
|
247
284
|
`convox api get /resources/#{bucket_name} 2>/dev/null`
|
248
|
-
|
285
|
+
$CHILD_STATUS.success?
|
249
286
|
end
|
250
287
|
|
251
288
|
def s3_bucket_details
|
@@ -255,12 +292,12 @@ module Convox
|
|
255
292
|
logger.debug "Fetching S3 bucket resource details for #{bucket_name}..."
|
256
293
|
|
257
294
|
response = `convox api get /resources/#{bucket_name}`
|
258
|
-
raise
|
295
|
+
raise 'convox command failed!' unless $CHILD_STATUS.success?
|
259
296
|
|
260
297
|
bucket_data = JSON.parse(response)
|
261
|
-
s3_url = bucket_data[
|
298
|
+
s3_url = bucket_data['url']
|
262
299
|
matches = s3_url.match(
|
263
|
-
|
300
|
+
%r{^s3://(?<access_key_id>[^:]*):(?<secret_access_key>[^@]*)@(?<bucket_name>.*)$}
|
264
301
|
)
|
265
302
|
|
266
303
|
match_keys = %i[access_key_id secret_access_key bucket_name]
|
@@ -271,7 +308,7 @@ module Convox
|
|
271
308
|
{
|
272
309
|
access_key_id: matches[:access_key_id],
|
273
310
|
secret_access_key: matches[:secret_access_key],
|
274
|
-
name: matches[:bucket_name]
|
311
|
+
name: matches[:bucket_name]
|
275
312
|
}
|
276
313
|
end
|
277
314
|
end
|
@@ -282,7 +319,7 @@ module Convox
|
|
282
319
|
secret_access_key = config.fetch(:aws_secret_access_key)
|
283
320
|
|
284
321
|
unless config.key? :s3_bucket_cors_policy
|
285
|
-
logger.debug
|
322
|
+
logger.debug 'No CORS policy provided in config: s3_bucket_cors_policy'
|
286
323
|
return
|
287
324
|
end
|
288
325
|
cors_policy_string = config.fetch(:s3_bucket_cors_policy)
|
@@ -294,17 +331,17 @@ module Convox
|
|
294
331
|
`AWS_ACCESS_KEY_ID=#{access_key_id} \
|
295
332
|
AWS_SECRET_ACCESS_KEY=#{secret_access_key} \
|
296
333
|
aws s3api get-bucket-cors --bucket #{bucket_name} 2>/dev/null`
|
297
|
-
if
|
334
|
+
if $CHILD_STATUS.success? && existing_cors_policy_string.present?
|
298
335
|
# Sort all the nested arrays so that the equality operator works
|
299
336
|
existing_cors_policy = JSON.parse(existing_cors_policy_string)
|
300
337
|
cors_policy_json = JSON.parse(cors_policy_string)
|
301
338
|
[existing_cors_policy, cors_policy_json].each do |policy_json|
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
339
|
+
next unless policy_json.is_a?(Hash) && policy_json['CORSRules']
|
340
|
+
|
341
|
+
policy_json['CORSRules'].each do |rule|
|
342
|
+
rule['AllowedHeaders']&.sort!
|
343
|
+
rule['AllowedMethods']&.sort!
|
344
|
+
rule['AllowedOrigins']&.sort!
|
308
345
|
end
|
309
346
|
end
|
310
347
|
|
@@ -317,19 +354,20 @@ module Convox
|
|
317
354
|
begin
|
318
355
|
logger.info "Setting CORS policy for #{bucket_name}..."
|
319
356
|
|
320
|
-
File.open(
|
357
|
+
File.open('cors-policy.json', 'w') { |f| f.puts cors_policy_string }
|
321
358
|
|
322
359
|
`AWS_ACCESS_KEY_ID=#{access_key_id} \
|
323
360
|
AWS_SECRET_ACCESS_KEY=#{secret_access_key} \
|
324
361
|
aws s3api put-bucket-cors \
|
325
362
|
--bucket #{bucket_name} \
|
326
363
|
--cors-configuration "file://cors-policy.json"`
|
327
|
-
unless
|
328
|
-
raise
|
364
|
+
unless $CHILD_STATUS.success?
|
365
|
+
raise 'Something went wrong while setting the S3 bucket CORS policy!'
|
329
366
|
end
|
367
|
+
|
330
368
|
logger.info "=> Successfully set CORS policy for #{bucket_name}."
|
331
369
|
ensure
|
332
|
-
FileUtils.rm_f
|
370
|
+
FileUtils.rm_f 'cors-policy.json'
|
333
371
|
end
|
334
372
|
end
|
335
373
|
|
@@ -338,38 +376,39 @@ module Convox
|
|
338
376
|
|
339
377
|
registry_url = config.fetch(:docker_registry_url)
|
340
378
|
|
341
|
-
logger.debug
|
379
|
+
logger.debug 'Looking up existing Docker registries...'
|
342
380
|
registries_response = `convox api get /registries`
|
343
|
-
unless
|
344
|
-
raise
|
381
|
+
unless $CHILD_STATUS.success?
|
382
|
+
raise 'Something went wrong while fetching the list of registries!'
|
345
383
|
end
|
384
|
+
|
346
385
|
registries = JSON.parse(registries_response)
|
347
386
|
|
348
|
-
if registries.any? { |r| r[
|
387
|
+
if registries.any? { |r| r['server'] == registry_url }
|
349
388
|
logger.debug "=> Docker Registry already exists: #{registry_url}"
|
350
389
|
return true
|
351
390
|
end
|
352
391
|
|
353
392
|
logger.info "Adding Docker Registry: #{registry_url}..."
|
354
|
-
logger.info
|
355
|
-
|
393
|
+
logger.info '=> Documentation: ' \
|
394
|
+
'https://docs.convox.com/deployment/private-registries'
|
356
395
|
|
357
396
|
`convox registries add "#{registry_url}" \
|
358
397
|
"#{config.fetch(:docker_registry_username)}" \
|
359
398
|
"#{config.fetch(:docker_registry_password)}"`
|
360
|
-
|
361
|
-
|
362
|
-
|
399
|
+
return if $CHILD_STATUS.success?
|
400
|
+
|
401
|
+
raise "Something went wrong while adding the #{registry_url} registry!"
|
363
402
|
end
|
364
403
|
|
365
404
|
def default_service_domain_name
|
366
405
|
require_config(%i[convox_app_name default_service])
|
367
406
|
|
368
407
|
@default_service_domain_name ||= begin
|
369
|
-
convox_domain = convox_rack_data[
|
370
|
-
elb_name_and_region = convox_domain[/([
|
408
|
+
convox_domain = convox_rack_data['domain']
|
409
|
+
elb_name_and_region = convox_domain[/([^.]*\.[^.]*)\..*/, 1]
|
371
410
|
unless elb_name_and_region.present?
|
372
|
-
raise
|
411
|
+
raise 'Something went wrong while parsing the ELB name and region! ' \
|
373
412
|
"(#{elb_name_and_region})"
|
374
413
|
end
|
375
414
|
app = config.fetch(:convox_app_name)
|
@@ -383,7 +422,7 @@ module Convox
|
|
383
422
|
def run_convox_command!(cmd, env = {})
|
384
423
|
command = "convox #{cmd}"
|
385
424
|
system env, command
|
386
|
-
raise "Error running: #{command}" unless
|
425
|
+
raise "Error running: #{command}" unless $CHILD_STATUS.success?
|
387
426
|
end
|
388
427
|
|
389
428
|
private
|
@@ -393,7 +432,7 @@ module Convox
|
|
393
432
|
|
394
433
|
begin
|
395
434
|
JSON.parse(File.read(AUTH_FILE))
|
396
|
-
rescue
|
435
|
+
rescue StandardError
|
397
436
|
{}
|
398
437
|
end
|
399
438
|
end
|
data/lib/convox.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
3
|
+
require 'highline'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'json'
|
6
|
+
require 'securerandom'
|
7
7
|
|
8
8
|
module ConvoxInstaller
|
9
9
|
class Config
|
10
|
-
CONFIG_FILE = File.expand_path(
|
10
|
+
CONFIG_FILE = File.expand_path('./.installer_config.json').freeze
|
11
11
|
|
12
12
|
attr_accessor :logger, :config, :prompts, :highline
|
13
13
|
|
14
14
|
DEFAULT_PROMPTS = [
|
15
15
|
{
|
16
16
|
key: :stack_name,
|
17
|
-
title:
|
18
|
-
prompt:
|
19
|
-
default:
|
17
|
+
title: 'Convox Stack Name',
|
18
|
+
prompt: 'Please enter a name for your Convox installation',
|
19
|
+
default: 'convox'
|
20
20
|
},
|
21
21
|
{
|
22
22
|
key: :aws_region,
|
23
|
-
title:
|
24
|
-
default:
|
23
|
+
title: 'AWS Region',
|
24
|
+
default: 'us-east-1'
|
25
25
|
},
|
26
26
|
{
|
27
27
|
key: :instance_type,
|
28
|
-
title:
|
29
|
-
default:
|
28
|
+
title: 'EC2 Instance Type',
|
29
|
+
default: 't3.medium'
|
30
30
|
},
|
31
31
|
{
|
32
|
-
section:
|
32
|
+
section: 'Admin AWS Credentials'
|
33
33
|
},
|
34
34
|
{
|
35
35
|
key: :aws_access_key_id,
|
36
|
-
title:
|
36
|
+
title: 'AWS Access Key ID'
|
37
37
|
},
|
38
38
|
{
|
39
39
|
key: :aws_secret_access_key,
|
40
|
-
title:
|
41
|
-
}
|
40
|
+
title: 'AWS Secret Access Key'
|
41
|
+
}
|
42
42
|
].freeze
|
43
43
|
|
44
44
|
def initialize(options = {})
|
45
|
-
@logger = Logger.new(
|
45
|
+
@logger = Logger.new($stdout)
|
46
46
|
logger.level = options[:log_level] || Logger::INFO
|
47
47
|
|
48
48
|
self.prompts = options[:prompts] || DEFAULT_PROMPTS
|
@@ -74,13 +74,14 @@ module ConvoxInstaller
|
|
74
74
|
|
75
75
|
@completed_prompt = true
|
76
76
|
|
77
|
-
highline.say
|
77
|
+
highline.say 'Please double check all of these configuration details.'
|
78
78
|
|
79
79
|
agree = highline.agree(
|
80
|
-
|
80
|
+
'Would you like to start the Convox installation?' \
|
81
81
|
" (press 'n' to correct any settings)"
|
82
82
|
)
|
83
83
|
break if agree
|
84
|
+
|
84
85
|
highline.say "\n"
|
85
86
|
end
|
86
87
|
|
@@ -89,7 +90,7 @@ module ConvoxInstaller
|
|
89
90
|
|
90
91
|
def show_config_summary
|
91
92
|
highline.say "\n============================================"
|
92
|
-
highline.say
|
93
|
+
highline.say ' SUMMARY'
|
93
94
|
highline.say "============================================\n\n"
|
94
95
|
|
95
96
|
config_titles = prompts.map do |prompt|
|
@@ -106,10 +107,18 @@ module ConvoxInstaller
|
|
106
107
|
highline.say " #{padded_key} #{value}"
|
107
108
|
end
|
108
109
|
highline.say "\nWe've saved your configuration to: #{CONFIG_FILE}"
|
109
|
-
highline.say
|
110
|
+
highline.say 'If anything goes wrong during the installation, ' \
|
110
111
|
"you can restart the script to reload the config and continue.\n\n"
|
111
112
|
end
|
112
113
|
|
114
|
+
def self.config_file_exists?
|
115
|
+
File.exist?(CONFIG_FILE)
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.read_config_file
|
119
|
+
File.read(CONFIG_FILE)
|
120
|
+
end
|
121
|
+
|
113
122
|
private
|
114
123
|
|
115
124
|
def ask_prompt(prompt)
|
@@ -129,7 +138,11 @@ module ConvoxInstaller
|
|
129
138
|
return if config[key]
|
130
139
|
|
131
140
|
default = prompt[:value]
|
132
|
-
config[key] = default.is_a?(Proc)
|
141
|
+
config[key] = if default.is_a?(Proc)
|
142
|
+
default.arity.zero? ? default.call : default.call(config)
|
143
|
+
else
|
144
|
+
default
|
145
|
+
end
|
133
146
|
save_config_to_file
|
134
147
|
return
|
135
148
|
end
|
@@ -153,7 +166,7 @@ module ConvoxInstaller
|
|
153
166
|
|
154
167
|
logger.debug "Loading saved config from #{CONFIG_FILE}..."
|
155
168
|
|
156
|
-
loaded_config = JSON.parse(Config.read_config_file)[
|
169
|
+
loaded_config = JSON.parse(Config.read_config_file)['config'].symbolize_keys
|
157
170
|
self.config = config.merge(loaded_config)
|
158
171
|
end
|
159
172
|
|
@@ -170,17 +183,9 @@ module ConvoxInstaller
|
|
170
183
|
|
171
184
|
def save_config_to_file
|
172
185
|
# FileUtils.mkdir_p File.expand_path("~/.convox")
|
173
|
-
File.open(CONFIG_FILE,
|
174
|
-
f.puts(
|
186
|
+
File.open(CONFIG_FILE, 'w') do |f|
|
187
|
+
f.puts(JSON.pretty_generate(config: config))
|
175
188
|
end
|
176
189
|
end
|
177
|
-
|
178
|
-
def self.config_file_exists?
|
179
|
-
File.exist?(CONFIG_FILE)
|
180
|
-
end
|
181
|
-
|
182
|
-
def self.read_config_file
|
183
|
-
File.read(CONFIG_FILE)
|
184
|
-
end
|
185
190
|
end
|
186
191
|
end
|