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.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +26 -1
  4. data/lib/morpheus/api/clouds_interface.rb +4 -11
  5. data/lib/morpheus/api/health_interface.rb +37 -3
  6. data/lib/morpheus/api/instances_interface.rb +18 -5
  7. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  8. data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
  9. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
  10. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  11. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  12. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  13. data/lib/morpheus/api/network_routers_interface.rb +21 -0
  14. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  15. data/lib/morpheus/api/rest_interface.rb +2 -1
  16. data/lib/morpheus/api/roles_interface.rb +7 -0
  17. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  18. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  19. data/lib/morpheus/cli/cli_command.rb +21 -14
  20. data/lib/morpheus/cli/cli_registry.rb +56 -2
  21. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  22. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  23. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  24. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +0 -3
  25. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  26. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  27. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +3 -11
  28. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  29. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  30. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  31. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  32. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  33. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +0 -0
  34. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  35. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  36. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  37. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  38. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  39. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  40. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  41. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  42. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
  43. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  44. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +51 -39
  45. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  46. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  47. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  48. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  49. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  50. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  51. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  52. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  53. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  54. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  55. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  56. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  57. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  58. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  59. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  60. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  61. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  62. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  63. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  64. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  65. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  66. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  67. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  68. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  69. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +0 -10
  70. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
  71. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  72. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +364 -148
  73. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
  74. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
  75. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  76. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  77. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
  78. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  79. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  80. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  81. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  82. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  83. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  84. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  85. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  86. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  87. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  88. data/lib/morpheus/cli/commands/load_balancer_pools.rb +111 -0
  89. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +0 -4
  90. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +136 -0
  91. data/lib/morpheus/cli/commands/load_balancers.rb +89 -0
  92. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  93. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  94. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  95. data/lib/morpheus/cli/commands/logout.rb +63 -0
  96. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  97. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  98. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  99. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  100. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
  101. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  102. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  103. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  104. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  105. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  106. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  107. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  108. data/lib/morpheus/cli/commands/network_firewalls_command.rb +806 -0
  109. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  110. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  111. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  112. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  113. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +291 -12
  114. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  115. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  116. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
  117. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  118. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  119. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +0 -7
  120. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  121. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  122. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  123. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +0 -0
  124. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  125. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  126. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  127. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  128. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  129. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +1 -7
  130. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  131. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  132. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +244 -39
  133. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  134. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  135. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  136. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  137. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  138. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  139. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  140. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +2 -103
  141. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  142. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  143. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  144. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  145. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  146. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  147. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  148. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +0 -7
  149. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  150. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  151. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +0 -1
  152. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +0 -0
  153. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +0 -1
  154. data/lib/morpheus/cli/{users.rb → commands/users.rb} +0 -7
  155. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  156. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  157. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  158. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  159. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
  160. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  161. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
  162. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  163. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  164. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  165. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  166. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
  167. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  168. data/lib/morpheus/cli/mixins/print_helper.rb +1 -0
  169. data/lib/morpheus/cli/mixins/provisioning_helper.rb +155 -112
  170. data/lib/morpheus/cli/mixins/rest_command.rb +154 -52
  171. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +575 -0
  172. data/lib/morpheus/cli/option_parser.rb +25 -17
  173. data/lib/morpheus/cli/option_types.rb +96 -32
  174. data/lib/morpheus/cli/version.rb +1 -1
  175. data/lib/morpheus/cli.rb +5 -128
  176. data/lib/morpheus/terminal.rb +5 -6
  177. data/morpheus-cli.gemspec +1 -1
  178. metadata +156 -143
  179. data/lib/morpheus/cli/change_password_command.rb +0 -147
  180. data/lib/morpheus/cli/library.rb +0 -1
  181. data/lib/morpheus/cli/load_balancers.rb +0 -245
  182. 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