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.
- checksums.yaml +7 -0
- data/.dockerignore +20 -0
- data/.github/pull_request_template.md +14 -0
- data/.github/workflows/ci.yml +56 -0
- data/.github/workflows/release.yml +46 -0
- data/.gitignore +25 -0
- data/CLAUDE.md +24 -0
- data/CONTRIBUTING.md +91 -0
- data/Dockerfile +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +23 -0
- data/README.md +187 -0
- data/Rakefile +26 -0
- data/bin/mcs +3 -0
- data/bin/mtncloud +27 -0
- data/lib/mtncloud/api/account_groups_interface.rb +48 -0
- data/lib/mtncloud/api/account_users_interface.rb +68 -0
- data/lib/mtncloud/api/accounts_interface.rb +9 -0
- data/lib/mtncloud/api/activity_interface.rb +9 -0
- data/lib/mtncloud/api/affinity_groups_interface.rb +46 -0
- data/lib/mtncloud/api/api_client.rb +1091 -0
- data/lib/mtncloud/api/appliance_settings_interface.rb +49 -0
- data/lib/mtncloud/api/approvals_interface.rb +32 -0
- data/lib/mtncloud/api/apps_interface.rb +180 -0
- data/lib/mtncloud/api/archive_buckets_interface.rb +116 -0
- data/lib/mtncloud/api/archive_files_interface.rb +173 -0
- data/lib/mtncloud/api/audit_interface.rb +9 -0
- data/lib/mtncloud/api/auth_interface.rb +58 -0
- data/lib/mtncloud/api/backup_jobs_interface.rb +13 -0
- data/lib/mtncloud/api/backup_restores_interface.rb +27 -0
- data/lib/mtncloud/api/backup_results_interface.rb +32 -0
- data/lib/mtncloud/api/backup_service_types_interface.rb +9 -0
- data/lib/mtncloud/api/backup_services_interface.rb +9 -0
- data/lib/mtncloud/api/backup_settings_interface.rb +20 -0
- data/lib/mtncloud/api/backup_types_interface.rb +9 -0
- data/lib/mtncloud/api/backups_interface.rb +21 -0
- data/lib/mtncloud/api/billing_interface.rb +34 -0
- data/lib/mtncloud/api/blueprints_interface.rb +70 -0
- data/lib/mtncloud/api/body_io.rb +22 -0
- data/lib/mtncloud/api/budgets_interface.rb +48 -0
- data/lib/mtncloud/api/catalog_item_types_interface.rb +29 -0
- data/lib/mtncloud/api/certificate_types_interface.rb +14 -0
- data/lib/mtncloud/api/certificates_interface.rb +9 -0
- data/lib/mtncloud/api/clients_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_datastores_interface.rb +48 -0
- data/lib/mtncloud/api/cloud_folders_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_policies_interface.rb +41 -0
- data/lib/mtncloud/api/cloud_resource_pools_interface.rb +66 -0
- data/lib/mtncloud/api/clouds_interface.rb +217 -0
- data/lib/mtncloud/api/clusters_interface.rb +471 -0
- data/lib/mtncloud/api/containers_interface.rb +145 -0
- data/lib/mtncloud/api/credential_types_interface.rb +9 -0
- data/lib/mtncloud/api/credentials_interface.rb +9 -0
- data/lib/mtncloud/api/custom_instance_types_interface.rb +99 -0
- data/lib/mtncloud/api/cypher_interface.rb +51 -0
- data/lib/mtncloud/api/dashboard_interface.rb +14 -0
- data/lib/mtncloud/api/datastores_interface.rb +21 -0
- data/lib/mtncloud/api/deploy_interface.rb +44 -0
- data/lib/mtncloud/api/deployments_interface.rb +79 -0
- data/lib/mtncloud/api/distributed_workers_interface.rb +41 -0
- data/lib/mtncloud/api/email_templates_interface.rb +53 -0
- data/lib/mtncloud/api/environments_interface.rb +48 -0
- data/lib/mtncloud/api/execute_schedules_interface.rb +71 -0
- data/lib/mtncloud/api/execution_request_interface.rb +27 -0
- data/lib/mtncloud/api/file_copy_request_interface.rb +68 -0
- data/lib/mtncloud/api/forgot_password_interface.rb +17 -0
- data/lib/mtncloud/api/group_policies_interface.rb +41 -0
- data/lib/mtncloud/api/groups_interface.rb +73 -0
- data/lib/mtncloud/api/guidance_interface.rb +44 -0
- data/lib/mtncloud/api/guidance_settings_interface.rb +17 -0
- data/lib/mtncloud/api/health_interface.rb +100 -0
- data/lib/mtncloud/api/host_vm_groups_interface.rb +37 -0
- data/lib/mtncloud/api/hub_interface.rb +25 -0
- data/lib/mtncloud/api/image_builder_boot_scripts_interface.rb +41 -0
- data/lib/mtncloud/api/image_builder_image_builds_interface.rb +73 -0
- data/lib/mtncloud/api/image_builder_interface.rb +20 -0
- data/lib/mtncloud/api/image_builder_preseed_scripts_interface.rb +41 -0
- data/lib/mtncloud/api/instance_types_interface.rb +20 -0
- data/lib/mtncloud/api/instances_interface.rb +453 -0
- data/lib/mtncloud/api/integration_types_interface.rb +14 -0
- data/lib/mtncloud/api/integrations_interface.rb +74 -0
- data/lib/mtncloud/api/invoice_line_items_interface.rb +9 -0
- data/lib/mtncloud/api/invoices_interface.rb +28 -0
- data/lib/mtncloud/api/jobs_interface.rb +83 -0
- data/lib/mtncloud/api/key_pairs_interface.rb +57 -0
- data/lib/mtncloud/api/library_cluster_layouts_interface.rb +47 -0
- data/lib/mtncloud/api/library_cluster_packages_interface.rb +60 -0
- data/lib/mtncloud/api/library_container_scripts_interface.rb +43 -0
- data/lib/mtncloud/api/library_container_templates_interface.rb +43 -0
- data/lib/mtncloud/api/library_container_types_interface.rb +59 -0
- data/lib/mtncloud/api/library_container_upgrades_interface.rb +60 -0
- data/lib/mtncloud/api/library_instance_types_interface.rb +74 -0
- data/lib/mtncloud/api/library_layouts_interface.rb +69 -0
- data/lib/mtncloud/api/library_operating_systems_interface.rb +63 -0
- data/lib/mtncloud/api/library_spec_template_types_interface.rb +43 -0
- data/lib/mtncloud/api/library_spec_templates_interface.rb +43 -0
- data/lib/mtncloud/api/license_interface.rb +30 -0
- data/lib/mtncloud/api/load_balancer_monitors_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_pool_nodes_interface.rb +8 -0
- data/lib/mtncloud/api/load_balancer_pools_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_pools_secondary_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_profiles_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_types_interface.rb +9 -0
- data/lib/mtncloud/api/load_balancer_virtual_servers_interface.rb +18 -0
- data/lib/mtncloud/api/load_balancers_interface.rb +14 -0
- data/lib/mtncloud/api/log_settings_interface.rb +44 -0
- data/lib/mtncloud/api/logs_interface.rb +37 -0
- data/lib/mtncloud/api/migrations_interface.rb +49 -0
- data/lib/mtncloud/api/monitoring_alerts_interface.rb +39 -0
- data/lib/mtncloud/api/monitoring_apps_interface.rb +69 -0
- data/lib/mtncloud/api/monitoring_checks_interface.rb +103 -0
- data/lib/mtncloud/api/monitoring_contacts_interface.rb +41 -0
- data/lib/mtncloud/api/monitoring_groups_interface.rb +77 -0
- data/lib/mtncloud/api/monitoring_incidents_interface.rb +107 -0
- data/lib/mtncloud/api/monitoring_interface.rb +35 -0
- data/lib/mtncloud/api/monitoring_settings_interface.rb +21 -0
- data/lib/mtncloud/api/network_dhcp_relays_interface.rb +36 -0
- data/lib/mtncloud/api/network_dhcp_servers_interface.rb +36 -0
- data/lib/mtncloud/api/network_domain_records_interface.rb +41 -0
- data/lib/mtncloud/api/network_domains_interface.rb +41 -0
- data/lib/mtncloud/api/network_edge_clusters_interface.rb +26 -0
- data/lib/mtncloud/api/network_floating_ips_interface.rb +40 -0
- data/lib/mtncloud/api/network_groups_interface.rb +41 -0
- data/lib/mtncloud/api/network_pool_ips_interface.rb +41 -0
- data/lib/mtncloud/api/network_pool_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_pool_servers_interface.rb +48 -0
- data/lib/mtncloud/api/network_pools_interface.rb +41 -0
- data/lib/mtncloud/api/network_proxies_interface.rb +41 -0
- data/lib/mtncloud/api/network_routers_interface.rb +181 -0
- data/lib/mtncloud/api/network_security_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_security_servers_interface.rb +27 -0
- data/lib/mtncloud/api/network_server_groups_interface.rb +7 -0
- data/lib/mtncloud/api/network_server_types_interface.rb +9 -0
- data/lib/mtncloud/api/network_servers_interface.rb +102 -0
- data/lib/mtncloud/api/network_services_interface.rb +63 -0
- data/lib/mtncloud/api/network_static_routes_interface.rb +36 -0
- data/lib/mtncloud/api/network_subnets_interface.rb +42 -0
- data/lib/mtncloud/api/network_types_interface.rb +20 -0
- data/lib/mtncloud/api/networks_interface.rb +48 -0
- data/lib/mtncloud/api/option_type_forms_interface.rb +9 -0
- data/lib/mtncloud/api/option_type_lists_interface.rb +53 -0
- data/lib/mtncloud/api/option_types_interface.rb +41 -0
- data/lib/mtncloud/api/options_interface.rb +17 -0
- data/lib/mtncloud/api/packages_interface.rb +112 -0
- data/lib/mtncloud/api/ping_interface.rb +22 -0
- data/lib/mtncloud/api/plugins_interface.rb +22 -0
- data/lib/mtncloud/api/policies_interface.rb +56 -0
- data/lib/mtncloud/api/power_schedules_interface.rb +71 -0
- data/lib/mtncloud/api/price_sets_interface.rb +39 -0
- data/lib/mtncloud/api/prices_interface.rb +71 -0
- data/lib/mtncloud/api/processes_interface.rb +40 -0
- data/lib/mtncloud/api/projects_interface.rb +33 -0
- data/lib/mtncloud/api/provision_types_interface.rb +24 -0
- data/lib/mtncloud/api/provisioning_license_types_interface.rb +31 -0
- data/lib/mtncloud/api/provisioning_licenses_interface.rb +60 -0
- data/lib/mtncloud/api/provisioning_settings_interface.rb +26 -0
- data/lib/mtncloud/api/read_interface.rb +24 -0
- data/lib/mtncloud/api/reports_interface.rb +70 -0
- data/lib/mtncloud/api/resource_pool_groups_interface.rb +51 -0
- data/lib/mtncloud/api/rest_interface.rb +37 -0
- data/lib/mtncloud/api/roles_interface.rb +151 -0
- data/lib/mtncloud/api/scale_thresholds_interface.rb +9 -0
- data/lib/mtncloud/api/search_interface.rb +13 -0
- data/lib/mtncloud/api/secondary_read_interface.rb +25 -0
- data/lib/mtncloud/api/secondary_rest_interface.rb +42 -0
- data/lib/mtncloud/api/security_group_rules_interface.rb +35 -0
- data/lib/mtncloud/api/security_groups_interface.rb +56 -0
- data/lib/mtncloud/api/security_package_types_interface.rb +9 -0
- data/lib/mtncloud/api/security_packages_interface.rb +9 -0
- data/lib/mtncloud/api/security_scans_interface.rb +9 -0
- data/lib/mtncloud/api/server_devices_interface.rb +30 -0
- data/lib/mtncloud/api/server_types_interface.rb +20 -0
- data/lib/mtncloud/api/servers_interface.rb +230 -0
- data/lib/mtncloud/api/service_catalog_interface.rb +89 -0
- data/lib/mtncloud/api/service_plans_interface.rb +62 -0
- data/lib/mtncloud/api/setup_interface.rb +46 -0
- data/lib/mtncloud/api/snapshots_interface.rb +19 -0
- data/lib/mtncloud/api/storage_datastores_interface.rb +44 -0
- data/lib/mtncloud/api/storage_providers_interface.rb +151 -0
- data/lib/mtncloud/api/storage_server_types_interface.rb +14 -0
- data/lib/mtncloud/api/storage_servers_interface.rb +9 -0
- data/lib/mtncloud/api/storage_volume_types_interface.rb +9 -0
- data/lib/mtncloud/api/storage_volumes_interface.rb +24 -0
- data/lib/mtncloud/api/subnet_types_interface.rb +20 -0
- data/lib/mtncloud/api/subnets_interface.rb +41 -0
- data/lib/mtncloud/api/support_bundles_interface.rb +46 -0
- data/lib/mtncloud/api/system_types_interface.rb +13 -0
- data/lib/mtncloud/api/systems_interface.rb +55 -0
- data/lib/mtncloud/api/task_sets_interface.rb +52 -0
- data/lib/mtncloud/api/tasks_interface.rb +66 -0
- data/lib/mtncloud/api/tokens_interface.rb +39 -0
- data/lib/mtncloud/api/usage_interface.rb +18 -0
- data/lib/mtncloud/api/user_groups_interface.rb +59 -0
- data/lib/mtncloud/api/user_settings_interface.rb +90 -0
- data/lib/mtncloud/api/user_sources_interface.rb +99 -0
- data/lib/mtncloud/api/users_interface.rb +33 -0
- data/lib/mtncloud/api/vdi_allocations_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_apps_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_gateways_interface.rb +9 -0
- data/lib/mtncloud/api/vdi_interface.rb +28 -0
- data/lib/mtncloud/api/vdi_pools_interface.rb +19 -0
- data/lib/mtncloud/api/virtual_images_interface.rb +210 -0
- data/lib/mtncloud/api/virtual_servers_interface.rb +9 -0
- data/lib/mtncloud/api/virtual_switches_interface.rb +9 -0
- data/lib/mtncloud/api/whitelabel_settings_interface.rb +57 -0
- data/lib/mtncloud/api/whoami_interface.rb +13 -0
- data/lib/mtncloud/api/wiki_interface.rb +48 -0
- data/lib/mtncloud/api.rb +12 -0
- data/lib/mtncloud/benchmarking.rb +259 -0
- data/lib/mtncloud/cli/cli_command.rb +2281 -0
- data/lib/mtncloud/cli/cli_registry.rb +337 -0
- data/lib/mtncloud/cli/commands/access_token_command.rb +201 -0
- data/lib/mtncloud/cli/commands/account_groups_command.rb +530 -0
- data/lib/mtncloud/cli/commands/activity_command.rb +149 -0
- data/lib/mtncloud/cli/commands/affinity_groups_command.rb +554 -0
- data/lib/mtncloud/cli/commands/alias_command.rb +278 -0
- data/lib/mtncloud/cli/commands/appliance_settings_command.rb +382 -0
- data/lib/mtncloud/cli/commands/approvals_command.rb +236 -0
- data/lib/mtncloud/cli/commands/apps.rb +2549 -0
- data/lib/mtncloud/cli/commands/archives_command.rb +2161 -0
- data/lib/mtncloud/cli/commands/audit.rb +188 -0
- data/lib/mtncloud/cli/commands/backup_jobs_command.rb +366 -0
- data/lib/mtncloud/cli/commands/backup_restores_command.rb +144 -0
- data/lib/mtncloud/cli/commands/backup_results_command.rb +149 -0
- data/lib/mtncloud/cli/commands/backup_services_command.rb +44 -0
- data/lib/mtncloud/cli/commands/backup_settings_command.rb +184 -0
- data/lib/mtncloud/cli/commands/backup_types_command.rb +53 -0
- data/lib/mtncloud/cli/commands/backups_command.rb +674 -0
- data/lib/mtncloud/cli/commands/benchmark_command.rb +458 -0
- data/lib/mtncloud/cli/commands/blueprints_command.rb +2297 -0
- data/lib/mtncloud/cli/commands/boot_scripts_command.rb +379 -0
- data/lib/mtncloud/cli/commands/budgets_command.rb +754 -0
- data/lib/mtncloud/cli/commands/cat_command.rb +45 -0
- data/lib/mtncloud/cli/commands/catalog_item_types_command.rb +858 -0
- data/lib/mtncloud/cli/commands/certificates_command.rb +575 -0
- data/lib/mtncloud/cli/commands/change_password_command.rb +132 -0
- data/lib/mtncloud/cli/commands/clients_command.rb +331 -0
- data/lib/mtncloud/cli/commands/cloud_datastores_command.rb +543 -0
- data/lib/mtncloud/cli/commands/cloud_folders_command.rb +512 -0
- data/lib/mtncloud/cli/commands/cloud_resource_pools_command.rb +870 -0
- data/lib/mtncloud/cli/commands/clouds.rb +2037 -0
- data/lib/mtncloud/cli/commands/clouds_types.rb +140 -0
- data/lib/mtncloud/cli/commands/cluster_types.rb +179 -0
- data/lib/mtncloud/cli/commands/clusters.rb +5855 -0
- data/lib/mtncloud/cli/commands/coloring_command.rb +82 -0
- data/lib/mtncloud/cli/commands/containers_command.rb +967 -0
- data/lib/mtncloud/cli/commands/credential_types_command.rb +36 -0
- data/lib/mtncloud/cli/commands/credentials_command.rb +124 -0
- data/lib/mtncloud/cli/commands/curl_command.rb +168 -0
- data/lib/mtncloud/cli/commands/cypher_command.rb +587 -0
- data/lib/mtncloud/cli/commands/dashboard_command.rb +300 -0
- data/lib/mtncloud/cli/commands/debug_command.rb +75 -0
- data/lib/mtncloud/cli/commands/deploy.rb +485 -0
- data/lib/mtncloud/cli/commands/deployments.rb +923 -0
- data/lib/mtncloud/cli/commands/deploys.rb +485 -0
- data/lib/mtncloud/cli/commands/distributed_workers_command.rb +282 -0
- data/lib/mtncloud/cli/commands/echo_command.rb +61 -0
- data/lib/mtncloud/cli/commands/edit_profile_command.rb +57 -0
- data/lib/mtncloud/cli/commands/edit_rc_command.rb +77 -0
- data/lib/mtncloud/cli/commands/email_templates_command.rb +373 -0
- data/lib/mtncloud/cli/commands/environments_command.rb +401 -0
- data/lib/mtncloud/cli/commands/execute_schedules_command.rb +735 -0
- data/lib/mtncloud/cli/commands/execution_request_command.rb +333 -0
- data/lib/mtncloud/cli/commands/exit_command.rb +34 -0
- data/lib/mtncloud/cli/commands/file_copy_request_command.rb +352 -0
- data/lib/mtncloud/cli/commands/forgot_password.rb +133 -0
- data/lib/mtncloud/cli/commands/get_prompt_command.rb +36 -0
- data/lib/mtncloud/cli/commands/groups.rb +818 -0
- data/lib/mtncloud/cli/commands/guidance_command.rb +529 -0
- data/lib/mtncloud/cli/commands/guidance_settings.rb +148 -0
- data/lib/mtncloud/cli/commands/health_command.rb +1046 -0
- data/lib/mtncloud/cli/commands/history_command.rb +60 -0
- data/lib/mtncloud/cli/commands/host_vm_groups_command.rb +423 -0
- data/lib/mtncloud/cli/commands/hosts.rb +2986 -0
- data/lib/mtncloud/cli/commands/hub.rb +215 -0
- data/lib/mtncloud/cli/commands/image_builder_command.rb +1197 -0
- data/lib/mtncloud/cli/commands/instance_types.rb +163 -0
- data/lib/mtncloud/cli/commands/instances.rb +5813 -0
- data/lib/mtncloud/cli/commands/integrations_command.rb +1412 -0
- data/lib/mtncloud/cli/commands/invoices_command.rb +1151 -0
- data/lib/mtncloud/cli/commands/jobs_command.rb +998 -0
- data/lib/mtncloud/cli/commands/key_pairs.rb +470 -0
- data/lib/mtncloud/cli/commands/library_cluster_layouts_command.rb +901 -0
- data/lib/mtncloud/cli/commands/library_cluster_packages_command.rb +552 -0
- data/lib/mtncloud/cli/commands/library_container_scripts_command.rb +446 -0
- data/lib/mtncloud/cli/commands/library_container_templates_command.rb +526 -0
- data/lib/mtncloud/cli/commands/library_container_types_command.rb +698 -0
- data/lib/mtncloud/cli/commands/library_forms_command.rb +625 -0
- data/lib/mtncloud/cli/commands/library_instance_types_command.rb +668 -0
- data/lib/mtncloud/cli/commands/library_layouts_command.rb +849 -0
- data/lib/mtncloud/cli/commands/library_operating_systems_command.rb +671 -0
- data/lib/mtncloud/cli/commands/library_option_lists_command.rb +503 -0
- data/lib/mtncloud/cli/commands/library_option_types_command.rb +329 -0
- data/lib/mtncloud/cli/commands/library_spec_templates_command.rb +547 -0
- data/lib/mtncloud/cli/commands/library_upgrades_command.rb +596 -0
- data/lib/mtncloud/cli/commands/license.rb +475 -0
- data/lib/mtncloud/cli/commands/load_balancer_monitors.rb +70 -0
- data/lib/mtncloud/cli/commands/load_balancer_pool_nodes.rb +87 -0
- data/lib/mtncloud/cli/commands/load_balancer_pools.rb +129 -0
- data/lib/mtncloud/cli/commands/load_balancer_profiles.rb +64 -0
- data/lib/mtncloud/cli/commands/load_balancer_types.rb +38 -0
- data/lib/mtncloud/cli/commands/load_balancer_virtual_servers.rb +147 -0
- data/lib/mtncloud/cli/commands/load_balancers.rb +189 -0
- data/lib/mtncloud/cli/commands/log_level_command.rb +54 -0
- data/lib/mtncloud/cli/commands/log_settings_command.rb +443 -0
- data/lib/mtncloud/cli/commands/login.rb +148 -0
- data/lib/mtncloud/cli/commands/logout.rb +63 -0
- data/lib/mtncloud/cli/commands/logs_command.rb +140 -0
- data/lib/mtncloud/cli/commands/man_command.rb +409 -0
- data/lib/mtncloud/cli/commands/migrations.rb +453 -0
- data/lib/mtncloud/cli/commands/monitoring_alerts_command.rb +791 -0
- data/lib/mtncloud/cli/commands/monitoring_apps_command.rb +716 -0
- data/lib/mtncloud/cli/commands/monitoring_checks_command.rb +766 -0
- data/lib/mtncloud/cli/commands/monitoring_contacts_command.rb +339 -0
- data/lib/mtncloud/cli/commands/monitoring_groups_command.rb +674 -0
- data/lib/mtncloud/cli/commands/monitoring_incidents_command.rb +835 -0
- data/lib/mtncloud/cli/commands/monitoring_settings.rb +212 -0
- data/lib/mtncloud/cli/commands/network_dhcp_relays_command.rb +375 -0
- data/lib/mtncloud/cli/commands/network_dhcp_servers_command.rb +366 -0
- data/lib/mtncloud/cli/commands/network_domains_command.rb +896 -0
- data/lib/mtncloud/cli/commands/network_edge_clusters_command.rb +288 -0
- data/lib/mtncloud/cli/commands/network_firewalls_command.rb +783 -0
- data/lib/mtncloud/cli/commands/network_floating_ips.rb +147 -0
- data/lib/mtncloud/cli/commands/network_groups_command.rb +654 -0
- data/lib/mtncloud/cli/commands/network_pool_server_types.rb +20 -0
- data/lib/mtncloud/cli/commands/network_pool_servers_command.rb +318 -0
- data/lib/mtncloud/cli/commands/network_pools_command.rb +903 -0
- data/lib/mtncloud/cli/commands/network_proxies_command.rb +578 -0
- data/lib/mtncloud/cli/commands/network_routers_command.rb +2628 -0
- data/lib/mtncloud/cli/commands/network_security_server_types.rb +20 -0
- data/lib/mtncloud/cli/commands/network_server_groups_command.rb +222 -0
- data/lib/mtncloud/cli/commands/network_server_types_command.rb +20 -0
- data/lib/mtncloud/cli/commands/network_servers_command.rb +398 -0
- data/lib/mtncloud/cli/commands/network_services_command.rb +198 -0
- data/lib/mtncloud/cli/commands/network_static_routes_command.rb +451 -0
- data/lib/mtncloud/cli/commands/network_transport_zones_command.rb +412 -0
- data/lib/mtncloud/cli/commands/networks_command.rb +1692 -0
- data/lib/mtncloud/cli/commands/open_command.rb +30 -0
- data/lib/mtncloud/cli/commands/options.rb +231 -0
- data/lib/mtncloud/cli/commands/packages_command.rb +822 -0
- data/lib/mtncloud/cli/commands/ping.rb +242 -0
- data/lib/mtncloud/cli/commands/plugins.rb +214 -0
- data/lib/mtncloud/cli/commands/policies_command.rb +990 -0
- data/lib/mtncloud/cli/commands/power_schedules_command.rb +731 -0
- data/lib/mtncloud/cli/commands/preseed_scripts_command.rb +378 -0
- data/lib/mtncloud/cli/commands/price_sets_command.rb +557 -0
- data/lib/mtncloud/cli/commands/prices_command.rb +692 -0
- data/lib/mtncloud/cli/commands/processes_command.rb +469 -0
- data/lib/mtncloud/cli/commands/projects_command.rb +537 -0
- data/lib/mtncloud/cli/commands/provisioning_licenses_command.rb +509 -0
- data/lib/mtncloud/cli/commands/provisioning_settings_command.rb +238 -0
- data/lib/mtncloud/cli/commands/recent_activity_command.rb +171 -0
- data/lib/mtncloud/cli/commands/remote.rb +1818 -0
- data/lib/mtncloud/cli/commands/reports_command.rb +724 -0
- data/lib/mtncloud/cli/commands/resource_pool_groups_command.rb +586 -0
- data/lib/mtncloud/cli/commands/rm_command.rb +14 -0
- data/lib/mtncloud/cli/commands/roles.rb +3120 -0
- data/lib/mtncloud/cli/commands/scale_thresholds.rb +103 -0
- data/lib/mtncloud/cli/commands/search_command.rb +184 -0
- data/lib/mtncloud/cli/commands/security_group_rules.rb +230 -0
- data/lib/mtncloud/cli/commands/security_groups.rb +1294 -0
- data/lib/mtncloud/cli/commands/security_package_types.rb +32 -0
- data/lib/mtncloud/cli/commands/security_packages.rb +84 -0
- data/lib/mtncloud/cli/commands/security_scans.rb +107 -0
- data/lib/mtncloud/cli/commands/self_service_command.rb +17 -0
- data/lib/mtncloud/cli/commands/server_devices_command.rb +207 -0
- data/lib/mtncloud/cli/commands/service_catalog_command.rb +1528 -0
- data/lib/mtncloud/cli/commands/service_plans_command.rb +895 -0
- data/lib/mtncloud/cli/commands/set_prompt_command.rb +51 -0
- data/lib/mtncloud/cli/commands/setup.rb +423 -0
- data/lib/mtncloud/cli/commands/shell.rb +717 -0
- data/lib/mtncloud/cli/commands/sleep_command.rb +43 -0
- data/lib/mtncloud/cli/commands/snapshots.rb +156 -0
- data/lib/mtncloud/cli/commands/source_command.rb +30 -0
- data/lib/mtncloud/cli/commands/ssl_verification_command.rb +47 -0
- data/lib/mtncloud/cli/commands/storage_datastores.rb +457 -0
- data/lib/mtncloud/cli/commands/storage_providers_command.rb +1401 -0
- data/lib/mtncloud/cli/commands/storage_server_types.rb +45 -0
- data/lib/mtncloud/cli/commands/storage_servers.rb +116 -0
- data/lib/mtncloud/cli/commands/storage_volume_types.rb +45 -0
- data/lib/mtncloud/cli/commands/storage_volumes.rb +236 -0
- data/lib/mtncloud/cli/commands/subnets_command.rb +819 -0
- data/lib/mtncloud/cli/commands/support_bundles_command.rb +606 -0
- data/lib/mtncloud/cli/commands/systems.rb +1203 -0
- data/lib/mtncloud/cli/commands/tasks.rb +1391 -0
- data/lib/mtncloud/cli/commands/tee_command.rb +14 -0
- data/lib/mtncloud/cli/commands/tenants_command.rb +315 -0
- data/lib/mtncloud/cli/commands/tokens_command.rb +391 -0
- data/lib/mtncloud/cli/commands/update_command.rb +46 -0
- data/lib/mtncloud/cli/commands/usage_command.rb +203 -0
- data/lib/mtncloud/cli/commands/user_groups_command.rb +512 -0
- data/lib/mtncloud/cli/commands/user_settings_command.rb +849 -0
- data/lib/mtncloud/cli/commands/user_sources_command.rb +1065 -0
- data/lib/mtncloud/cli/commands/users.rb +897 -0
- data/lib/mtncloud/cli/commands/vdi_allocations_command.rb +159 -0
- data/lib/mtncloud/cli/commands/vdi_apps_command.rb +317 -0
- data/lib/mtncloud/cli/commands/vdi_command.rb +359 -0
- data/lib/mtncloud/cli/commands/vdi_gateways_command.rb +290 -0
- data/lib/mtncloud/cli/commands/vdi_pools_command.rb +574 -0
- data/lib/mtncloud/cli/commands/version_command.rb +38 -0
- data/lib/mtncloud/cli/commands/view.rb +107 -0
- data/lib/mtncloud/cli/commands/virtual_images.rb +1362 -0
- data/lib/mtncloud/cli/commands/virtual_switches_command.rb +336 -0
- data/lib/mtncloud/cli/commands/whitelabel_settings_command.rb +653 -0
- data/lib/mtncloud/cli/commands/whoami.rb +323 -0
- data/lib/mtncloud/cli/commands/wiki_command.rb +448 -0
- data/lib/mtncloud/cli/commands/workflows.rb +1022 -0
- data/lib/mtncloud/cli/credentials.rb +482 -0
- data/lib/mtncloud/cli/dot_file.rb +180 -0
- data/lib/mtncloud/cli/error_handler.rb +307 -0
- data/lib/mtncloud/cli/errors.rb +53 -0
- data/lib/mtncloud/cli/expression_parser.rb +153 -0
- data/lib/mtncloud/cli/mixins/accounts_helper.rb +484 -0
- data/lib/mtncloud/cli/mixins/affinity_helper.rb +118 -0
- data/lib/mtncloud/cli/mixins/backups_helper.rb +200 -0
- data/lib/mtncloud/cli/mixins/deployments_helper.rb +163 -0
- data/lib/mtncloud/cli/mixins/execution_request_helper.rb +50 -0
- data/lib/mtncloud/cli/mixins/infrastructure_helper.rb +966 -0
- data/lib/mtncloud/cli/mixins/jobs_helper.rb +202 -0
- data/lib/mtncloud/cli/mixins/library_helper.rb +539 -0
- data/lib/mtncloud/cli/mixins/load_balancers_helper.rb +176 -0
- data/lib/mtncloud/cli/mixins/logs_helper.rb +131 -0
- data/lib/mtncloud/cli/mixins/monitoring_helper.rb +876 -0
- data/lib/mtncloud/cli/mixins/networks_helper.rb +62 -0
- data/lib/mtncloud/cli/mixins/operations_helper.rb +41 -0
- data/lib/mtncloud/cli/mixins/option_source_helper.rb +254 -0
- data/lib/mtncloud/cli/mixins/print_helper.rb +1631 -0
- data/lib/mtncloud/cli/mixins/processes_helper.rb +286 -0
- data/lib/mtncloud/cli/mixins/prompt_helper.rb +136 -0
- data/lib/mtncloud/cli/mixins/provisioning_helper.rb +2963 -0
- data/lib/mtncloud/cli/mixins/remote_helper.rb +139 -0
- data/lib/mtncloud/cli/mixins/rest_command.rb +994 -0
- data/lib/mtncloud/cli/mixins/secondary_rest_command.rb +700 -0
- data/lib/mtncloud/cli/mixins/storage_servers_helper.rb +93 -0
- data/lib/mtncloud/cli/mixins/storage_volumes_helper.rb +76 -0
- data/lib/mtncloud/cli/mixins/vdi_helper.rb +246 -0
- data/lib/mtncloud/cli/mixins/whoami_helper.rb +73 -0
- data/lib/mtncloud/cli/option_parser.rb +127 -0
- data/lib/mtncloud/cli/option_types.rb +1622 -0
- data/lib/mtncloud/cli/version.rb +6 -0
- data/lib/mtncloud/cli.rb +105 -0
- data/lib/mtncloud/currency.rb +184 -0
- data/lib/mtncloud/ext/hash.rb +109 -0
- data/lib/mtncloud/ext/nil_class.rb +5 -0
- data/lib/mtncloud/ext/rest_client.rb +37 -0
- data/lib/mtncloud/ext/string.rb +66 -0
- data/lib/mtncloud/formatters.rb +511 -0
- data/lib/mtncloud/logging.rb +185 -0
- data/lib/mtncloud/morpkg.rb +119 -0
- data/lib/mtncloud/rest_client.rb +104 -0
- data/lib/mtncloud/routes.rb +304 -0
- data/lib/mtncloud/terminal.rb +528 -0
- data/lib/mtncloud/util.rb +29 -0
- data/lib/mtncloud.rb +5 -0
- data/mtncloud-cli.gemspec +38 -0
- data/test/api/affinity_groups_interface_test.rb +43 -0
- data/test/api/clients_interface_test.rb +23 -0
- data/test/api/clouds_interface_test.rb +67 -0
- data/test/api/containers_interface_test.rb +68 -0
- data/test/api/host_vm_groups_interface_test.rb +35 -0
- data/test/api/instances_interface_test.rb +22 -0
- data/test/api/network_routers_interface_test.rb +22 -0
- data/test/api/systems_interface_test.rb +26 -0
- data/test/api/whoami_interface_test.rb +14 -0
- data/test/branding_test.rb +160 -0
- data/test/cli/access_token_test.rb +36 -0
- data/test/cli/affinity_groups_cloud_cluster_scope_test.rb +270 -0
- data/test/cli/affinity_groups_cluster_scope_test.rb +171 -0
- data/test/cli/affinity_groups_test.rb +57 -0
- data/test/cli/affinity_groups_violations_scope_test.rb +141 -0
- data/test/cli/affinity_helper_test.rb +367 -0
- data/test/cli/auth_test.rb +88 -0
- data/test/cli/backups_test.rb +212 -0
- data/test/cli/cli_test.rb +48 -0
- data/test/cli/clients_test.rb +45 -0
- data/test/cli/clusters_uuid_test.rb +146 -0
- data/test/cli/containers_test.rb +92 -0
- data/test/cli/distributed_workers_test.rb +68 -0
- data/test/cli/help_test.rb +25 -0
- data/test/cli/host_vm_groups_cluster_scope_test.rb +187 -0
- data/test/cli/host_vm_groups_test.rb +63 -0
- data/test/cli/infrastructure_helper_cluster_resolver_test.rb +250 -0
- data/test/cli/instances_test.rb +37 -0
- data/test/cli/man_test.rb +14 -0
- data/test/cli/migrations_test.rb +39 -0
- data/test/cli/network_routers_test.rb +65 -0
- data/test/cli/remote_test.rb +89 -0
- data/test/cli/roles_test.rb +47 -0
- data/test/cli/shell_test.rb +81 -0
- data/test/cli/storage_volumes_test.rb +79 -0
- data/test/cli/systems_test.rb +206 -0
- data/test/cli/version_test.rb +23 -0
- data/test/cli/view_test.rb +55 -0
- data/test/cli/whoami_test.rb +17 -0
- data/test/mtncloud_test.rb +16 -0
- data/test/test_case.rb +342 -0
- data/test/test_config.rb +137 -0
- data/test/test_data_helper.rb +97 -0
- 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
|