morpheus-cli 5.3.2.3 → 5.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/account_users_interface.rb +68 -0
  4. data/lib/morpheus/api/api_client.rb +75 -8
  5. data/lib/morpheus/api/audit_interface.rb +9 -0
  6. data/lib/morpheus/api/clouds_interface.rb +4 -11
  7. data/lib/morpheus/api/health_interface.rb +37 -3
  8. data/lib/morpheus/api/instances_interface.rb +39 -5
  9. data/lib/morpheus/api/load_balancer_monitors_interface.rb +9 -0
  10. data/lib/morpheus/api/load_balancer_profiles_interface.rb +9 -0
  11. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +9 -0
  12. data/lib/morpheus/api/load_balancers_interface.rb +5 -0
  13. data/lib/morpheus/api/network_dhcp_relays_interface.rb +36 -0
  14. data/lib/morpheus/api/network_dhcp_servers_interface.rb +36 -0
  15. data/lib/morpheus/api/network_edge_clusters_interface.rb +26 -0
  16. data/lib/morpheus/api/network_routers_interface.rb +30 -0
  17. data/lib/morpheus/api/network_servers_interface.rb +98 -0
  18. data/lib/morpheus/api/network_static_routes_interface.rb +36 -0
  19. data/lib/morpheus/api/read_interface.rb +4 -3
  20. data/lib/morpheus/api/rest_interface.rb +5 -4
  21. data/lib/morpheus/api/roles_interface.rb +7 -0
  22. data/lib/morpheus/api/secondary_read_interface.rb +1 -1
  23. data/lib/morpheus/api/secondary_rest_interface.rb +19 -19
  24. data/lib/morpheus/api/storage_server_types_interface.rb +14 -0
  25. data/lib/morpheus/api/storage_servers_interface.rb +9 -0
  26. data/lib/morpheus/api/storage_volume_types_interface.rb +9 -0
  27. data/lib/morpheus/api/storage_volumes_interface.rb +9 -0
  28. data/lib/morpheus/api/users_interface.rb +16 -63
  29. data/lib/morpheus/api/virtual_images_interface.rb +23 -2
  30. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  31. data/lib/morpheus/cli/cli_command.rb +274 -19
  32. data/lib/morpheus/cli/cli_registry.rb +56 -2
  33. data/lib/morpheus/cli/{access_token_command.rb → commands/access_token_command.rb} +1 -1
  34. data/lib/morpheus/cli/{account_groups_command.rb → commands/account_groups_command.rb} +0 -8
  35. data/lib/morpheus/cli/{activity_command.rb → commands/activity_command.rb} +0 -0
  36. data/lib/morpheus/cli/commands/{standard/alias_command.rb → alias_command.rb} +1 -4
  37. data/lib/morpheus/cli/{appliance_settings_command.rb → commands/appliance_settings_command.rb} +0 -0
  38. data/lib/morpheus/cli/{approvals_command.rb → commands/approvals_command.rb} +0 -0
  39. data/lib/morpheus/cli/{apps.rb → commands/apps.rb} +17 -89
  40. data/lib/morpheus/cli/{archives_command.rb → commands/archives_command.rb} +0 -6
  41. data/lib/morpheus/cli/commands/audit.rb +188 -0
  42. data/lib/morpheus/cli/{backup_jobs_command.rb → commands/backup_jobs_command.rb} +0 -0
  43. data/lib/morpheus/cli/{backup_settings_command.rb → commands/backup_settings_command.rb} +0 -0
  44. data/lib/morpheus/cli/{backups_command.rb → commands/backups_command.rb} +0 -0
  45. data/lib/morpheus/cli/commands/{standard/benchmark_command.rb → benchmark_command.rb} +0 -3
  46. data/lib/morpheus/cli/{blueprints_command.rb → commands/blueprints_command.rb} +1 -1
  47. data/lib/morpheus/cli/{boot_scripts_command.rb → commands/boot_scripts_command.rb} +0 -3
  48. data/lib/morpheus/cli/{budgets_command.rb → commands/budgets_command.rb} +0 -0
  49. data/lib/morpheus/cli/commands/{standard/cat_command.rb → cat_command.rb} +0 -0
  50. data/lib/morpheus/cli/{catalog_item_types_command.rb → commands/catalog_item_types_command.rb} +0 -0
  51. data/lib/morpheus/cli/{certificates_command.rb → commands/certificates_command.rb} +0 -0
  52. data/lib/morpheus/cli/commands/change_password_command.rb +132 -0
  53. data/lib/morpheus/cli/{cloud_datastores_command.rb → commands/cloud_datastores_command.rb} +0 -4
  54. data/lib/morpheus/cli/{cloud_folders_command.rb → commands/cloud_folders_command.rb} +0 -4
  55. data/lib/morpheus/cli/{cloud_resource_pools_command.rb → commands/cloud_resource_pools_command.rb} +170 -138
  56. data/lib/morpheus/cli/{clouds.rb → commands/clouds.rb} +22 -47
  57. data/lib/morpheus/cli/{clusters.rb → commands/clusters.rb} +86 -49
  58. data/lib/morpheus/cli/commands/{standard/coloring_command.rb → coloring_command.rb} +0 -2
  59. data/lib/morpheus/cli/{containers_command.rb → commands/containers_command.rb} +0 -7
  60. data/lib/morpheus/cli/commands/{standard/curl_command.rb → curl_command.rb} +0 -3
  61. data/lib/morpheus/cli/{cypher_command.rb → commands/cypher_command.rb} +0 -1
  62. data/lib/morpheus/cli/{dashboard_command.rb → commands/dashboard_command.rb} +0 -2
  63. data/lib/morpheus/cli/commands/{standard/debug_command.rb → debug_command.rb} +0 -1
  64. data/lib/morpheus/cli/{deploy.rb → commands/deploy.rb} +0 -1
  65. data/lib/morpheus/cli/{deployments.rb → commands/deployments.rb} +0 -0
  66. data/lib/morpheus/cli/{deploys.rb → commands/deploys.rb} +0 -1
  67. data/lib/morpheus/cli/{doc.rb → commands/doc.rb} +1 -1
  68. data/lib/morpheus/cli/commands/{standard/echo_command.rb → echo_command.rb} +0 -2
  69. data/lib/morpheus/cli/commands/{standard/edit_profile_command.rb → edit_profile_command.rb} +15 -4
  70. data/lib/morpheus/cli/commands/{standard/edit_rc_command.rb → edit_rc_command.rb} +19 -3
  71. data/lib/morpheus/cli/{environments_command.rb → commands/environments_command.rb} +0 -5
  72. data/lib/morpheus/cli/{execute_schedules_command.rb → commands/execute_schedules_command.rb} +0 -0
  73. data/lib/morpheus/cli/{execution_request_command.rb → commands/execution_request_command.rb} +0 -2
  74. data/lib/morpheus/cli/commands/{standard/exit_command.rb → exit_command.rb} +0 -2
  75. data/lib/morpheus/cli/{file_copy_request_command.rb → commands/file_copy_request_command.rb} +0 -4
  76. data/lib/morpheus/cli/{forgot_password.rb → commands/forgot_password.rb} +0 -0
  77. data/lib/morpheus/cli/commands/{standard/get_prompt_command.rb → get_prompt_command.rb} +0 -3
  78. data/lib/morpheus/cli/{groups.rb → commands/groups.rb} +0 -7
  79. data/lib/morpheus/cli/{guidance_command.rb → commands/guidance_command.rb} +1 -1
  80. data/lib/morpheus/cli/{health_command.rb → commands/health_command.rb} +104 -19
  81. data/lib/morpheus/cli/commands/{standard/history_command.rb → history_command.rb} +0 -3
  82. data/lib/morpheus/cli/{hosts.rb → commands/hosts.rb} +15 -25
  83. data/lib/morpheus/cli/{image_builder_command.rb → commands/image_builder_command.rb} +2 -8
  84. data/lib/morpheus/cli/{instance_types.rb → commands/instance_types.rb} +0 -3
  85. data/lib/morpheus/cli/{instances.rb → commands/instances.rb} +473 -150
  86. data/lib/morpheus/cli/{integrations_command.rb → commands/integrations_command.rb} +0 -0
  87. data/lib/morpheus/cli/{invoices_command.rb → commands/invoices_command.rb} +118 -134
  88. data/lib/morpheus/cli/{jobs_command.rb → commands/jobs_command.rb} +0 -0
  89. data/lib/morpheus/cli/{key_pairs.rb → commands/key_pairs.rb} +0 -6
  90. data/lib/morpheus/cli/{library_cluster_layouts_command.rb → commands/library_cluster_layouts_command.rb} +20 -4
  91. data/lib/morpheus/cli/{library_container_scripts_command.rb → commands/library_container_scripts_command.rb} +0 -0
  92. data/lib/morpheus/cli/{library_container_templates_command.rb → commands/library_container_templates_command.rb} +0 -1
  93. data/lib/morpheus/cli/{library_container_types_command.rb → commands/library_container_types_command.rb} +0 -4
  94. data/lib/morpheus/cli/{library_instance_types_command.rb → commands/library_instance_types_command.rb} +0 -4
  95. data/lib/morpheus/cli/{library_layouts_command.rb → commands/library_layouts_command.rb} +0 -4
  96. data/lib/morpheus/cli/{library_option_lists_command.rb → commands/library_option_lists_command.rb} +3 -7
  97. data/lib/morpheus/cli/{library_option_types_command.rb → commands/library_option_types_command.rb} +0 -4
  98. data/lib/morpheus/cli/{library_spec_templates_command.rb → commands/library_spec_templates_command.rb} +0 -1
  99. data/lib/morpheus/cli/{library_upgrades_command.rb → commands/library_upgrades_command.rb} +0 -4
  100. data/lib/morpheus/cli/{license.rb → commands/license.rb} +0 -3
  101. data/lib/morpheus/cli/commands/load_balancer_monitors.rb +71 -0
  102. data/lib/morpheus/cli/commands/load_balancer_pools.rb +91 -0
  103. data/lib/morpheus/cli/commands/load_balancer_profiles.rb +65 -0
  104. data/lib/morpheus/cli/{load_balancer_types.rb → commands/load_balancer_types.rb} +9 -8
  105. data/lib/morpheus/cli/commands/load_balancer_virtual_servers.rb +156 -0
  106. data/lib/morpheus/cli/commands/load_balancers.rb +176 -0
  107. data/lib/morpheus/cli/commands/{standard/log_level_command.rb → log_level_command.rb} +0 -3
  108. data/lib/morpheus/cli/{log_settings_command.rb → commands/log_settings_command.rb} +0 -0
  109. data/lib/morpheus/cli/{login.rb → commands/login.rb} +0 -5
  110. data/lib/morpheus/cli/commands/logout.rb +63 -0
  111. data/lib/morpheus/cli/{logs_command.rb → commands/logs_command.rb} +0 -3
  112. data/lib/morpheus/cli/commands/{standard/man_command.rb → man_command.rb} +0 -2
  113. data/lib/morpheus/cli/{monitoring_alerts_command.rb → commands/monitoring_alerts_command.rb} +0 -7
  114. data/lib/morpheus/cli/{monitoring_apps_command.rb → commands/monitoring_apps_command.rb} +0 -1
  115. data/lib/morpheus/cli/{monitoring_checks_command.rb → commands/monitoring_checks_command.rb} +2 -1
  116. data/lib/morpheus/cli/{monitoring_contacts_command.rb → commands/monitoring_contacts_command.rb} +0 -7
  117. data/lib/morpheus/cli/{monitoring_groups_command.rb → commands/monitoring_groups_command.rb} +0 -1
  118. data/lib/morpheus/cli/{monitoring_incidents_command.rb → commands/monitoring_incidents_command.rb} +0 -1
  119. data/lib/morpheus/cli/commands/network_dhcp_relays_command.rb +416 -0
  120. data/lib/morpheus/cli/commands/network_dhcp_servers_command.rb +407 -0
  121. data/lib/morpheus/cli/{network_domains_command.rb → commands/network_domains_command.rb} +0 -4
  122. data/lib/morpheus/cli/commands/network_edge_clusters_command.rb +329 -0
  123. data/lib/morpheus/cli/commands/network_firewalls_command.rb +823 -0
  124. data/lib/morpheus/cli/{network_groups_command.rb → commands/network_groups_command.rb} +0 -4
  125. data/lib/morpheus/cli/{network_pool_servers_command.rb → commands/network_pool_servers_command.rb} +0 -4
  126. data/lib/morpheus/cli/{network_pools_command.rb → commands/network_pools_command.rb} +0 -4
  127. data/lib/morpheus/cli/{network_proxies_command.rb → commands/network_proxies_command.rb} +0 -4
  128. data/lib/morpheus/cli/{network_routers_command.rb → commands/network_routers_command.rb} +387 -57
  129. data/lib/morpheus/cli/{network_services_command.rb → commands/network_services_command.rb} +0 -4
  130. data/lib/morpheus/cli/commands/network_static_routes_command.rb +446 -0
  131. data/lib/morpheus/cli/commands/network_transport_zones_command.rb +452 -0
  132. data/lib/morpheus/cli/{networks_command.rb → commands/networks_command.rb} +21 -21
  133. data/lib/morpheus/cli/commands/open_command.rb +30 -0
  134. data/lib/morpheus/cli/commands/options.rb +98 -0
  135. data/lib/morpheus/cli/{packages_command.rb → commands/packages_command.rb} +0 -2
  136. data/lib/morpheus/cli/{ping.rb → commands/ping.rb} +0 -7
  137. data/lib/morpheus/cli/{policies_command.rb → commands/policies_command.rb} +1 -8
  138. data/lib/morpheus/cli/{power_schedules_command.rb → commands/power_schedules_command.rb} +0 -0
  139. data/lib/morpheus/cli/{preseed_scripts_command.rb → commands/preseed_scripts_command.rb} +0 -3
  140. data/lib/morpheus/cli/{price_sets_command.rb → commands/price_sets_command.rb} +0 -0
  141. data/lib/morpheus/cli/{prices_command.rb → commands/prices_command.rb} +7 -7
  142. data/lib/morpheus/cli/{processes_command.rb → commands/processes_command.rb} +0 -1
  143. data/lib/morpheus/cli/{projects_command.rb → commands/projects_command.rb} +0 -0
  144. data/lib/morpheus/cli/{provisioning_licenses_command.rb → commands/provisioning_licenses_command.rb} +0 -0
  145. data/lib/morpheus/cli/{provisioning_settings_command.rb → commands/provisioning_settings_command.rb} +0 -0
  146. data/lib/morpheus/cli/{recent_activity_command.rb → commands/recent_activity_command.rb} +0 -0
  147. data/lib/morpheus/cli/{remote.rb → commands/remote.rb} +5 -9
  148. data/lib/morpheus/cli/{reports_command.rb → commands/reports_command.rb} +0 -2
  149. data/lib/morpheus/cli/commands/{standard/rm_command.rb → rm_command.rb} +0 -0
  150. data/lib/morpheus/cli/{roles.rb → commands/roles.rb} +245 -40
  151. data/lib/morpheus/cli/{search_command.rb → commands/search_command.rb} +0 -0
  152. data/lib/morpheus/cli/{security_group_rules.rb → commands/security_group_rules.rb} +0 -5
  153. data/lib/morpheus/cli/{security_groups.rb → commands/security_groups.rb} +0 -6
  154. data/lib/morpheus/cli/{service_catalog_command.rb → commands/service_catalog_command.rb} +0 -0
  155. data/lib/morpheus/cli/{service_plans_command.rb → commands/service_plans_command.rb} +0 -0
  156. data/lib/morpheus/cli/commands/{standard/set_prompt_command.rb → set_prompt_command.rb} +0 -3
  157. data/lib/morpheus/cli/{setup.rb → commands/setup.rb} +0 -0
  158. data/lib/morpheus/cli/{shell.rb → commands/shell.rb} +4 -105
  159. data/lib/morpheus/cli/commands/{standard/sleep_command.rb → sleep_command.rb} +0 -2
  160. data/lib/morpheus/cli/commands/{standard/source_command.rb → source_command.rb} +0 -2
  161. data/lib/morpheus/cli/commands/{standard/ssl_verification_command.rb → ssl_verification_command.rb} +0 -3
  162. data/lib/morpheus/cli/{storage_providers_command.rb → commands/storage_providers_command.rb} +0 -4
  163. data/lib/morpheus/cli/commands/storage_server_types.rb +50 -0
  164. data/lib/morpheus/cli/commands/storage_servers.rb +122 -0
  165. data/lib/morpheus/cli/commands/storage_volume_types.rb +50 -0
  166. data/lib/morpheus/cli/commands/storage_volumes.rb +103 -0
  167. data/lib/morpheus/cli/{subnets_command.rb → commands/subnets_command.rb} +7 -6
  168. data/lib/morpheus/cli/{tasks.rb → commands/tasks.rb} +25 -6
  169. data/lib/morpheus/cli/commands/{standard/tee_command.rb → tee_command.rb} +0 -0
  170. data/lib/morpheus/cli/{tenants_command.rb → commands/tenants_command.rb} +1 -8
  171. data/lib/morpheus/cli/commands/{standard/update_command.rb → update_command.rb} +0 -1
  172. data/lib/morpheus/cli/{usage_command.rb → commands/usage_command.rb} +0 -0
  173. data/lib/morpheus/cli/{user_groups_command.rb → commands/user_groups_command.rb} +1 -2
  174. data/lib/morpheus/cli/{user_settings_command.rb → commands/user_settings_command.rb} +2 -1
  175. data/lib/morpheus/cli/{user_sources_command.rb → commands/user_sources_command.rb} +1 -2
  176. data/lib/morpheus/cli/{users.rb → commands/users.rb} +28 -35
  177. data/lib/morpheus/cli/{vdi_allocations_command.rb → commands/vdi_allocations_command.rb} +0 -0
  178. data/lib/morpheus/cli/{vdi_apps_command.rb → commands/vdi_apps_command.rb} +0 -0
  179. data/lib/morpheus/cli/{vdi_command.rb → commands/vdi_command.rb} +0 -0
  180. data/lib/morpheus/cli/{vdi_gateways_command.rb → commands/vdi_gateways_command.rb} +0 -0
  181. data/lib/morpheus/cli/{vdi_pools_command.rb → commands/vdi_pools_command.rb} +4 -1
  182. data/lib/morpheus/cli/commands/{standard/version_command.rb → version_command.rb} +0 -0
  183. data/lib/morpheus/cli/commands/view.rb +102 -0
  184. data/lib/morpheus/cli/{virtual_images.rb → commands/virtual_images.rb} +251 -33
  185. data/lib/morpheus/cli/{whitelabel_settings_command.rb → commands/whitelabel_settings_command.rb} +0 -1
  186. data/lib/morpheus/cli/{whoami.rb → commands/whoami.rb} +0 -4
  187. data/lib/morpheus/cli/{wiki_command.rb → commands/wiki_command.rb} +0 -5
  188. data/lib/morpheus/cli/{workflows.rb → commands/workflows.rb} +0 -3
  189. data/lib/morpheus/cli/mixins/accounts_helper.rb +5 -5
  190. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +26 -6
  191. data/lib/morpheus/cli/mixins/logs_helper.rb +1 -1
  192. data/lib/morpheus/cli/mixins/print_helper.rb +51 -18
  193. data/lib/morpheus/cli/mixins/processes_helper.rb +1 -2
  194. data/lib/morpheus/cli/mixins/provisioning_helper.rb +167 -110
  195. data/lib/morpheus/cli/mixins/rest_command.rb +268 -94
  196. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +668 -0
  197. data/lib/morpheus/cli/mixins/storage_servers_helper.rb +156 -0
  198. data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +119 -0
  199. data/lib/morpheus/cli/option_parser.rb +25 -17
  200. data/lib/morpheus/cli/option_types.rb +137 -52
  201. data/lib/morpheus/cli/version.rb +1 -1
  202. data/lib/morpheus/cli.rb +6 -128
  203. data/lib/morpheus/ext/string.rb +29 -6
  204. data/lib/morpheus/routes.rb +238 -0
  205. data/lib/morpheus/terminal.rb +5 -6
  206. data/lib/morpheus/util.rb +6 -1
  207. data/morpheus-cli.gemspec +1 -1
  208. metadata +183 -149
  209. data/lib/morpheus/cli/change_password_command.rb +0 -147
  210. data/lib/morpheus/cli/library.rb +0 -1
  211. data/lib/morpheus/cli/load_balancers.rb +0 -245
  212. data/lib/morpheus/cli/logout.rb +0 -81
