mtncloud-cli 1.0.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 (499) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +20 -0
  3. data/.github/pull_request_template.md +14 -0
  4. data/.github/workflows/ci.yml +56 -0
  5. data/.github/workflows/release.yml +46 -0
  6. data/.gitignore +25 -0
  7. data/CLAUDE.md +24 -0
  8. data/CONTRIBUTING.md +91 -0
  9. data/Dockerfile +19 -0
  10. data/Gemfile +4 -0
  11. data/LICENSE.txt +23 -0
  12. data/README.md +187 -0
  13. data/Rakefile +26 -0
  14. data/bin/mcs +3 -0
  15. data/bin/mtncloud +27 -0
  16. data/lib/mtncloud/api/account_groups_interface.rb +48 -0
  17. data/lib/mtncloud/api/account_users_interface.rb +68 -0
  18. data/lib/mtncloud/api/accounts_interface.rb +9 -0
  19. data/lib/mtncloud/api/activity_interface.rb +9 -0
  20. data/lib/mtncloud/api/affinity_groups_interface.rb +46 -0
  21. data/lib/mtncloud/api/api_client.rb +1091 -0
  22. data/lib/mtncloud/api/appliance_settings_interface.rb +49 -0
  23. data/lib/mtncloud/api/approvals_interface.rb +32 -0
  24. data/lib/mtncloud/api/apps_interface.rb +180 -0
  25. data/lib/mtncloud/api/archive_buckets_interface.rb +116 -0
  26. data/lib/mtncloud/api/archive_files_interface.rb +173 -0
  27. data/lib/mtncloud/api/audit_interface.rb +9 -0
  28. data/lib/mtncloud/api/auth_interface.rb +58 -0
  29. data/lib/mtncloud/api/backup_jobs_interface.rb +13 -0
  30. data/lib/mtncloud/api/backup_restores_interface.rb +27 -0
  31. data/lib/mtncloud/api/backup_results_interface.rb +32 -0
  32. data/lib/mtncloud/api/backup_service_types_interface.rb +9 -0
  33. data/lib/mtncloud/api/backup_services_interface.rb +9 -0
  34. data/lib/mtncloud/api/backup_settings_interface.rb +20 -0
  35. data/lib/mtncloud/api/backup_types_interface.rb +9 -0
  36. data/lib/mtncloud/api/backups_interface.rb +21 -0
  37. data/lib/mtncloud/api/billing_interface.rb +34 -0
  38. data/lib/mtncloud/api/blueprints_interface.rb +70 -0
  39. data/lib/mtncloud/api/body_io.rb +22 -0
  40. data/lib/mtncloud/api/budgets_interface.rb +48 -0
  41. data/lib/mtncloud/api/catalog_item_types_interface.rb +29 -0
  42. data/lib/mtncloud/api/certificate_types_interface.rb +14 -0
  43. data/lib/mtncloud/api/certificates_interface.rb +9 -0
  44. data/lib/mtncloud/api/clients_interface.rb +41 -0
  45. data/lib/mtncloud/api/cloud_datastores_interface.rb +48 -0
  46. data/lib/mtncloud/api/cloud_folders_interface.rb +41 -0
  47. data/lib/mtncloud/api/cloud_policies_interface.rb +41 -0
  48. data/lib/mtncloud/api/cloud_resource_pools_interface.rb +66 -0
  49. data/lib/mtncloud/api/clouds_interface.rb +217 -0
  50. data/lib/mtncloud/api/clusters_interface.rb +471 -0
  51. data/lib/mtncloud/api/containers_interface.rb +145 -0
  52. data/lib/mtncloud/api/credential_types_interface.rb +9 -0
  53. data/lib/mtncloud/api/credentials_interface.rb +9 -0
  54. data/lib/mtncloud/api/custom_instance_types_interface.rb +99 -0
  55. data/lib/mtncloud/api/cypher_interface.rb +51 -0
  56. data/lib/mtncloud/api/dashboard_interface.rb +14 -0
  57. data/lib/mtncloud/api/datastores_interface.rb +21 -0
  58. data/lib/mtncloud/api/deploy_interface.rb +44 -0
  59. data/lib/mtncloud/api/deployments_interface.rb +79 -0
  60. data/lib/mtncloud/api/distributed_workers_interface.rb +41 -0
  61. data/lib/mtncloud/api/email_templates_interface.rb +53 -0
  62. data/lib/mtncloud/api/environments_interface.rb +48 -0
  63. data/lib/mtncloud/api/execute_schedules_interface.rb +71 -0
  64. data/lib/mtncloud/api/execution_request_interface.rb +27 -0
  65. data/lib/mtncloud/api/file_copy_request_interface.rb +68 -0
  66. data/lib/mtncloud/api/forgot_password_interface.rb +17 -0
  67. data/lib/mtncloud/api/group_policies_interface.rb +41 -0
  68. data/lib/mtncloud/api/groups_interface.rb +73 -0
  69. data/lib/mtncloud/api/guidance_interface.rb +44 -0
  70. data/lib/mtncloud/api/guidance_settings_interface.rb +17 -0
  71. data/lib/mtncloud/api/health_interface.rb +100 -0
  72. data/lib/mtncloud/api/host_vm_groups_interface.rb +37 -0
  73. data/lib/mtncloud/api/hub_interface.rb +25 -0
  74. data/lib/mtncloud/api/image_builder_boot_scripts_interface.rb +41 -0
  75. data/lib/mtncloud/api/image_builder_image_builds_interface.rb +73 -0
  76. data/lib/mtncloud/api/image_builder_interface.rb +20 -0
  77. data/lib/mtncloud/api/image_builder_preseed_scripts_interface.rb +41 -0
  78. data/lib/mtncloud/api/instance_types_interface.rb +20 -0
  79. data/lib/mtncloud/api/instances_interface.rb +453 -0
  80. data/lib/mtncloud/api/integration_types_interface.rb +14 -0
  81. data/lib/mtncloud/api/integrations_interface.rb +74 -0
  82. data/lib/mtncloud/api/invoice_line_items_interface.rb +9 -0
  83. data/lib/mtncloud/api/invoices_interface.rb +28 -0
  84. data/lib/mtncloud/api/jobs_interface.rb +83 -0
  85. data/lib/mtncloud/api/key_pairs_interface.rb +57 -0
  86. data/lib/mtncloud/api/library_cluster_layouts_interface.rb +47 -0
  87. data/lib/mtncloud/api/library_cluster_packages_interface.rb +60 -0
  88. data/lib/mtncloud/api/library_container_scripts_interface.rb +43 -0
  89. data/lib/mtncloud/api/library_container_templates_interface.rb +43 -0
  90. data/lib/mtncloud/api/library_container_types_interface.rb +59 -0
  91. data/lib/mtncloud/api/library_container_upgrades_interface.rb +60 -0
  92. data/lib/mtncloud/api/library_instance_types_interface.rb +74 -0
  93. data/lib/mtncloud/api/library_layouts_interface.rb +69 -0
  94. data/lib/mtncloud/api/library_operating_systems_interface.rb +63 -0
  95. data/lib/mtncloud/api/library_spec_template_types_interface.rb +43 -0
  96. data/lib/mtncloud/api/library_spec_templates_interface.rb +43 -0
  97. data/lib/mtncloud/api/license_interface.rb +30 -0
  98. data/lib/mtncloud/api/load_balancer_monitors_interface.rb +9 -0
  99. data/lib/mtncloud/api/load_balancer_pool_nodes_interface.rb +8 -0
  100. data/lib/mtncloud/api/load_balancer_pools_interface.rb +9 -0
  101. data/lib/mtncloud/api/load_balancer_pools_secondary_interface.rb +9 -0
  102. data/lib/mtncloud/api/load_balancer_profiles_interface.rb +9 -0
  103. data/lib/mtncloud/api/load_balancer_types_interface.rb +9 -0
  104. data/lib/mtncloud/api/load_balancer_virtual_servers_interface.rb +18 -0
  105. data/lib/mtncloud/api/load_balancers_interface.rb +14 -0
  106. data/lib/mtncloud/api/log_settings_interface.rb +44 -0
  107. data/lib/mtncloud/api/logs_interface.rb +37 -0
  108. data/lib/mtncloud/api/migrations_interface.rb +49 -0
  109. data/lib/mtncloud/api/monitoring_alerts_interface.rb +39 -0
  110. data/lib/mtncloud/api/monitoring_apps_interface.rb +69 -0
  111. data/lib/mtncloud/api/monitoring_checks_interface.rb +103 -0
  112. data/lib/mtncloud/api/monitoring_contacts_interface.rb +41 -0
  113. data/lib/mtncloud/api/monitoring_groups_interface.rb +77 -0
  114. data/lib/mtncloud/api/monitoring_incidents_interface.rb +107 -0
  115. data/lib/mtncloud/api/monitoring_interface.rb +35 -0
  116. data/lib/mtncloud/api/monitoring_settings_interface.rb +21 -0
  117. data/lib/mtncloud/api/network_dhcp_relays_interface.rb +36 -0
  118. data/lib/mtncloud/api/network_dhcp_servers_interface.rb +36 -0
  119. data/lib/mtncloud/api/network_domain_records_interface.rb +41 -0
  120. data/lib/mtncloud/api/network_domains_interface.rb +41 -0
  121. data/lib/mtncloud/api/network_edge_clusters_interface.rb +26 -0
  122. data/lib/mtncloud/api/network_floating_ips_interface.rb +40 -0
  123. data/lib/mtncloud/api/network_groups_interface.rb +41 -0
  124. data/lib/mtncloud/api/network_pool_ips_interface.rb +41 -0
  125. data/lib/mtncloud/api/network_pool_server_types_interface.rb +9 -0
  126. data/lib/mtncloud/api/network_pool_servers_interface.rb +48 -0
  127. data/lib/mtncloud/api/network_pools_interface.rb +41 -0
  128. data/lib/mtncloud/api/network_proxies_interface.rb +41 -0
  129. data/lib/mtncloud/api/network_routers_interface.rb +181 -0
  130. data/lib/mtncloud/api/network_security_server_types_interface.rb +9 -0
  131. data/lib/mtncloud/api/network_security_servers_interface.rb +27 -0
  132. data/lib/mtncloud/api/network_server_groups_interface.rb +7 -0
  133. data/lib/mtncloud/api/network_server_types_interface.rb +9 -0
  134. data/lib/mtncloud/api/network_servers_interface.rb +102 -0
  135. data/lib/mtncloud/api/network_services_interface.rb +63 -0
  136. data/lib/mtncloud/api/network_static_routes_interface.rb +36 -0
  137. data/lib/mtncloud/api/network_subnets_interface.rb +42 -0
  138. data/lib/mtncloud/api/network_types_interface.rb +20 -0
  139. data/lib/mtncloud/api/networks_interface.rb +48 -0
  140. data/lib/mtncloud/api/option_type_forms_interface.rb +9 -0
  141. data/lib/mtncloud/api/option_type_lists_interface.rb +53 -0
  142. data/lib/mtncloud/api/option_types_interface.rb +41 -0
  143. data/lib/mtncloud/api/options_interface.rb +17 -0
  144. data/lib/mtncloud/api/packages_interface.rb +112 -0
  145. data/lib/mtncloud/api/ping_interface.rb +22 -0
  146. data/lib/mtncloud/api/plugins_interface.rb +22 -0
  147. data/lib/mtncloud/api/policies_interface.rb +56 -0
  148. data/lib/mtncloud/api/power_schedules_interface.rb +71 -0
  149. data/lib/mtncloud/api/price_sets_interface.rb +39 -0
  150. data/lib/mtncloud/api/prices_interface.rb +71 -0
  151. data/lib/mtncloud/api/processes_interface.rb +40 -0
  152. data/lib/mtncloud/api/projects_interface.rb +33 -0
  153. data/lib/mtncloud/api/provision_types_interface.rb +24 -0
  154. data/lib/mtncloud/api/provisioning_license_types_interface.rb +31 -0
  155. data/lib/mtncloud/api/provisioning_licenses_interface.rb +60 -0
  156. data/lib/mtncloud/api/provisioning_settings_interface.rb +26 -0
  157. data/lib/mtncloud/api/read_interface.rb +24 -0
  158. data/lib/mtncloud/api/reports_interface.rb +70 -0
  159. data/lib/mtncloud/api/resource_pool_groups_interface.rb +51 -0
  160. data/lib/mtncloud/api/rest_interface.rb +37 -0
  161. data/lib/mtncloud/api/roles_interface.rb +151 -0
  162. data/lib/mtncloud/api/scale_thresholds_interface.rb +9 -0
  163. data/lib/mtncloud/api/search_interface.rb +13 -0
  164. data/lib/mtncloud/api/secondary_read_interface.rb +25 -0
  165. data/lib/mtncloud/api/secondary_rest_interface.rb +42 -0
  166. data/lib/mtncloud/api/security_group_rules_interface.rb +35 -0
  167. data/lib/mtncloud/api/security_groups_interface.rb +56 -0
  168. data/lib/mtncloud/api/security_package_types_interface.rb +9 -0
  169. data/lib/mtncloud/api/security_packages_interface.rb +9 -0
  170. data/lib/mtncloud/api/security_scans_interface.rb +9 -0
  171. data/lib/mtncloud/api/server_devices_interface.rb +30 -0
  172. data/lib/mtncloud/api/server_types_interface.rb +20 -0
  173. data/lib/mtncloud/api/servers_interface.rb +230 -0
  174. data/lib/mtncloud/api/service_catalog_interface.rb +89 -0
  175. data/lib/mtncloud/api/service_plans_interface.rb +62 -0
  176. data/lib/mtncloud/api/setup_interface.rb +46 -0
  177. data/lib/mtncloud/api/snapshots_interface.rb +19 -0
  178. data/lib/mtncloud/api/storage_datastores_interface.rb +44 -0
  179. data/lib/mtncloud/api/storage_providers_interface.rb +151 -0
  180. data/lib/mtncloud/api/storage_server_types_interface.rb +14 -0
  181. data/lib/mtncloud/api/storage_servers_interface.rb +9 -0
  182. data/lib/mtncloud/api/storage_volume_types_interface.rb +9 -0
  183. data/lib/mtncloud/api/storage_volumes_interface.rb +24 -0
  184. data/lib/mtncloud/api/subnet_types_interface.rb +20 -0
  185. data/lib/mtncloud/api/subnets_interface.rb +41 -0
  186. data/lib/mtncloud/api/support_bundles_interface.rb +46 -0
  187. data/lib/mtncloud/api/system_types_interface.rb +13 -0
  188. data/lib/mtncloud/api/systems_interface.rb +55 -0
  189. data/lib/mtncloud/api/task_sets_interface.rb +52 -0
  190. data/lib/mtncloud/api/tasks_interface.rb +66 -0
  191. data/lib/mtncloud/api/tokens_interface.rb +39 -0
  192. data/lib/mtncloud/api/usage_interface.rb +18 -0
  193. data/lib/mtncloud/api/user_groups_interface.rb +59 -0
  194. data/lib/mtncloud/api/user_settings_interface.rb +90 -0
  195. data/lib/mtncloud/api/user_sources_interface.rb +99 -0
  196. data/lib/mtncloud/api/users_interface.rb +33 -0
  197. data/lib/mtncloud/api/vdi_allocations_interface.rb +9 -0
  198. data/lib/mtncloud/api/vdi_apps_interface.rb +9 -0
  199. data/lib/mtncloud/api/vdi_gateways_interface.rb +9 -0
  200. data/lib/mtncloud/api/vdi_interface.rb +28 -0
  201. data/lib/mtncloud/api/vdi_pools_interface.rb +19 -0
  202. data/lib/mtncloud/api/virtual_images_interface.rb +210 -0
  203. data/lib/mtncloud/api/virtual_servers_interface.rb +9 -0
  204. data/lib/mtncloud/api/virtual_switches_interface.rb +9 -0
  205. data/lib/mtncloud/api/whitelabel_settings_interface.rb +57 -0
  206. data/lib/mtncloud/api/whoami_interface.rb +13 -0
  207. data/lib/mtncloud/api/wiki_interface.rb +48 -0
  208. data/lib/mtncloud/api.rb +12 -0
  209. data/lib/mtncloud/benchmarking.rb +259 -0
  210. data/lib/mtncloud/cli/cli_command.rb +2281 -0
  211. data/lib/mtncloud/cli/cli_registry.rb +337 -0
  212. data/lib/mtncloud/cli/commands/access_token_command.rb +201 -0
  213. data/lib/mtncloud/cli/commands/account_groups_command.rb +530 -0
  214. data/lib/mtncloud/cli/commands/activity_command.rb +149 -0
  215. data/lib/mtncloud/cli/commands/affinity_groups_command.rb +554 -0
  216. data/lib/mtncloud/cli/commands/alias_command.rb +278 -0
  217. data/lib/mtncloud/cli/commands/appliance_settings_command.rb +382 -0
  218. data/lib/mtncloud/cli/commands/approvals_command.rb +236 -0
  219. data/lib/mtncloud/cli/commands/apps.rb +2549 -0
  220. data/lib/mtncloud/cli/commands/archives_command.rb +2161 -0
  221. data/lib/mtncloud/cli/commands/audit.rb +188 -0
  222. data/lib/mtncloud/cli/commands/backup_jobs_command.rb +366 -0
  223. data/lib/mtncloud/cli/commands/backup_restores_command.rb +144 -0
  224. data/lib/mtncloud/cli/commands/backup_results_command.rb +149 -0
  225. data/lib/mtncloud/cli/commands/backup_services_command.rb +44 -0
  226. data/lib/mtncloud/cli/commands/backup_settings_command.rb +184 -0
  227. data/lib/mtncloud/cli/commands/backup_types_command.rb +53 -0
  228. data/lib/mtncloud/cli/commands/backups_command.rb +674 -0
  229. data/lib/mtncloud/cli/commands/benchmark_command.rb +458 -0
  230. data/lib/mtncloud/cli/commands/blueprints_command.rb +2297 -0
  231. data/lib/mtncloud/cli/commands/boot_scripts_command.rb +379 -0
  232. data/lib/mtncloud/cli/commands/budgets_command.rb +754 -0
  233. data/lib/mtncloud/cli/commands/cat_command.rb +45 -0
  234. data/lib/mtncloud/cli/commands/catalog_item_types_command.rb +858 -0
  235. data/lib/mtncloud/cli/commands/certificates_command.rb +575 -0
  236. data/lib/mtncloud/cli/commands/change_password_command.rb +132 -0
  237. data/lib/mtncloud/cli/commands/clients_command.rb +331 -0
  238. data/lib/mtncloud/cli/commands/cloud_datastores_command.rb +543 -0
  239. data/lib/mtncloud/cli/commands/cloud_folders_command.rb +512 -0
  240. data/lib/mtncloud/cli/commands/cloud_resource_pools_command.rb +870 -0
  241. data/lib/mtncloud/cli/commands/clouds.rb +2037 -0
  242. data/lib/mtncloud/cli/commands/clouds_types.rb +140 -0
  243. data/lib/mtncloud/cli/commands/cluster_types.rb +179 -0
  244. data/lib/mtncloud/cli/commands/clusters.rb +5855 -0
  245. data/lib/mtncloud/cli/commands/coloring_command.rb +82 -0
  246. data/lib/mtncloud/cli/commands/containers_command.rb +967 -0
  247. data/lib/mtncloud/cli/commands/credential_types_command.rb +36 -0
  248. data/lib/mtncloud/cli/commands/credentials_command.rb +124 -0
  249. data/lib/mtncloud/cli/commands/curl_command.rb +168 -0
  250. data/lib/mtncloud/cli/commands/cypher_command.rb +587 -0
  251. data/lib/mtncloud/cli/commands/dashboard_command.rb +300 -0
  252. data/lib/mtncloud/cli/commands/debug_command.rb +75 -0
  253. data/lib/mtncloud/cli/commands/deploy.rb +485 -0
  254. data/lib/mtncloud/cli/commands/deployments.rb +923 -0
  255. data/lib/mtncloud/cli/commands/deploys.rb +485 -0
  256. data/lib/mtncloud/cli/commands/distributed_workers_command.rb +282 -0
  257. data/lib/mtncloud/cli/commands/echo_command.rb +61 -0
  258. data/lib/mtncloud/cli/commands/edit_profile_command.rb +57 -0
  259. data/lib/mtncloud/cli/commands/edit_rc_command.rb +77 -0
  260. data/lib/mtncloud/cli/commands/email_templates_command.rb +373 -0
  261. data/lib/mtncloud/cli/commands/environments_command.rb +401 -0
  262. data/lib/mtncloud/cli/commands/execute_schedules_command.rb +735 -0
  263. data/lib/mtncloud/cli/commands/execution_request_command.rb +333 -0
  264. data/lib/mtncloud/cli/commands/exit_command.rb +34 -0
  265. data/lib/mtncloud/cli/commands/file_copy_request_command.rb +352 -0
  266. data/lib/mtncloud/cli/commands/forgot_password.rb +133 -0
  267. data/lib/mtncloud/cli/commands/get_prompt_command.rb +36 -0
  268. data/lib/mtncloud/cli/commands/groups.rb +818 -0
  269. data/lib/mtncloud/cli/commands/guidance_command.rb +529 -0
  270. data/lib/mtncloud/cli/commands/guidance_settings.rb +148 -0
  271. data/lib/mtncloud/cli/commands/health_command.rb +1046 -0
  272. data/lib/mtncloud/cli/commands/history_command.rb +60 -0
  273. data/lib/mtncloud/cli/commands/host_vm_groups_command.rb +423 -0
  274. data/lib/mtncloud/cli/commands/hosts.rb +2986 -0
  275. data/lib/mtncloud/cli/commands/hub.rb +215 -0
  276. data/lib/mtncloud/cli/commands/image_builder_command.rb +1197 -0
  277. data/lib/mtncloud/cli/commands/instance_types.rb +163 -0
  278. data/lib/mtncloud/cli/commands/instances.rb +5813 -0
  279. data/lib/mtncloud/cli/commands/integrations_command.rb +1412 -0
  280. data/lib/mtncloud/cli/commands/invoices_command.rb +1151 -0
  281. data/lib/mtncloud/cli/commands/jobs_command.rb +998 -0
  282. data/lib/mtncloud/cli/commands/key_pairs.rb +470 -0
  283. data/lib/mtncloud/cli/commands/library_cluster_layouts_command.rb +901 -0
  284. data/lib/mtncloud/cli/commands/library_cluster_packages_command.rb +552 -0
  285. data/lib/mtncloud/cli/commands/library_container_scripts_command.rb +446 -0
  286. data/lib/mtncloud/cli/commands/library_container_templates_command.rb +526 -0
  287. data/lib/mtncloud/cli/commands/library_container_types_command.rb +698 -0
  288. data/lib/mtncloud/cli/commands/library_forms_command.rb +625 -0
  289. data/lib/mtncloud/cli/commands/library_instance_types_command.rb +668 -0
  290. data/lib/mtncloud/cli/commands/library_layouts_command.rb +849 -0
  291. data/lib/mtncloud/cli/commands/library_operating_systems_command.rb +671 -0
  292. data/lib/mtncloud/cli/commands/library_option_lists_command.rb +503 -0
  293. data/lib/mtncloud/cli/commands/library_option_types_command.rb +329 -0
  294. data/lib/mtncloud/cli/commands/library_spec_templates_command.rb +547 -0
  295. data/lib/mtncloud/cli/commands/library_upgrades_command.rb +596 -0
  296. data/lib/mtncloud/cli/commands/license.rb +475 -0
  297. data/lib/mtncloud/cli/commands/load_balancer_monitors.rb +70 -0
  298. data/lib/mtncloud/cli/commands/load_balancer_pool_nodes.rb +87 -0
  299. data/lib/mtncloud/cli/commands/load_balancer_pools.rb +129 -0
  300. data/lib/mtncloud/cli/commands/load_balancer_profiles.rb +64 -0
  301. data/lib/mtncloud/cli/commands/load_balancer_types.rb +38 -0
  302. data/lib/mtncloud/cli/commands/load_balancer_virtual_servers.rb +147 -0
  303. data/lib/mtncloud/cli/commands/load_balancers.rb +189 -0
  304. data/lib/mtncloud/cli/commands/log_level_command.rb +54 -0
  305. data/lib/mtncloud/cli/commands/log_settings_command.rb +443 -0
  306. data/lib/mtncloud/cli/commands/login.rb +148 -0
  307. data/lib/mtncloud/cli/commands/logout.rb +63 -0
  308. data/lib/mtncloud/cli/commands/logs_command.rb +140 -0
  309. data/lib/mtncloud/cli/commands/man_command.rb +409 -0
  310. data/lib/mtncloud/cli/commands/migrations.rb +453 -0
  311. data/lib/mtncloud/cli/commands/monitoring_alerts_command.rb +791 -0
  312. data/lib/mtncloud/cli/commands/monitoring_apps_command.rb +716 -0
  313. data/lib/mtncloud/cli/commands/monitoring_checks_command.rb +766 -0
  314. data/lib/mtncloud/cli/commands/monitoring_contacts_command.rb +339 -0
  315. data/lib/mtncloud/cli/commands/monitoring_groups_command.rb +674 -0
  316. data/lib/mtncloud/cli/commands/monitoring_incidents_command.rb +835 -0
  317. data/lib/mtncloud/cli/commands/monitoring_settings.rb +212 -0
  318. data/lib/mtncloud/cli/commands/network_dhcp_relays_command.rb +375 -0
  319. data/lib/mtncloud/cli/commands/network_dhcp_servers_command.rb +366 -0
  320. data/lib/mtncloud/cli/commands/network_domains_command.rb +896 -0
  321. data/lib/mtncloud/cli/commands/network_edge_clusters_command.rb +288 -0
  322. data/lib/mtncloud/cli/commands/network_firewalls_command.rb +783 -0
  323. data/lib/mtncloud/cli/commands/network_floating_ips.rb +147 -0
  324. data/lib/mtncloud/cli/commands/network_groups_command.rb +654 -0
  325. data/lib/mtncloud/cli/commands/network_pool_server_types.rb +20 -0
  326. data/lib/mtncloud/cli/commands/network_pool_servers_command.rb +318 -0
  327. data/lib/mtncloud/cli/commands/network_pools_command.rb +903 -0
  328. data/lib/mtncloud/cli/commands/network_proxies_command.rb +578 -0
  329. data/lib/mtncloud/cli/commands/network_routers_command.rb +2628 -0
  330. data/lib/mtncloud/cli/commands/network_security_server_types.rb +20 -0
  331. data/lib/mtncloud/cli/commands/network_server_groups_command.rb +222 -0
  332. data/lib/mtncloud/cli/commands/network_server_types_command.rb +20 -0
  333. data/lib/mtncloud/cli/commands/network_servers_command.rb +398 -0
  334. data/lib/mtncloud/cli/commands/network_services_command.rb +198 -0
  335. data/lib/mtncloud/cli/commands/network_static_routes_command.rb +451 -0
  336. data/lib/mtncloud/cli/commands/network_transport_zones_command.rb +412 -0
  337. data/lib/mtncloud/cli/commands/networks_command.rb +1692 -0
  338. data/lib/mtncloud/cli/commands/open_command.rb +30 -0
  339. data/lib/mtncloud/cli/commands/options.rb +231 -0
  340. data/lib/mtncloud/cli/commands/packages_command.rb +822 -0
  341. data/lib/mtncloud/cli/commands/ping.rb +242 -0
  342. data/lib/mtncloud/cli/commands/plugins.rb +214 -0
  343. data/lib/mtncloud/cli/commands/policies_command.rb +990 -0
  344. data/lib/mtncloud/cli/commands/power_schedules_command.rb +731 -0
  345. data/lib/mtncloud/cli/commands/preseed_scripts_command.rb +378 -0
  346. data/lib/mtncloud/cli/commands/price_sets_command.rb +557 -0
  347. data/lib/mtncloud/cli/commands/prices_command.rb +692 -0
  348. data/lib/mtncloud/cli/commands/processes_command.rb +469 -0
  349. data/lib/mtncloud/cli/commands/projects_command.rb +537 -0
  350. data/lib/mtncloud/cli/commands/provisioning_licenses_command.rb +509 -0
  351. data/lib/mtncloud/cli/commands/provisioning_settings_command.rb +238 -0
  352. data/lib/mtncloud/cli/commands/recent_activity_command.rb +171 -0
  353. data/lib/mtncloud/cli/commands/remote.rb +1818 -0
  354. data/lib/mtncloud/cli/commands/reports_command.rb +724 -0
  355. data/lib/mtncloud/cli/commands/resource_pool_groups_command.rb +586 -0
  356. data/lib/mtncloud/cli/commands/rm_command.rb +14 -0
  357. data/lib/mtncloud/cli/commands/roles.rb +3120 -0
  358. data/lib/mtncloud/cli/commands/scale_thresholds.rb +103 -0
  359. data/lib/mtncloud/cli/commands/search_command.rb +184 -0
  360. data/lib/mtncloud/cli/commands/security_group_rules.rb +230 -0
  361. data/lib/mtncloud/cli/commands/security_groups.rb +1294 -0
  362. data/lib/mtncloud/cli/commands/security_package_types.rb +32 -0
  363. data/lib/mtncloud/cli/commands/security_packages.rb +84 -0
  364. data/lib/mtncloud/cli/commands/security_scans.rb +107 -0
  365. data/lib/mtncloud/cli/commands/self_service_command.rb +17 -0
  366. data/lib/mtncloud/cli/commands/server_devices_command.rb +207 -0
  367. data/lib/mtncloud/cli/commands/service_catalog_command.rb +1528 -0
  368. data/lib/mtncloud/cli/commands/service_plans_command.rb +895 -0
  369. data/lib/mtncloud/cli/commands/set_prompt_command.rb +51 -0
  370. data/lib/mtncloud/cli/commands/setup.rb +423 -0
  371. data/lib/mtncloud/cli/commands/shell.rb +717 -0
  372. data/lib/mtncloud/cli/commands/sleep_command.rb +43 -0
  373. data/lib/mtncloud/cli/commands/snapshots.rb +156 -0
  374. data/lib/mtncloud/cli/commands/source_command.rb +30 -0
  375. data/lib/mtncloud/cli/commands/ssl_verification_command.rb +47 -0
  376. data/lib/mtncloud/cli/commands/storage_datastores.rb +457 -0
  377. data/lib/mtncloud/cli/commands/storage_providers_command.rb +1401 -0
  378. data/lib/mtncloud/cli/commands/storage_server_types.rb +45 -0
  379. data/lib/mtncloud/cli/commands/storage_servers.rb +116 -0
  380. data/lib/mtncloud/cli/commands/storage_volume_types.rb +45 -0
  381. data/lib/mtncloud/cli/commands/storage_volumes.rb +236 -0
  382. data/lib/mtncloud/cli/commands/subnets_command.rb +819 -0
  383. data/lib/mtncloud/cli/commands/support_bundles_command.rb +606 -0
  384. data/lib/mtncloud/cli/commands/systems.rb +1203 -0
  385. data/lib/mtncloud/cli/commands/tasks.rb +1391 -0
  386. data/lib/mtncloud/cli/commands/tee_command.rb +14 -0
  387. data/lib/mtncloud/cli/commands/tenants_command.rb +315 -0
  388. data/lib/mtncloud/cli/commands/tokens_command.rb +391 -0
  389. data/lib/mtncloud/cli/commands/update_command.rb +46 -0
  390. data/lib/mtncloud/cli/commands/usage_command.rb +203 -0
  391. data/lib/mtncloud/cli/commands/user_groups_command.rb +512 -0
  392. data/lib/mtncloud/cli/commands/user_settings_command.rb +849 -0
  393. data/lib/mtncloud/cli/commands/user_sources_command.rb +1065 -0
  394. data/lib/mtncloud/cli/commands/users.rb +897 -0
  395. data/lib/mtncloud/cli/commands/vdi_allocations_command.rb +159 -0
  396. data/lib/mtncloud/cli/commands/vdi_apps_command.rb +317 -0
  397. data/lib/mtncloud/cli/commands/vdi_command.rb +359 -0
  398. data/lib/mtncloud/cli/commands/vdi_gateways_command.rb +290 -0
  399. data/lib/mtncloud/cli/commands/vdi_pools_command.rb +574 -0
  400. data/lib/mtncloud/cli/commands/version_command.rb +38 -0
  401. data/lib/mtncloud/cli/commands/view.rb +107 -0
  402. data/lib/mtncloud/cli/commands/virtual_images.rb +1362 -0
  403. data/lib/mtncloud/cli/commands/virtual_switches_command.rb +336 -0
  404. data/lib/mtncloud/cli/commands/whitelabel_settings_command.rb +653 -0
  405. data/lib/mtncloud/cli/commands/whoami.rb +323 -0
  406. data/lib/mtncloud/cli/commands/wiki_command.rb +448 -0
  407. data/lib/mtncloud/cli/commands/workflows.rb +1022 -0
  408. data/lib/mtncloud/cli/credentials.rb +482 -0
  409. data/lib/mtncloud/cli/dot_file.rb +180 -0
  410. data/lib/mtncloud/cli/error_handler.rb +307 -0
  411. data/lib/mtncloud/cli/errors.rb +53 -0
  412. data/lib/mtncloud/cli/expression_parser.rb +153 -0
  413. data/lib/mtncloud/cli/mixins/accounts_helper.rb +484 -0
  414. data/lib/mtncloud/cli/mixins/affinity_helper.rb +118 -0
  415. data/lib/mtncloud/cli/mixins/backups_helper.rb +200 -0
  416. data/lib/mtncloud/cli/mixins/deployments_helper.rb +163 -0
  417. data/lib/mtncloud/cli/mixins/execution_request_helper.rb +50 -0
  418. data/lib/mtncloud/cli/mixins/infrastructure_helper.rb +966 -0
  419. data/lib/mtncloud/cli/mixins/jobs_helper.rb +202 -0
  420. data/lib/mtncloud/cli/mixins/library_helper.rb +539 -0
  421. data/lib/mtncloud/cli/mixins/load_balancers_helper.rb +176 -0
  422. data/lib/mtncloud/cli/mixins/logs_helper.rb +131 -0
  423. data/lib/mtncloud/cli/mixins/monitoring_helper.rb +876 -0
  424. data/lib/mtncloud/cli/mixins/networks_helper.rb +62 -0
  425. data/lib/mtncloud/cli/mixins/operations_helper.rb +41 -0
  426. data/lib/mtncloud/cli/mixins/option_source_helper.rb +254 -0
  427. data/lib/mtncloud/cli/mixins/print_helper.rb +1631 -0
  428. data/lib/mtncloud/cli/mixins/processes_helper.rb +286 -0
  429. data/lib/mtncloud/cli/mixins/prompt_helper.rb +136 -0
  430. data/lib/mtncloud/cli/mixins/provisioning_helper.rb +2963 -0
  431. data/lib/mtncloud/cli/mixins/remote_helper.rb +139 -0
  432. data/lib/mtncloud/cli/mixins/rest_command.rb +994 -0
  433. data/lib/mtncloud/cli/mixins/secondary_rest_command.rb +700 -0
  434. data/lib/mtncloud/cli/mixins/storage_servers_helper.rb +93 -0
  435. data/lib/mtncloud/cli/mixins/storage_volumes_helper.rb +76 -0
  436. data/lib/mtncloud/cli/mixins/vdi_helper.rb +246 -0
  437. data/lib/mtncloud/cli/mixins/whoami_helper.rb +73 -0
  438. data/lib/mtncloud/cli/option_parser.rb +127 -0
  439. data/lib/mtncloud/cli/option_types.rb +1622 -0
  440. data/lib/mtncloud/cli/version.rb +6 -0
  441. data/lib/mtncloud/cli.rb +105 -0
  442. data/lib/mtncloud/currency.rb +184 -0
  443. data/lib/mtncloud/ext/hash.rb +109 -0
  444. data/lib/mtncloud/ext/nil_class.rb +5 -0
  445. data/lib/mtncloud/ext/rest_client.rb +37 -0
  446. data/lib/mtncloud/ext/string.rb +66 -0
  447. data/lib/mtncloud/formatters.rb +511 -0
  448. data/lib/mtncloud/logging.rb +185 -0
  449. data/lib/mtncloud/morpkg.rb +119 -0
  450. data/lib/mtncloud/rest_client.rb +104 -0
  451. data/lib/mtncloud/routes.rb +304 -0
  452. data/lib/mtncloud/terminal.rb +528 -0
  453. data/lib/mtncloud/util.rb +29 -0
  454. data/lib/mtncloud.rb +5 -0
  455. data/mtncloud-cli.gemspec +38 -0
  456. data/test/api/affinity_groups_interface_test.rb +43 -0
  457. data/test/api/clients_interface_test.rb +23 -0
  458. data/test/api/clouds_interface_test.rb +67 -0
  459. data/test/api/containers_interface_test.rb +68 -0
  460. data/test/api/host_vm_groups_interface_test.rb +35 -0
  461. data/test/api/instances_interface_test.rb +22 -0
  462. data/test/api/network_routers_interface_test.rb +22 -0
  463. data/test/api/systems_interface_test.rb +26 -0
  464. data/test/api/whoami_interface_test.rb +14 -0
  465. data/test/branding_test.rb +160 -0
  466. data/test/cli/access_token_test.rb +36 -0
  467. data/test/cli/affinity_groups_cloud_cluster_scope_test.rb +270 -0
  468. data/test/cli/affinity_groups_cluster_scope_test.rb +171 -0
  469. data/test/cli/affinity_groups_test.rb +57 -0
  470. data/test/cli/affinity_groups_violations_scope_test.rb +141 -0
  471. data/test/cli/affinity_helper_test.rb +367 -0
  472. data/test/cli/auth_test.rb +88 -0
  473. data/test/cli/backups_test.rb +212 -0
  474. data/test/cli/cli_test.rb +48 -0
  475. data/test/cli/clients_test.rb +45 -0
  476. data/test/cli/clusters_uuid_test.rb +146 -0
  477. data/test/cli/containers_test.rb +92 -0
  478. data/test/cli/distributed_workers_test.rb +68 -0
  479. data/test/cli/help_test.rb +25 -0
  480. data/test/cli/host_vm_groups_cluster_scope_test.rb +187 -0
  481. data/test/cli/host_vm_groups_test.rb +63 -0
  482. data/test/cli/infrastructure_helper_cluster_resolver_test.rb +250 -0
  483. data/test/cli/instances_test.rb +37 -0
  484. data/test/cli/man_test.rb +14 -0
  485. data/test/cli/migrations_test.rb +39 -0
  486. data/test/cli/network_routers_test.rb +65 -0
  487. data/test/cli/remote_test.rb +89 -0
  488. data/test/cli/roles_test.rb +47 -0
  489. data/test/cli/shell_test.rb +81 -0
  490. data/test/cli/storage_volumes_test.rb +79 -0
  491. data/test/cli/systems_test.rb +206 -0
  492. data/test/cli/version_test.rb +23 -0
  493. data/test/cli/view_test.rb +55 -0
  494. data/test/cli/whoami_test.rb +17 -0
  495. data/test/mtncloud_test.rb +16 -0
  496. data/test/test_case.rb +342 -0
  497. data/test/test_config.rb +137 -0
  498. data/test/test_data_helper.rb +97 -0
  499. metadata +807 -0
