morpheus-cli 5.3.0 → 5.3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/README.md +1 -3
- data/lib/morpheus/api/account_groups_interface.rb +0 -6
- data/lib/morpheus/api/accounts_interface.rb +1 -7
- data/lib/morpheus/api/api_client.rb +155 -119
- data/lib/morpheus/api/appliance_settings_interface.rb +6 -9
- data/lib/morpheus/api/approvals_interface.rb +5 -8
- data/lib/morpheus/api/apps_interface.rb +0 -7
- data/lib/morpheus/api/archive_buckets_interface.rb +9 -16
- data/lib/morpheus/api/archive_files_interface.rb +0 -6
- data/lib/morpheus/api/auth_interface.rb +4 -4
- data/lib/morpheus/api/backup_settings_interface.rb +5 -8
- data/lib/morpheus/api/blueprints_interface.rb +1 -7
- data/lib/morpheus/api/budgets_interface.rb +0 -6
- data/lib/morpheus/api/certificate_types_interface.rb +14 -0
- data/lib/morpheus/api/certificates_interface.rb +9 -0
- data/lib/morpheus/api/cloud_datastores_interface.rb +0 -6
- data/lib/morpheus/api/cloud_folders_interface.rb +1 -7
- data/lib/morpheus/api/cloud_policies_interface.rb +0 -6
- data/lib/morpheus/api/cloud_resource_pools_interface.rb +0 -6
- data/lib/morpheus/api/clouds_interface.rb +0 -6
- data/lib/morpheus/api/clusters_interface.rb +39 -42
- data/lib/morpheus/api/containers_interface.rb +0 -6
- data/lib/morpheus/api/custom_instance_types_interface.rb +0 -6
- data/lib/morpheus/api/cypher_interface.rb +0 -6
- data/lib/morpheus/api/datastores_interface.rb +4 -7
- data/lib/morpheus/api/deploy_interface.rb +1 -6
- data/lib/morpheus/api/environments_interface.rb +0 -6
- data/lib/morpheus/api/execute_schedules_interface.rb +0 -6
- data/lib/morpheus/api/execution_request_interface.rb +0 -6
- data/lib/morpheus/api/file_copy_request_interface.rb +2 -9
- data/lib/morpheus/api/group_policies_interface.rb +0 -6
- data/lib/morpheus/api/groups_interface.rb +0 -7
- data/lib/morpheus/api/guidance_interface.rb +9 -12
- data/lib/morpheus/api/health_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_boot_scripts_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_image_builds_interface.rb +0 -6
- data/lib/morpheus/api/image_builder_interface.rb +3 -9
- data/lib/morpheus/api/image_builder_preseed_scripts_interface.rb +0 -6
- data/lib/morpheus/api/instance_types_interface.rb +0 -7
- data/lib/morpheus/api/instances_interface.rb +8 -19
- data/lib/morpheus/api/integration_types_interface.rb +14 -0
- data/lib/morpheus/api/integrations_interface.rb +36 -21
- data/lib/morpheus/api/invoice_line_items_interface.rb +4 -9
- data/lib/morpheus/api/jobs_interface.rb +11 -14
- data/lib/morpheus/api/key_pairs_interface.rb +0 -6
- data/lib/morpheus/api/library_cluster_layouts_interface.rb +0 -6
- data/lib/morpheus/api/library_container_scripts_interface.rb +0 -6
- data/lib/morpheus/api/library_container_templates_interface.rb +0 -6
- data/lib/morpheus/api/library_container_types_interface.rb +0 -6
- data/lib/morpheus/api/library_container_upgrades_interface.rb +0 -6
- data/lib/morpheus/api/library_instance_types_interface.rb +0 -6
- data/lib/morpheus/api/library_layouts_interface.rb +0 -6
- data/lib/morpheus/api/library_spec_template_types_interface.rb +0 -6
- data/lib/morpheus/api/library_spec_templates_interface.rb +0 -6
- data/lib/morpheus/api/license_interface.rb +0 -6
- data/lib/morpheus/api/load_balancers_interface.rb +0 -6
- data/lib/morpheus/api/log_settings_interface.rb +9 -12
- data/lib/morpheus/api/logs_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_alerts_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_apps_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_checks_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_contacts_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_groups_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_incidents_interface.rb +0 -6
- data/lib/morpheus/api/monitoring_interface.rb +6 -12
- data/lib/morpheus/api/network_domain_records_interface.rb +0 -6
- data/lib/morpheus/api/network_domains_interface.rb +0 -6
- data/lib/morpheus/api/network_groups_interface.rb +0 -6
- data/lib/morpheus/api/network_pool_ips_interface.rb +0 -6
- data/lib/morpheus/api/network_pool_servers_interface.rb +0 -6
- data/lib/morpheus/api/network_pools_interface.rb +0 -6
- data/lib/morpheus/api/network_proxies_interface.rb +0 -6
- data/lib/morpheus/api/network_routers_interface.rb +0 -6
- data/lib/morpheus/api/network_security_servers_interface.rb +6 -9
- data/lib/morpheus/api/network_services_interface.rb +14 -14
- data/lib/morpheus/api/network_subnets_interface.rb +0 -6
- data/lib/morpheus/api/network_types_interface.rb +1 -7
- data/lib/morpheus/api/networks_interface.rb +0 -6
- data/lib/morpheus/api/option_type_lists_interface.rb +0 -6
- data/lib/morpheus/api/option_types_interface.rb +0 -6
- data/lib/morpheus/api/options_interface.rb +0 -6
- data/lib/morpheus/api/packages_interface.rb +0 -6
- data/lib/morpheus/api/policies_interface.rb +1 -8
- data/lib/morpheus/api/power_schedules_interface.rb +0 -6
- data/lib/morpheus/api/price_sets_interface.rb +8 -11
- data/lib/morpheus/api/prices_interface.rb +12 -15
- data/lib/morpheus/api/processes_interface.rb +0 -6
- data/lib/morpheus/api/provision_types_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_license_types_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_licenses_interface.rb +0 -6
- data/lib/morpheus/api/provisioning_settings_interface.rb +6 -9
- data/lib/morpheus/api/read_interface.rb +23 -0
- data/lib/morpheus/api/reports_interface.rb +0 -6
- data/lib/morpheus/api/rest_interface.rb +12 -10
- data/lib/morpheus/api/roles_interface.rb +7 -6
- data/lib/morpheus/api/security_group_rules_interface.rb +0 -7
- data/lib/morpheus/api/security_groups_interface.rb +0 -6
- data/lib/morpheus/api/server_types_interface.rb +0 -6
- data/lib/morpheus/api/servers_interface.rb +7 -6
- data/lib/morpheus/api/service_plans_interface.rb +11 -14
- data/lib/morpheus/api/storage_providers_interface.rb +9 -16
- data/lib/morpheus/api/subnet_types_interface.rb +1 -7
- data/lib/morpheus/api/subnets_interface.rb +0 -6
- data/lib/morpheus/api/task_sets_interface.rb +0 -6
- data/lib/morpheus/api/tasks_interface.rb +0 -6
- data/lib/morpheus/api/user_groups_interface.rb +0 -6
- data/lib/morpheus/api/user_settings_interface.rb +38 -18
- data/lib/morpheus/api/user_sources_interface.rb +0 -6
- data/lib/morpheus/api/users_interface.rb +0 -6
- data/lib/morpheus/api/vdi_allocations_interface.rb +9 -0
- data/lib/morpheus/api/vdi_apps_interface.rb +9 -0
- data/lib/morpheus/api/vdi_gateways_interface.rb +9 -0
- data/lib/morpheus/api/vdi_interface.rb +28 -0
- data/lib/morpheus/api/vdi_pools_interface.rb +19 -0
- data/lib/morpheus/api/virtual_images_interface.rb +0 -6
- data/lib/morpheus/api/whitelabel_settings_interface.rb +8 -11
- data/lib/morpheus/api/wiki_interface.rb +0 -6
- data/lib/morpheus/cli.rb +9 -2
- data/lib/morpheus/cli/access_token_command.rb +1 -1
- data/lib/morpheus/cli/account_groups_command.rb +4 -4
- data/lib/morpheus/cli/apps.rb +68 -84
- data/lib/morpheus/cli/archives_command.rb +5 -5
- data/lib/morpheus/cli/blueprints_command.rb +5 -5
- data/lib/morpheus/cli/boot_scripts_command.rb +1 -1
- data/lib/morpheus/cli/catalog_item_types_command.rb +13 -13
- data/lib/morpheus/cli/certificates_command.rb +575 -0
- data/lib/morpheus/cli/change_password_command.rb +4 -4
- data/lib/morpheus/cli/cli_command.rb +63 -7
- data/lib/morpheus/cli/clouds.rb +3 -2
- data/lib/morpheus/cli/clusters.rb +7 -4
- data/lib/morpheus/cli/commands/standard/history_command.rb +4 -5
- data/lib/morpheus/cli/commands/standard/man_command.rb +4 -5
- data/lib/morpheus/cli/credentials.rb +4 -11
- data/lib/morpheus/cli/environments_command.rb +1 -1
- data/lib/morpheus/cli/execute_schedules_command.rb +3 -3
- data/lib/morpheus/cli/hosts.rb +253 -232
- data/lib/morpheus/cli/image_builder_command.rb +6 -6
- data/lib/morpheus/cli/instance_types.rb +1 -1
- data/lib/morpheus/cli/instances.rb +196 -186
- data/lib/morpheus/cli/integrations_command.rb +1155 -42
- data/lib/morpheus/cli/invoices_command.rb +75 -67
- data/lib/morpheus/cli/key_pairs.rb +2 -2
- data/lib/morpheus/cli/library_container_scripts_command.rb +1 -1
- data/lib/morpheus/cli/library_container_templates_command.rb +1 -1
- data/lib/morpheus/cli/library_container_types_command.rb +6 -6
- data/lib/morpheus/cli/library_instance_types_command.rb +4 -4
- data/lib/morpheus/cli/library_layouts_command.rb +5 -5
- data/lib/morpheus/cli/library_option_lists_command.rb +4 -4
- data/lib/morpheus/cli/library_option_types_command.rb +4 -4
- data/lib/morpheus/cli/library_upgrades_command.rb +6 -6
- data/lib/morpheus/cli/license.rb +2 -2
- data/lib/morpheus/cli/load_balancers.rb +1 -1
- data/lib/morpheus/cli/login.rb +10 -1
- data/lib/morpheus/cli/mixins/option_source_helper.rb +15 -16
- data/lib/morpheus/cli/mixins/print_helper.rb +33 -18
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +4 -4
- data/lib/morpheus/cli/mixins/vdi_helper.rb +246 -0
- data/lib/morpheus/cli/network_domains_command.rb +2 -2
- data/lib/morpheus/cli/network_routers_command.rb +22 -9
- data/lib/morpheus/cli/networks_command.rb +2 -2
- data/lib/morpheus/cli/option_types.rb +39 -34
- data/lib/morpheus/cli/policies_command.rb +0 -1
- data/lib/morpheus/cli/power_schedules_command.rb +3 -3
- data/lib/morpheus/cli/preseed_scripts_command.rb +1 -1
- data/lib/morpheus/cli/remote.rb +2 -2
- data/lib/morpheus/cli/reports_command.rb +5 -2
- data/lib/morpheus/cli/roles.rb +224 -64
- data/lib/morpheus/cli/security_group_rules.rb +1 -1
- data/lib/morpheus/cli/service_plans_command.rb +4 -1
- data/lib/morpheus/cli/setup.rb +0 -1
- data/lib/morpheus/cli/subnets_command.rb +11 -2
- data/lib/morpheus/cli/tenants_command.rb +3 -3
- data/lib/morpheus/cli/user_groups_command.rb +3 -3
- data/lib/morpheus/cli/user_settings_command.rb +268 -57
- data/lib/morpheus/cli/user_sources_command.rb +3 -3
- data/lib/morpheus/cli/users.rb +3 -3
- data/lib/morpheus/cli/vdi_allocations_command.rb +159 -0
- data/lib/morpheus/cli/vdi_apps_command.rb +317 -0
- data/lib/morpheus/cli/vdi_command.rb +359 -0
- data/lib/morpheus/cli/vdi_gateways_command.rb +290 -0
- data/lib/morpheus/cli/vdi_pools_command.rb +571 -0
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/virtual_images.rb +1 -1
- data/lib/morpheus/cli/whoami.rb +0 -15
- data/lib/morpheus/cli/wiki_command.rb +1 -1
- data/lib/morpheus/rest_client.rb +30 -0
- data/lib/morpheus/terminal.rb +15 -7
- metadata +18 -2
@@ -16,7 +16,7 @@ class Morpheus::Cli::SecurityGroupRules
|
|
16
16
|
|
17
17
|
def connect(opts)
|
18
18
|
@api_client = establish_remote_appliance_connection(opts)
|
19
|
-
@security_group_rules_interface =
|
19
|
+
@security_group_rules_interface = @api_client.security_group_rules
|
20
20
|
@active_security_group = ::Morpheus::Cli::SecurityGroups.load_security_group_file
|
21
21
|
end
|
22
22
|
|
@@ -427,7 +427,10 @@ class Morpheus::Cli::ServicePlanCommand
|
|
427
427
|
# permissions
|
428
428
|
if !options[:no_prompt]
|
429
429
|
perms = prompt_permissions(options, ['plans', 'groupDefaults'])
|
430
|
-
|
430
|
+
if perms['resourcePool'] && !perms['resourcePool']['visibility'].nil?
|
431
|
+
params['visibility'] = perms['resourcePool']['visibility']
|
432
|
+
end
|
433
|
+
perms.delete('resourcePool')
|
431
434
|
params['permissions'] = perms
|
432
435
|
end
|
433
436
|
payload = {'servicePlan' => params}
|
data/lib/morpheus/cli/setup.rb
CHANGED
@@ -61,7 +61,6 @@ EOT
|
|
61
61
|
payload.deep_merge!(parse_passed_options(options))
|
62
62
|
|
63
63
|
# JD: This should just do a Remote.check_appliance() first... needs to work with --remote-url though.
|
64
|
-
# @setup_interface = Morpheus::SetupInterface.new({url:@appliance_url,access_token:@access_token})
|
65
64
|
appliance_status_json = nil
|
66
65
|
begin
|
67
66
|
appliance_status_json = @setup_interface.get()
|
@@ -349,8 +349,8 @@ class Morpheus::Cli::SubnetsCommand
|
|
349
349
|
subnet_type_option_types = subnet_type['optionTypes']
|
350
350
|
if subnet_type_option_types && subnet_type_option_types.size > 0
|
351
351
|
# prompt for option types
|
352
|
-
subnet_type_params = Morpheus::Cli::OptionTypes.prompt(subnet_type_option_types,options[:options],@api_client, {networkId: network['id']})
|
353
|
-
payload['subnet'].deep_merge!(subnet_type_params)
|
352
|
+
subnet_type_params = Morpheus::Cli::OptionTypes.prompt(subnet_type_option_types,options[:options],@api_client, {networkId: network['id'], zoneId: network['zone']['id']})
|
353
|
+
payload['subnet'].deep_merge!(subnet_type_params['subnet'])
|
354
354
|
|
355
355
|
else
|
356
356
|
# DEFAULT INPUTS
|
@@ -365,6 +365,14 @@ class Morpheus::Cli::SubnetsCommand
|
|
365
365
|
|
366
366
|
end
|
367
367
|
|
368
|
+
# CIDR
|
369
|
+
if options['cidr']
|
370
|
+
payload['subnet']['cidr'] = options['cidr']
|
371
|
+
elsif !subnet_type['code'].include? 'azure'
|
372
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'cidr', 'fieldLabel' => 'CIDR', 'type' => 'text', 'required' => true, 'description' => ''}], options)
|
373
|
+
payload['subnet']['cidr'] = v_prompt['cidr']
|
374
|
+
end
|
375
|
+
|
368
376
|
# DHCP
|
369
377
|
if options['dhcpServer']
|
370
378
|
payload['subnet']['dhcpServer'] = options['dhcpServer']
|
@@ -432,6 +440,7 @@ class Morpheus::Cli::SubnetsCommand
|
|
432
440
|
print_dry_run @subnets_interface.dry.create(network['id'], payload)
|
433
441
|
return
|
434
442
|
end
|
443
|
+
|
435
444
|
json_response = @subnets_interface.create(network['id'], payload)
|
436
445
|
if options[:json]
|
437
446
|
puts as_json(json_response, options)
|
@@ -25,9 +25,9 @@ class Morpheus::Cli::TenantsCommand
|
|
25
25
|
|
26
26
|
def connect(opts)
|
27
27
|
@api_client = establish_remote_appliance_connection(opts)
|
28
|
-
@users_interface =
|
29
|
-
@accounts_interface =
|
30
|
-
@roles_interface =
|
28
|
+
@users_interface = @api_client.users
|
29
|
+
@accounts_interface = @api_client.accounts
|
30
|
+
@roles_interface = @api_client.roles
|
31
31
|
end
|
32
32
|
|
33
33
|
def handle(args)
|
@@ -12,9 +12,9 @@ class Morpheus::Cli::UserGroupsCommand
|
|
12
12
|
|
13
13
|
def connect(opts)
|
14
14
|
@api_client = establish_remote_appliance_connection(opts)
|
15
|
-
@user_groups_interface =
|
16
|
-
@users_interface =
|
17
|
-
@accounts_interface =
|
15
|
+
@user_groups_interface = @api_client.user_groups
|
16
|
+
@users_interface = @api_client.users
|
17
|
+
@accounts_interface = @api_client.accounts
|
18
18
|
end
|
19
19
|
|
20
20
|
def handle(args)
|
@@ -6,7 +6,7 @@ class Morpheus::Cli::UserSettingsCommand
|
|
6
6
|
|
7
7
|
set_command_name :'user-settings'
|
8
8
|
|
9
|
-
register_subcommands :get, :update, :'update-avatar', :'view-avatar', :'regenerate-access-token', :'clear-access-token', :'list-clients'
|
9
|
+
register_subcommands :get, :update, :'update-avatar', :'remove-avatar', :'view-avatar', :'update-desktop-background', :'remove-desktop-background', :'view-desktop-background', :'regenerate-access-token', :'clear-access-token', :'list-clients'
|
10
10
|
|
11
11
|
set_default_subcommand :get
|
12
12
|
|
@@ -51,29 +51,20 @@ EOT
|
|
51
51
|
return 1
|
52
52
|
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
puts as_json(json_response, options, "user")
|
69
|
-
return 0
|
70
|
-
elsif options[:yaml]
|
71
|
-
puts as_yaml(json_response, options, "user")
|
72
|
-
return 0
|
73
|
-
elsif options[:csv]
|
74
|
-
puts records_as_csv([json_response['user']], options)
|
75
|
-
return 0
|
76
|
-
end
|
54
|
+
if options[:user]
|
55
|
+
user = find_user_by_username_or_id(nil, options[:user], {global:true})
|
56
|
+
return 1 if user.nil?
|
57
|
+
params['userId'] = user['id']
|
58
|
+
end
|
59
|
+
params.merge!(parse_list_options(options))
|
60
|
+
@user_settings_interface.setopts(options)
|
61
|
+
if options[:dry_run]
|
62
|
+
print_dry_run @user_settings_interface.dry.get(params)
|
63
|
+
return
|
64
|
+
end
|
65
|
+
json_response = @user_settings_interface.get(params)
|
66
|
+
|
67
|
+
render_response(json_response, options) do
|
77
68
|
|
78
69
|
user_settings = json_response['user'] || json_response['userSettings']
|
79
70
|
access_tokens = user_settings['accessTokens'] || json_response['accessTokens'] || json_response['apiAccessTokens'] || []
|
@@ -94,7 +85,11 @@ EOT
|
|
94
85
|
"Linux Key Pair" => lambda {|it| it['linuxKeyPairId'] },
|
95
86
|
"Windows Username" => lambda {|it| it['windowsUsername'] },
|
96
87
|
"Windows Password" => lambda {|it| it['windowsPassword'] },
|
88
|
+
"Default Group" => lambda {|it| it['defaultGroup'] ? it['defaultGroup']['name'] : '' },
|
89
|
+
"Default Cloud" => lambda {|it| it['defaultCloud'] ? it['defaultCloud']['name'] : '' },
|
97
90
|
"Default Persona" => lambda {|it| it['defaultPersona'] ? it['defaultPersona']['name'] : '' },
|
91
|
+
"Desktop Background" => lambda {|it| it['desktopBackground'] ? it['desktopBackground'].split('/').last : '' },
|
92
|
+
"2FA Enabled" => lambda {|it| it['isUsing2FA'].nil? ? '' : format_boolean(it['isUsing2FA']) },
|
98
93
|
}
|
99
94
|
print_description_list(description_cols, user_settings)
|
100
95
|
|
@@ -117,18 +112,15 @@ EOT
|
|
117
112
|
end
|
118
113
|
|
119
114
|
print reset #, "\n"
|
120
|
-
return 0
|
121
|
-
rescue RestClient::Exception => e
|
122
|
-
print_rest_exception(e, options)
|
123
|
-
return 1
|
124
115
|
end
|
116
|
+
return 0, nil
|
125
117
|
end
|
126
118
|
|
127
119
|
|
128
120
|
def update(args)
|
129
|
-
raw_args = args
|
130
121
|
options = {}
|
131
122
|
params = {}
|
123
|
+
query_params = {}
|
132
124
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
133
125
|
opts.banner = subcommand_usage("[options]")
|
134
126
|
opts.on("-u", "--user USER", "User username or ID") do |val|
|
@@ -138,7 +130,8 @@ EOT
|
|
138
130
|
params['userId'] = val.to_s
|
139
131
|
end
|
140
132
|
#opts.add_hidden_option('--user-id')
|
141
|
-
|
133
|
+
build_option_type_options(opts, options, update_user_settings_option_types)
|
134
|
+
build_standard_update_options(opts, options)
|
142
135
|
opts.footer = <<-EOT
|
143
136
|
Update user settings.
|
144
137
|
Done for the current user by default, unless a user is specified with the --user option.
|
@@ -152,29 +145,161 @@ EOT
|
|
152
145
|
return 1
|
153
146
|
end
|
154
147
|
|
148
|
+
if options[:user]
|
149
|
+
user = find_user_by_username_or_id(nil, options[:user], {global:true})
|
150
|
+
return 1 if user.nil?
|
151
|
+
params['userId'] = user['id']
|
152
|
+
end
|
153
|
+
|
154
|
+
payload = {}
|
155
|
+
if options[:payload]
|
156
|
+
payload = options[:payload]
|
157
|
+
payload.deep_merge!({'user' => parse_passed_options(options)})
|
158
|
+
else
|
159
|
+
params.deep_merge!(parse_passed_options(options))
|
160
|
+
# do not prompt on update
|
161
|
+
v_prompt = Morpheus::Cli::OptionTypes.no_prompt(update_user_settings_option_types, options[:options], @api_client, options[:params])
|
162
|
+
v_prompt.deep_compact!
|
163
|
+
params.deep_merge!(v_prompt)
|
164
|
+
# convert checkbox "on" and "off" to true and false
|
165
|
+
params.booleanize!
|
166
|
+
# upload requires multipart instead of json
|
167
|
+
if params['avatar']
|
168
|
+
params['avatar'] = File.new(File.expand_path(params['avatar']), 'rb')
|
169
|
+
payload[:multipart] = true
|
170
|
+
end
|
171
|
+
if params['desktopBackground']
|
172
|
+
params['desktopBackground'] = File.new(File.expand_path(params['desktopBackground']), 'rb')
|
173
|
+
payload[:multipart] = true
|
174
|
+
end
|
175
|
+
# userId goes in query string, not payload...
|
176
|
+
query_params['userId'] = params.delete('userId') if params.key?('userId')
|
177
|
+
payload.deep_merge!({'user' => params})
|
178
|
+
if payload['user'].empty? # || options[:no_prompt]
|
179
|
+
raise_command_error "Specify at least one option to update.\n#{optparse}"
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
@user_settings_interface.setopts(options)
|
184
|
+
if options[:dry_run]
|
185
|
+
print_dry_run @user_settings_interface.dry.update(payload, query_params)
|
186
|
+
return
|
187
|
+
end
|
188
|
+
json_response = @user_settings_interface.update(payload, query_params)
|
189
|
+
render_response(json_response, options) do
|
190
|
+
print_green_success "Updated user settings"
|
191
|
+
get_args = [] + (options[:remote] ? ["-r",options[:remote]] : []) + (query_params['userId'] ? ['--user-id', query_params['userId'].to_s] : [])
|
192
|
+
get(get_args)
|
193
|
+
end
|
194
|
+
return 0, nil
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
def update_avatar(args)
|
199
|
+
options = {}
|
200
|
+
params = {}
|
201
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
202
|
+
opts.banner = subcommand_usage("[file]")
|
203
|
+
opts.on("-u", "--user USER", "User username or ID") do |val|
|
204
|
+
options[:user] = val.to_s
|
205
|
+
end
|
206
|
+
opts.on("--user-id ID", String, "User ID") do |val|
|
207
|
+
params['userId'] = val.to_s
|
208
|
+
end
|
209
|
+
#opts.add_hidden_option('--user-id')
|
210
|
+
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
211
|
+
opts.footer = <<-EOT
|
212
|
+
Update avatar profile image.
|
213
|
+
[file] is required. This is the local path of a file to upload [png|jpg|svg].
|
214
|
+
Done for the current user by default, unless a user is specified with the --user option.
|
215
|
+
EOT
|
216
|
+
end
|
217
|
+
optparse.parse!(args)
|
218
|
+
connect(options)
|
219
|
+
if args.count != 1
|
220
|
+
print_error Morpheus::Terminal.angry_prompt
|
221
|
+
puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
222
|
+
return 1
|
223
|
+
end
|
224
|
+
filename = File.expand_path(args[0].to_s)
|
225
|
+
image_file = nil
|
226
|
+
if filename && File.file?(filename)
|
227
|
+
# maybe validate it's an image file? [.png|jpg|svg]
|
228
|
+
image_file = File.new(filename, 'rb')
|
229
|
+
else
|
230
|
+
# print_red_alert "File not found: #{filename}"
|
231
|
+
puts_error "#{Morpheus::Terminal.angry_prompt}File not found: #{filename}"
|
232
|
+
return 1
|
233
|
+
end
|
234
|
+
|
155
235
|
begin
|
156
236
|
if options[:user]
|
157
237
|
user = find_user_by_username_or_id(nil, options[:user], {global:true})
|
158
238
|
return 1 if user.nil?
|
159
239
|
params['userId'] = user['id']
|
160
240
|
end
|
161
|
-
|
162
|
-
if options[:
|
163
|
-
|
164
|
-
|
165
|
-
|
241
|
+
@user_settings_interface.setopts(options)
|
242
|
+
if options[:dry_run]
|
243
|
+
print_dry_run @user_settings_interface.dry.update_avatar(image_file, params)
|
244
|
+
return
|
245
|
+
end
|
246
|
+
json_response = @user_settings_interface.update_avatar(image_file, params)
|
247
|
+
if options[:quiet]
|
248
|
+
return 0
|
249
|
+
elsif options[:json]
|
250
|
+
puts as_json(json_response, options)
|
251
|
+
return 0
|
166
252
|
end
|
167
253
|
|
168
|
-
|
169
|
-
|
170
|
-
|
254
|
+
print_green_success "Updated avatar"
|
255
|
+
get_args = [] + (options[:remote] ? ["-r",options[:remote]] : []) + (params['userId'] ? ['--user-id', params['userId'].to_s] : [])
|
256
|
+
get(get_args)
|
257
|
+
return 0
|
258
|
+
rescue RestClient::Exception => e
|
259
|
+
print_rest_exception(e, options)
|
260
|
+
return 1
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def remove_avatar(args)
|
265
|
+
options = {}
|
266
|
+
params = {}
|
267
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
268
|
+
opts.banner = subcommand_usage()
|
269
|
+
opts.on("-u", "--user USER", "User username or ID") do |val|
|
270
|
+
options[:user] = val.to_s
|
271
|
+
end
|
272
|
+
opts.on("--user-id ID", String, "User ID") do |val|
|
273
|
+
params['userId'] = val.to_s
|
274
|
+
end
|
275
|
+
#opts.add_hidden_option('--user-id')
|
276
|
+
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
277
|
+
opts.footer = <<-EOT
|
278
|
+
Remove avatar profile image.
|
279
|
+
[file] is required. This is the local path of a file to upload [png|jpg|svg].
|
280
|
+
Done for the current user by default, unless a user is specified with the --user option.
|
281
|
+
EOT
|
282
|
+
end
|
283
|
+
optparse.parse!(args)
|
284
|
+
connect(options)
|
285
|
+
if args.count != 0
|
286
|
+
print_error Morpheus::Terminal.angry_prompt
|
287
|
+
puts_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
288
|
+
return 1
|
289
|
+
end
|
290
|
+
|
291
|
+
begin
|
292
|
+
if options[:user]
|
293
|
+
user = find_user_by_username_or_id(nil, options[:user], {global:true})
|
294
|
+
return 1 if user.nil?
|
295
|
+
params['userId'] = user['id']
|
171
296
|
end
|
172
297
|
@user_settings_interface.setopts(options)
|
173
298
|
if options[:dry_run]
|
174
|
-
print_dry_run @user_settings_interface.dry.
|
299
|
+
print_dry_run @user_settings_interface.dry.remove_avatar(params)
|
175
300
|
return
|
176
301
|
end
|
177
|
-
json_response = @user_settings_interface.
|
302
|
+
json_response = @user_settings_interface.remove_avatar(params)
|
178
303
|
if options[:quiet]
|
179
304
|
return 0
|
180
305
|
elsif options[:json]
|
@@ -182,7 +307,7 @@ EOT
|
|
182
307
|
return 0
|
183
308
|
end
|
184
309
|
|
185
|
-
print_green_success "
|
310
|
+
print_green_success "Removed avatar"
|
186
311
|
get_args = [] + (options[:remote] ? ["-r",options[:remote]] : []) + (params['userId'] ? ['--user-id', params['userId'].to_s] : [])
|
187
312
|
get(get_args)
|
188
313
|
return 0
|
@@ -192,7 +317,65 @@ EOT
|
|
192
317
|
end
|
193
318
|
end
|
194
319
|
|
195
|
-
def
|
320
|
+
def view_avatar(args)
|
321
|
+
raw_args = args
|
322
|
+
options = {}
|
323
|
+
params = {}
|
324
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
325
|
+
opts.banner = subcommand_usage()
|
326
|
+
opts.on("-u", "--user USER", "User username or ID") do |val|
|
327
|
+
options[:user] = val.to_s
|
328
|
+
end
|
329
|
+
opts.on("--user-id ID", String, "User ID") do |val|
|
330
|
+
params['userId'] = val.to_s
|
331
|
+
end
|
332
|
+
#opts.add_hidden_option('--user-id')
|
333
|
+
build_common_options(opts, options, [:remote])
|
334
|
+
opts.footer = <<-EOT
|
335
|
+
View avatar profile image.
|
336
|
+
This opens the avatar image url with a web browser.
|
337
|
+
Done for the current user by default, unless a user is specified with the --user option.
|
338
|
+
EOT
|
339
|
+
end
|
340
|
+
optparse.parse!(args)
|
341
|
+
connect(options)
|
342
|
+
if args.count != 0
|
343
|
+
print_error Morpheus::Terminal.angry_prompt
|
344
|
+
puts_error "wrong number of arguments, expected 0 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
345
|
+
return 1
|
346
|
+
end
|
347
|
+
|
348
|
+
begin
|
349
|
+
if options[:user]
|
350
|
+
user = find_user_by_username_or_id(nil, options[:user], {global:true})
|
351
|
+
return 1 if user.nil?
|
352
|
+
params['userId'] = user['id']
|
353
|
+
end
|
354
|
+
json_response = @user_settings_interface.get(params)
|
355
|
+
user_settings = json_response['user'] || json_response['userSettings']
|
356
|
+
|
357
|
+
if user_settings['avatar']
|
358
|
+
link = user_settings['avatar']
|
359
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
360
|
+
system "start #{link}"
|
361
|
+
elsif RbConfig::CONFIG['host_os'] =~ /darwin/
|
362
|
+
system "open #{link}"
|
363
|
+
elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
|
364
|
+
system "xdg-open #{link}"
|
365
|
+
end
|
366
|
+
return 0, nil
|
367
|
+
else
|
368
|
+
print_error red,"No avatar image found.",reset,"\n"
|
369
|
+
return 1
|
370
|
+
end
|
371
|
+
|
372
|
+
rescue RestClient::Exception => e
|
373
|
+
print_rest_exception(e, options)
|
374
|
+
return 1
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def update_desktop_background(args)
|
196
379
|
options = {}
|
197
380
|
params = {}
|
198
381
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
@@ -206,7 +389,7 @@ EOT
|
|
206
389
|
#opts.add_hidden_option('--user-id')
|
207
390
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
208
391
|
opts.footer = <<-EOT
|
209
|
-
Update
|
392
|
+
Update desktop background image used in the VDI persona.
|
210
393
|
[file] is required. This is the local path of a file to upload [png|jpg|svg].
|
211
394
|
Done for the current user by default, unless a user is specified with the --user option.
|
212
395
|
EOT
|
@@ -237,10 +420,10 @@ EOT
|
|
237
420
|
end
|
238
421
|
@user_settings_interface.setopts(options)
|
239
422
|
if options[:dry_run]
|
240
|
-
print_dry_run @user_settings_interface.dry.
|
423
|
+
print_dry_run @user_settings_interface.dry.update_desktop_background(image_file, params)
|
241
424
|
return
|
242
425
|
end
|
243
|
-
json_response = @user_settings_interface.
|
426
|
+
json_response = @user_settings_interface.update_desktop_background(image_file, params)
|
244
427
|
if options[:quiet]
|
245
428
|
return 0
|
246
429
|
elsif options[:json]
|
@@ -248,7 +431,7 @@ EOT
|
|
248
431
|
return 0
|
249
432
|
end
|
250
433
|
|
251
|
-
print_green_success "Updated
|
434
|
+
print_green_success "Updated desktop background"
|
252
435
|
get_args = [] + (options[:remote] ? ["-r",options[:remote]] : []) + (params['userId'] ? ['--user-id', params['userId'].to_s] : [])
|
253
436
|
get(get_args)
|
254
437
|
return 0
|
@@ -258,7 +441,7 @@ EOT
|
|
258
441
|
end
|
259
442
|
end
|
260
443
|
|
261
|
-
def
|
444
|
+
def remove_desktop_background(args)
|
262
445
|
options = {}
|
263
446
|
params = {}
|
264
447
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
@@ -272,7 +455,7 @@ EOT
|
|
272
455
|
#opts.add_hidden_option('--user-id')
|
273
456
|
build_common_options(opts, options, [:json, :dry_run, :quiet, :remote])
|
274
457
|
opts.footer = <<-EOT
|
275
|
-
Remove
|
458
|
+
Remove desktop background image.
|
276
459
|
[file] is required. This is the local path of a file to upload [png|jpg|svg].
|
277
460
|
Done for the current user by default, unless a user is specified with the --user option.
|
278
461
|
EOT
|
@@ -293,10 +476,10 @@ EOT
|
|
293
476
|
end
|
294
477
|
@user_settings_interface.setopts(options)
|
295
478
|
if options[:dry_run]
|
296
|
-
print_dry_run @user_settings_interface.dry.
|
479
|
+
print_dry_run @user_settings_interface.dry.remove_desktop_background(params)
|
297
480
|
return
|
298
481
|
end
|
299
|
-
json_response = @user_settings_interface.
|
482
|
+
json_response = @user_settings_interface.remove_desktop_background(params)
|
300
483
|
if options[:quiet]
|
301
484
|
return 0
|
302
485
|
elsif options[:json]
|
@@ -304,7 +487,7 @@ EOT
|
|
304
487
|
return 0
|
305
488
|
end
|
306
489
|
|
307
|
-
print_green_success "Removed
|
490
|
+
print_green_success "Removed desktop background"
|
308
491
|
get_args = [] + (options[:remote] ? ["-r",options[:remote]] : []) + (params['userId'] ? ['--user-id', params['userId'].to_s] : [])
|
309
492
|
get(get_args)
|
310
493
|
return 0
|
@@ -314,7 +497,7 @@ EOT
|
|
314
497
|
end
|
315
498
|
end
|
316
499
|
|
317
|
-
def
|
500
|
+
def view_desktop_background(args)
|
318
501
|
raw_args = args
|
319
502
|
options = {}
|
320
503
|
params = {}
|
@@ -329,8 +512,8 @@ EOT
|
|
329
512
|
#opts.add_hidden_option('--user-id')
|
330
513
|
build_common_options(opts, options, [:remote])
|
331
514
|
opts.footer = <<-EOT
|
332
|
-
View
|
333
|
-
This opens the
|
515
|
+
View desktop background image.
|
516
|
+
This opens the desktop background image url with a web browser.
|
334
517
|
Done for the current user by default, unless a user is specified with the --user option.
|
335
518
|
EOT
|
336
519
|
end
|
@@ -351,8 +534,8 @@ EOT
|
|
351
534
|
json_response = @user_settings_interface.get(params)
|
352
535
|
user_settings = json_response['user'] || json_response['userSettings']
|
353
536
|
|
354
|
-
if user_settings['
|
355
|
-
link = user_settings['
|
537
|
+
if user_settings['desktopBackground']
|
538
|
+
link = user_settings['desktopBackground']
|
356
539
|
if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
357
540
|
system "start #{link}"
|
358
541
|
elsif RbConfig::CONFIG['host_os'] =~ /darwin/
|
@@ -362,7 +545,7 @@ EOT
|
|
362
545
|
end
|
363
546
|
return 0, nil
|
364
547
|
else
|
365
|
-
print_error red,"No
|
548
|
+
print_error red,"No desktop background image found.",reset,"\n"
|
366
549
|
return 1
|
367
550
|
end
|
368
551
|
|
@@ -600,4 +783,32 @@ EOT
|
|
600
783
|
end
|
601
784
|
end
|
602
785
|
|
786
|
+
protected
|
787
|
+
|
788
|
+
def update_user_settings_option_types
|
789
|
+
[
|
790
|
+
# todo: rest of the available user settings!
|
791
|
+
{'switch' => 'change-username', 'fieldName' => 'username', 'fieldLabel' => 'Username', 'type' => 'text', 'description' => 'Change user credentials to use a new username'},
|
792
|
+
{'switch' => 'change-password', 'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'description' => 'Change user credentials to use a new password'},
|
793
|
+
{'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text'},
|
794
|
+
{'fieldName' => 'firstName', 'fieldLabel' => 'First Name', 'type' => 'text'},
|
795
|
+
{'fieldName' => 'lastName', 'fieldLabel' => 'Last Name', 'type' => 'text'},
|
796
|
+
{'fieldName' => 'email', 'fieldLabel' => 'Email', 'type' => 'text'},
|
797
|
+
{'fieldName' => 'receiveNotifications', 'fieldLabel' => 'Receive Notifications', 'type' => 'checkbox'},
|
798
|
+
{'fieldName' => 'linuxUsername', 'fieldLabel' => 'Linux Username', 'type' => 'text'},
|
799
|
+
{'fieldName' => 'linuxPassword', 'fieldLabel' => 'Linux Password', 'type' => 'password'},
|
800
|
+
{'fieldName' => 'linuxKeyPairId', 'fieldLabel' => 'Linux Key Pair ID', 'type' => 'password'},
|
801
|
+
{'fieldName' => 'windowsUsername', 'fieldLabel' => 'Windows Username', 'type' => 'text'},
|
802
|
+
{'fieldName' => 'windowsPassword', 'fieldLabel' => 'Windows Password', 'type' => 'password'},
|
803
|
+
{'fieldName' => 'defaultGroup', 'fieldLabel' => 'Default Group ID', 'type' => 'text'},
|
804
|
+
{'fieldName' => 'defaultCloud', 'fieldLabel' => 'Default Cloud ID', 'type' => 'text'},
|
805
|
+
{'fieldName' => 'defaultPersona', 'fieldLabel' => 'Default Persona Name or Code or ID', 'type' => 'text'},
|
806
|
+
{'switch' => 'change-password', 'fieldName' => 'password', 'fieldLabel' => 'Password', 'type' => 'password', 'description' => 'Change user credentials to use a new password'},
|
807
|
+
{'fieldName' => 'avatar', 'fieldLabel' => 'Avatar', 'type' => 'file', 'description' => 'Local filepath of image file to upload as user avatar'},
|
808
|
+
{'fieldName' => 'desktopBackground', 'fieldLabel' => 'Desktop Background', 'type' => 'file', 'description' => 'Local filepath of image file to upload as user desktop background'},
|
809
|
+
# api cannot yet modify isUsing2fa
|
810
|
+
# {'switch' => '2fa', 'fieldName' => 'isUsing2fa', 'fieldLabel' => '2FA Enabled', 'type' => 'checkbox', 'description' => 'Enable or Disable 2FA for your user.'}
|
811
|
+
]
|
812
|
+
end
|
813
|
+
|
603
814
|
end
|