morpheus-cli 5.3.2.2 → 5.4.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/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +26 -1
- data/lib/morpheus/api/clouds_interface.rb +4 -11
- data/lib/morpheus/api/health_interface.rb +37 -3
- data/lib/morpheus/api/instances_interface.rb +18 -5
- data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
- data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
- data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
- data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
- data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
- data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
- data/lib/morpheus/api/network_routers_interface.rb +21 -0
- data/lib/morpheus/api/network_servers_interface.rb +98 -0
- data/lib/morpheus/api/rest_interface.rb +2 -1
- data/lib/morpheus/api/roles_interface.rb +7 -0
- data/lib/morpheus/api/virtual_images_interface.rb +23 -2
- data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
- data/lib/morpheus/cli/cli_command.rb +21 -14
- data/lib/morpheus/cli/cli_registry.rb +56 -2
- data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
- data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
- data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
- data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +0 -3
- data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
- data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
- data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +3 -11
- data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
- data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
- data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
- data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
- data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
- data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +0 -0
- data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
- data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
- data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
- data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
- data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
- data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
- data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
- data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
- data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
- data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
- data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +51 -39
- data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
- data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
- data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
- data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
- data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
- data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
- data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
- data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
- data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
- data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
- data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
- data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
- data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
- data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
- data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
- data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
- data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
- data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
- data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
- data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
- data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
- data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +0 -10
- data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
- data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
- data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +364 -148
- data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
- data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
- data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
- data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
- data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
- data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
- data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
- data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
- data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
- data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
- data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
- data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
- data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
- data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
- data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
- data/lib/morpheus/cli/commands/load_balancer_pools.rb +111 -0
- data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +0 -4
- data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +136 -0
- data/lib/morpheus/cli/commands/load_balancers.rb +89 -0
- data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
- data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
- data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
- data/lib/morpheus/cli/commands/logout.rb +63 -0
- data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
- data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
- data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
- data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
- data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
- data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
- data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
- data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
- data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
- data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
- data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
- data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
- data/lib/morpheus/cli/commands/network_firewalls_command.rb +806 -0
- data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
- data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
- data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
- data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
- data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +291 -12
- data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
- data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
- data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
- data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
- data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
- data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +0 -7
- data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
- data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
- data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
- data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +0 -0
- data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
- data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
- data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
- data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
- data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
- data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +1 -7
- data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
- data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +244 -39
- data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
- data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
- data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
- data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
- data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
- data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
- data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
- data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +2 -103
- data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
- data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
- data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
- data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
- data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
- data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
- data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +0 -7
- data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
- data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
- data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +0 -1
- data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +0 -0
- data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +0 -1
- data/lib/morpheus/cli/{users.rb → commands/users.rb} +0 -7
- data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
- data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
- data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
- data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
- data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
- data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
- data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
- data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
- data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
- data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
- data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
- data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
- data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
- data/lib/morpheus/cli/mixins/print_helper.rb +1 -0
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +155 -112
- data/lib/morpheus/cli/mixins/rest_command.rb +154 -52
- data/lib/morpheus/cli/mixins/secondary_rest_command.rb +575 -0
- data/lib/morpheus/cli/option_parser.rb +25 -17
- data/lib/morpheus/cli/option_types.rb +96 -32
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli.rb +5 -128
- data/lib/morpheus/terminal.rb +5 -6
- data/morpheus-cli.gemspec +1 -1
- metadata +156 -143
- data/lib/morpheus/cli/change_password_command.rb +0 -147
- data/lib/morpheus/cli/library.rb +0 -1
- data/lib/morpheus/cli/load_balancers.rb +0 -245
- data/lib/morpheus/cli/logout.rb +0 -81
|
@@ -0,0 +1,806 @@
|
|
|
1
|
+
require 'morpheus/cli/cli_command'
|
|
2
|
+
|
|
3
|
+
class Morpheus::Cli::NetworkFirewallsCommand
|
|
4
|
+
include Morpheus::Cli::CliCommand
|
|
5
|
+
include Morpheus::Cli::ProvisioningHelper
|
|
6
|
+
include Morpheus::Cli::WhoamiHelper
|
|
7
|
+
set_command_hidden #hide until api ready
|
|
8
|
+
set_command_name :'network-firewalls'
|
|
9
|
+
register_subcommands :list_rules, :get_rule, :add_rule, :update_rule, :remove_rule
|
|
10
|
+
register_subcommands :list_rule_groups, :get_rule_group, :add_rule_group, :update_rule_group, :remove_rule_group
|
|
11
|
+
|
|
12
|
+
def connect(opts)
|
|
13
|
+
@api_client = establish_remote_appliance_connection(opts)
|
|
14
|
+
@account_interface = @api_client.accounts
|
|
15
|
+
@network_servers_interface = @api_client.network_servers
|
|
16
|
+
@options_interface = @api_client.options
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def handle(args)
|
|
20
|
+
handle_subcommand(args)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def list_rules(args)
|
|
24
|
+
options = {}
|
|
25
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
26
|
+
opts.banner = subcommand_usage("[server]")
|
|
27
|
+
build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
|
28
|
+
opts.footer = "List network firewall rules." + "\n" +
|
|
29
|
+
"[server] is optional. This is the name or id of a network server."
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
optparse.parse!(args)
|
|
33
|
+
connect(options)
|
|
34
|
+
|
|
35
|
+
if args.count > 1
|
|
36
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
37
|
+
puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
38
|
+
return 1
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
42
|
+
server = find_network_server(server_id)
|
|
43
|
+
return 1 if server.nil?
|
|
44
|
+
|
|
45
|
+
_list_rules(server, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def _list_rules(server, options)
|
|
49
|
+
params = parse_list_options(options)
|
|
50
|
+
@network_servers_interface.setopts(options)
|
|
51
|
+
|
|
52
|
+
if options[:dry_run]
|
|
53
|
+
print_dry_run @network_servers_interface.dry.list_firewall_rules(server['id'], params)
|
|
54
|
+
return
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
json_response = @network_servers_interface.list_firewall_rules(server['id'], params)
|
|
58
|
+
render_response(json_response, options, 'rules') do
|
|
59
|
+
print_h1 "Network Firewall Rules For: #{server['name']}"
|
|
60
|
+
print cyan
|
|
61
|
+
|
|
62
|
+
app_title = server['type']['titleFirewallApplications'].tr(' ', '_').downcase
|
|
63
|
+
rows = json_response['rules'].collect {|it|
|
|
64
|
+
row = {
|
|
65
|
+
id: it['id'], group: it['groupName'], name: it['name'], description: it['description'],
|
|
66
|
+
priority: it['priority'], enabled: format_boolean(it['enabled']), policy: it['policy'], direction: it['direction'],
|
|
67
|
+
source: it['sources'].kind_of?(Array) && it['sources'].count > 0 ? it['sources'].collect {|it| it['name']}.join(', ') : (it['sources'].nil? || it['sources'].empty? ? 'any' : it['source']),
|
|
68
|
+
destination: it['destinations'].count > 0 ? it['destinations'].collect {|it| it['name']}.join(', ') : (it['destinations'].nil? || it['destinations'].empty? ? 'any' : it['destination'])
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if it['applications'].count
|
|
72
|
+
row[app_title] = it['applications'].slice(0, 2).collect {|it| it['name']}.join(', ') + (it['applications'].count > 2 ? '... ' : ' ')
|
|
73
|
+
end
|
|
74
|
+
if it['protocal'] || it['portRange']
|
|
75
|
+
row[app_title] += "#{(it['protocol'] || 'any')} #{it['portRange'] || ''}"
|
|
76
|
+
end
|
|
77
|
+
row[app_title] = 'Any' if it['applications'].count == 0 && row['protocol'].nil? && row['portRange'].nil?
|
|
78
|
+
|
|
79
|
+
applied_to = []
|
|
80
|
+
if server['type']['supportsFirewallRuleAppliedTarget']
|
|
81
|
+
applied_to << 'All Edges' if row['config']['applyToAllEdges']
|
|
82
|
+
applied_to << 'Distributed Firewall' if row['config']['applyToAllDistributed']
|
|
83
|
+
applied_to += rule['appliedTargets'].collect {|it| it['name']}
|
|
84
|
+
row[:applied_to] = applied_to.join(', ')
|
|
85
|
+
end
|
|
86
|
+
row
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
cols = [:id]
|
|
90
|
+
|
|
91
|
+
if server['type']['hasFirewallGroups']
|
|
92
|
+
cols += [:group]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
cols += [:name, :description]
|
|
96
|
+
cols += [:priority] if server['type']['hasSecurityGroupRulePriority']
|
|
97
|
+
cols += [:applied_to] if server['type']['supportsFirewallRuleAppliedTarget']
|
|
98
|
+
cols += [:enabled, :policy, :direction, :source, :destination, app_title.to_sym]
|
|
99
|
+
puts as_pretty_table(rows, cols)
|
|
100
|
+
end
|
|
101
|
+
print reset
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def get_rule(args)
|
|
105
|
+
options = {}
|
|
106
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
107
|
+
opts.banner = subcommand_usage("[server] [rule]")
|
|
108
|
+
build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
|
|
109
|
+
opts.footer = "Display details on a network firewall rule." + "\n" +
|
|
110
|
+
"[server] is optional. This is the name or id of a network server.\n" +
|
|
111
|
+
"[rule] is optional. This is the id of a network firewall rule.\n"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
optparse.parse!(args)
|
|
115
|
+
connect(options)
|
|
116
|
+
|
|
117
|
+
if args.count > 2
|
|
118
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
119
|
+
puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
120
|
+
return 1
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
124
|
+
server = find_network_server(server_id)
|
|
125
|
+
return 1 if server.nil?
|
|
126
|
+
|
|
127
|
+
rule_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
|
|
128
|
+
_get_rule(server, rule_id, options)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def _get_rule(server, name_or_id, options)
|
|
132
|
+
@network_servers_interface.setopts(options)
|
|
133
|
+
|
|
134
|
+
if options[:dry_run]
|
|
135
|
+
if name_or_id.to_s =~ /\A\d{1,}\Z/
|
|
136
|
+
print_dry_run @network_servers_interface.dry.get_firewall_rule(server['id'], name_or_id.to_i)
|
|
137
|
+
else
|
|
138
|
+
print_dry_run @network_servers_interface.dry.get_firewall_rule(server['id'], {name: name_or_id})
|
|
139
|
+
end
|
|
140
|
+
return
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
if server['type']['hasFirewall']
|
|
144
|
+
rule = find_rule(server['id'], name_or_id)
|
|
145
|
+
|
|
146
|
+
return 1 if rule.nil?
|
|
147
|
+
|
|
148
|
+
render_response({rule: rule}, options, 'rule') do
|
|
149
|
+
print_h1 "Network Firewall Rule Details"
|
|
150
|
+
print cyan
|
|
151
|
+
|
|
152
|
+
description_cols = {
|
|
153
|
+
"ID" => lambda {|it| it['id']},
|
|
154
|
+
"Name" => lambda {|it| it['name']},
|
|
155
|
+
"Description" => lambda {|it| it['description']},
|
|
156
|
+
"Enabled" => lambda {|it| format_boolean(it['enabled'])},
|
|
157
|
+
"Priority" => lambda {|it| it['priority']}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
server['type']['ruleOptionTypes'].reject {|it| it['type'] == 'hidden'}.sort_by {|it| it['displayOrder']}.each do |option_type|
|
|
161
|
+
description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
|
|
162
|
+
end
|
|
163
|
+
print_description_list(description_cols, rule)
|
|
164
|
+
end
|
|
165
|
+
else
|
|
166
|
+
print_red_alert "Firewall not supported for #{server['type']['name']}"
|
|
167
|
+
end
|
|
168
|
+
println reset
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def add_rule(args)
|
|
172
|
+
options = {:options=>{}}
|
|
173
|
+
params = {}
|
|
174
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
175
|
+
opts.banner = subcommand_usage("[server] [group]")
|
|
176
|
+
opts.on( '-g', '--group GROUP', String, "Rule group name or ID" ) do |val|
|
|
177
|
+
options[:group] = val
|
|
178
|
+
end
|
|
179
|
+
opts.on('-n', '--name VALUE', String, "Name for this firewall rule") do |val|
|
|
180
|
+
options[:options]['name'] = val
|
|
181
|
+
end
|
|
182
|
+
opts.on('-D', '--description VALUE', String, "Description for this firewall rule") do |val|
|
|
183
|
+
options[:options]['description'] = val
|
|
184
|
+
end
|
|
185
|
+
opts.on('--priority VALUE', Integer, "Priority for this firewall rule") do |val|
|
|
186
|
+
options[:options]['priority'] = val
|
|
187
|
+
end
|
|
188
|
+
opts.on('--enabled [on|off]', String, "Can be used to disable") do |val|
|
|
189
|
+
options[:options]['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
|
|
190
|
+
end
|
|
191
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
192
|
+
opts.footer = "Create a network firewall rule." + "\n" +
|
|
193
|
+
"[server] is optional. This is the name or id of a network server.\n" +
|
|
194
|
+
"[group] is optional. This is the name of id of rule group (applicable to select network servers)."
|
|
195
|
+
end
|
|
196
|
+
optparse.parse!(args)
|
|
197
|
+
connect(options)
|
|
198
|
+
|
|
199
|
+
if args.count > 2
|
|
200
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
201
|
+
puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
202
|
+
return 1
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
206
|
+
server = find_network_server(server_id)
|
|
207
|
+
return 1 if server.nil?
|
|
208
|
+
|
|
209
|
+
options[:group] = args[1] if options[:group].nil? && args.count == 2
|
|
210
|
+
|
|
211
|
+
if !server['type']['hasFirewall']
|
|
212
|
+
print_red_alert "Firewall not supported for #{server['type']['name']}"
|
|
213
|
+
return 1
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
if options[:payload]
|
|
217
|
+
payload = options[:payload]
|
|
218
|
+
else
|
|
219
|
+
if server['type']['hasFirewallGroups']
|
|
220
|
+
if !options[:group].nil?
|
|
221
|
+
group = find_rule_group(server['id'], options[:group])
|
|
222
|
+
if group.nil?
|
|
223
|
+
return 1
|
|
224
|
+
end
|
|
225
|
+
group_id = group['id']
|
|
226
|
+
else
|
|
227
|
+
avail_groups = @network_servers_interface.list_firewall_rule_groups(server['id'])['ruleGroups'].collect {|it| {'name' => it['name'], 'value' => it['id']}}
|
|
228
|
+
group_id = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Rule Group', 'selectOptions' => avail_groups, 'required' => true, 'description' => 'Select Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
|
|
229
|
+
end
|
|
230
|
+
params['ruleGroup'] = {'id' => group_id}
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'Name.'}],options[:options],@api_client,{})['name']
|
|
234
|
+
params['description'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false, 'description' => 'Description.'}],options[:options],@api_client,{})['description']
|
|
235
|
+
params['enabled'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'description' => 'Enable Router.', 'defaultValue' => true, 'required' => false}], options[:options], @api_client, {})['enabled'] == 'on'
|
|
236
|
+
|
|
237
|
+
if server['type']['hasSecurityGroupRulePriority']
|
|
238
|
+
params['priority'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'priority', 'type' => 'number', 'fieldLabel' => 'Priority', 'required' => false, 'description' => 'Priority.'}],options[:options],@api_client,{})['priority']
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
option_types = server['type']['ruleOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
242
|
+
|
|
243
|
+
# prompt options
|
|
244
|
+
option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'rule' => ''}}), @api_client, {'networkServerId' => server['id']}, nil, true)
|
|
245
|
+
payload = {'rule' => params.deep_merge(option_result)}
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
@network_servers_interface.setopts(options)
|
|
249
|
+
|
|
250
|
+
if options[:dry_run]
|
|
251
|
+
print_dry_run @network_servers_interface.dry.create_firewall_rule(server['id'], payload)
|
|
252
|
+
return
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
json_response = @network_servers_interface.create_firewall_rule(server['id'], payload)
|
|
256
|
+
render_response(json_response, options, 'rule') do
|
|
257
|
+
print_green_success "\nAdded Network Firewall Rule #{json_response['id']}\n"
|
|
258
|
+
_get_rule(server, json_response['id'], options)
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def update_rule(args)
|
|
263
|
+
options = {:options=>{}}
|
|
264
|
+
params = {}
|
|
265
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
266
|
+
opts.banner = subcommand_usage("[server] [rule]")
|
|
267
|
+
opts.on('-n', '--name VALUE', String, "Name for this firewall rule") do |val|
|
|
268
|
+
params['name'] = val
|
|
269
|
+
end
|
|
270
|
+
opts.on('-D', '--description VALUE', String, "Description for this firewall rule") do |val|
|
|
271
|
+
params['description'] = val
|
|
272
|
+
end
|
|
273
|
+
opts.on('--priority VALUE', Integer, "Priority for this firewall rule") do |val|
|
|
274
|
+
params['priority'] = val
|
|
275
|
+
end
|
|
276
|
+
opts.on('--enabled [on|off]', String, "Can be used to disable") do |val|
|
|
277
|
+
params['enabled'] = val.to_s == 'on' || val.to_s == 'true' || val.to_s.empty?
|
|
278
|
+
end
|
|
279
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
280
|
+
opts.footer = "Update a network firewall rule.\n" +
|
|
281
|
+
"[server] is optional. This is the name or id of a network server.\n" +
|
|
282
|
+
"[rule] is optional. This is the name or id of an existing rule."
|
|
283
|
+
end
|
|
284
|
+
optparse.parse!(args)
|
|
285
|
+
if args.count > 2
|
|
286
|
+
raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
|
|
287
|
+
end
|
|
288
|
+
connect(options)
|
|
289
|
+
|
|
290
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
291
|
+
server = find_network_server(server_id)
|
|
292
|
+
return 1 if server.nil?
|
|
293
|
+
|
|
294
|
+
if !server['type']['hasFirewall']
|
|
295
|
+
print_red_alert "Firewall not supported for #{server['type']['name']}"
|
|
296
|
+
return 1
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
rule_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
|
|
300
|
+
rule = find_rule(server['id'], rule_id)
|
|
301
|
+
return 1 if rule.nil?
|
|
302
|
+
|
|
303
|
+
payload = parse_payload(options) || {'rule' => params}
|
|
304
|
+
payload['rule'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['rule'].nil?
|
|
305
|
+
|
|
306
|
+
if payload['rule'].empty?
|
|
307
|
+
option_types = server['type']['ruleOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
308
|
+
print_green_success "Nothing to update"
|
|
309
|
+
println cyan
|
|
310
|
+
edit_option_types = option_types.reject {|it| !it['editable'] || !it['showOnEdit']}
|
|
311
|
+
|
|
312
|
+
if edit_option_types.count > 0
|
|
313
|
+
print Morpheus::Cli::OptionTypes.display_option_types_help(
|
|
314
|
+
option_types,
|
|
315
|
+
{:include_context => true, :context_map => {'rule' => ''}, :color => cyan, :title => "Available Firewall Rule Options"}
|
|
316
|
+
)
|
|
317
|
+
end
|
|
318
|
+
exit 1
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
@network_servers_interface.setopts(options)
|
|
322
|
+
|
|
323
|
+
if options[:dry_run]
|
|
324
|
+
print_dry_run @network_servers_interface.dry.update_firewall_rule(server['id'], rule['id'], payload)
|
|
325
|
+
return
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
json_response = @network_servers_interface.update_firewall_rule(server['id'], rule['id'], payload)
|
|
329
|
+
render_response(json_response, options, 'rule') do
|
|
330
|
+
print_green_success "\nUpdated Network Firewall Rule #{rule['id']}\n"
|
|
331
|
+
_get_rule(server, rule['id'], options)
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def remove_rule(args)
|
|
336
|
+
options = {}
|
|
337
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
338
|
+
opts.banner = subcommand_usage("[server] [rule]")
|
|
339
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
|
|
340
|
+
opts.footer = "Delete a network firewall rule.\n" +
|
|
341
|
+
"[server] is optional. This is the name or id of a network server.\n" +
|
|
342
|
+
"[rule] is optional. This is the name of id of an existing rule."
|
|
343
|
+
end
|
|
344
|
+
optparse.parse!(args)
|
|
345
|
+
if args.count > 2
|
|
346
|
+
raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
|
|
347
|
+
end
|
|
348
|
+
connect(options)
|
|
349
|
+
|
|
350
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
351
|
+
server = find_network_server(server_id)
|
|
352
|
+
return 1 if server.nil?
|
|
353
|
+
|
|
354
|
+
if !server['type']['hasFirewall']
|
|
355
|
+
print_red_alert "Firewall not supported for #{server['type']['name']}"
|
|
356
|
+
return 1
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
rule_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'rule', 'type' => 'select', 'fieldLabel' => 'Firewall Rule', 'selectOptions' => search_rules(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule.'}],options[:options],@api_client,{})['rule']
|
|
360
|
+
rule = find_rule(server['id'], rule_id)
|
|
361
|
+
return 1 if rule.nil?
|
|
362
|
+
|
|
363
|
+
unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the network firewall rule '#{rule['name']}' from server '#{server['name']}'?", options)
|
|
364
|
+
return 9, "aborted command"
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
@network_servers_interface.setopts(options)
|
|
368
|
+
|
|
369
|
+
if options[:dry_run]
|
|
370
|
+
print_dry_run @network_servers_interface.dry.destroy_firewall_rule(server['id'], rule['id'])
|
|
371
|
+
return
|
|
372
|
+
end
|
|
373
|
+
json_response = @network_servers_interface.destroy_firewall_rule(server['id'], rule['id'])
|
|
374
|
+
render_response(json_response, options, 'rule') do
|
|
375
|
+
print_green_success "\nDeleted Network Firewall Rule #{rule['name']}\n"
|
|
376
|
+
_list_rules(server, options)
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def list_rule_groups(args)
|
|
381
|
+
options = {}
|
|
382
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
383
|
+
opts.banner = subcommand_usage("[server]")
|
|
384
|
+
build_common_options(opts, options, [:list, :query, :json, :yaml, :csv, :fields, :dry_run, :remote])
|
|
385
|
+
opts.footer = "List network firewall rule groups." + "\n" +
|
|
386
|
+
"[server] is required. This is the name or id of a network server."
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
optparse.parse!(args)
|
|
390
|
+
connect(options)
|
|
391
|
+
|
|
392
|
+
if args.count > 1
|
|
393
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
394
|
+
puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
395
|
+
return 1
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
399
|
+
server = find_network_server(server_id)
|
|
400
|
+
return 1 if server.nil?
|
|
401
|
+
_list_rule_groups(server, options)
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def _list_rule_groups(server, options)
|
|
405
|
+
params = parse_list_options(options)
|
|
406
|
+
@network_servers_interface.setopts(options)
|
|
407
|
+
|
|
408
|
+
if options[:dry_run]
|
|
409
|
+
print_dry_run @network_servers_interface.dry.list_firewall_rule_groups(server['id'], params)
|
|
410
|
+
return
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
if server['type']['hasFirewallGroups']
|
|
414
|
+
json_response = @network_servers_interface.list_firewall_rule_groups(server['id'], params)
|
|
415
|
+
render_response(json_response, options, 'ruleGroups') do
|
|
416
|
+
print_h1 "#{server['type']['titleFirewallGroups'] || 'Network firewall rule groups'} For: #{server['name']}"
|
|
417
|
+
print cyan
|
|
418
|
+
puts as_pretty_table(json_response['ruleGroups'].collect {|it|
|
|
419
|
+
{id: it['id'], name: it['name'], description: it['description'], priority: it['priority'], category: it['groupLayer']}
|
|
420
|
+
}, [:id, :name, :description, :priority, :category])
|
|
421
|
+
end
|
|
422
|
+
else
|
|
423
|
+
print_red_alert "#{server['type']['titleFirewallGroups'] || 'Network firewall rule groups'} not supported for #{server['type']['name']}"
|
|
424
|
+
end
|
|
425
|
+
print reset
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
def get_rule_group(args)
|
|
429
|
+
options = {}
|
|
430
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
431
|
+
opts.banner = subcommand_usage("[server] [group]")
|
|
432
|
+
build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
|
|
433
|
+
opts.footer = "Display details on a network firewall rule group." + "\n" +
|
|
434
|
+
"[server] is optional. This is the name or id of a network server.\n" +
|
|
435
|
+
"[group] is optional. This is the id of a network firewall rule group.\n"
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
optparse.parse!(args)
|
|
439
|
+
connect(options)
|
|
440
|
+
|
|
441
|
+
if args.count > 2
|
|
442
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
443
|
+
puts_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
444
|
+
return 1
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
448
|
+
server = find_network_server(server_id)
|
|
449
|
+
return 1 if server.nil?
|
|
450
|
+
|
|
451
|
+
group_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
|
|
452
|
+
_get_rule_group(server, group_id, options)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
def _get_rule_group(server, name_or_id, options)
|
|
456
|
+
@network_servers_interface.setopts(options)
|
|
457
|
+
|
|
458
|
+
if options[:dry_run]
|
|
459
|
+
if name_or_id.to_s =~ /\A\d{1,}\Z/
|
|
460
|
+
print_dry_run @network_servers_interface.dry.get_firewall_rule_group(server['id'], name_or_id.to_i)
|
|
461
|
+
else
|
|
462
|
+
print_dry_run @network_servers_interface.dry.list_firewall_rule_groups(server['id'], {name: name_or_id})
|
|
463
|
+
end
|
|
464
|
+
return
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
if server['type']['hasFirewallGroups']
|
|
468
|
+
group = find_rule_group(server['id'], name_or_id)
|
|
469
|
+
return 1 if group.nil?
|
|
470
|
+
|
|
471
|
+
render_response({ruleGroup: group}, options, 'ruleGroup') do
|
|
472
|
+
print_h1 "Network Firewall Rule Group Details"
|
|
473
|
+
print cyan
|
|
474
|
+
|
|
475
|
+
description_cols = {
|
|
476
|
+
"ID" => lambda {|it| it['id']},
|
|
477
|
+
"Name" => lambda {|it| it['name']},
|
|
478
|
+
"Description" => lambda {|it| it['description']},
|
|
479
|
+
"Priority" => lambda {|it| it['priority']},
|
|
480
|
+
"Category" => lambda {|it| it['groupLayer']}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
server['type']['firewallGroupOptionTypes'].reject {|it| it['type'] == 'hidden'}.sort_by {|it| it['displayOrder']}.each do |option_type|
|
|
484
|
+
description_cols[option_type['fieldLabel']] = lambda {|it| Morpheus::Cli::OptionTypes.get_option_value(it, option_type, true)}
|
|
485
|
+
end
|
|
486
|
+
print_description_list(description_cols, group)
|
|
487
|
+
end
|
|
488
|
+
else
|
|
489
|
+
print_red_alert "Network firewall rule groups not supported for #{server['type']['name']}"
|
|
490
|
+
end
|
|
491
|
+
println reset
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
def add_rule_group(args)
|
|
495
|
+
options = {:options=>{}}
|
|
496
|
+
params = {}
|
|
497
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
498
|
+
opts.banner = subcommand_usage("[server]")
|
|
499
|
+
opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
|
|
500
|
+
options[:options]['name'] = val
|
|
501
|
+
end
|
|
502
|
+
opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
|
|
503
|
+
options[:options]['description'] = val
|
|
504
|
+
end
|
|
505
|
+
opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
|
|
506
|
+
options[:options]['priority'] = val
|
|
507
|
+
end
|
|
508
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
509
|
+
opts.footer = "Create a network firewall rule group." + "\n" +
|
|
510
|
+
"[server] is optional. This is the name or id of a network server.\n";
|
|
511
|
+
end
|
|
512
|
+
optparse.parse!(args)
|
|
513
|
+
connect(options)
|
|
514
|
+
if args.count > 1
|
|
515
|
+
print_error Morpheus::Terminal.angry_prompt
|
|
516
|
+
puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
|
517
|
+
return 1
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
521
|
+
server = find_network_server(server_id)
|
|
522
|
+
return 1 if server.nil?
|
|
523
|
+
|
|
524
|
+
if !server['type']['hasFirewallGroups']
|
|
525
|
+
print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
|
|
526
|
+
return 1
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
if options[:payload]
|
|
530
|
+
payload = options[:payload]
|
|
531
|
+
else
|
|
532
|
+
params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'Name.'}],options[:options],@api_client, {})['name']
|
|
533
|
+
params['description'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false, 'description' => 'Description.'}],options[:options],@api_client,{})['description']
|
|
534
|
+
params['priority'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'priority', 'type' => 'number', 'fieldLabel' => 'Priority', 'required' => false, 'description' => 'Priority.'}],options[:options],@api_client,{})['priority']
|
|
535
|
+
|
|
536
|
+
option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
537
|
+
|
|
538
|
+
# prompt options
|
|
539
|
+
option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'ruleGroup' => ''}}), @api_client, {'networkServerId' => server['id']}, nil, true)
|
|
540
|
+
payload = {'ruleGroup' => params.deep_merge(option_result)}
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
@network_servers_interface.setopts(options)
|
|
544
|
+
|
|
545
|
+
if options[:dry_run]
|
|
546
|
+
print_dry_run @network_servers_interface.dry.create_firewall_rule_group(server['id'], payload)
|
|
547
|
+
return
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
json_response = @network_servers_interface.create_firewall_rule_group(server['id'], payload)
|
|
551
|
+
render_response(json_response, options, 'ruleGroup') do
|
|
552
|
+
print_green_success "\nAdded Network Firewall Rule Group #{json_response['id']}\n"
|
|
553
|
+
_get_rule_group(server, json_response['id'], options)
|
|
554
|
+
end
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
def update_rule_group(args)
|
|
558
|
+
options = {:options=>{}}
|
|
559
|
+
params = {}
|
|
560
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
|
561
|
+
opts.banner = subcommand_usage("[server] [group]")
|
|
562
|
+
opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
|
|
563
|
+
options[:options]['name'] = val
|
|
564
|
+
end
|
|
565
|
+
opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
|
|
566
|
+
options[:options]['description'] = val
|
|
567
|
+
end
|
|
568
|
+
opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
|
|
569
|
+
options[:options]['priority'] = val
|
|
570
|
+
end
|
|
571
|
+
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
|
|
572
|
+
opts.footer = "Update a network firewall rule group.\n" +
|
|
573
|
+
"[server] is optional. This is the name or id of an existing network server.\n" +
|
|
574
|
+
"[group] is optional. This is the name or id of an existing network firewall rule group."
|
|
575
|
+
end
|
|
576
|
+
optparse.parse!(args)
|
|
577
|
+
if args.count > 2
|
|
578
|
+
raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
|
|
579
|
+
end
|
|
580
|
+
connect(options)
|
|
581
|
+
|
|
582
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
583
|
+
server = find_network_server(server_id)
|
|
584
|
+
return 1 if server.nil?
|
|
585
|
+
|
|
586
|
+
if !server['type']['hasFirewallGroups']
|
|
587
|
+
print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
|
|
588
|
+
return 1
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
group_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
|
|
592
|
+
group = find_rule_group(server['id'], group_id)
|
|
593
|
+
return 1 if group.nil?
|
|
594
|
+
|
|
595
|
+
payload = parse_payload(options) || {'ruleGroup' => params}
|
|
596
|
+
payload['ruleGroup'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['ruleGroup'].nil?
|
|
597
|
+
|
|
598
|
+
if payload['ruleGroup'].empty?
|
|
599
|
+
print_green_success "Nothing to update"
|
|
600
|
+
println cyan
|
|
601
|
+
option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
|
|
602
|
+
edit_option_types = option_types.reject {|it| !it['editable'] || !it['showOnEdit']}
|
|
603
|
+
|
|
604
|
+
if edit_option_types.count > 0
|
|
605
|
+
print Morpheus::Cli::OptionTypes.display_option_types_help(option_types, {:include_context => true, :context_map => {'ruleGroup' => ''}, :color => cyan, :title => "Available Firewall Rule Group Options"})
|
|
606
|
+
end
|
|
607
|
+
exit 1
|
|
608
|
+
end
|
|
609
|
+
|
|
610
|
+
@network_servers_interface.setopts(options)
|
|
611
|
+
|
|
612
|
+
if options[:dry_run]
|
|
613
|
+
print_dry_run @network_servers_interface.dry.update_firewall_rule_group(server['id'], group['id'], payload)
|
|
614
|
+
return
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
json_response = @network_servers_interface.update_firewall_rule_group(server['id'], group['id'], payload)
|
|
618
|
+
render_response(json_response, options, 'ruleGroup') do
|
|
619
|
+
print_green_success "\nUpdated Network Firewall Rule Group #{group['id']}\n"
|
|
620
|
+
_get_rule_group(server, group['id'], options)
|
|
621
|
+
end
|
|
622
|
+
end
|
|
623
|
+
|
|
624
|
+
def remove_rule_group(args)
|
|
625
|
+
options = {}
|
|
626
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
|
627
|
+
opts.banner = subcommand_usage("[server] [group]")
|
|
628
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
|
|
629
|
+
opts.footer = "Delete a network firewall group.\n" +
|
|
630
|
+
"[server] is optional. This is the name or id of an existing network server.\n" +
|
|
631
|
+
"[group] is optional. This is the name or id of an existing network firewall rule group."
|
|
632
|
+
end
|
|
633
|
+
optparse.parse!(args)
|
|
634
|
+
if args.count > 2
|
|
635
|
+
raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
|
|
636
|
+
end
|
|
637
|
+
connect(options)
|
|
638
|
+
|
|
639
|
+
server_id = args.count > 0 ? args[0] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'networkServer', 'type' => 'select', 'fieldLabel' => 'Network Server', 'selectOptions' => search_network_servers.collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Network Server.'}],options[:options],@api_client,{})['networkServer']
|
|
640
|
+
server = find_network_server(server_id)
|
|
641
|
+
return 1 if server.nil?
|
|
642
|
+
|
|
643
|
+
if !server['type']['hasFirewallGroups']
|
|
644
|
+
print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
|
|
645
|
+
return 1
|
|
646
|
+
end
|
|
647
|
+
|
|
648
|
+
group_id = args.count > 1 ? args[1] : Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'ruleGroup', 'type' => 'select', 'fieldLabel' => 'Firewall Rule Group', 'selectOptions' => search_rule_groups(server['id']).collect {|it| {'name' => it['name'], 'value' => it['id']}}, 'required' => true, 'description' => 'Select Firewall Rule Group.'}],options[:options],@api_client,{})['ruleGroup']
|
|
649
|
+
group = find_rule_group(server['id'], group_id)
|
|
650
|
+
return 1 if group.nil?
|
|
651
|
+
|
|
652
|
+
unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to remove the network firewall rule group '#{group['name']}' from server '#{server['name']}'?", options)
|
|
653
|
+
return 9, "aborted command"
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
@network_servers_interface.setopts(options)
|
|
657
|
+
|
|
658
|
+
if options[:dry_run]
|
|
659
|
+
print_dry_run @network_servers_interface.dry.destroy_firewall_rule_group(server['id'], group['id'])
|
|
660
|
+
return
|
|
661
|
+
end
|
|
662
|
+
json_response = @network_servers_interface.destroy_firewall_rule_group(server['id'], group['id'])
|
|
663
|
+
render_response(json_response, options, 'ruleGroup') do
|
|
664
|
+
print_green_success "\nDeleted Network Firewall Rule Group #{group['name']}\n"
|
|
665
|
+
_list_rule_groups(server, options)
|
|
666
|
+
end
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
private
|
|
670
|
+
|
|
671
|
+
def find_network_server(val)
|
|
672
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
673
|
+
return find_network_server_by_id(val)
|
|
674
|
+
else
|
|
675
|
+
if server = find_network_server_by_name(val)
|
|
676
|
+
return find_network_server_by_id(server['id'])
|
|
677
|
+
end
|
|
678
|
+
end
|
|
679
|
+
end
|
|
680
|
+
|
|
681
|
+
def find_network_server_by_id(id)
|
|
682
|
+
begin
|
|
683
|
+
json_response = @network_servers_interface.get(id.to_i)
|
|
684
|
+
return json_response['networkServer']
|
|
685
|
+
rescue RestClient::Exception => e
|
|
686
|
+
if e.response && e.response.code == 404
|
|
687
|
+
print_red_alert "Network Server not found by id #{id}"
|
|
688
|
+
return nil
|
|
689
|
+
else
|
|
690
|
+
raise e
|
|
691
|
+
end
|
|
692
|
+
end
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
def find_network_server_by_name(name)
|
|
696
|
+
servers = search_network_servers(name)
|
|
697
|
+
if servers.empty?
|
|
698
|
+
print_red_alert "Network Server not found by name #{name}"
|
|
699
|
+
return nil
|
|
700
|
+
elsif servers.size > 1
|
|
701
|
+
print_red_alert "#{servers.size} network servers found by name #{name}"
|
|
702
|
+
rows = servers.collect do |it|
|
|
703
|
+
{id: it['id'], name: it['name']}
|
|
704
|
+
end
|
|
705
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
706
|
+
return nil
|
|
707
|
+
else
|
|
708
|
+
return servers[0]
|
|
709
|
+
end
|
|
710
|
+
end
|
|
711
|
+
|
|
712
|
+
def search_network_servers(phrase = nil)
|
|
713
|
+
@network_servers_interface.list(phrase ? {phrase: phrase.to_s} : {})['networkServers']
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
def find_rule(server_id, val)
|
|
717
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
718
|
+
return find_rule_by_id(server_id, val)
|
|
719
|
+
else
|
|
720
|
+
if rule = find_rule_by_name(server_id, val)
|
|
721
|
+
return find_rule_by_id(server_id, rule['id'])
|
|
722
|
+
end
|
|
723
|
+
end
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
def find_rule_by_id(server_id, rule_id)
|
|
727
|
+
begin
|
|
728
|
+
json_response = @network_servers_interface.get_firewall_rule(server_id, rule_id.to_i)
|
|
729
|
+
return json_response['rule']
|
|
730
|
+
rescue RestClient::Exception => e
|
|
731
|
+
if e.response && e.response.code == 404
|
|
732
|
+
print_red_alert "Network firewall rule not found by id #{rule_id}"
|
|
733
|
+
return nil
|
|
734
|
+
else
|
|
735
|
+
raise e
|
|
736
|
+
end
|
|
737
|
+
end
|
|
738
|
+
end
|
|
739
|
+
|
|
740
|
+
def find_rule_by_name(server_id, name)
|
|
741
|
+
rules = search_rules(server_id, name)
|
|
742
|
+
if rules.empty?
|
|
743
|
+
print_red_alert "Network firewall rule not found by name #{name}"
|
|
744
|
+
return nil
|
|
745
|
+
elsif rules.size > 1
|
|
746
|
+
print_red_alert "#{rules.size} network firewall rules found by name #{name}"
|
|
747
|
+
rows = rules.collect do |it|
|
|
748
|
+
{id: it['id'], name: it['name']}
|
|
749
|
+
end
|
|
750
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
751
|
+
return nil
|
|
752
|
+
else
|
|
753
|
+
return rules[0]
|
|
754
|
+
end
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
def search_rules(server_id, phrase = nil)
|
|
758
|
+
@network_servers_interface.list_firewall_rules(server_id, phrase ? {phrase: phrase.to_s} : {})['rules']
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
def find_rule_group(server_id, val)
|
|
762
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
|
763
|
+
return find_rule_group_by_id(server_id, val)
|
|
764
|
+
else
|
|
765
|
+
if group = find_rule_group_by_name(server_id, val)
|
|
766
|
+
return find_rule_group_by_id(server_id, group['id'])
|
|
767
|
+
end
|
|
768
|
+
end
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
def find_rule_group_by_id(server_id, group_id)
|
|
772
|
+
begin
|
|
773
|
+
json_response = @network_servers_interface.get_firewall_rule_group(server_id, group_id.to_i)
|
|
774
|
+
return json_response['ruleGroup']
|
|
775
|
+
rescue RestClient::Exception => e
|
|
776
|
+
if e.response && e.response.code == 404
|
|
777
|
+
print_red_alert "Network firewall rule group not found by id #{group_id}"
|
|
778
|
+
return nil
|
|
779
|
+
else
|
|
780
|
+
raise e
|
|
781
|
+
end
|
|
782
|
+
end
|
|
783
|
+
end
|
|
784
|
+
|
|
785
|
+
def find_rule_group_by_name(server_id, name)
|
|
786
|
+
groups = search_rule_groups(server_id, name)
|
|
787
|
+
if groups.empty?
|
|
788
|
+
print_red_alert "Network firewall rule group not found by name #{name}"
|
|
789
|
+
return nil
|
|
790
|
+
elsif groups.size > 1
|
|
791
|
+
print_red_alert "#{groups.size} network firewall rule groups found by name #{name}"
|
|
792
|
+
rows = groups.collect do |it|
|
|
793
|
+
{id: it['id'], name: it['name']}
|
|
794
|
+
end
|
|
795
|
+
puts as_pretty_table(rows, [:id, :name], {color:red})
|
|
796
|
+
return nil
|
|
797
|
+
else
|
|
798
|
+
return groups[0]
|
|
799
|
+
end
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
def search_rule_groups(server_id, phrase = nil)
|
|
803
|
+
@network_servers_interface.list_firewall_rule_groups(server_id, phrase ? {phrase: phrase.to_s} : {})['ruleGroups']
|
|
804
|
+
end
|
|
805
|
+
|
|
806
|
+
end
|