@@ -0,0 +1,823 @@
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
+
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'].kind_of?(Array) && 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 it['config']['applyToAllEdges']
82
+ applied_to << 'Distributed Firewall' if it['config']['applyToAllDistributed']
83
+ applied_to += it['appliedTargets'].collect {|target| target['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
+
487
+ if is_master_account
488
+ description_cols["Visibility"] = lambda {|it| it['visibility']}
489
+ description_cols["Tenants"] = lambda {|it| it['tenants'].collect {|tenant| tenant['name']}.join(', ')}
490
+ end
491
+ print_description_list(description_cols, group)
492
+ end
493
+ else
494
+ print_red_alert "Network firewall rule groups not supported for #{server['type']['name']}"
495
+ end
496
+ println reset
497
+ end
498
+
499
+ def add_rule_group(args)
500
+ options = {:options=>{}}
501
+ params = {}
502
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
503
+ opts.banner = subcommand_usage("[server]")
504
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
505
+ options[:options]['name'] = val
506
+ end
507
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
508
+ options[:options]['description'] = val
509
+ end
510
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
511
+ options[:options]['priority'] = val
512
+ end
513
+ add_perms_options(opts, options, ['plans', 'groups'])
514
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
515
+ opts.footer = "Create a network firewall rule group." + "\n" +
516
+ "[server] is optional. This is the name or id of a network server.\n";
517
+ end
518
+ optparse.parse!(args)
519
+ connect(options)
520
+ if args.count > 1
521
+ print_error Morpheus::Terminal.angry_prompt
522
+ puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
523
+ return 1
524
+ end
525
+
526
+ 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']
527
+ server = find_network_server(server_id)
528
+ return 1 if server.nil?
529
+
530
+ if !server['type']['hasFirewallGroups']
531
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
532
+ return 1
533
+ end
534
+
535
+ if options[:payload]
536
+ payload = options[:payload]
537
+ else
538
+ params['name'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'name', 'type' => 'text', 'fieldLabel' => 'Name', 'required' => true, 'description' => 'Name.'}],options[:options],@api_client, {})['name']
539
+ params['description'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'description', 'type' => 'text', 'fieldLabel' => 'Description', 'required' => false, 'description' => 'Description.'}],options[:options],@api_client,{})['description']
540
+ params['priority'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'priority', 'type' => 'number', 'fieldLabel' => 'Priority', 'required' => false, 'description' => 'Priority.'}],options[:options],@api_client,{})['priority']
541
+
542
+ option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
543
+
544
+ # prompt options
545
+ option_result = Morpheus::Cli::OptionTypes.prompt(option_types, options[:options].deep_merge({:context_map => {'ruleGroup' => ''}}), @api_client, {'networkServerId' => server['id']}, nil, true)
546
+
547
+ # prompt perms
548
+ if is_master_account
549
+ params.merge!(prompt_permissions_v2(options, ['plans', 'groups']))
550
+ end
551
+ payload = {'ruleGroup' => params.deep_merge(option_result)}
552
+ end
553
+
554
+ @network_servers_interface.setopts(options)
555
+
556
+ if options[:dry_run]
557
+ print_dry_run @network_servers_interface.dry.create_firewall_rule_group(server['id'], payload)
558
+ return
559
+ end
560
+
561
+ json_response = @network_servers_interface.create_firewall_rule_group(server['id'], payload)
562
+ render_response(json_response, options, 'ruleGroup') do
563
+ print_green_success "\nAdded Network Firewall Rule Group #{json_response['id']}\n"
564
+ _get_rule_group(server, json_response['id'], options)
565
+ end
566
+ end
567
+
568
+ def update_rule_group(args)
569
+ options = {:options=>{}}
570
+ params = {}
571
+ optparse = Morpheus::Cli::OptionParser.new do|opts|
572
+ opts.banner = subcommand_usage("[server] [group]")
573
+ opts.on('-n', '--name VALUE', String, "Name for this firewall rule group") do |val|
574
+ options[:options]['name'] = val
575
+ end
576
+ opts.on('-D', '--description VALUE', String, "Description for this firewall rule group") do |val|
577
+ options[:options]['description'] = val
578
+ end
579
+ opts.on('--priority VALUE', Integer, "Priority for this firewall rule group") do |val|
580
+ options[:options]['priority'] = val
581
+ end
582
+ add_perms_options(opts, options, ['plans', 'groups'])
583
+ build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote])
584
+ opts.footer = "Update a network firewall rule group.\n" +
585
+ "[server] is optional. This is the name or id of an existing network server.\n" +
586
+ "[group] is optional. This is the name or id of an existing network firewall rule group."
587
+ end
588
+ optparse.parse!(args)
589
+ if args.count > 2
590
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
591
+ end
592
+ connect(options)
593
+
594
+ 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']
595
+ server = find_network_server(server_id)
596
+ return 1 if server.nil?
597
+
598
+ if !server['type']['hasFirewallGroups']
599
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
600
+ return 1
601
+ end
602
+
603
+ 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']
604
+ group = find_rule_group(server['id'], group_id)
605
+ return 1 if group.nil?
606
+
607
+ if is_master_account
608
+ params['visibility'] = options[:visibility] if !options[:visibility].nil?
609
+ params['tenants'] = options[:tenants].collect {|it| {'id' => it}} if !options[:tenants].nil?
610
+ end
611
+
612
+ payload = parse_payload(options) || {'ruleGroup' => params}
613
+ payload['ruleGroup'].deep_merge!(options[:options].reject {|k,v| k.is_a?(Symbol) }) if options[:options] && !payload['ruleGroup'].nil?
614
+
615
+ if payload['ruleGroup'].empty?
616
+ print_green_success "Nothing to update"
617
+ println cyan
618
+ option_types = server['type']['firewallGroupOptionTypes'].sort_by {|it| it['displayOrder']}
619
+ edit_option_types = option_types.reject {|it| !it['editable'] || !it['showOnEdit']}
620
+
621
+ if edit_option_types.count > 0
622
+ print Morpheus::Cli::OptionTypes.display_option_types_help(option_types, {:include_context => true, :context_map => {'ruleGroup' => ''}, :color => cyan, :title => "Available Firewall Rule Group Options"})
623
+ end
624
+ exit 1
625
+ end
626
+
627
+ @network_servers_interface.setopts(options)
628
+
629
+ if options[:dry_run]
630
+ print_dry_run @network_servers_interface.dry.update_firewall_rule_group(server['id'], group['id'], payload)
631
+ return
632
+ end
633
+
634
+ json_response = @network_servers_interface.update_firewall_rule_group(server['id'], group['id'], payload)
635
+ render_response(json_response, options, 'ruleGroup') do
636
+ print_green_success "\nUpdated Network Firewall Rule Group #{group['id']}\n"
637
+ _get_rule_group(server, group['id'], options)
638
+ end
639
+ end
640
+
641
+ def remove_rule_group(args)
642
+ options = {}
643
+ optparse = Morpheus::Cli::OptionParser.new do |opts|
644
+ opts.banner = subcommand_usage("[server] [group]")
645
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
646
+ opts.footer = "Delete a network firewall group.\n" +
647
+ "[server] is optional. This is the name or id of an existing network server.\n" +
648
+ "[group] is optional. This is the name or id of an existing network firewall rule group."
649
+ end
650
+ optparse.parse!(args)
651
+ if args.count > 2
652
+ raise_command_error "wrong number of arguments, expected 0-2 and got (#{args.count}) #{args}\n#{optparse}"
653
+ end
654
+ connect(options)
655
+
656
+ 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']
657
+ server = find_network_server(server_id)
658
+ return 1 if server.nil?
659
+
660
+ if !server['type']['hasFirewallGroups']
661
+ print_red_alert "Firewall rule groups not supported for #{server['type']['name']}"
662
+ return 1
663
+ end
664
+
665
+ 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']
666
+ group = find_rule_group(server['id'], group_id)
667
+ return 1 if group.nil?
668
+
669
+ 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)
670
+ return 9, "aborted command"
671
+ end
672
+
673
+ @network_servers_interface.setopts(options)
674
+
675
+ if options[:dry_run]
676
+ print_dry_run @network_servers_interface.dry.destroy_firewall_rule_group(server['id'], group['id'])
677
+ return
678
+ end
679
+ json_response = @network_servers_interface.destroy_firewall_rule_group(server['id'], group['id'])
680
+ render_response(json_response, options, 'ruleGroup') do
681
+ print_green_success "\nDeleted Network Firewall Rule Group #{group['name']}\n"
682
+ _list_rule_groups(server, options)
683
+ end
684
+ end
685
+
686
+ private
687
+
688
+ def find_network_server(val)
689
+ if val.to_s =~ /\A\d{1,}\Z/
690
+ return find_network_server_by_id(val)
691
+ else
692
+ if server = find_network_server_by_name(val)
693
+ return find_network_server_by_id(server['id'])
694
+ end
695
+ end
696
+ end
697
+
698
+ def find_network_server_by_id(id)
699
+ begin
700
+ json_response = @network_servers_interface.get(id.to_i)
701
+ return json_response['networkServer']
702
+ rescue RestClient::Exception => e
703
+ if e.response && e.response.code == 404
704
+ print_red_alert "Network Server not found by id #{id}"
705
+ return nil
706
+ else
707
+ raise e
708
+ end
709
+ end
710
+ end
711
+
712
+ def find_network_server_by_name(name)
713
+ servers = search_network_servers(name)
714
+ if servers.empty?
715
+ print_red_alert "Network Server not found by name #{name}"
716
+ return nil
717
+ elsif servers.size > 1
718
+ print_red_alert "#{servers.size} network servers found by name #{name}"
719
+ rows = servers.collect do |it|
720
+ {id: it['id'], name: it['name']}
721
+ end
722
+ puts as_pretty_table(rows, [:id, :name], {color:red})
723
+ return nil
724
+ else
725
+ return servers[0]
726
+ end
727
+ end
728
+
729
+ def search_network_servers(phrase = nil)
730
+ @network_servers_interface.list(phrase ? {phrase: phrase.to_s} : {})['networkServers']
731
+ end
732
+
733
+ def find_rule(server_id, val)
734
+ if val.to_s =~ /\A\d{1,}\Z/
735
+ return find_rule_by_id(server_id, val)
736
+ else
737
+ if rule = find_rule_by_name(server_id, val)
738
+ return find_rule_by_id(server_id, rule['id'])
739
+ end
740
+ end
741
+ end
742
+
743
+ def find_rule_by_id(server_id, rule_id)
744
+ begin
745
+ json_response = @network_servers_interface.get_firewall_rule(server_id, rule_id.to_i)
746
+ return json_response['rule']
747
+ rescue RestClient::Exception => e
748
+ if e.response && e.response.code == 404
749
+ print_red_alert "Network firewall rule not found by id #{rule_id}"
750
+ return nil
751
+ else
752
+ raise e
753
+ end
754
+ end
755
+ end
756
+
757
+ def find_rule_by_name(server_id, name)
758
+ rules = search_rules(server_id, name)
759
+ if rules.empty?
760
+ print_red_alert "Network firewall rule not found by name #{name}"
761
+ return nil
762
+ elsif rules.size > 1
763
+ print_red_alert "#{rules.size} network firewall rules found by name #{name}"
764
+ rows = rules.collect do |it|
765
+ {id: it['id'], name: it['name']}
766
+ end
767
+ puts as_pretty_table(rows, [:id, :name], {color:red})
768
+ return nil
769
+ else
770
+ return rules[0]
771
+ end
772
+ end
773
+
774
+ def search_rules(server_id, phrase = nil)
775
+ @network_servers_interface.list_firewall_rules(server_id, phrase ? {phrase: phrase.to_s} : {})['rules']
776
+ end
777
+
778
+ def find_rule_group(server_id, val)
779
+ if val.to_s =~ /\A\d{1,}\Z/
780
+ return find_rule_group_by_id(server_id, val)
781
+ else
782
+ if group = find_rule_group_by_name(server_id, val)
783
+ return find_rule_group_by_id(server_id, group['id'])
784
+ end
785
+ end
786
+ end
787
+
788
+ def find_rule_group_by_id(server_id, group_id)
789
+ begin
790
+ json_response = @network_servers_interface.get_firewall_rule_group(server_id, group_id.to_i)
791
+ return json_response['ruleGroup']
792
+ rescue RestClient::Exception => e
793
+ if e.response && e.response.code == 404
794
+ print_red_alert "Network firewall rule group not found by id #{group_id}"
795
+ return nil
796
+ else
797
+ raise e
798
+ end
799
+ end
800
+ end
801
+
802
+ def find_rule_group_by_name(server_id, name)
803
+ groups = search_rule_groups(server_id, name)
804
+ if groups.empty?
805
+ print_red_alert "Network firewall rule group not found by name #{name}"
806
+ return nil
807
+ elsif groups.size > 1
808
+ print_red_alert "#{groups.size} network firewall rule groups found by name #{name}"
809
+ rows = groups.collect do |it|
810
+ {id: it['id'], name: it['name']}
811
+ end
812
+ puts as_pretty_table(rows, [:id, :name], {color:red})
813
+ return nil
814
+ else
815
+ return groups[0]
816
+ end
817
+ end
818
+
819
+ def search_rule_groups(server_id, phrase = nil)
820
+ @network_servers_interface.list_firewall_rule_groups(server_id, phrase ? {phrase: phrase.to_s} : {})['ruleGroups']
821
+ end
822
+
823
+ end