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,482 @@
1
+ require 'fileutils'
2
+ require 'yaml'
3
+ require 'json'
4
+ require 'io/console'
5
+ require 'rest_client'
6
+ require 'mtncloud/logging'
7
+ require 'mtncloud/cli/mixins/print_helper'
8
+
9
+ module MtnCloud
10
+ module Cli
11
+ class Credentials
12
+ include MtnCloud::Cli::PrintHelper
13
+
14
+ @@appliance_credentials_map = nil
15
+
16
+ def initialize(appliance_name, appliance_url)
17
+ @appliance_name = appliance_name ? appliance_name.to_sym : nil
18
+ @appliance_url = appliance_url
19
+ end
20
+
21
+ # request_credentials will fetch a credentials wallet (access_token, refresh_token, etc)
22
+ # By default this uses the saved credentials for the current appliance.
23
+ # If not logged in, it will prompt for username and password to
24
+ # authenticate with the /oauth/token API to receive an access_token.
25
+ # If :username and :password are passed, then
26
+ # Pass :remote_token to skip prompting and the auth api request.
27
+ # @param options - Hash of optional settings.
28
+ # :username - Username for prompt.
29
+ # :password - Password for prompt.
30
+ # :remote_url - Use this url instead of the one from the current appliance. Credentials will not be saved.
31
+ # :remote_token - Use this access_token, skip prompting and API request.
32
+ # :remote_username - Username for authentication with --remote, skips saving credentials
33
+ # :remote_password - Password for authentication with --remote, skips saving credentials
34
+ # :test_only - Test only. Saved credentials will not be updated.
35
+ # @return Hash wallet like {"access_token":"ec68be138765...", "refresh_token":"ec68be138765..."}
36
+ # or nil if unable to find credentials.
37
+ def request_credentials(options = {}, do_save=true)
38
+ #puts "request_credentials(#{options})"
39
+ username = nil
40
+ password = nil
41
+ wallet = nil
42
+
43
+ # should not need this logic in here
44
+ if options[:remote_url]
45
+ # @appliance_name = options[:remote_url]
46
+ # name should change too though or printing may be misleading.
47
+ # @appliance_name = "remote-url"
48
+ # @appliance_url = options[:remote_url]
49
+ # do not save when using --remote-url
50
+ do_save = false
51
+ end
52
+
53
+ if options[:remote_token]
54
+ # user passed in a token to login with.
55
+ # this should get token info from /oauth/token
56
+ # OR whoami should return other wallet info like access token or maybe just the expiration date
57
+ # for now, it just stores the access token without other wallet info
58
+ begin
59
+ whoami_interface = MtnCloud::WhoamiInterface.new({url: @appliance_url, access_token: options[:remote_token], verify_ssl: !options[:insecure]})
60
+ whoami_interface.setopts(options)
61
+ if options[:dry_run]
62
+ print_dry_run whoami_interface.dry.get()
63
+ return nil
64
+ end
65
+ whoami_response = whoami_interface.get()
66
+ if options[:json]
67
+ puts as_json(whoami_response, options)
68
+ print reset, "\n"
69
+ end
70
+ # store mock /oauth/token auth_interface.login() result
71
+ json_response = {'access_token' => options[:remote_token], 'token_type' => 'bearer'}
72
+ username = whoami_response['user']['username']
73
+ login_date = Time.now
74
+ expire_date = nil
75
+ if json_response['expires_in']
76
+ expire_date = login_date.to_i + json_response['expires_in'].to_i
77
+ end
78
+ wallet = {
79
+ 'username' => username,
80
+ 'login_date' => login_date.to_i,
81
+ 'expire_date' => expire_date ? expire_date.to_i : nil,
82
+ 'access_token' => json_response['access_token'],
83
+ 'refresh_token' => json_response['refresh_token'],
84
+ 'token_type' => json_response['token_type']
85
+ }
86
+ rescue ::RestClient::Exception => e
87
+ #raise e
88
+ print_red_alert "Token not valid."
89
+ if options[:debug]
90
+ print_rest_exception(e, options)
91
+ end
92
+ wallet = nil
93
+ end
94
+ else
95
+ # ok prompt for creds..
96
+ username = options['username'] || options[:username] || nil
97
+ password = options['password'] || options[:password] || nil
98
+
99
+ # what are these for? just use :username and :password
100
+ if options[:remote_username]
101
+ username = options[:remote_username]
102
+ password = options[:remote_password]
103
+ end
104
+ if wallet.nil?
105
+ unless options[:quiet] || options[:no_prompt]
106
+ print "Enter MTN Cloud Credentials for #{display_appliance(@appliance_name, @appliance_url)}", "\n", reset
107
+ if options[:client_id].empty?
108
+ # print "Client ID: #{required_blue_prompt} #{options[:client_id]}", "\n", reset
109
+ else
110
+ if options[:client_id] != MtnCloud::APIClient::CLIENT_ID
111
+ print "Client ID: #{required_blue_prompt} #{options[:client_id]}", "\n", reset
112
+ end
113
+ end
114
+ if username.empty?
115
+ # print "Username: #{required_blue_prompt} "
116
+ # username = $stdin.gets.chomp!
117
+ Readline.completion_append_character = ""
118
+ Readline.basic_word_break_characters = ''
119
+ Readline.completer_word_break_characters = '' rescue nil
120
+ Readline.completion_proc = nil
121
+ username = Readline.readline("Username: #{required_blue_prompt} ", false).to_s.chomp
122
+ else
123
+ print "Username: #{required_blue_prompt} #{username}\n"
124
+ end
125
+ if password.empty?
126
+ # readline is still echoing secret with 'NUL:'' so just use $stdin on windows for now
127
+ # and some other environments? just use noecho unless running unit tests
128
+ if MtnCloud::Cli.windows? || !MtnCloud::Cli.testing?
129
+ print "Password: #{required_blue_prompt} "
130
+ # this should be my_terminal.stdin instead of STDIN and $stdin
131
+ password = $stdin.noecho(&:gets).chomp!
132
+ print "\n"
133
+ else
134
+
135
+ Readline.completion_append_character = ""
136
+ Readline.basic_word_break_characters = ''
137
+ Readline.completer_word_break_characters = '' rescue nil
138
+ Readline.completion_proc = nil
139
+ # needs to work like $stdin.noecho
140
+ Readline.pre_input_hook = lambda {
141
+ Readline.output = File.open('/dev/null', 'w')
142
+ #Readline.output = File.open(MtnCloud::Cli.windows? ? 'NUL:' : '/dev/null', 'w')
143
+ #$stdout = File.open(MtnCloud::Cli.windows? ? 'NUL:' : '/dev/null', 'w')
144
+ }
145
+ password = Readline.readline("Password: #{required_blue_prompt} ", false).to_s.chomp
146
+ Readline.pre_input_hook = nil
147
+ Readline.output = MtnCloud::Terminal.instance.stdout #my_terminal.stdout
148
+ print "\n"
149
+ end
150
+ else
151
+ print "Password: #{required_blue_prompt} \n"
152
+ end
153
+ end
154
+ if username.empty? || password.empty?
155
+ print_red_alert "Username and password are required to login."
156
+ return nil
157
+ end
158
+ begin
159
+ auth_interface = MtnCloud::AuthInterface.new({url:@appliance_url, client_id: options[:client_id], verify_ssl: !options[:insecure]})
160
+ auth_interface.setopts(options)
161
+ if options[:dry_run]
162
+ print_dry_run auth_interface.dry.login(username, password)
163
+ return nil
164
+ end
165
+ json_response = auth_interface.login(username, password)
166
+ if options[:json]
167
+ print JSON.pretty_generate(json_response)
168
+ print reset, "\n"
169
+ end
170
+ #wallet = json_response
171
+ login_date = Time.now
172
+ expire_date = nil
173
+ if json_response['expires_in']
174
+ expire_date = login_date.to_i + json_response['expires_in'].to_i
175
+ end
176
+ wallet = {
177
+ 'username' => username,
178
+ 'login_date' => login_date.to_i,
179
+ 'expire_date' => expire_date ? expire_date.to_i : nil,
180
+ 'access_token' => json_response['access_token'],
181
+ 'refresh_token' => json_response['refresh_token'],
182
+ 'token_type' => json_response['token_type']
183
+ }
184
+
185
+ rescue ::RestClient::Exception => e
186
+ #raise e
187
+ if (e.response && e.response.code == 400)
188
+ json_response = JSON.parse(e.response.to_s)
189
+ error_msg = json_response['error_description'] || "Credentials not verified."
190
+ print_red_alert error_msg
191
+ if options[:json]
192
+ json_response = JSON.parse(e.response.to_s)
193
+ print JSON.pretty_generate(json_response)
194
+ print reset, "\n"
195
+ end
196
+ else
197
+ print_rest_exception(e, options)
198
+ end
199
+ wallet = nil
200
+ end
201
+
202
+ end
203
+ end
204
+
205
+ if do_save && @appliance_name
206
+ begin
207
+ # save pertinent session info to the appliance
208
+ save_credentials(@appliance_name, wallet)
209
+ now = Time.now.to_i
210
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
211
+ if wallet && wallet['access_token']
212
+ save_credentials(@appliance_name, wallet)
213
+ else
214
+ clear_saved_credentials(@appliance_name)
215
+ end
216
+ if appliance
217
+ if wallet && wallet['access_token']
218
+ # save wallet to credentials file
219
+ save_credentials(@appliance_name, wallet)
220
+ # save appliances file
221
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
222
+ appliance[:authenticated] = true
223
+ appliance[:username] = username
224
+ appliance[:status] = "ready"
225
+ appliance[:last_login_at] = now
226
+ appliance[:last_success_at] = now
227
+ ::MtnCloud::Cli::Remote.save_remote(@appliance_name, appliance)
228
+ else
229
+ # could be nice and not do this
230
+ #logout()
231
+ #save wallet to credentials file
232
+ clear_saved_credentials(@appliance_name)
233
+ now = Time.now.to_i
234
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
235
+ appliance[:authenticated] = false
236
+ old_username = appliance.delete(:username)
237
+ appliance[:last_logout_at] = Time.now.to_i
238
+ #appliance[:last_login_at] = now
239
+ #appliance[:error] = "Credentials not verified"
240
+ appliance.delete(:username)
241
+ ::MtnCloud::Cli::Remote.save_remote(@appliance_name, appliance)
242
+ if old_username
243
+ print reset,"You have been automatically logged out. Goodbye #{old_username}!", reset, "\n"
244
+ end
245
+ end
246
+
247
+ end
248
+ rescue => e
249
+ MtnCloud::Logging::DarkPrinter.puts "failed to update remote appliance config: (#{e.class}) #{e.message}"
250
+ ensure
251
+ #::MtnCloud::Cli::Remote.recalculate_variable_map()
252
+ end
253
+ end
254
+
255
+ return wallet
256
+ end
257
+
258
+ def login(options = {}, do_save=true)
259
+ request_credentials(options, do_save)
260
+ end
261
+
262
+ def logout()
263
+ clear_saved_credentials(@appliance_name)
264
+ # save pertinent session info to the appliance
265
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
266
+ if appliance
267
+ appliance.delete(:username) # could leave this...
268
+ appliance[:authenticated] = false
269
+ appliance[:last_logout_at] = Time.now.to_i
270
+ ::MtnCloud::Cli::Remote.save_remote(@appliance_name, appliance)
271
+ end
272
+ ::MtnCloud::Cli::Remote.recalculate_variable_map()
273
+ true
274
+ end
275
+
276
+ def use_refresh_token(refresh_token_value, options = {})
277
+
278
+ wallet = load_saved_credentials
279
+
280
+ if wallet.nil?
281
+ print_red_alert yellow,"You are not currently logged in to #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
282
+ return nil
283
+ end
284
+
285
+ if refresh_token_value.nil?
286
+ if wallet['refresh_token']
287
+ refresh_token_value = wallet['refresh_token']
288
+ else
289
+ print_red_alert yellow,"No refresh token found for #{display_appliance(@appliance_name, @appliance_url)}",reset,"\n"
290
+ return nil
291
+ end
292
+ end
293
+
294
+ username = wallet['username']
295
+
296
+ begin
297
+ auth_interface = MtnCloud::AuthInterface.new({url:@appliance_url, client_id: options[:client_id], verify_ssl: !options[:insecure]})
298
+ auth_interface.setopts(options)
299
+ if options[:dry_run]
300
+ print_dry_run auth_interface.dry.use_refresh_token(refresh_token_value)
301
+ return nil
302
+ end
303
+ json_response = auth_interface.use_refresh_token(refresh_token_value)
304
+ #wallet = json_response
305
+ login_date = Time.now
306
+ expire_date = nil
307
+ if json_response['expires_in']
308
+ expire_date = login_date.to_i + json_response['expires_in'].to_i
309
+ end
310
+ wallet = {
311
+ 'username' => username,
312
+ 'login_date' => login_date.to_i,
313
+ 'expire_date' => expire_date ? expire_date.to_i : nil,
314
+ 'access_token' => json_response['access_token'],
315
+ 'refresh_token' => json_response['refresh_token'],
316
+ 'token_type' => json_response['token_type']
317
+ }
318
+
319
+ rescue ::RestClient::Exception => e
320
+ #raise e
321
+ if (e.response && e.response.code == 400)
322
+ json_response = JSON.parse(e.response.to_s)
323
+ error_msg = json_response['error_description'] || "Refresh token not valid."
324
+ print_red_alert error_msg
325
+ if options[:json]
326
+ json_response = JSON.parse(e.response.to_s)
327
+ print JSON.pretty_generate(json_response)
328
+ print reset, "\n"
329
+ end
330
+ else
331
+ print_rest_exception(e, options)
332
+ end
333
+ wallet = nil
334
+ # return now or else it will log them out
335
+ return nil
336
+ end
337
+
338
+ # save wallet to credentials file
339
+ save_credentials(@appliance_name, wallet)
340
+
341
+ begin
342
+ # save pertinent session info to the appliance
343
+ now = Time.now.to_i
344
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
345
+ if appliance
346
+ if wallet && wallet['access_token']
347
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
348
+ appliance[:authenticated] = true
349
+ appliance[:username] = username
350
+ appliance[:status] = "ready"
351
+ appliance[:last_login_at] = now
352
+ appliance[:last_success_at] = now
353
+ ::MtnCloud::Cli::Remote.save_remote(@appliance_name, appliance)
354
+ else
355
+ now = Time.now.to_i
356
+ appliance = ::MtnCloud::Cli::Remote.load_remote(@appliance_name)
357
+ appliance[:authenticated] = false
358
+ #appliance[:username] = username
359
+ #appliance[:last_login_at] = now
360
+ #appliance[:error] = "Credentials not verified"
361
+ ::MtnCloud::Cli::Remote.save_remote(@appliance_name, appliance)
362
+ end
363
+ end
364
+ rescue => e
365
+ MtnCloud::Logging::DarkPrinter.puts "failed to update remote appliance config: (#{e.class}) #{e.message}"
366
+ end
367
+
368
+
369
+ return wallet
370
+ end
371
+
372
+ def clear_saved_credentials(appliance_name)
373
+ @@appliance_credentials_map = load_credentials_file || {}
374
+ @@appliance_credentials_map.delete(appliance_name.to_s)
375
+ @@appliance_credentials_map.delete(appliance_name.to_sym)
376
+ #MtnCloud::Logging::DarkPrinter.puts "clearing credentials for #{appliance_name} from file #{credentials_file_path}" if MtnCloud::Logging.debug?
377
+ File.open(credentials_file_path, 'w') {|f| f.write @@appliance_credentials_map.to_yaml } #Store
378
+ ::MtnCloud::Cli::Remote.recalculate_variable_map()
379
+ true
380
+ end
381
+
382
+ def load_saved_credentials(reload=false)
383
+ if reload || !defined?(@@appliance_credentials_map) || @@appliance_credentials_map.nil?
384
+ @@appliance_credentials_map = load_credentials_file || {}
385
+ end
386
+ # ok, we switched symbols to strings, because symbols suck in yaml! need to support both
387
+ # also we switched from just a token (symbol) to a whole object of strings
388
+ wallet = @@appliance_credentials_map[@appliance_name.to_s] || @@appliance_credentials_map[@appliance_name.to_sym]
389
+ if wallet.is_a?(String)
390
+ wallet = {'access_token' => wallet}
391
+ end
392
+ return wallet
393
+ end
394
+
395
+ def load_credentials_file
396
+ fn = credentials_file_path
397
+ if File.exist? fn
398
+ #MtnCloud::Logging::DarkPrinter.puts "loading credentials file #{fn}" if MtnCloud::Logging.debug?
399
+ return YAML.load_file(fn)
400
+ else
401
+ return nil
402
+ end
403
+ end
404
+
405
+ def credentials_file_path
406
+ File.join(MtnCloud::Cli.home_directory, "credentials")
407
+ end
408
+
409
+ # credentials wallet is {'access_token': '...', 'refresh_token': '...' 'expiration': '2019-01-01...'}
410
+ def save_credentials(appliance_name, wallet)
411
+ # reloading file is better for now, otherwise you can lose credentials with multiple shells.
412
+ credential_map = load_credentials_file || {}
413
+
414
+ if wallet
415
+ credential_map[appliance_name.to_s] = wallet
416
+ else
417
+ # nil mean remove the damn thing
418
+ credential_map.delete(appliance_name.to_s)
419
+ end
420
+ # always remove symbol, which was used pre 3.6.9
421
+ credential_map.delete(appliance_name.to_sym)
422
+ begin
423
+ fn = credentials_file_path
424
+ if !Dir.exist?(File.dirname(fn))
425
+ FileUtils.mkdir_p(File.dirname(fn))
426
+ end
427
+ #MtnCloud::Logging::DarkPrinter.puts "adding credentials for #{appliance_name} to #{fn}" if MtnCloud::Logging.debug?
428
+ File.open(fn, 'w') {|f| f.write credential_map.to_yaml } #Store
429
+ FileUtils.chmod(0600, fn)
430
+ @@appliance_credentials_map = credential_map
431
+ rescue => e
432
+ puts "failed to save #{fn}. #{e}" if MtnCloud::Logging.debug?
433
+ ensure
434
+ # recalcuate echo vars
435
+ #puts "Recalculating variable maps for username change"
436
+ MtnCloud::Cli::Echo.recalculate_variable_map()
437
+ # recalculate shell prompt after this change
438
+ if MtnCloud::Cli::Shell.has_instance?
439
+ MtnCloud::Cli::Shell.instance.reinitialize()
440
+ end
441
+ end
442
+ end
443
+
444
+ def rename_credentials(appliance_name, new_appliance_name)
445
+ # reloading file is better for now, otherwise you can lose credentials with multiple shells.
446
+ credential_map = load_credentials_file || {}
447
+
448
+ if new_appliance_name.to_s.empty?
449
+ puts "Cannot rename credentials without specifying a new name"
450
+ return nil
451
+ elsif credential_map[new_appliance_name.to_s] || credential_map[new_appliance_name.to_sym]
452
+ # yes you can, maybe require --force?
453
+ puts "Cannot rename credentials to a name that already exists: #{new_appliance_name}"
454
+ return nil
455
+ end
456
+
457
+ # always remove symbol, which was used pre 3.6.9
458
+ credential_map.delete(appliance_name.to_sym)
459
+ begin
460
+ fn = credentials_file_path
461
+ if !Dir.exist?(File.dirname(fn))
462
+ FileUtils.mkdir_p(File.dirname(fn))
463
+ end
464
+ #MtnCloud::Logging::DarkPrinter.puts "renaming credentials from #{appliance_name} to #{new_appliance_name}" if MtnCloud::Logging.debug?
465
+ File.open(fn, 'w') {|f| f.write credential_map.to_yaml } #Store
466
+ FileUtils.chmod(0600, fn)
467
+ @@appliance_credentials_map = credential_map
468
+ rescue => e
469
+ puts "failed to save #{fn}. #{e}" if MtnCloud::Logging.debug?
470
+ ensure
471
+ # recalcuate echo vars
472
+ #puts "Recalculating variable maps for username change"
473
+ MtnCloud::Cli::Echo.recalculate_variable_map()
474
+ # recalculate shell prompt after this change
475
+ if MtnCloud::Cli::Shell.has_instance?
476
+ MtnCloud::Cli::Shell.instance.reinitialize()
477
+ end
478
+ end
479
+ end
480
+ end
481
+ end
482
+ end
@@ -0,0 +1,180 @@
1
+ require 'fileutils'
2
+ require 'time'
3
+ require 'mtncloud/cli/cli_registry'
4
+ require 'mtncloud/logging'
5
+ require 'term/ansicolor'
6
+
7
+ class MtnCloud::Cli::DotFile
8
+ include Term::ANSIColor
9
+
10
+ EXPORTED_ALIASES_HEADER = "# exported aliases"
11
+
12
+ # the path of the profile source file
13
+ # this is executed when `mtncloud` is run
14
+ def self.mtncloud_profile_filename
15
+ File.join(MtnCloud::Cli.home_directory, ".mtncloud_profile")
16
+ end
17
+
18
+ # the path of the shell source file
19
+ # this is executed when `mtncloud shell` is run
20
+ def self.mtncloudrc_filename
21
+ File.join(MtnCloud::Cli.home_directory, ".mtncloudrc")
22
+ end
23
+
24
+ attr_reader :filename
25
+ # attr_reader :file_contents
26
+ # attr_reader :commands
27
+ # attr_reader :cmd_results
28
+
29
+ def initialize(fn)
30
+ @filename = fn
31
+ #load_file()
32
+ end
33
+
34
+ # execute this file as a mtncloud shell script
35
+ # executes each line in the file as a mtncloud expression, ignores empty lines and comments '#'
36
+ # @return [Array] exit codes of all the commands that were run.
37
+ def execute()
38
+ if !File.exist?(@filename)
39
+ print "#{Term::ANSIColor.red}source file not found: #{@filename}#{Term::ANSIColor.reset}\n" # if MtnCloud::Logging.debug?
40
+ else
41
+ MtnCloud::Logging::DarkPrinter.puts "executing source file #{@filename}" if MtnCloud::Logging.debug?
42
+ end
43
+ file_contents = File.read(@filename)
44
+ lines = file_contents.split("\n")
45
+ cmd_results = []
46
+ line_num = 0
47
+ lines.each_with_index do |line, line_index|
48
+ line_num = line_index + 1
49
+ line = line.strip
50
+ next if line.empty?
51
+ next if line =~ /^\#/ # skip comments
52
+
53
+ cmd_exit_code = 0
54
+ cmd_err = nil
55
+ cmd_result = nil
56
+ begin
57
+ cmd_result = MtnCloud::Cli::CliRegistry.exec_expression(line)
58
+ rescue SystemExit => err
59
+ if err.success?
60
+ cmd_result = true
61
+ else
62
+ puts "#{red} source file: #{@filename}, line: #{line_num}, command: #{line}, error: #{err}#{reset}"
63
+ cmd_result = false
64
+ end
65
+ rescue => err
66
+ # raise err
67
+ puts "#{red} source file: #{@filename}, line: #{line_num}, command: #{line}, error: #{err}#{reset}"
68
+ cmd_result = false
69
+ end
70
+ cmd_results << cmd_result
71
+ end
72
+ return cmd_results
73
+ end
74
+
75
+ # this saves the source file, upserting alias definitions at the bottom
76
+ # todo: smarter logic to allow the user to put stuff AFTER this section too
77
+ # under the section titled '# exported aliases'
78
+ # @param alias_definitions [Map] Map of alias_name => command_string
79
+ # @return nil
80
+ def export_aliases(alias_definitions)
81
+ if !@filename
82
+ print "#{Term::ANSIColor.dark}Skipping source file save because filename has not been set#{Term::ANSIColor.reset}\n" if MtnCloud::Logging.debug?
83
+ return false
84
+ end
85
+ if !Dir.exist?(File.dirname(@filename))
86
+ FileUtils.mkdir_p(File.dirname(@filename))
87
+ end
88
+ if !File.exist?(@filename)
89
+ print "#{Term::ANSIColor.dark}Initializing source file #{@filename}#{Term::ANSIColor.reset}\n" if MtnCloud::Logging.debug?
90
+ FileUtils.touch(@filename)
91
+ else
92
+ print "#{dark} #=> Saving source file #{@filename}#{reset}\n" if MtnCloud::Logging.debug?
93
+ end
94
+
95
+
96
+ config_text = File.read(@filename)
97
+ config_lines = config_text.split(/\n/)
98
+ new_config_lines = []
99
+ existing_alias_definitions = {}
100
+ header_line_index = config_lines.index {|line| line.strip.include?(EXPORTED_ALIASES_HEADER) }
101
+ # JD: there's some bad bug here where it can clear all your aliases!
102
+ # it would be safer to export to another file at .mtncloud/aliases or something.
103
+ if header_line_index
104
+ # keep everything before the exported alias section
105
+ new_config_lines = config_lines[0..header_line_index-1]
106
+ existing_alias_lines = config_lines[header_line_index..config_lines.size-1]
107
+ # parse out the existing alias definitions
108
+ existing_alias_lines.each do |line|
109
+ if line =~ /^alias\s+/
110
+ alias_name, command_string = MtnCloud::Cli::CliRegistry.parse_alias_definition(line)
111
+ if alias_name.empty? || command_string.empty?
112
+ print "#{dark} #=> removing bad config line #{line_num} invalid alias definition: #{line}\n" if MtnCloud::Logging.debug?
113
+ else
114
+ existing_alias_definitions[alias_name] = command_string
115
+ end
116
+ end
117
+ end
118
+ else
119
+ new_config_lines = config_lines
120
+ new_config_lines << "" # blank line before alias header
121
+ end
122
+
123
+ # append header line
124
+ new_config_lines << EXPORTED_ALIASES_HEADER
125
+ new_config_lines << "# Do not put anything below here, or it will be lost when aliases are exported"
126
+ #new_config_lines << ""
127
+
128
+ # update aliases, sort them, and append the lines
129
+ new_alias_definitions = existing_alias_definitions.merge(alias_definitions)
130
+ new_alias_definitions.keys.sort.each do |alias_name|
131
+ new_config_lines << "alias #{alias_name}='#{new_alias_definitions[alias_name]}'"
132
+ end
133
+
134
+ # include a blank line after this section
135
+ new_config_lines << ""
136
+ new_config_lines << ""
137
+
138
+ new_config_text = new_config_lines.join("\n")
139
+
140
+ File.open(@filename, 'w') {|f| f.write(new_config_text) }
141
+ return true
142
+ end
143
+
144
+ # this saves the source file, removing alias definitions at the bottom
145
+ # todo: smarter logic to allow the user to put stuff AFTER this section too
146
+ # under the section titled '# exported aliases'
147
+ # @param alias_definitions [Map] Map of alias_name => command_string
148
+ # @return nil
149
+ def remove_aliases(alias_names)
150
+ if !@filename
151
+ print "#{Term::ANSIColor.dark}Skipping source file save because filename has not been set#{Term::ANSIColor.reset}\n" if MtnCloud::Logging.debug?
152
+ return false
153
+ end
154
+ if !Dir.exist?(File.dirname(@filename))
155
+ FileUtils.mkdir_p(File.dirname(@filename))
156
+ end
157
+ if !File.exist?(@filename)
158
+ print "#{Term::ANSIColor.dark}Initializing source file #{@filename}#{Term::ANSIColor.reset}\n" if MtnCloud::Logging.debug?
159
+ FileUtils.touch(@filename)
160
+ else
161
+ print "#{dark} #=> Saving source file #{@filename}#{reset}\n" if MtnCloud::Logging.debug?
162
+ end
163
+
164
+
165
+ config_text = File.read(@filename)
166
+ config_lines = config_text.split(/\n/)
167
+
168
+ new_config_lines = config_lines.reject {|line|
169
+ alias_names.find {|alias_name| /^alias\s+#{Regexp.escape(alias_name)}\s?\=/ }
170
+ }
171
+
172
+ new_config_text = new_config_lines.join("\n")
173
+
174
+ File.open(@filename, 'w') {|f| f.write(new_config_text) }
175
+ return true
176
+ end
177
+
178
+
179
+
180
+ end