morpheus-cli 2.10.0 → 2.10.1
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/morpheus +27 -32
- data/lib/morpheus/api/accounts_interface.rb +36 -47
- data/lib/morpheus/api/api_client.rb +141 -110
- data/lib/morpheus/api/app_templates_interface.rb +56 -72
- data/lib/morpheus/api/apps_interface.rb +111 -132
- data/lib/morpheus/api/auth_interface.rb +30 -0
- data/lib/morpheus/api/clouds_interface.rb +71 -76
- data/lib/morpheus/api/custom_instance_types_interface.rb +21 -46
- data/lib/morpheus/api/dashboard_interface.rb +10 -17
- data/lib/morpheus/api/deploy_interface.rb +60 -72
- data/lib/morpheus/api/deployments_interface.rb +53 -71
- data/lib/morpheus/api/groups_interface.rb +55 -45
- data/lib/morpheus/api/instance_types_interface.rb +19 -23
- data/lib/morpheus/api/instances_interface.rb +179 -177
- data/lib/morpheus/api/key_pairs_interface.rb +11 -17
- data/lib/morpheus/api/license_interface.rb +18 -23
- data/lib/morpheus/api/load_balancers_interface.rb +54 -69
- data/lib/morpheus/api/logs_interface.rb +25 -29
- data/lib/morpheus/api/options_interface.rb +13 -17
- data/lib/morpheus/api/provision_types_interface.rb +19 -22
- data/lib/morpheus/api/roles_interface.rb +75 -94
- data/lib/morpheus/api/security_group_rules_interface.rb +28 -37
- data/lib/morpheus/api/security_groups_interface.rb +39 -51
- data/lib/morpheus/api/servers_interface.rb +113 -115
- data/lib/morpheus/api/setup_interface.rb +31 -0
- data/lib/morpheus/api/task_sets_interface.rb +36 -38
- data/lib/morpheus/api/tasks_interface.rb +56 -69
- data/lib/morpheus/api/users_interface.rb +67 -76
- data/lib/morpheus/api/virtual_images_interface.rb +61 -61
- data/lib/morpheus/api/whoami_interface.rb +12 -15
- data/lib/morpheus/cli.rb +71 -60
- data/lib/morpheus/cli/accounts.rb +254 -315
- data/lib/morpheus/cli/alias_command.rb +219 -0
- data/lib/morpheus/cli/app_templates.rb +264 -272
- data/lib/morpheus/cli/apps.rb +608 -671
- data/lib/morpheus/cli/cli_command.rb +259 -21
- data/lib/morpheus/cli/cli_registry.rb +99 -14
- data/lib/morpheus/cli/clouds.rb +599 -372
- data/lib/morpheus/cli/config_file.rb +126 -0
- data/lib/morpheus/cli/credentials.rb +141 -117
- data/lib/morpheus/cli/dashboard_command.rb +48 -56
- data/lib/morpheus/cli/deployments.rb +254 -268
- data/lib/morpheus/cli/deploys.rb +150 -142
- data/lib/morpheus/cli/error_handler.rb +38 -0
- data/lib/morpheus/cli/groups.rb +551 -179
- data/lib/morpheus/cli/hosts.rb +862 -617
- data/lib/morpheus/cli/instance_types.rb +103 -95
- data/lib/morpheus/cli/instances.rb +1335 -1009
- data/lib/morpheus/cli/key_pairs.rb +82 -90
- data/lib/morpheus/cli/library.rb +498 -499
- data/lib/morpheus/cli/license.rb +83 -101
- data/lib/morpheus/cli/load_balancers.rb +314 -300
- data/lib/morpheus/cli/login.rb +66 -44
- data/lib/morpheus/cli/logout.rb +47 -46
- data/lib/morpheus/cli/mixins/accounts_helper.rb +69 -31
- data/lib/morpheus/cli/mixins/infrastructure_helper.rb +106 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +181 -17
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +535 -458
- data/lib/morpheus/cli/mixins/whoami_helper.rb +2 -2
- data/lib/morpheus/cli/option_parser.rb +35 -0
- data/lib/morpheus/cli/option_types.rb +232 -192
- data/lib/morpheus/cli/recent_activity_command.rb +61 -65
- data/lib/morpheus/cli/remote.rb +446 -199
- data/lib/morpheus/cli/roles.rb +884 -906
- data/lib/morpheus/cli/security_group_rules.rb +213 -203
- data/lib/morpheus/cli/security_groups.rb +237 -192
- data/lib/morpheus/cli/shell.rb +338 -231
- data/lib/morpheus/cli/tasks.rb +326 -308
- data/lib/morpheus/cli/users.rb +457 -462
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/version_command.rb +16 -18
- data/lib/morpheus/cli/virtual_images.rb +526 -345
- data/lib/morpheus/cli/whoami.rb +125 -111
- data/lib/morpheus/cli/workflows.rb +338 -185
- data/lib/morpheus/formatters.rb +8 -1
- data/lib/morpheus/logging.rb +1 -1
- data/lib/morpheus/rest_client.rb +17 -8
- metadata +9 -3
- data/lib/morpheus/api/custom_instance_types.rb +0 -55
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'table_print'
|
2
2
|
require 'morpheus/cli/mixins/print_helper'
|
3
3
|
|
4
|
-
# Mixin for Morpheus::Cli command classes
|
4
|
+
# Mixin for Morpheus::Cli command classes
|
5
5
|
# Provides common methods for fetching and printing accounts, roles, and users.
|
6
6
|
# The including class must establish @accounts_interface, @roles_interface, @users_interface
|
7
7
|
module Morpheus::Cli::WhoamiHelper
|
@@ -14,7 +14,7 @@ module Morpheus::Cli::WhoamiHelper
|
|
14
14
|
whoami_interface = @whoami_interface || @api_client.whoami
|
15
15
|
whoami_response = whoami_interface.get()
|
16
16
|
# whoami_response = @whoami_interface.get()
|
17
|
-
@current_user = whoami_response["user"]
|
17
|
+
@current_user = whoami_response["user"]
|
18
18
|
if @current_user.empty?
|
19
19
|
print_red_alert "Unauthenticated. Please login."
|
20
20
|
exit 1
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Morpheus
|
4
|
+
module Cli
|
5
|
+
|
6
|
+
# an enhanced OptionParser
|
7
|
+
# not used yet, maybe ever =o
|
8
|
+
class Morpheus::Cli::OptionParser < OptionParser
|
9
|
+
|
10
|
+
attr_reader :footer
|
11
|
+
|
12
|
+
def footer=(msg)
|
13
|
+
@footer = msg
|
14
|
+
end
|
15
|
+
|
16
|
+
alias :original_to_s :to_s
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
full_help_message
|
20
|
+
end
|
21
|
+
|
22
|
+
def full_help_message
|
23
|
+
out = ""
|
24
|
+
out << original_to_s
|
25
|
+
if footer
|
26
|
+
out << footer.to_s.strip
|
27
|
+
out << "\n"
|
28
|
+
end
|
29
|
+
out
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -3,20 +3,28 @@ require 'readline'
|
|
3
3
|
module Morpheus
|
4
4
|
module Cli
|
5
5
|
module OptionTypes
|
6
|
-
|
6
|
+
include Term::ANSIColor
|
7
7
|
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
def self.confirm(message,options={})
|
10
|
+
if options[:yes] == true
|
11
|
+
return true
|
12
|
+
end
|
13
|
+
default_value = options[:default]
|
14
|
+
value_found = false
|
15
|
+
while value_found == false do
|
16
|
+
if default_value.nil?
|
17
|
+
print "#{message} (yes/no): "
|
18
|
+
else
|
19
|
+
print "#{message} (yes/no) [#{!!default_value ? 'yes' : 'no'}]: "
|
20
|
+
end
|
16
21
|
input = $stdin.gets.chomp!
|
17
|
-
if input.
|
22
|
+
if input.empty? && !default_value.nil?
|
23
|
+
return !!default_value
|
24
|
+
end
|
25
|
+
if input.downcase == 'yes' || input.downcase == 'y'
|
18
26
|
return true
|
19
|
-
elsif input.downcase == 'no'
|
27
|
+
elsif input.downcase == 'no' || input.downcase == 'n'
|
20
28
|
return false
|
21
29
|
else
|
22
30
|
puts "Invalid Option... Please try again."
|
@@ -62,7 +70,7 @@ module Morpheus
|
|
62
70
|
value_found = true
|
63
71
|
end
|
64
72
|
if !value_found
|
65
|
-
# select type is special because it supports skipSingleOption
|
73
|
+
# select type is special because it supports skipSingleOption
|
66
74
|
# and prints the available options on error
|
67
75
|
if option_type['type'] == 'select'
|
68
76
|
value = select_prompt(option_type, api_client, api_params, true)
|
@@ -86,7 +94,7 @@ module Morpheus
|
|
86
94
|
if option_type['type'] == 'number'
|
87
95
|
value = number_prompt(option_type)
|
88
96
|
elsif option_type['type'] == 'password'
|
89
|
-
|
97
|
+
value = password_prompt(option_type)
|
90
98
|
elsif option_type['type'] == 'checkbox'
|
91
99
|
value = checkbox_prompt(option_type)
|
92
100
|
elsif option_type['type'] == 'radio'
|
@@ -94,16 +102,17 @@ module Morpheus
|
|
94
102
|
elsif option_type['type'] == 'textarea'
|
95
103
|
value = multiline_prompt(option_type)
|
96
104
|
elsif option_type['type'] == 'code-editor'
|
97
|
-
value = multiline_prompt(option_type)
|
105
|
+
value = multiline_prompt(option_type)
|
98
106
|
elsif option_type['type'] == 'select'
|
99
107
|
value = select_prompt(option_type,api_client, api_params)
|
100
108
|
elsif option_type['type'] == 'hidden'
|
101
109
|
value = option_type['defaultValue']
|
102
110
|
input = value
|
111
|
+
elsif option_type['type'] == 'file'
|
112
|
+
value = file_prompt(option_type)
|
103
113
|
else
|
104
114
|
value = generic_prompt(option_type)
|
105
115
|
end
|
106
|
-
|
107
116
|
end
|
108
117
|
context_map[option_type['fieldName']] = value
|
109
118
|
end
|
@@ -113,218 +122,249 @@ module Morpheus
|
|
113
122
|
|
114
123
|
|
115
124
|
def self.radio_prompt(option_type)
|
116
|
-
value_found = false
|
117
|
-
value = nil
|
118
|
-
options = []
|
119
|
-
if option_type['config'] and option_type['config']['radioOptions']
|
120
|
-
option_type['config']['radioOptions'].each do |radio_option|
|
121
|
-
options << {key: radio_option['key'], checked: radio_option['checked']}
|
122
|
-
end
|
123
|
-
end
|
124
|
-
optionString = options.collect{ |b| b[:checked] ? "(#{b[:key]})" : b[:key]}.join(', ')
|
125
|
-
while !value_found do
|
126
|
-
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }[#{optionString}]: "
|
127
|
-
input = $stdin.gets.chomp!
|
128
|
-
if input == '?'
|
129
|
-
help_prompt(option_type)
|
130
|
-
else
|
131
|
-
if input.nil? || input.empty?
|
132
|
-
selectedOption = options.find{|o| o[:checked] == true}
|
133
|
-
else
|
134
|
-
selectedOption = options.find{|o| o[:key].downcase == input.downcase}
|
135
|
-
end
|
136
|
-
|
137
|
-
if selectedOption
|
138
|
-
value = selectedOption[:key]
|
139
|
-
else
|
140
|
-
puts "Invalid Option. Please select from #{optionString}."
|
141
|
-
end
|
142
|
-
if !value.nil? || option_type['required'] != true
|
143
|
-
value_found = true
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
return value
|
148
|
-
end
|
149
|
-
|
150
|
-
def self.number_prompt(option_type)
|
151
|
-
value_found = false
|
152
|
-
value = nil
|
153
|
-
while !value_found do
|
154
|
-
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
|
155
|
-
input = $stdin.gets.chomp!
|
156
|
-
value = input.empty? ? option_type['defaultValue'] : input.to_i
|
157
|
-
if input == '?'
|
158
|
-
help_prompt(option_type)
|
159
|
-
elsif !value.nil? || option_type['required'] != true
|
160
|
-
value_found = true
|
161
|
-
end
|
162
|
-
end
|
163
|
-
return value
|
164
|
-
end
|
165
|
-
|
166
|
-
def self.select_prompt(option_type,api_client, api_params={}, no_prompt=false)
|
167
125
|
value_found = false
|
168
126
|
value = nil
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
else
|
174
|
-
raise "select_prompt() requires selectOptions or optionSource!"
|
175
|
-
end
|
176
|
-
if !select_options.nil? && select_options.count == 1 && option_type['skipSingleOption'] == true
|
177
|
-
value_found = true
|
178
|
-
value = select_options[0]['value']
|
179
|
-
end
|
180
|
-
if no_prompt
|
181
|
-
if !value_found
|
182
|
-
if option_type['required']
|
183
|
-
print Term::ANSIColor.red, "\nMissing Required Option\n\n"
|
184
|
-
print Term::ANSIColor.red, " * #{option_type['fieldLabel']} [-O #{option_type['fieldContext'] ? (option_type['fieldContext']+'.') : ''}#{option_type['fieldName']}=] - ", Term::ANSIColor.reset , "#{option_type['description']}\n"
|
185
|
-
display_select_options(select_options)
|
186
|
-
print "\n"
|
187
|
-
exit 1
|
188
|
-
else
|
189
|
-
return nil
|
190
|
-
end
|
127
|
+
options = []
|
128
|
+
if option_type['config'] and option_type['config']['radioOptions']
|
129
|
+
option_type['config']['radioOptions'].each do |radio_option|
|
130
|
+
options << {key: radio_option['key'], checked: radio_option['checked']}
|
191
131
|
end
|
192
132
|
end
|
133
|
+
optionString = options.collect{ |b| b[:checked] ? "(#{b[:key]})" : b[:key]}.join(', ')
|
193
134
|
while !value_found do
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
input = input.chomp.strip
|
199
|
-
if input.empty?
|
200
|
-
value = option_type['defaultValue']
|
135
|
+
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }[#{optionString}]: "
|
136
|
+
input = $stdin.gets.chomp!
|
137
|
+
if input == '?'
|
138
|
+
help_prompt(option_type)
|
201
139
|
else
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
input = '?'
|
140
|
+
if input.nil? || input.empty?
|
141
|
+
selectedOption = options.find{|o| o[:checked] == true}
|
142
|
+
else
|
143
|
+
selectedOption = options.find{|o| o[:key].downcase == input.downcase}
|
207
144
|
end
|
208
|
-
|
209
|
-
|
210
|
-
if input == '?'
|
211
|
-
help_prompt(option_type)
|
212
|
-
display_select_options(select_options)
|
213
|
-
elsif !value.nil? || option_type['required'] != true
|
214
|
-
value_found = true
|
215
|
-
end
|
216
|
-
end
|
217
|
-
return value
|
218
|
-
end
|
219
|
-
|
220
|
-
def self.checkbox_prompt(option_type)
|
221
|
-
value_found = false
|
222
|
-
value = nil
|
223
|
-
while !value_found do
|
224
|
-
print "#{option_type['fieldLabel']} (yes/no) [#{option_type['defaultValue'] == 'on' ? 'yes' : 'no'}]: "
|
225
|
-
input = $stdin.gets.chomp!
|
226
|
-
if input.downcase == 'yes'
|
227
|
-
value = 'on'
|
228
|
-
elsif input.downcase == 'no'
|
229
|
-
value = 'off'
|
145
|
+
if selectedOption
|
146
|
+
value = selectedOption[:key]
|
230
147
|
else
|
231
|
-
|
148
|
+
puts "Invalid Option. Please select from #{optionString}."
|
232
149
|
end
|
233
|
-
if
|
234
|
-
help_prompt(option_type)
|
235
|
-
elsif !value.nil? || option_type['required'] != true
|
150
|
+
if !value.nil? || option_type['required'] != true
|
236
151
|
value_found = true
|
237
152
|
end
|
153
|
+
end
|
238
154
|
end
|
239
155
|
return value
|
240
|
-
|
156
|
+
end
|
241
157
|
|
242
|
-
|
158
|
+
def self.number_prompt(option_type)
|
243
159
|
value_found = false
|
244
160
|
value = nil
|
245
161
|
while !value_found do
|
246
162
|
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
|
247
163
|
input = $stdin.gets.chomp!
|
248
|
-
value = input.empty? ? option_type['defaultValue'] : input
|
164
|
+
value = input.empty? ? option_type['defaultValue'] : input.to_i
|
249
165
|
if input == '?'
|
250
|
-
|
166
|
+
help_prompt(option_type)
|
251
167
|
elsif !value.nil? || option_type['required'] != true
|
252
168
|
value_found = true
|
253
169
|
end
|
170
|
+
end
|
171
|
+
return value
|
254
172
|
end
|
255
|
-
return value
|
256
|
-
end
|
257
173
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
174
|
+
def self.select_prompt(option_type,api_client, api_params={}, no_prompt=false)
|
175
|
+
value_found = false
|
176
|
+
value = nil
|
177
|
+
if option_type['selectOptions']
|
178
|
+
select_options = option_type['selectOptions']
|
179
|
+
elsif option_type['optionSource']
|
180
|
+
select_options = load_source_options(option_type['optionSource'],api_client,api_params)
|
181
|
+
else
|
182
|
+
raise "select_prompt() requires selectOptions or optionSource!"
|
183
|
+
end
|
184
|
+
if !select_options.nil? && select_options.count == 1 && option_type['skipSingleOption'] == true
|
185
|
+
value_found = true
|
186
|
+
value = select_options[0]['value']
|
187
|
+
end
|
188
|
+
if no_prompt
|
189
|
+
if !value_found
|
190
|
+
if option_type['required']
|
191
|
+
print Term::ANSIColor.red, "\nMissing Required Option\n\n"
|
192
|
+
print Term::ANSIColor.red, " * #{option_type['fieldLabel']} [-O #{option_type['fieldContext'] ? (option_type['fieldContext']+'.') : ''}#{option_type['fieldName']}=] - ", Term::ANSIColor.reset , "#{option_type['description']}\n"
|
193
|
+
display_select_options(select_options)
|
194
|
+
print "\n"
|
195
|
+
exit 1
|
196
|
+
else
|
197
|
+
return nil
|
198
|
+
end
|
264
199
|
end
|
265
|
-
|
266
|
-
|
267
|
-
|
200
|
+
end
|
201
|
+
while !value_found do
|
202
|
+
Readline.completion_append_character = ""
|
203
|
+
Readline.basic_word_break_characters = ''
|
204
|
+
Readline.completion_proc = proc {|s| select_options.clone.collect{|opt| opt['name']}.grep(/^#{Regexp.escape(s)}/)}
|
205
|
+
input = Readline.readline("#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''} ['?' for options]: ", false).to_s
|
206
|
+
input = input.chomp.strip
|
207
|
+
if input.empty?
|
208
|
+
value = option_type['defaultValue']
|
209
|
+
else
|
210
|
+
select_option = select_options.find{|b| b['name'] == input || (!b['value'].nil? && b['value'].to_s == input) || (b['value'].nil? && input.empty?)}
|
211
|
+
if select_option
|
212
|
+
value = select_option['value']
|
213
|
+
elsif !input.nil? && !input.empty?
|
214
|
+
input = '?'
|
215
|
+
end
|
216
|
+
end
|
217
|
+
if input == '?'
|
268
218
|
help_prompt(option_type)
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
if value.nil?
|
273
|
-
value = ''
|
219
|
+
display_select_options(select_options)
|
220
|
+
elsif !value.nil? || option_type['required'] != true
|
221
|
+
value_found = true
|
274
222
|
end
|
275
|
-
value << input + "\n"
|
276
223
|
end
|
277
|
-
|
278
|
-
|
279
|
-
end
|
224
|
+
return value
|
225
|
+
end
|
280
226
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
227
|
+
def self.checkbox_prompt(option_type)
|
228
|
+
value_found = false
|
229
|
+
value = nil
|
230
|
+
while !value_found do
|
231
|
+
print "#{option_type['fieldLabel']} (yes/no) [#{option_type['defaultValue'] == 'on' ? 'yes' : 'no'}]: "
|
232
|
+
input = $stdin.gets.chomp!
|
233
|
+
if input.downcase == 'yes'
|
234
|
+
value = 'on'
|
235
|
+
elsif input.downcase == 'no'
|
236
|
+
value = 'off'
|
237
|
+
else
|
238
|
+
value = option_type['defaultValue']
|
239
|
+
end
|
240
|
+
if input == '?'
|
241
|
+
help_prompt(option_type)
|
242
|
+
elsif !value.nil? || option_type['required'] != true
|
243
|
+
value_found = true
|
244
|
+
end
|
245
|
+
end
|
246
|
+
return value
|
292
247
|
end
|
293
|
-
end
|
294
|
-
return value
|
295
|
-
end
|
296
248
|
|
297
|
-
|
298
|
-
|
299
|
-
|
249
|
+
def self.generic_prompt(option_type)
|
250
|
+
value_found = false
|
251
|
+
value = nil
|
252
|
+
while !value_found do
|
253
|
+
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
|
254
|
+
input = $stdin.gets.chomp!
|
255
|
+
value = input.empty? ? option_type['defaultValue'] : input
|
256
|
+
if input == '?'
|
257
|
+
help_prompt(option_type)
|
258
|
+
elsif !value.nil? || option_type['required'] != true
|
259
|
+
value_found = true
|
260
|
+
end
|
261
|
+
end
|
262
|
+
return value
|
263
|
+
end
|
300
264
|
|
265
|
+
def self.multiline_prompt(option_type)
|
266
|
+
value_found = false
|
267
|
+
value = nil
|
268
|
+
while !value_found do
|
269
|
+
if value.nil?
|
270
|
+
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''} [Type 'EOF' to stop input]: \n"
|
271
|
+
end
|
272
|
+
input = $stdin.gets.chomp!
|
273
|
+
# value = input.empty? ? option_type['defaultValue'] : input
|
274
|
+
if input == '?' && value.nil?
|
275
|
+
help_prompt(option_type)
|
276
|
+
elsif (!value.nil? || option_type['required'] != true) && input.chomp == 'EOF'
|
277
|
+
value_found = true
|
278
|
+
else
|
279
|
+
if value.nil?
|
280
|
+
value = ''
|
281
|
+
end
|
282
|
+
value << input + "\n"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
return value
|
286
|
+
end
|
301
287
|
|
302
|
-
|
303
|
-
|
304
|
-
|
288
|
+
def self.password_prompt(option_type)
|
289
|
+
value_found = false
|
290
|
+
while !value_found do
|
291
|
+
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}: "
|
292
|
+
input = $stdin.noecho(&:gets).chomp!
|
293
|
+
value = input
|
294
|
+
print "\n"
|
295
|
+
if input == '?'
|
296
|
+
help_prompt(option_type)
|
297
|
+
elsif !value.empty? || option_type['required'] != true
|
298
|
+
value_found = true
|
299
|
+
end
|
300
|
+
end
|
301
|
+
return value
|
302
|
+
end
|
305
303
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
304
|
+
def self.file_prompt(option_type)
|
305
|
+
value_found = false
|
306
|
+
value = nil
|
307
|
+
while !value_found do
|
308
|
+
print "#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''}: "
|
309
|
+
Readline.completion_append_character = ""
|
310
|
+
Readline.basic_word_break_characters = ''
|
311
|
+
Readline.completion_proc = proc {|s| Readline::FILENAME_COMPLETION_PROC.call(s) }
|
312
|
+
input = Readline.readline("#{option_type['fieldLabel']}#{option_type['fieldAddOn'] ? ('(' + option_type['fieldAddOn'] + ') ') : '' }#{!option_type['required'] ? ' (optional)' : ''}#{option_type['defaultValue'] ? ' ['+option_type['defaultValue'].to_s+']' : ''} ['?' for options]: ", false).to_s
|
313
|
+
input = input.chomp.strip
|
314
|
+
#input = $stdin.gets.chomp!
|
315
|
+
value = input.empty? ? option_type['defaultValue'] : input.to_s
|
316
|
+
if input == '?'
|
317
|
+
help_prompt(option_type)
|
318
|
+
elsif value.empty? && option_type['required'] != true
|
319
|
+
value = nil
|
320
|
+
value_found = true
|
321
|
+
elsif value
|
322
|
+
filename = File.expand_path(value)
|
323
|
+
if !File.exists?(filename)
|
324
|
+
# print_red_alert "File not found: #{filename}"
|
325
|
+
# exit 1
|
326
|
+
print Term::ANSIColor.red," File not found: #{filename}",Term::ANSIColor.reset, "\n"
|
327
|
+
elsif !File.file?(filename)
|
328
|
+
print Term::ANSIColor.red," Argument is not a file: #{filename}",Term::ANSIColor.reset, "\n"
|
329
|
+
else
|
330
|
+
value = filename
|
331
|
+
value_found = true
|
332
|
+
end
|
333
|
+
end
|
334
|
+
end
|
335
|
+
return value
|
336
|
+
end
|
314
337
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
338
|
+
def self.help_prompt(option_type)
|
339
|
+
print Term::ANSIColor.green," * #{option_type['fieldLabel']} [-O #{option_type['fieldContext'] ? (option_type['fieldContext']+'.') : ''}#{option_type['fieldName']}=] - ", Term::ANSIColor.reset , "#{option_type['description']}\n"
|
340
|
+
end
|
341
|
+
|
342
|
+
|
343
|
+
def self.load_source_options(source,api_client,params)
|
344
|
+
api_client.options.options_for_source(source,params)['data']
|
345
|
+
end
|
346
|
+
|
347
|
+
def self.display_select_options(select_options = [])
|
348
|
+
puts "\nOptions"
|
349
|
+
puts "==============="
|
350
|
+
select_options.each do |option|
|
351
|
+
puts " * #{option['name']} [#{option['value']}]"
|
352
|
+
end
|
353
|
+
puts "\n\n"
|
354
|
+
end
|
327
355
|
|
328
|
-
|
329
|
-
|
330
|
-
|
356
|
+
def self.format_option_types_help(option_types)
|
357
|
+
if option_types.empty?
|
358
|
+
"Available Options:\nNone\n\n"
|
359
|
+
else
|
360
|
+
option_lines = option_types.collect {|it| " -O #{it['fieldName']}=\"value\"" }.join("\n")
|
361
|
+
"Available Options:\n#{option_lines}\n\n"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
def self.display_option_types_help(option_types)
|
365
|
+
puts self.format_option_types_help(option_types)
|
366
|
+
end
|
367
|
+
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|