morpheus-cli 5.0.0 → 5.0.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/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +12 -0
- data/lib/morpheus/api/billing_interface.rb +1 -0
- data/lib/morpheus/api/deploy_interface.rb +1 -1
- data/lib/morpheus/api/deployments_interface.rb +20 -1
- data/lib/morpheus/api/forgot_password_interface.rb +17 -0
- data/lib/morpheus/api/instances_interface.rb +7 -0
- data/lib/morpheus/api/search_interface.rb +13 -0
- data/lib/morpheus/api/servers_interface.rb +7 -0
- data/lib/morpheus/api/usage_interface.rb +18 -0
- data/lib/morpheus/cli.rb +4 -1
- data/lib/morpheus/cli/cli_command.rb +26 -9
- data/lib/morpheus/cli/commands/standard/curl_command.rb +3 -5
- data/lib/morpheus/cli/commands/standard/history_command.rb +3 -1
- data/lib/morpheus/cli/commands/standard/man_command.rb +74 -40
- data/lib/morpheus/cli/deploy.rb +199 -90
- data/lib/morpheus/cli/deployments.rb +341 -28
- data/lib/morpheus/cli/deploys.rb +206 -41
- data/lib/morpheus/cli/error_handler.rb +7 -0
- data/lib/morpheus/cli/forgot_password.rb +133 -0
- data/lib/morpheus/cli/health_command.rb +2 -2
- data/lib/morpheus/cli/hosts.rb +169 -32
- data/lib/morpheus/cli/instances.rb +83 -32
- data/lib/morpheus/cli/invoices_command.rb +33 -16
- data/lib/morpheus/cli/logs_command.rb +9 -6
- data/lib/morpheus/cli/mixins/deployments_helper.rb +31 -2
- data/lib/morpheus/cli/mixins/print_helper.rb +0 -21
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +24 -4
- data/lib/morpheus/cli/option_types.rb +266 -17
- data/lib/morpheus/cli/remote.rb +35 -10
- data/lib/morpheus/cli/reports_command.rb +99 -30
- data/lib/morpheus/cli/search_command.rb +182 -0
- data/lib/morpheus/cli/setup.rb +1 -1
- data/lib/morpheus/cli/shell.rb +33 -11
- data/lib/morpheus/cli/tasks.rb +20 -21
- data/lib/morpheus/cli/usage_command.rb +64 -11
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +280 -199
- data/lib/morpheus/cli/whoami.rb +6 -6
- data/lib/morpheus/cli/workflows.rb +33 -40
- data/lib/morpheus/formatters.rb +22 -0
- data/lib/morpheus/terminal.rb +6 -2
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30d7a10e197c41b49f453d0d43fa28027e8759e8a889b531045626b0ad2157f8
|
4
|
+
data.tar.gz: f5bc8ef27e0c29feb0fbd9005ce7d013746ecdf005c92a049ff7537301c1fcbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 616bb0355ed1a3a6c07f26a8e6aa291cb99f7208f754c94146d8ac08ffc735c7231c081fd4e56bf0c6490c2a0931e10995332023e46f66314213c3af0e5e8545
|
7
|
+
data.tar.gz: ae11e6b85aa13a6349dc54e6d9421cbe9cde6071332de409570e6796dd2a09da3d932c349652de6adfe5321c88816f066c25aeebc651e6a63bd9106cddde15a3
|
data/Dockerfile
CHANGED
@@ -342,10 +342,18 @@ class Morpheus::APIClient
|
|
342
342
|
Morpheus::AuthInterface.new({url: @base_url, client_id: @client_id}).setopts(@options)
|
343
343
|
end
|
344
344
|
|
345
|
+
def forgot
|
346
|
+
Morpheus::ForgotPasswordInterface.new(common_interface_options).setopts(@options)
|
347
|
+
end
|
348
|
+
|
345
349
|
def whoami
|
346
350
|
Morpheus::WhoamiInterface.new(common_interface_options).setopts(@options)
|
347
351
|
end
|
348
352
|
|
353
|
+
def search
|
354
|
+
Morpheus::SearchInterface.new(common_interface_options).setopts(@options)
|
355
|
+
end
|
356
|
+
|
349
357
|
def user_settings
|
350
358
|
Morpheus::UserSettingsInterface.new(common_interface_options).setopts(@options)
|
351
359
|
end
|
@@ -768,6 +776,10 @@ class Morpheus::APIClient
|
|
768
776
|
Morpheus::CatalogItemTypesInterface.new(common_interface_options).setopts(@options)
|
769
777
|
end
|
770
778
|
|
779
|
+
def usage
|
780
|
+
Morpheus::UsageInterface.new(common_interface_options).setopts(@options)
|
781
|
+
end
|
782
|
+
|
771
783
|
def billing
|
772
784
|
Morpheus::BillingInterface.new(common_interface_options).setopts(@options)
|
773
785
|
end
|
@@ -18,7 +18,7 @@ class Morpheus::DeployInterface < Morpheus::APIClient
|
|
18
18
|
execute(method: :get, url: "#{base_path}", params: params)
|
19
19
|
end
|
20
20
|
|
21
|
-
def get(
|
21
|
+
def get(id, params={})
|
22
22
|
validate_id!(id)
|
23
23
|
execute(method: :get, url: "#{base_path}/#{id}", params: params)
|
24
24
|
end
|
@@ -40,7 +40,8 @@ class Morpheus::DeploymentsInterface < Morpheus::RestInterface
|
|
40
40
|
if destination.empty? || destination == "/" || destination == "." || destination.include?("../")
|
41
41
|
raise "#{self.class}.upload_file() passed a bad destination: '#{destination}'"
|
42
42
|
end
|
43
|
-
url = "#{@base_url}/#{base_path}/#{deployment_id}/versions/#{id}/files"
|
43
|
+
# url = "#{@base_url}/#{base_path}/#{deployment_id}/versions/#{id}/files"
|
44
|
+
url = "#{base_path}/#{deployment_id}/versions/#{id}/files"
|
44
45
|
if !destination.to_s.empty?
|
45
46
|
url += "/#{destination}"
|
46
47
|
end
|
@@ -57,4 +58,22 @@ class Morpheus::DeploymentsInterface < Morpheus::RestInterface
|
|
57
58
|
execute(method: :post, url: url, headers: headers, payload: payload, params: params, timeout: 172800)
|
58
59
|
end
|
59
60
|
|
61
|
+
# upload a file without multipart
|
62
|
+
# local_file is the full absolute local filename
|
63
|
+
# destination should be the full remote file path, including the file name.
|
64
|
+
def destroy_file(deployment_id, id, destination, params={})
|
65
|
+
if destination.empty? || destination == "/" || destination == "." || destination.include?("../")
|
66
|
+
raise "#{self.class}.upload_file() passed a bad destination: '#{destination}'"
|
67
|
+
end
|
68
|
+
# url = "#{@base_url}/#{base_path}/#{deployment_id}/versions/#{id}/files"
|
69
|
+
url = "#{base_path}/#{deployment_id}/versions/#{id}/files"
|
70
|
+
if !destination.to_s.empty?
|
71
|
+
url += "/#{destination}"
|
72
|
+
end
|
73
|
+
# use URI to escape path
|
74
|
+
uri = URI.parse(url)
|
75
|
+
url = uri.path
|
76
|
+
execute(method: :delete, url: url, params: params)
|
77
|
+
end
|
78
|
+
|
60
79
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
# There is no Authorization required for this API.
|
3
|
+
class Morpheus::ForgotPasswordInterface < Morpheus::APIClient
|
4
|
+
|
5
|
+
def authorization_required?
|
6
|
+
false
|
7
|
+
end
|
8
|
+
|
9
|
+
def send_email(payload, params={})
|
10
|
+
execute(method: :post, url: "/api/forgot/send-email", params: params, payload: payload.to_json)
|
11
|
+
end
|
12
|
+
|
13
|
+
def reset_password(payload, params={})
|
14
|
+
execute(method: :post, url: "/api/forgot/reset-password", params: params, payload: payload.to_json)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -218,6 +218,13 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
218
218
|
execute(opts)
|
219
219
|
end
|
220
220
|
|
221
|
+
def snapshots(instance_id, params={})
|
222
|
+
url = "#{@base_url}/api/instances/#{instance_id}/snapshots"
|
223
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
224
|
+
opts = {method: :get, url: url, headers: headers}
|
225
|
+
execute(opts)
|
226
|
+
end
|
227
|
+
|
221
228
|
def import_snapshot(id, params={}, payload={})
|
222
229
|
url = "#{@base_url}/api/instances/#{id}/import-snapshot"
|
223
230
|
headers = {:authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
@@ -169,4 +169,11 @@ class Morpheus::ServersInterface < Morpheus::APIClient
|
|
169
169
|
execute(opts)
|
170
170
|
end
|
171
171
|
|
172
|
+
def snapshots(id, params={})
|
173
|
+
url = "#{@base_url}/api/servers/#{id}/snapshots"
|
174
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
175
|
+
opts = {method: :get, url: url, headers: headers}
|
176
|
+
execute(opts)
|
177
|
+
end
|
178
|
+
|
172
179
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
class Morpheus::UsageInterface < Morpheus::APIClient
|
4
|
+
|
5
|
+
def base_path
|
6
|
+
"/api/usage" # not /usages ?
|
7
|
+
end
|
8
|
+
|
9
|
+
def list(params={})
|
10
|
+
execute(method: :get, url: "#{base_path}", params: params)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(id, params={})
|
14
|
+
validate_id!(id)
|
15
|
+
execute(method: :get, url: "#{base_path}/#{id}", params: params)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/lib/morpheus/cli.rb
CHANGED
@@ -74,9 +74,11 @@ module Morpheus
|
|
74
74
|
load 'morpheus/cli/setup.rb'
|
75
75
|
load 'morpheus/cli/login.rb'
|
76
76
|
load 'morpheus/cli/logout.rb'
|
77
|
+
load 'morpheus/cli/forgot_password.rb'
|
77
78
|
load 'morpheus/cli/whoami.rb'
|
78
79
|
load 'morpheus/cli/access_token_command.rb'
|
79
80
|
load 'morpheus/cli/user_settings_command.rb'
|
81
|
+
load 'morpheus/cli/search_command.rb'
|
80
82
|
load 'morpheus/cli/dashboard_command.rb'
|
81
83
|
load 'morpheus/cli/recent_activity_command.rb' # deprecated, removing soon
|
82
84
|
load 'morpheus/cli/activity_command.rb'
|
@@ -94,11 +96,12 @@ module Morpheus
|
|
94
96
|
load 'morpheus/cli/tasks.rb'
|
95
97
|
load 'morpheus/cli/workflows.rb'
|
96
98
|
load 'morpheus/cli/deployments.rb'
|
99
|
+
load 'morpheus/cli/deploy.rb'
|
100
|
+
load 'morpheus/cli/deploys.rb'
|
97
101
|
load 'morpheus/cli/instances.rb'
|
98
102
|
load 'morpheus/cli/containers_command.rb'
|
99
103
|
load 'morpheus/cli/apps.rb'
|
100
104
|
load 'morpheus/cli/blueprints_command.rb'
|
101
|
-
load 'morpheus/cli/deploys.rb'
|
102
105
|
load 'morpheus/cli/license.rb'
|
103
106
|
load 'morpheus/cli/instance_types.rb'
|
104
107
|
load 'morpheus/cli/jobs_command.rb'
|
@@ -309,6 +309,15 @@ module Morpheus
|
|
309
309
|
opts.add_hidden_option('-a, --account') if opts.is_a?(Morpheus::Cli::OptionParser)
|
310
310
|
opts.add_hidden_option('-A, --account-id') if opts.is_a?(Morpheus::Cli::OptionParser)
|
311
311
|
|
312
|
+
when :details
|
313
|
+
opts.on('-a', '--all', "Show all details." ) do
|
314
|
+
options[:details] = true
|
315
|
+
end
|
316
|
+
opts.on('--details', '--details', "Show more details" ) do
|
317
|
+
options[:details] = true
|
318
|
+
end
|
319
|
+
opts.add_hidden_option('--details')
|
320
|
+
|
312
321
|
when :options
|
313
322
|
options[:options] ||= {}
|
314
323
|
opts.on( '-O', '--option OPTION', "Option in the format -O field=\"value\"" ) do |option|
|
@@ -602,13 +611,13 @@ module Morpheus
|
|
602
611
|
end
|
603
612
|
# opts.add_hidden_option('-H') if opts.is_a?(Morpheus::Cli::OptionParser)
|
604
613
|
# opts.add_hidden_option('--header') if opts.is_a?(Morpheus::Cli::OptionParser)
|
605
|
-
opts.add_hidden_option('--
|
614
|
+
opts.add_hidden_option('-H, --header') if opts.is_a?(Morpheus::Cli::OptionParser)
|
606
615
|
|
607
616
|
#when :timeout
|
608
617
|
opts.on( '--timeout SECONDS', "Timeout for api requests. Default is typically 30 seconds." ) do |val|
|
609
618
|
options[:timeout] = val ? val.to_f : nil
|
610
619
|
end
|
611
|
-
|
620
|
+
opts.add_hidden_option('--timeout') if opts.is_a?(Morpheus::Cli::OptionParser)
|
612
621
|
|
613
622
|
when :auto_confirm
|
614
623
|
opts.on( '-y', '--yes', "Auto Confirm" ) do
|
@@ -715,7 +724,7 @@ module Morpheus
|
|
715
724
|
|
716
725
|
|
717
726
|
when :dry_run
|
718
|
-
opts.on('-d','--dry-run', "Dry Run, print the API request instead of executing it") do
|
727
|
+
opts.on('-d','--dry-run', "Dry Run, print the API request instead of executing it.") do
|
719
728
|
# todo: this should print after parsing obv..
|
720
729
|
# need a hook after parse! or a standard_handle(options) { ... } paradigm
|
721
730
|
# either that or hook it up in every command somehow, maybe a hook on connect()
|
@@ -727,7 +736,7 @@ module Morpheus
|
|
727
736
|
end
|
728
737
|
options[:dry_run] = true
|
729
738
|
end
|
730
|
-
opts.on(nil,'--curl', "
|
739
|
+
opts.on(nil,'--curl', "Curl, print the API request as a curl command instead of executing it.") do
|
731
740
|
# print once and dont munge json
|
732
741
|
if !options[:dry_run] && !options[:json]
|
733
742
|
puts "#{cyan}#{bold}#{dark}DRY RUN#{reset}"
|
@@ -830,6 +839,10 @@ module Morpheus
|
|
830
839
|
opts
|
831
840
|
end
|
832
841
|
|
842
|
+
def prog_name
|
843
|
+
self.class.prog_name
|
844
|
+
end
|
845
|
+
|
833
846
|
def command_name
|
834
847
|
self.class.command_name
|
835
848
|
end
|
@@ -870,14 +883,14 @@ module Morpheus
|
|
870
883
|
|
871
884
|
def usage
|
872
885
|
if !subcommands.empty?
|
873
|
-
"Usage:
|
886
|
+
"Usage: #{prog_name} #{command_name} [command] [options]"
|
874
887
|
else
|
875
|
-
"Usage:
|
888
|
+
"Usage: #{prog_name} #{command_name} [options]"
|
876
889
|
end
|
877
890
|
end
|
878
891
|
|
879
892
|
def my_help_command
|
880
|
-
"
|
893
|
+
"#{prog_name} #{command_name} --help"
|
881
894
|
end
|
882
895
|
|
883
896
|
def subcommand_usage(*extra)
|
@@ -888,7 +901,7 @@ module Morpheus
|
|
888
901
|
extra.shift
|
889
902
|
end
|
890
903
|
#extra = ["[options]"] if extra.empty?
|
891
|
-
"Usage:
|
904
|
+
"Usage: #{prog_name} #{command_name} #{subcommand_name} #{extra.join(' ')}".squeeze(' ').strip
|
892
905
|
end
|
893
906
|
|
894
907
|
# a string to describe the usage of your command
|
@@ -939,7 +952,7 @@ module Morpheus
|
|
939
952
|
end
|
940
953
|
cmd_method = subcommands[subcommand_name]
|
941
954
|
if !cmd_method
|
942
|
-
error_msg = "'#{command_name} #{subcommand_name}' is not a
|
955
|
+
error_msg = "'#{command_name} #{subcommand_name}' is not a #{prog_name} command.\n#{full_command_usage}"
|
943
956
|
raise CommandNotFoundError.new(error_msg)
|
944
957
|
end
|
945
958
|
self.send(cmd_method, args[1..-1])
|
@@ -1295,6 +1308,10 @@ module Morpheus
|
|
1295
1308
|
|
1296
1309
|
module ClassMethods
|
1297
1310
|
|
1311
|
+
def prog_name
|
1312
|
+
"morpheus"
|
1313
|
+
end
|
1314
|
+
|
1298
1315
|
def set_command_name(cmd_name)
|
1299
1316
|
@command_name = cmd_name
|
1300
1317
|
Morpheus::Cli::CliRegistry.add(self, self.command_name)
|
@@ -41,7 +41,7 @@ class Morpheus::Cli::CurlCommand
|
|
41
41
|
opts.on( '--progress', '--progress', "Display progress output by excluding the -s option." ) do
|
42
42
|
show_progress = true
|
43
43
|
end
|
44
|
-
build_common_options(opts, options, [:dry_run, :remote])
|
44
|
+
build_common_options(opts, options, [:dry_run, :json, :remote])
|
45
45
|
opts.add_hidden_option('--curl')
|
46
46
|
#opts.add_hidden_option('--scrub')
|
47
47
|
opts.footer = <<-EOT
|
@@ -140,16 +140,14 @@ EOT
|
|
140
140
|
print reset
|
141
141
|
# print result
|
142
142
|
curl_output = `#{curl_cmd}`
|
143
|
-
if options[:pretty]
|
143
|
+
if options[:pretty] || options[:json]
|
144
144
|
output_lines = curl_output.split("\n")
|
145
145
|
last_line = output_lines.pop
|
146
146
|
if output_lines.size > 0
|
147
147
|
puts output_lines.join("\n")
|
148
148
|
end
|
149
149
|
begin
|
150
|
-
|
151
|
-
json_string = JSON.pretty_generate(json_data)
|
152
|
-
puts json_string
|
150
|
+
puts as_json(JSON.parse(last_line), options)
|
153
151
|
rescue => ex
|
154
152
|
Morpheus::Logging::DarkPrinter.puts "failed to parse curl result as JSON data Error: #{ex.message}" if Morpheus::Logging.debug?
|
155
153
|
puts last_line
|
@@ -6,7 +6,9 @@ require 'morpheus/cli/cli_command'
|
|
6
6
|
class Morpheus::Cli::HistoryCommand
|
7
7
|
include Morpheus::Cli::CliCommand
|
8
8
|
set_command_name :'history'
|
9
|
-
|
9
|
+
set_command_description "View morpheus shell command history"
|
10
|
+
# hidden for now because it is a shell command, shouldnt just be shell command though
|
11
|
+
set_command_hidden
|
10
12
|
|
11
13
|
# todo: support all the other :list options too, not just max
|
12
14
|
# AND start logging every terminal command, not just shell...
|
@@ -9,7 +9,7 @@ class Morpheus::Cli::ManCommand
|
|
9
9
|
|
10
10
|
# this should be read only anyway...
|
11
11
|
@@default_editor = "less" # ENV['EDITOR']
|
12
|
-
|
12
|
+
|
13
13
|
def handle(args)
|
14
14
|
options = {}
|
15
15
|
regenerate = false
|
@@ -28,6 +28,12 @@ class Morpheus::Cli::ManCommand
|
|
28
28
|
opts.on('-g','--generate', "Regenerate the manual file") do
|
29
29
|
regenerate = true
|
30
30
|
end
|
31
|
+
opts.on('-o','--out FILE', "Write manual file to a custom location") do |val|
|
32
|
+
options[:outfile] = val
|
33
|
+
end
|
34
|
+
opts.on('--overwrite', '--overwrite', "Overwrite output file if it already exists.") do |val|
|
35
|
+
options[:overwrite] = true
|
36
|
+
end
|
31
37
|
opts.on('-q','--quiet', "Do not open manual, for use with the -g option.") do
|
32
38
|
options[:quiet] = true
|
33
39
|
end
|
@@ -47,7 +53,8 @@ class Morpheus::Cli::ManCommand
|
|
47
53
|
end
|
48
54
|
opts.footer = <<-EOT
|
49
55
|
Open the morpheus manual located at #{Morpheus::Cli::ManCommand.man_file_path}
|
50
|
-
The -g
|
56
|
+
The -g option can be used to regenerate the file.
|
57
|
+
The --out FILE option be used to write the manual file to a custom location.
|
51
58
|
EOT
|
52
59
|
end
|
53
60
|
optparse.parse!(args)
|
@@ -65,18 +72,35 @@ EOT
|
|
65
72
|
end
|
66
73
|
|
67
74
|
fn = Morpheus::Cli::ManCommand.man_file_path
|
75
|
+
if options[:outfile]
|
76
|
+
regenerate = true
|
77
|
+
fn = File.expand_path(options[:outfile])
|
78
|
+
if File.directory?(fn)
|
79
|
+
# if you give me a directory, could still work and use the default filename
|
80
|
+
# fn = File.join(fn, "CLI-Manual-#{Morpheus::Cli::VERSION}.md")
|
81
|
+
# raise_command_error "outfile is invalid. It is the name of an existing directory: #{fn}"
|
82
|
+
print_error "#{red}Output file '#{fn}' is invalid.#{reset}\n"
|
83
|
+
print_error "#{red}It is the name of an existing directory.#{reset}\n"
|
84
|
+
return 1
|
85
|
+
end
|
86
|
+
if File.exists?(fn) && options[:overwrite] != true
|
87
|
+
print_error "#{red}Output file '#{fn}' already exists.#{reset}\n"
|
88
|
+
print_error "#{red}Use --overwrite to overwrite the existing file.#{reset}\n"
|
89
|
+
return 1
|
90
|
+
end
|
91
|
+
end
|
92
|
+
exit_code, err = 0, nil
|
68
93
|
if regenerate || !File.exists?(fn)
|
69
94
|
#Morpheus::Logging::DarkPrinter.puts "generating manual #{fn} ..." if Morpheus::Logging.debug? && !options[:quiet]
|
70
|
-
Morpheus::Cli::ManCommand.generate_manual(options)
|
95
|
+
exit_code, err = Morpheus::Cli::ManCommand.generate_manual(options)
|
71
96
|
end
|
72
97
|
|
73
98
|
if options[:quiet]
|
74
|
-
return
|
99
|
+
return exit_code, err
|
75
100
|
end
|
76
101
|
|
77
102
|
Morpheus::Logging::DarkPrinter.puts "opening manual file #{fn}" if Morpheus::Logging.debug? && !options[:quiet]
|
78
103
|
|
79
|
-
|
80
104
|
if open_as_link # not used atm
|
81
105
|
link = "file://#{fn}"
|
82
106
|
if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
@@ -138,6 +162,14 @@ EOT
|
|
138
162
|
# todo: use pandoc or something else to convert the CLI-Manual.md to a man page
|
139
163
|
# and install it, so the os command `man morpheus` will work too.
|
140
164
|
fn = man_file_path()
|
165
|
+
if options[:outfile]
|
166
|
+
fn = File.expand_path(options[:outfile])
|
167
|
+
if File.exists?(fn) && options[:overwrite] != true
|
168
|
+
print_error "#{red}Output file '#{options[:outfile]}' already exists.#{reset}\n"
|
169
|
+
print_error "#{red}Use --overwrite to overwrite the existing file.#{reset}\n"
|
170
|
+
return 1, "output file already exists"
|
171
|
+
end
|
172
|
+
end
|
141
173
|
if !Dir.exists?(File.dirname(fn))
|
142
174
|
FileUtils.mkdir_p(File.dirname(fn))
|
143
175
|
end
|
@@ -153,7 +185,7 @@ EOT
|
|
153
185
|
begin
|
154
186
|
|
155
187
|
manpage.print <<-ENDTEXT
|
156
|
-
|
188
|
+
#{prog_name} v#{Morpheus::Cli::VERSION}
|
157
189
|
|
158
190
|
## NAME
|
159
191
|
|
@@ -170,17 +202,17 @@ morpheus v#{Morpheus::Cli::VERSION}
|
|
170
202
|
This is a command line interface for managing a Morpheus Appliance.
|
171
203
|
All communication with the remote appliance is done via the Morpheus API.
|
172
204
|
|
173
|
-
|
205
|
+
Use the command `#{prog_name} remote add` to connect to your Morpheus appliance.
|
174
206
|
|
175
207
|
To learn more, visit https://github.com/gomorpheus/morpheus-cli/wiki/Getting-Started
|
176
208
|
|
177
|
-
To learn more about the Morpheus Appliance, visit https://www.morpheusdata.com
|
209
|
+
To learn more about the Morpheus Appliance, visit https://www.morpheusdata.com
|
178
210
|
|
179
211
|
To learn more about the Morpheus API, visit https://apidocs.morpheusdata.com
|
180
212
|
|
181
213
|
## GLOBAL OPTIONS
|
182
214
|
|
183
|
-
|
215
|
+
There are several global options available.
|
184
216
|
|
185
217
|
-v, --version Print the version.
|
186
218
|
--noprofile Do not read and execute the personal initialization script .morpheus_profile
|
@@ -190,30 +222,42 @@ morpheus v#{Morpheus::Cli::VERSION}
|
|
190
222
|
|
191
223
|
## COMMON OPTIONS
|
192
224
|
|
193
|
-
There are
|
225
|
+
There are many common options that are supported by a most commands.
|
194
226
|
|
195
227
|
-O, --option OPTION Option value in the format -O var="value" (deprecated soon in favor of first class options)
|
196
228
|
-N, --no-prompt Skip prompts. Use default values for all optional fields.
|
229
|
+
--payload FILE Payload from a local JSON or YAML file, skip all prompting
|
230
|
+
--payload-dir DIRECTORY Payload from a local directory containing 1-N JSON or YAML files, skip all prompting
|
231
|
+
--payload-json JSON Payload JSON, skip all prompting
|
232
|
+
--payload-yaml YAML Payload YAML, skip all prompting
|
197
233
|
-j, --json JSON Output
|
198
234
|
-d, --dry-run Dry Run, print the API request instead of executing it
|
199
|
-
|
200
|
-
|
201
|
-
-
|
202
|
-
|
235
|
+
--curl Dry Run to output API request as a curl command.
|
236
|
+
--scrub Mask secrets in output, such as the Authorization header. For use with --curl and --dry-run.
|
237
|
+
-r, --remote REMOTE Remote name. The current remote is used by default.
|
238
|
+
--remote-url URL Remote url. This allows adhoc requests instead of using a configured remote.
|
239
|
+
-T, --token TOKEN Access token for authentication with --remote. Saved credentials are used by default.
|
240
|
+
-U, --username USERNAME Username for authentication.
|
241
|
+
-P, --password PASSWORD Password for authentication.
|
242
|
+
-I, --insecure Allow insecure HTTPS communication. i.e. bad SSL certificate.
|
243
|
+
-H, --header HEADER Additional HTTP header to include with requests.
|
244
|
+
--timeout SECONDS Timeout for api requests. Default is typically 30 seconds.
|
245
|
+
-y, --yes Auto Confirm
|
246
|
+
-q, --quiet No Output, do not print to stdout
|
203
247
|
|
204
248
|
## MORPHEUS COMMANDS
|
205
249
|
|
206
|
-
|
207
|
-
|
250
|
+
The morpheus executable is divided into commands.
|
251
|
+
Each morpheus command may have 0-N sub-commands that it supports.
|
208
252
|
Commands generally map to the functionality provided in the Morpheus UI.
|
209
253
|
|
210
254
|
You can get help for any morpheus command by using the -h option.
|
211
255
|
|
212
|
-
The available commands and their options are
|
256
|
+
The available commands and their options are documented below.
|
213
257
|
ENDTEXT
|
214
258
|
|
215
259
|
terminal = Morpheus::Terminal.new($stdin, manpage)
|
216
|
-
Morpheus::Logging::DarkPrinter.puts "appending command help
|
260
|
+
Morpheus::Logging::DarkPrinter.puts "appending command help `#{prog_name} --help`" if Morpheus::Logging.debug? && !options[:quiet]
|
217
261
|
|
218
262
|
manpage.print "\n"
|
219
263
|
manpage.print "## morpheus\n"
|
@@ -226,7 +270,7 @@ ENDTEXT
|
|
226
270
|
Morpheus::Cli::CliRegistry.all.keys.sort.each do |cmd|
|
227
271
|
cmd_klass = Morpheus::Cli::CliRegistry.instance.get(cmd)
|
228
272
|
cmd_instance = cmd_klass.new
|
229
|
-
Morpheus::Logging::DarkPrinter.puts "appending command help
|
273
|
+
Morpheus::Logging::DarkPrinter.puts "appending command help `#{prog_name} #{cmd} --help`" if Morpheus::Logging.debug? && !options[:quiet]
|
230
274
|
#help_cmd = "morpheus #{cmd} --help"
|
231
275
|
#help_output = `#{help_cmd}`
|
232
276
|
manpage.print "\n"
|
@@ -243,7 +287,7 @@ ENDTEXT
|
|
243
287
|
subcommands = cmd_klass.visible_subcommands
|
244
288
|
if subcommands && subcommands.size > 0
|
245
289
|
subcommands.sort.each do |subcommand, subcommand_method|
|
246
|
-
Morpheus::Logging::DarkPrinter.puts "appending command help
|
290
|
+
Morpheus::Logging::DarkPrinter.puts "appending command help `#{prog_name} #{cmd} #{subcommand} --help`" if Morpheus::Logging.debug? && !options[:quiet]
|
247
291
|
manpage.print "\n"
|
248
292
|
manpage.print "#### morpheus #{cmd} #{subcommand}\n"
|
249
293
|
manpage.print "\n"
|
@@ -289,7 +333,7 @@ morpheus> remote list
|
|
289
333
|
Morpheus Appliances
|
290
334
|
==================
|
291
335
|
|
292
|
-
You have no appliances configured. See the
|
336
|
+
You have no appliances configured. See the `#{prog_name} remote add` command.
|
293
337
|
|
294
338
|
```
|
295
339
|
|
@@ -319,11 +363,10 @@ The `appliances` YAML file contains a list of known appliances, keyed by name.
|
|
319
363
|
Example:
|
320
364
|
```yaml
|
321
365
|
:qa:
|
322
|
-
:host: https://qa.
|
366
|
+
:host: https://qa.mymorpheus.com
|
323
367
|
:active: true
|
324
368
|
:production:
|
325
|
-
:host: https://
|
326
|
-
:active: false
|
369
|
+
:host: https://mymorpheus.com
|
327
370
|
```
|
328
371
|
|
329
372
|
### credentials file
|
@@ -349,7 +392,7 @@ This may be inhibited by using the `--noprofile` option.
|
|
349
392
|
|
350
393
|
### .morpheusrc file
|
351
394
|
|
352
|
-
When started as an interactive shell with the
|
395
|
+
When started as an interactive shell with the `#{prog_name} shell` command,
|
353
396
|
Morpheus reads and executes `$MORPHEUS_CLI_HOME/.morpheusrc` (if it exists). This may be inhibited by using the `--norc` option.
|
354
397
|
|
355
398
|
An example startup script might look like this:
|
@@ -357,20 +400,11 @@ An example startup script might look like this:
|
|
357
400
|
```
|
358
401
|
# .morpheusrc
|
359
402
|
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
# greeting
|
367
|
-
echo "Welcome back human, have fun!"
|
368
|
-
|
369
|
-
# print current user information
|
370
|
-
whoami
|
371
|
-
|
372
|
-
# print the list of instances in our cloud
|
373
|
-
our-instances
|
403
|
+
set-prompt "%cyan%username%reset@%magenta%remote %cyanmorpheus> %reset"
|
404
|
+
version
|
405
|
+
remote current
|
406
|
+
echo "Welcome back %username"
|
407
|
+
echo
|
374
408
|
|
375
409
|
```
|
376
410
|
|
@@ -383,7 +417,7 @@ ENDTEXT
|
|
383
417
|
terminal = Morpheus::Terminal.new()
|
384
418
|
end
|
385
419
|
|
386
|
-
return
|
420
|
+
return 0, nil
|
387
421
|
end
|
388
422
|
|
389
423
|
end
|