@@ -0,0 +1,717 @@
1
+ require 'mtncloud/cli/cli_command'
2
+ require "shellwords"
3
+ require "readline"
4
+
5
+ #class MtnCloud::Cli::Shell < MtnCloud::Terminal
6
+ class MtnCloud::Cli::Shell
7
+ include MtnCloud::Cli::CliCommand
8
+
9
+ @@instance = nil
10
+
11
+ def self.has_instance?
12
+ defined?(@@instance) && @@instance
13
+ end
14
+
15
+ def self.instance
16
+ @@instance ||= reload_instance
17
+ end
18
+
19
+ def self.reload_instance
20
+ @@instance = self.new
21
+ end
22
+
23
+ def self.insecure
24
+ !!(defined?(@@insecure) && @@insecure == true)
25
+ end
26
+
27
+ attr_accessor :prompt #, :angry_prompt
28
+
29
+ def initialize()
30
+ @@instance = self
31
+ reinitialize()
32
+ end
33
+
34
+ def reinitialize()
35
+ # @appliance_name, @appliance_url = MtnCloud::Cli::Remote.active_appliance
36
+ @current_remote = ::MtnCloud::Cli::Remote.load_active_remote()
37
+ if @current_remote
38
+ @appliance_name, @appliance_url = @current_remote[:name], @current_remote[:host]
39
+ # @current_username = @current_remote[:username] || '(anonymous)'
40
+ @current_username = @current_remote[:username] || ''
41
+ else
42
+ @appliance_name, @appliance_url = nil, nil
43
+ @current_username = nil
44
+ end
45
+ #connect()
46
+ #raise "one shell only" if @@instance
47
+ @@instance = self
48
+ recalculate_prompt()
49
+ recalculate_auto_complete_commands()
50
+ end
51
+
52
+ # def connect(opts)
53
+ # @api_client = establish_remote_appliance_connection(opts)
54
+ # end
55
+
56
+ def recalculate_prompt()
57
+ # custom prompts.. this is overkill and perhaps a silly thing..
58
+ # Example usage:
59
+ # MTNCLOUD_PS1="[%remote] %cyan %username morph> " mtncloud shell --debug
60
+ #@prompt = MtnCloud::Terminal.instance.prompt.to_s #.dup
61
+ @prompt = my_terminal.prompt
62
+
63
+ variable_map = MtnCloud::Cli::Echo.variable_map
64
+ # variable_map = {
65
+ # '%cyan' => cyan, '%magenta' => magenta, '%red' => red, '%mgreen' => green, '%yellow' => yellow, '%dark' => dark, '%reset' => reset,
66
+ # '%remote' => @appliance_name.to_s, '%remote_url' => @appliance_url.to_s,
67
+ # '%username' => @current_username.to_s
68
+ # }
69
+ @calculated_prompt = @prompt.to_s.dup
70
+ variable_map.each do |k, v|
71
+ @calculated_prompt.gsub!(k.to_s, v.to_s)
72
+ end
73
+ # cleanup empty brackets caused by var value
74
+ @calculated_prompt = @calculated_prompt.gsub("[]", "").gsub("<>", "").gsub("{}", "")
75
+ #@calculated_prompt = @calculated_prompt.strip
76
+ # @calculated_prompt = "#{@calculated_prompt}#{reset} "
77
+ @calculated_prompt
78
+ end
79
+
80
+ def recalculate_auto_complete_commands
81
+ @mtncloud_commands = MtnCloud::Cli::CliRegistry.all.keys.reject {|k| [:shell].include?(k) }
82
+ @shell_commands = [:clear, :history, :reload, :help, :exit]
83
+ @shell_command_descriptions = {
84
+ :clear => "Clear terminal output and move cursor to the top",
85
+ :history => "View shell command history",
86
+ :reload => "Reload the shell, can be useful when developing",
87
+ :help => "Print this help",
88
+ :exit => "Exit the shell"
89
+ }
90
+ @alias_commands = MtnCloud::Cli::CliRegistry.all_aliases.keys
91
+ @exploded_commands = []
92
+ MtnCloud::Cli::CliRegistry.all.each do |cmd, klass|
93
+ @exploded_commands << cmd.to_s
94
+ #subcommands = klass.subcommands rescue []
95
+ subcommands = klass.visible_subcommands rescue []
96
+ subcommands.keys.each do |sub_cmd|
97
+ @exploded_commands << "#{cmd} #{sub_cmd}"
98
+ end
99
+ end
100
+ @auto_complete_commands = (@exploded_commands + @shell_commands + @alias_commands).collect {|it| it.to_s }
101
+ @auto_complete = proc do |s|
102
+ results = @auto_complete_commands.grep(/^#{Regexp.escape(s)}/)
103
+ # do not append space unless there is only one match
104
+ # note: this does not work in newer rubies for some reason (>= 3.3.7)
105
+ if results.size == 1
106
+ Readline.completion_append_character = " "
107
+ else
108
+ Readline.completion_append_character = ""
109
+ end
110
+ results
111
+ end
112
+ end
113
+
114
+ def handle(args)
115
+ @clean_shell_mode = false
116
+ @execute_mode = false
117
+ @execute_mode_command = nil
118
+ @norc = false
119
+ @temporary_shell_mode = false
120
+ @temporary_home_directory = nil
121
+ @original_home_directory = nil
122
+ usage = "Usage: #{prog_name} #{command_name}"
123
+ optparse = MtnCloud::Cli::OptionParser.new do |opts|
124
+ opts.banner = usage
125
+ # change to a temporary home directory, delete it afterwards.
126
+ opts.on('-e','--exec EXPRESSION', "Execute the command expression and exit. Expression can be a single #{prog_name} command or several by using parenthesis and operators (, ), &&, ||, and ;") do |val|
127
+ @execute_mode = true
128
+ @execute_mode_command = val
129
+ end
130
+ opts.on('--norc','--norc', "Do not read and execute the personal initialization script .mtncloudrc") do
131
+ @norc = true
132
+ end
133
+ opts.on('-I','--insecure', "Allow for insecure HTTPS communication i.e. bad SSL certificate") do |val|
134
+ @@insecure = true
135
+ MtnCloud::RestClient.enable_ssl_verification = false
136
+ end
137
+ opts.on('-Z','--temporary', "Temporary shell. Use a temporary shell with the current remote configuration, credentials and history loaded. Temporary shells do not save changes to remote configuration changes and command history.") do
138
+ @temporary_shell_mode = true
139
+ end
140
+ opts.on('-z','--clean', "Clean shell. Use a temporary shell without any remote configuration, credentials or command history loaded.") do
141
+ @temporary_shell_mode = true
142
+ @clean_shell_mode = true
143
+ end
144
+ opts.on('-C','--nocolor', "Disable ANSI coloring") do
145
+ Term::ANSIColor::coloring = false
146
+ end
147
+ opts.on('-V','--debug', "Print extra output for debugging.") do
148
+ MtnCloud::Logging.set_log_level(MtnCloud::Logging::Logger::DEBUG)
149
+ ::RestClient.log = MtnCloud::Logging.debug? ? MtnCloud::Logging::DarkPrinter.instance : nil
150
+ end
151
+ opts.on('-B','--benchmark', "Print benchmark time after each command is finished" ) do
152
+ MtnCloud::Benchmarking.enabled = true
153
+ my_terminal.benchmarking = MtnCloud::Benchmarking.enabled
154
+ end
155
+ opts.on( '-h', '--help', "Print this help" ) do
156
+ puts opts
157
+ exit
158
+ end
159
+ end
160
+ optparse.parse!(args)
161
+
162
+ # is this a temporary/temporary_shell shell?
163
+ # this works just by changing the cli home directory and updating appliances
164
+ if @temporary_shell_mode
165
+ #MtnCloud::Logging::DarkPrinter.puts "temporary shell started" if MtnCloud::Logging.debug?
166
+ # for now, always use the original home directory
167
+ # or else this will just keep growing deeper and deeper.
168
+ @parent_shell_directories ||= []
169
+ @parent_shell_directories << my_terminal.home_directory
170
+ @previous_home_directory = @parent_shell_directories.last
171
+ @original_home_directory ||= @previous_home_directory
172
+
173
+ #@norc = true # perhaps?
174
+ # instead of using TMPDIR, create tmp shell directory inside $MTNCLOUD_CLI_HOME/tmp
175
+ # should chown these files too..
176
+ #tmpdir = ENV['MTNCLOUD_CLI_TMPDIR'] || ENV['TMPDIR'] || ENV['TMP']
177
+ tmpdir = ENV['MTNCLOUD_CLI_TMPDIR']
178
+ if !tmpdir
179
+ tmpdir = File.join(@original_home_directory, "tmp")
180
+ end
181
+ if !File.exist?(tmpdir)
182
+ # MtnCloud::Logging::DarkPrinter.puts "creating tmpdir #{tmpdir}" if MtnCloud::Logging.debug?
183
+ FileUtils.mkdir_p(tmpdir)
184
+ end
185
+ # this won't not happen since we mkdir above
186
+ if !File.exist?(tmpdir)
187
+ raise_command_error "Temporary directory not found. Use environment variable MTNCLOUD_CLI_TMPDIR"
188
+ end
189
+ # change to a temporary home directory
190
+ @temporary_home_directory = File.join(tmpdir, "tmpshell-#{rand().to_s[2..7]}")
191
+
192
+ #if !File.exist?(@temporary_home_directory)
193
+ MtnCloud::Logging::DarkPrinter.puts "starting temporary shell at #{@temporary_home_directory}" if MtnCloud::Logging.debug?
194
+ FileUtils.mkdir_p(@temporary_home_directory)
195
+ # end
196
+
197
+
198
+ my_terminal.set_home_directory(@temporary_home_directory)
199
+
200
+
201
+ # wow..this already has cached list of Remote.appliances
202
+ # this is kinda nice though..keep it for now,
203
+ #MtnCloud::Cli::Remote.load_appliance_file
204
+ if @clean_shell_mode == true
205
+ # clean shell means no loading of remotes, aliases, history
206
+ # @norc = true
207
+ # todo: avoid writing files here and just work in memory for temporary shell
208
+ MtnCloud::Cli::Remote.save_appliances({})
209
+ else
210
+ # keep remotes and credentials and activity or history
211
+ # this is done just by copying configuration files to the tmp home dir
212
+ #
213
+ # should use MtnCloud::Cli::DotFile.mtncloud_profile_filename
214
+ # and # should use MtnCloud::Cli::DotFile.mtncloud_profile_filename
215
+ # this already got run though.. this temporary mode should work for any terminal command,
216
+ # not just in shell
217
+ # .mtncloud_profile has aliases
218
+ # this has already been loaded, probably should reload it...
219
+ if File.exist?(File.join(@previous_home_directory, ".mtncloud_profile"))
220
+ FileUtils.cp(File.join(@previous_home_directory, ".mtncloud_profile"), File.join(@temporary_home_directory, ".mtncloud_profile"))
221
+ end
222
+ if @norc != true
223
+ if File.exist?(File.join(@previous_home_directory, ".mtncloudrc"))
224
+ FileUtils.cp(File.join(@previous_home_directory, ".mtncloudrc"), File.join(@temporary_home_directory, ".mtncloudrc"))
225
+ end
226
+ end
227
+ if File.exist?(File.join(@previous_home_directory, "appliances"))
228
+ FileUtils.cp(File.join(@previous_home_directory, "appliances"), File.join(@temporary_home_directory, "appliances"))
229
+ end
230
+ if File.exist?(File.join(@previous_home_directory, "credentials"))
231
+ FileUtils.cp(File.join(@previous_home_directory, "credentials"), File.join(@temporary_home_directory, "credentials"))
232
+ end
233
+ if File.exist?(File.join(@previous_home_directory, "groups"))
234
+ FileUtils.cp(File.join(@previous_home_directory, "groups"), File.join(@temporary_home_directory, "groups"))
235
+ end
236
+ # stay logged in
237
+ # maybe have a different option for removing just credentials, and command history..
238
+ MtnCloud::Cli::Remote.appliances.each do |app_name, app|
239
+ #app[:username] = "(anonymous)"
240
+ #app[:status] = "fresh"
241
+ #app[:authenticated] = false
242
+ # app.delete(:active) # keep remote active..
243
+ #app.delete(:username)
244
+ #app.delete(:last_login_at)
245
+ #app.delete(:last_logout_at)
246
+ # app[:last_logout_at] = Time.now.to_i
247
+ # keep last_success and last check
248
+ #app.delete(:last_success_at)
249
+ #app.delete(:last_check)
250
+ #app.delete(:username)
251
+ end
252
+
253
+ # MtnCloud::Cli::Remote.save_appliances(new_remote_config)
254
+ # MtnCloud::Cli::Remote.clear_active_appliance
255
+ # MtnCloud::Cli::Credentials.clear_saved_credentials(@appliance_name)
256
+ # MtnCloud::Cli::Credentials.load_saved_credentials
257
+ # MtnCloud::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials()
258
+ end
259
+ end
260
+
261
+ @history_logger ||= load_history_logger rescue nil
262
+ @history_logger.info "shell started" if @history_logger
263
+ load_history_from_log_file()
264
+
265
+
266
+ # execute startup script
267
+ if !@norc
268
+ if File.exist?(MtnCloud::Cli::DotFile.mtncloudrc_filename)
269
+ @history_logger.info("load source #{MtnCloud::Cli::DotFile.mtncloudrc_filename}") if @history_logger
270
+ MtnCloud::Cli::DotFile.new(MtnCloud::Cli::DotFile.mtncloudrc_filename).execute()
271
+ end
272
+ end
273
+
274
+ reinitialize()
275
+ # recalculate_prompt()
276
+ # recalculate_auto_complete_commands()
277
+
278
+ result = nil
279
+ if @execute_mode_command
280
+ # execute a single command and exit
281
+ result = execute(@execute_mode_command)
282
+ else
283
+ # interactive prompt
284
+ result = 0
285
+ @exit_now_please = false
286
+ while !@exit_now_please do
287
+ #Readline.input = my_terminal.stdin
288
+ #Readline.input = $stdin
289
+ Readline.completion_append_character = ""
290
+ Readline.completion_proc = @auto_complete
291
+ Readline.basic_word_break_characters = "" rescue nil
292
+ Readline.completer_word_break_characters = "" rescue nil
293
+ #Readline.basic_word_break_characters = "\t\n\"\‘`@$><=;|&{( "
294
+ input = Readline.readline(@calculated_prompt, true).to_s
295
+ input = input.strip
296
+
297
+ result = execute(input)
298
+ print reset
299
+ end
300
+ end
301
+
302
+ # temporary_shell_mode, cover our tracks
303
+ if @temporary_home_directory
304
+ if @temporary_home_directory.include?("tmpshell")
305
+ begin
306
+ FileUtils.remove_dir(@temporary_home_directory, true)
307
+ MtnCloud::Logging::DarkPrinter.puts "cleaning up temporary shell at #{@temporary_home_directory}" if MtnCloud::Logging.debug?
308
+ rescue
309
+ end
310
+ end
311
+ parent_shell_directory = @parent_shell_directories ? @parent_shell_directories.pop : nil
312
+ if parent_shell_directory
313
+ # switch terminal shell back to parent shell.
314
+ # should just be forking instead of all this...
315
+ my_terminal.set_home_directory(parent_shell_directory)
316
+ if @original_home_directory && @original_home_directory == parent_shell_directory
317
+ # back to original shell, not temporary, right?
318
+ # todo: probably need to reload shell here?
319
+ @temporary_home_directory = nil
320
+ else
321
+ # back to another temporary shell
322
+ # todo: probably need to reload shell here?
323
+ @temporary_home_directory = parent_shell_directory
324
+ end
325
+ else
326
+ # there was no parent, this would be weird since temporary_home_directory was true..
327
+ end
328
+ end
329
+ return result
330
+ end
331
+
332
+ # execute the input as an expression.
333
+ # provides support for operators '(', ')', '&&', '||', ';'
334
+ # logs entire input as one command in shell history
335
+ # logging is skipped for certain commands: exit, !, !!
336
+ def execute(input)
337
+ unless input.strip.empty? || input.strip[0] == "!"
338
+ log_history_command(input.strip)
339
+ end
340
+
341
+ #MtnCloud::Logging::DarkPrinter.puts "Shell command: #{input}"
342
+ input = input.to_s.strip
343
+
344
+ # allow pasting in commands that have 'mtncloud ' prefix
345
+ if input[0..(prog_name.size)] == "#{prog_name} "
346
+ input = input[(prog_name.size + 1)..-1] || ""
347
+ end
348
+ if !input.empty?
349
+
350
+ if input == 'exit'
351
+ #print cyan,"Goodbye\n",reset
352
+ #@history_logger.info "exit" if @history_logger
353
+ @exit_now_please = true
354
+ return 0
355
+ #exit 0
356
+ elsif input == 'help'
357
+ out = ""
358
+ if @temporary_shell_mode
359
+ out << "You are in a (temporary) #{prog_name} shell\n"
360
+ else
361
+ out << "You are in a #{prog_name} shell.\n"
362
+ end
363
+ out << "See the available commands below.\n"
364
+
365
+ out << "\nCommands:\n"
366
+ # commands = @mtncloud_commands + @shell_commands
367
+ # @mtncloud_commands.sort.each {|cmd|
368
+ # out << "\t#{cmd.to_s}\n"
369
+ # }
370
+ sorted_commands = MtnCloud::Cli::CliRegistry.all.values.sort { |x,y| x.command_name.to_s <=> y.command_name.to_s }
371
+ sorted_commands.each {|cmd|
372
+ # JD: not ready to show description yet, gotta finish filling in every command first
373
+ # maybe change 'View and manage' to something more concise like 'Manage'
374
+ # out << "\t#{cmd.command_name.to_s.ljust(28, ' ')} #{cmd.command_description}\n"
375
+ out << "\t#{cmd.command_name.to_s}\n"
376
+ }
377
+ #puts "\n"
378
+ out << "\nShell Commands:\n"
379
+ @shell_commands.each {|cmd|
380
+ # out << "\t#{cmd.to_s.ljust(28, ' ')} #{@shell_command_descriptions ? @shell_command_descriptions[cmd] : ''}\n"
381
+ out << "\t#{cmd.to_s}\n"
382
+ }
383
+ out << "\n"
384
+ out << "For more information, run `#{prog_name} man`."
385
+ out << "\n"
386
+ print out
387
+ return 0
388
+ elsif input =~ /^\s*#/
389
+ MtnCloud::Logging::DarkPrinter.puts "ignored comment: #{input}" if MtnCloud::Logging.debug?
390
+ return 0
391
+ elsif input == 'clear'
392
+ print "\e[H\e[2J"
393
+ return 0
394
+ elsif input == 'reload' || input == 'reload!'
395
+ # clear registry
396
+ MtnCloud::Cli::CliRegistry.instance.flush
397
+ # reload code
398
+ MtnCloud::Cli.reload!
399
+ # execute startup scripts
400
+ if File.exist?(MtnCloud::Cli::DotFile.mtncloud_profile_filename)
401
+ MtnCloud::Cli::DotFile.new(MtnCloud::Cli::DotFile.mtncloud_profile_filename).execute()
402
+ end
403
+ if File.exist?(MtnCloud::Cli::DotFile.mtncloudrc_filename)
404
+ MtnCloud::Cli::DotFile.new(MtnCloud::Cli::DotFile.mtncloudrc_filename).execute()
405
+ end
406
+ # recalculate shell environment
407
+ reinitialize()
408
+
409
+ MtnCloud::Logging::DarkPrinter.puts "shell has been reloaded" if MtnCloud::Logging.debug?
410
+ return 0
411
+ elsif input == '!!'
412
+ cmd_number = @history.keys[-1]
413
+ input = @history[cmd_number]
414
+ if !input
415
+ puts "There is no previous command"
416
+ return false
417
+ end
418
+ return execute(input)
419
+ elsif input =~ /^\!.+/
420
+ cmd_number = input.sub("!", "").to_i
421
+ if cmd_number != 0
422
+ old_input = @history[cmd_number]
423
+ if !old_input
424
+ puts "Command not found by number #{cmd_number}"
425
+ return 0
426
+ end
427
+ #puts "executing history command: (#{cmd_number}) #{old_input}"
428
+ # log_history_command(old_input)
429
+ # remove this from readline, and replace it with the old command
430
+ Readline::HISTORY.pop
431
+ Readline::HISTORY << old_input
432
+ return execute(old_input)
433
+ end
434
+
435
+ elsif input == "insecure"
436
+ MtnCloud::RestClient.enable_ssl_verification = false
437
+ return 0
438
+
439
+ elsif ["hello","hi","hey","hola"].include?(input.strip.downcase)
440
+ user_msg = input.strip.downcase
441
+ # need a logged_in? method already damnit
442
+ wallet = MtnCloud::Cli::Credentials.new(@appliance_name, @appliance_url).load_saved_credentials
443
+ help_msg = case user_msg
444
+ when "hola"
445
+ "¿como puedo ayudarte? tratar #{cyan}help#{reset}"
446
+ else
447
+ "how may I #{cyan}help#{reset} you?"
448
+ end
449
+ greeting = "#{user_msg.capitalize}#{wallet ? (' '+green+wallet['username'].to_s+reset) : ''}, #{help_msg}#{reset}"
450
+ puts greeting
451
+ return 0
452
+ elsif input.strip =~ /^shell\s*/
453
+ # just allow shell to fall through
454
+ # we should reload the configs and history file after the sub shell process terminates though.
455
+ # actually, that looks like it is working just fine already...?
456
+ print cyan,"starting a subshell",reset,"\n"
457
+ elsif input =~ /^\.\s/
458
+ # dot alias for source <file>
459
+ log_history_command(input)
460
+ return MtnCloud::Cli::SourceCommand.new.handle(input.split[1..-1])
461
+ end
462
+ exit_code, err = 0, nil
463
+ begin
464
+ argv = Shellwords.shellsplit(input)
465
+ cmd_name = argv[0]
466
+ cmd_args = argv[1..-1]
467
+ # crap hack, naming conflicts can occur with aliases
468
+ @return_to_log_level = ["log-level","debug"].include?(cmd_name) ? nil : MtnCloud::Logging.log_level
469
+ @return_to_coloring = ["coloring"].include?(cmd_name) ? nil : Term::ANSIColor::coloring?
470
+ @return_to_benchmarking = ["benchmark"].include?(cmd_name) ? nil : MtnCloud::Benchmarking.enabled?
471
+
472
+ #if MtnCloud::Cli::CliRegistry.has_command?(cmd_name) || MtnCloud::Cli::CliRegistry.has_alias?(cmd_name)
473
+ #log_history_command(input)
474
+ # start a benchmark, unless the command is benchmark of course
475
+ if my_terminal.benchmarking || cmd_args.include?("-B") || cmd_args.include?("--benchmark")
476
+ if cmd_name != 'benchmark' # jd: this does not work still 2 of them printed.. fix it!
477
+ # benchmark_name = "mtncloud " + argv.reject {|it| it == '-B' || it == '--benchmark' }.join(' ')
478
+ benchmark_name = argv.reject {|it| it == '-B' || it == '--benchmark' }.join(' ')
479
+ start_benchmark(benchmark_name)
480
+ end
481
+ end
482
+ exit_code, err = MtnCloud::Cli::CliRegistry.exec_expression(input)
483
+ benchmark_record = stop_benchmark(exit_code, err) # if benchmarking?
484
+ MtnCloud::Logging::DarkPrinter.puts(cyan + dark + benchmark_record.msg) if benchmark_record
485
+ # else
486
+ # puts_error "#{MtnCloud::Terminal.angry_prompt}'#{cmd_name}' is not recognized. Use 'help' to see the list of available commands."
487
+ # @history_logger.warn "Unrecognized Command #{cmd_name}" if @history_logger
488
+ # exit_code, err = -1, "Command not recognized"
489
+ # end
490
+ rescue Interrupt
491
+ # user pressed ^C to interrupt a command
492
+ @history_logger.warn "shell interrupt" if @history_logger
493
+ print "\nInterrupt. aborting command '#{input}'\n"
494
+ exit_code, err = 9, "aborted command"
495
+ rescue SystemExit => cmdexit
496
+ # nothing to do, assume the command that exited printed an error already
497
+ # print "\n"
498
+ if cmdexit.success?
499
+ exit_code, err = cmdexit.status, nil
500
+ else
501
+ exit_code, err = cmdexit.status, "Command exited early."
502
+ end
503
+ rescue => e
504
+ # some other type of failure..
505
+ @history_logger.error "#{e.message}" if @history_logger
506
+ exit_code, err = MtnCloud::Cli::ErrorHandler.new(my_terminal.stderr).handle_error(e) # lol
507
+
508
+ ensure
509
+ if @return_to_log_level
510
+ MtnCloud::Logging.set_log_level(@return_to_log_level)
511
+ ::RestClient.log = MtnCloud::Logging.debug? ? MtnCloud::Logging::DarkPrinter.instance : nil
512
+ @return_to_log_level = nil
513
+ end
514
+ if @return_to_coloring != nil
515
+ Term::ANSIColor::coloring = @return_to_coloring
516
+ @return_to_coloring = nil
517
+ end
518
+ if @return_to_benchmarking != nil
519
+ MtnCloud::Benchmarking.enabled = @return_to_benchmarking
520
+ my_terminal.benchmarking = MtnCloud::Benchmarking.enabled
521
+ @return_to_benchmarking = nil
522
+ end
523
+ end
524
+
525
+ return exit_code, err
526
+ end
527
+
528
+ end
529
+
530
+ # wha this?
531
+ def get_prompt
532
+
533
+ # print cyan,"mtncloud > ",reset
534
+ # input = $stdin.gets.chomp!
535
+
536
+ input = ''
537
+ while char=$stdin.getch do
538
+ if char == '\n'
539
+ print "\r\n"
540
+ puts "executing..."
541
+ break
542
+ end
543
+ print char
544
+ input << char
545
+ end
546
+ return input
547
+ end
548
+
549
+ def history_file_path
550
+ File.join(MtnCloud::Cli.home_directory, "shell_history")
551
+ end
552
+
553
+ def load_history_logger
554
+ file_path = history_file_path
555
+ if !Dir.exist?(File.dirname(file_path))
556
+ FileUtils.mkdir_p(File.dirname(file_path))
557
+ end
558
+ if !File.exist?(file_path)
559
+ FileUtils.touch(file_path)
560
+ FileUtils.chmod(0600, file_path)
561
+ end
562
+ logger = Logger.new(file_path)
563
+ # logger.formatter = proc do |severity, datetime, progname, msg|
564
+ # "#{msg}\n"
565
+ # end
566
+ return logger
567
+ end
568
+
569
+ def load_history_from_log_file
570
+
571
+ # @history ||= {}
572
+ # @last_command_number ||= 0
573
+ @history = {}
574
+ @last_command_number = 0
575
+
576
+ begin
577
+ file_path = history_file_path
578
+ # if !Dir.exist?(File.dirname(file_path))
579
+ # FileUtils.mkdir_p(File.dirname(file_path))
580
+ # end
581
+ # if !File.exist?(file_path)
582
+ # FileUtils.touch(file_path)
583
+ # FileUtils.chmod(0600, file_path)
584
+ # end
585
+
586
+ File.open(file_path).each_line do |line|
587
+ # this is pretty goofy, but this looks for the format: (cmd $command_number) $command_string
588
+ matches = line.match(/\(cmd (\d+)\) (.+)/)
589
+ if matches && matches.size == 3
590
+ cmd_number = matches[1].to_i
591
+ cmd = matches[2]
592
+
593
+ if cmd_number > @last_command_number
594
+ @last_command_number = cmd_number
595
+ end
596
+ @history[cmd_number] = cmd
597
+
598
+ # for Ctrl+R history searching
599
+ Readline::HISTORY << cmd
600
+ end
601
+ end unless !File.exist?(file_path)
602
+ rescue => e
603
+ # raise e
604
+ puts_error "failed to load history from log: #{e}"
605
+ @history ||= {}
606
+ end
607
+ return @history
608
+ end
609
+
610
+ def log_history_command(cmd)
611
+ load_history_from_log_file if !@history
612
+ #todo: a fast log_history_command, that doesnt need to load the file..
613
+ #@history ||= {}
614
+ #@last_command_number ||= 0
615
+ previous_cmd = @history[@last_command_number]
616
+ # skip logging consecutive history commands.
617
+ if previous_cmd && previous_cmd =~ /history/ && previous_cmd == cmd
618
+ return @last_command_number
619
+ end
620
+ @last_command_number += 1
621
+ @history[@last_command_number] = cmd
622
+ if @history_logger
623
+ @history_logger.info "#{@current_username}@#{@appliance_name} -- : (cmd #{@last_command_number}) #{cmd}"
624
+ end
625
+ return @last_command_number
626
+ end
627
+
628
+ def last_command
629
+ if @history && @last_command_number
630
+ @history[@last_command_number]
631
+ else
632
+ nil
633
+ end
634
+ end
635
+
636
+ # load_history_commands paginates and sorts the command history
637
+ # the most recent 25 are returned by default.
638
+ # @return Hash like {:commands => [], :command_count => total}
639
+ def load_history_commands(options={})
640
+ phrase = options[:phrase]
641
+ #sort_key = options[:sort] ? options[:sort].to_sym : nil
642
+ #direction = options[:direction] # default sort is reversed to get newest first
643
+ offset = options[:offset].to_i > 0 ? options[:offset].to_i : 0
644
+ max = options[:max].to_i > 0 ? options[:max].to_i : 25
645
+
646
+ if !@history
647
+ load_history_from_log_file
648
+ end
649
+
650
+
651
+ # collect records as [{:number => 1, :command => "instances list"}, etc]
652
+ history_records = []
653
+ history_count = 0
654
+
655
+ # only go so far back in command history, 1 million commands
656
+ # this could be a large object...need to index our shell_history file lol
657
+ # todo: this max needs to be done in load_history_from_log_file()
658
+ history_keys = @history.keys.last(1000000).reverse
659
+ # filter by phrase
660
+ if phrase
661
+ history_keys = history_keys.select {|k| (@history[k] && @history[k].include?(phrase)) || k.to_s == phrase }
662
+ end
663
+ # no offset, just max
664
+ history_records = history_keys.first(max).collect { |k| {number: k, command: @history[k]} }
665
+ command_count = history_keys.size
666
+
667
+ meta = {size:history_records.size, total:command_count.to_i, max:max, offset:offset}
668
+ return {commands: history_records, command_count: command_count, meta: meta}
669
+ end
670
+
671
+ def print_history(options={})
672
+ history_result = load_history_commands(options)
673
+ history_records = history_result[:commands]
674
+ command_count = history_result[:command_count]
675
+ if history_records.size == 0
676
+ if options[:phrase]
677
+ print cyan,"0 commands found matching '#{options[:phrase]}'.",reset,"\n"
678
+ else
679
+ print cyan,"0 commands found.",reset,"\n"
680
+ end
681
+ else
682
+ print cyan
683
+ # by default show old->new as the shell history should bash history
684
+ history_records.reverse! unless options[:direction] == "desc"
685
+ history_records.each do |history_record|
686
+ puts "#{history_record[:number].to_s.rjust(3, ' ')} #{history_record[:command]}"
687
+ end
688
+ if options[:show_pagination]
689
+ pagination_msg = options[:phrase] ? "Viewing most recent %{size} of %{total} commands matching '#{options[:phrase]}'" : "Viewing most recent %{size} of %{total} commands"
690
+ print_results_pagination(history_result[:meta], {:message =>pagination_msg})
691
+ print reset, "\n"
692
+ else
693
+ print reset
694
+ end
695
+ end
696
+ #print "\n"
697
+ return 0
698
+ end
699
+
700
+ def history_commands_count()
701
+ load_history_from_log_file if !@history
702
+ @history.keys.size
703
+ end
704
+
705
+ def flush_history(n=nil)
706
+ # todo: support only flushing last n commands
707
+ file_path = history_file_path
708
+ if File.exist?(file_path)
709
+ File.truncate(file_path, 0)
710
+ end
711
+ @history = {}
712
+ @last_command_number = 0
713
+ @history_logger = load_history_logger
714
+ print green, "Command history flushed", reset, "\n"
715
+ return 0
716
+ end
717
+ end