ic-code 1.0.9__tar.gz → 1.1.0__tar.gz
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.
- {ic_code-1.0.9/src/ic_code.egg-info → ic_code-1.1.0}/PKG-INFO +1 -1
- ic_code-1.1.0/docs/ssh/configuration.md +109 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/pyproject.toml +1 -1
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/config.py +4 -18
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/auto_ssh.py +30 -4
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/server_info.py +24 -2
- {ic_code-1.0.9 → ic_code-1.1.0/src/ic_code.egg-info}/PKG-INFO +1 -1
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/SOURCES.txt +1 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/CHANGELOG.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/LICENSE +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/MANIFEST.in +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/SECURITY.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/azure_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/gather_env.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_config_validator.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_monitoring.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/log.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/ncp_security_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/ncp_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/ncpgov_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/progress_decorator.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/slack.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/common/utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/configuration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/troubleshooting.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/usage.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/AWS_IMPLEMENTATION_SUMMARY.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/aws_cli_prd.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/azure/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/config_migration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/deployment.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/general/configuration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/mcp_integration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/migration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/migration_guide.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/configuration.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/troubleshooting.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/usage.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncpgov/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncpgov/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/oci/README.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/oci/installation.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/security.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/troubleshooting.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/docs/user_guide.md +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/mcp/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/mcp/gcp_connector.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/requirements.txt +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/analysis_summary.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/bump-version.sh +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/cli_usage_analysis.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/dependency_mapper.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/deploy.sh +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/final_validation_and_documentation.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/fix_consolidated_imports.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/migration_execution_and_validation.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/ncp_security_scanner.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/oracle-policy/user_policy.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/performance_optimization.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/setup_venv.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/unset_env.sh +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_config.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_dependencies.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_ncp_security.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/setup.cfg +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/setup.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/cli.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/migration.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/security.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/cli.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/common.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/cleanup.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/docs_organizer.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/external.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/installer.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/manager.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/migration.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/migration_utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/path_manager.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/schema.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/secrets.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/security.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/dependency_validator.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/logging.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/mcp_manager.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/session.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/silence_logging.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/manager.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/post_validation.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/rollback.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/validation.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/cloudfront/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/build.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/service.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/task.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/addons.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/fargate.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/nodes.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/pods.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/update_config.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/fargate/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/fargate/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/broker.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/profile/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/profile/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/sg/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/sg/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/list_tags.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpn/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpn/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/aci/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/aks/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/lb/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/nsg/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/storage/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/vm/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/vnet/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/billing/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/billing/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/compute/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/compute/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/firewall/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/functions/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/functions/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/gke/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/gke/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/lb/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/lb/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/run/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/run/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/sql/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/sql/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/storage/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/storage/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/vpc/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/client.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/ec2/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/ec2/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/rds/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/rds/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/s3/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/s3/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/sg/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/sg/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/vpc/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/vpc/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/client.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/ec2/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/ec2/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/rds/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/rds/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/s3/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/s3/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/sg/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/sg/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/vpc/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/vpc/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/common/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/common/utils.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/compartment/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/compartment/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/credit.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/usage.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/info/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/info/oci_info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/lb/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/lb/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/nsg/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/nsg/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/obj/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/obj/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/search.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vcn/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vcn/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vm/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vm/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/volume/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/volume/info.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/__init__.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/config.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/detector.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/guidance.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/hooks.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/patterns.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/scanner.py +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/dependency_links.txt +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/entry_points.txt +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/requires.txt +0 -0
- {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# SSH Configuration Guide
|
|
2
|
+
|
|
3
|
+
## SSH Host Key Policy 설정
|
|
4
|
+
|
|
5
|
+
IC CLI의 SSH 기능은 보안을 위해 다양한 호스트 키 정책을 지원합니다.
|
|
6
|
+
|
|
7
|
+
### 설정 방법
|
|
8
|
+
|
|
9
|
+
`~/.ic/config/default.yaml` 파일에서 SSH 설정을 수정할 수 있습니다:
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
ssh:
|
|
13
|
+
config_file: ~/.ssh/config
|
|
14
|
+
key_dir: ~/.ssh
|
|
15
|
+
timeout: 5
|
|
16
|
+
workers: 20
|
|
17
|
+
host_key_policy: auto # 새로 추가된 설정
|
|
18
|
+
skip_prefixes:
|
|
19
|
+
- git
|
|
20
|
+
- test
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Host Key Policy 옵션
|
|
24
|
+
|
|
25
|
+
1. **auto** (기본값, 권장)
|
|
26
|
+
- 처음 연결하는 호스트의 키를 자동으로 `~/.ssh/known_hosts`에 추가
|
|
27
|
+
- 편의성과 보안의 균형을 제공
|
|
28
|
+
- 대부분의 사용 사례에 적합
|
|
29
|
+
|
|
30
|
+
2. **warning**
|
|
31
|
+
- 알려지지 않은 호스트에 대해 경고를 출력하지만 연결 허용
|
|
32
|
+
- 개발 환경이나 테스트 환경에 적합
|
|
33
|
+
- 보안 경고를 확인할 수 있음
|
|
34
|
+
|
|
35
|
+
3. **reject**
|
|
36
|
+
- 알려지지 않은 호스트에 대한 연결을 거부
|
|
37
|
+
- 최고 수준의 보안
|
|
38
|
+
- 프로덕션 환경에 적합하지만 초기 설정이 복잡할 수 있음
|
|
39
|
+
|
|
40
|
+
### 환경 변수 오버라이드
|
|
41
|
+
|
|
42
|
+
개발이나 테스트 목적으로 임시로 정책을 변경할 수 있습니다:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 테스트 모드 (경고 정책 사용)
|
|
46
|
+
IC_TEST_MODE=1 ic ssh info
|
|
47
|
+
|
|
48
|
+
# 개발 모드 (경고 정책 사용)
|
|
49
|
+
IC_DEV_MODE=1 ic ssh info
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 보안 고려사항
|
|
53
|
+
|
|
54
|
+
- **프로덕션 환경**: `reject` 정책 사용 권장
|
|
55
|
+
- **개발 환경**: `auto` 또는 `warning` 정책 사용 권장
|
|
56
|
+
- **CI/CD 환경**: `IC_TEST_MODE=1` 환경 변수 사용 권장
|
|
57
|
+
|
|
58
|
+
### 문제 해결
|
|
59
|
+
|
|
60
|
+
#### 모든 서버가 "Connection Fail"로 표시되는 경우
|
|
61
|
+
|
|
62
|
+
1. **임시 해결책**:
|
|
63
|
+
```bash
|
|
64
|
+
IC_DEV_MODE=1 ic ssh info
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
2. **영구 해결책**:
|
|
68
|
+
설정 파일에서 `host_key_policy`를 `auto`로 변경:
|
|
69
|
+
```yaml
|
|
70
|
+
ssh:
|
|
71
|
+
host_key_policy: auto
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
3. **known_hosts 파일 확인**:
|
|
75
|
+
```bash
|
|
76
|
+
ls -la ~/.ssh/known_hosts
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
#### 특정 서버만 연결 실패하는 경우
|
|
80
|
+
|
|
81
|
+
1. SSH 키 권한 확인:
|
|
82
|
+
```bash
|
|
83
|
+
chmod 600 ~/.ssh/id_rsa
|
|
84
|
+
chmod 644 ~/.ssh/id_rsa.pub
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
2. SSH 설정 파일 확인:
|
|
88
|
+
```bash
|
|
89
|
+
ssh -T [hostname]
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 예제 설정
|
|
93
|
+
|
|
94
|
+
완전한 SSH 설정 예제:
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
ssh:
|
|
98
|
+
config_file: ~/.ssh/config
|
|
99
|
+
key_dir: ~/.ssh
|
|
100
|
+
timeout: 10
|
|
101
|
+
workers: 30
|
|
102
|
+
host_key_policy: auto
|
|
103
|
+
skip_prefixes:
|
|
104
|
+
- git
|
|
105
|
+
- github
|
|
106
|
+
- gitlab
|
|
107
|
+
- test-
|
|
108
|
+
- temp-
|
|
109
|
+
```
|
|
@@ -441,22 +441,8 @@ class ConfigCommands:
|
|
|
441
441
|
"""
|
|
442
442
|
|
|
443
443
|
try:
|
|
444
|
-
# Load
|
|
445
|
-
self.config_manager.
|
|
446
|
-
config = self.config_manager.get_config()
|
|
447
|
-
|
|
448
|
-
# Also load secrets if available
|
|
449
|
-
secrets_path = Path.home() / ".ic" / "config" / "secrets.yaml"
|
|
450
|
-
if secrets_path.exists():
|
|
451
|
-
try:
|
|
452
|
-
with open(secrets_path, 'r') as f:
|
|
453
|
-
secrets = yaml.safe_load(f) or {}
|
|
454
|
-
# Merge secrets into config for display
|
|
455
|
-
if 'secrets' not in config:
|
|
456
|
-
config['secrets'] = {}
|
|
457
|
-
config['secrets'].update(secrets)
|
|
458
|
-
except Exception as e:
|
|
459
|
-
self.console.print(f"⚠️ Warning: Could not load secrets: {e}")
|
|
444
|
+
# Load all configurations including secrets
|
|
445
|
+
config = self.config_manager.load_all_configs()
|
|
460
446
|
|
|
461
447
|
# Mask sensitive data if requested
|
|
462
448
|
if args.mask_sensitive:
|
|
@@ -556,8 +542,8 @@ class ConfigCommands:
|
|
|
556
542
|
args: Command line arguments
|
|
557
543
|
"""
|
|
558
544
|
try:
|
|
559
|
-
# Load
|
|
560
|
-
self.config_manager.
|
|
545
|
+
# Load all configurations including secrets
|
|
546
|
+
self.config_manager.load_all_configs()
|
|
561
547
|
|
|
562
548
|
# Get value
|
|
563
549
|
value = self.config_manager.get_config_value(args.key_path, args.default)
|
|
@@ -161,12 +161,25 @@ def get_hostname_via_ssh(ip, key_path, user, port):
|
|
|
161
161
|
"""SSH를 통해 호스트명(hostname)을 가져옵니다."""
|
|
162
162
|
try:
|
|
163
163
|
ssh = paramiko.SSHClient()
|
|
164
|
-
# 보안
|
|
164
|
+
# 보안 정책 설정: 설정 파일에서 정책을 읽어오거나 환경 변수 확인
|
|
165
165
|
import os
|
|
166
|
+
from ic.config.manager import ConfigManager
|
|
167
|
+
_config_manager = ConfigManager()
|
|
168
|
+
_config = _config_manager.load_all_configs()
|
|
169
|
+
_ssh_config = _config.get('ssh', {})
|
|
170
|
+
host_key_policy = _ssh_config.get('host_key_policy', 'auto').lower()
|
|
171
|
+
|
|
166
172
|
if os.getenv('IC_TEST_MODE') or os.getenv('IC_DEV_MODE'):
|
|
167
173
|
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
168
|
-
|
|
174
|
+
elif host_key_policy == 'reject':
|
|
169
175
|
ssh.set_missing_host_key_policy(paramiko.RejectPolicy())
|
|
176
|
+
elif host_key_policy == 'warning':
|
|
177
|
+
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
178
|
+
elif host_key_policy == 'auto':
|
|
179
|
+
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # nosec B507
|
|
180
|
+
else:
|
|
181
|
+
# 기본값: 보안을 위해 경고 정책 사용
|
|
182
|
+
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
170
183
|
ssh.connect(str(ip), username=user, key_filename=key_path, port=port, timeout=SSH_TIMEOUT)
|
|
171
184
|
stdin, stdout, stderr = ssh.exec_command("hostname")
|
|
172
185
|
hostname = stdout.read().decode().strip()
|
|
@@ -240,12 +253,25 @@ def check_ssh_connection(host):
|
|
|
240
253
|
identityfile = host_config.get('identityfile')
|
|
241
254
|
|
|
242
255
|
client = paramiko.SSHClient()
|
|
243
|
-
# 보안
|
|
256
|
+
# 보안 정책 설정: 설정 파일에서 정책을 읽어오거나 환경 변수 확인
|
|
244
257
|
import os
|
|
258
|
+
from ic.config.manager import ConfigManager
|
|
259
|
+
_config_manager = ConfigManager()
|
|
260
|
+
_config = _config_manager.load_all_configs()
|
|
261
|
+
_ssh_config = _config.get('ssh', {})
|
|
262
|
+
host_key_policy = _ssh_config.get('host_key_policy', 'auto').lower()
|
|
263
|
+
|
|
245
264
|
if os.getenv('IC_TEST_MODE') or os.getenv('IC_DEV_MODE'):
|
|
246
265
|
client.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
247
|
-
|
|
266
|
+
elif host_key_policy == 'reject':
|
|
248
267
|
client.set_missing_host_key_policy(paramiko.RejectPolicy())
|
|
268
|
+
elif host_key_policy == 'warning':
|
|
269
|
+
client.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
270
|
+
elif host_key_policy == 'auto':
|
|
271
|
+
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # nosec B507
|
|
272
|
+
else:
|
|
273
|
+
# 기본값: 보안을 위해 경고 정책 사용
|
|
274
|
+
client.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
249
275
|
try:
|
|
250
276
|
client.connect(
|
|
251
277
|
hostname=hostname,
|
|
@@ -95,12 +95,21 @@ class ServerInfoRetriever:
|
|
|
95
95
|
|
|
96
96
|
try:
|
|
97
97
|
ssh = paramiko.SSHClient()
|
|
98
|
-
# 보안
|
|
98
|
+
# 보안 정책 설정: 설정 파일에서 정책을 읽어오거나 환경 변수 확인
|
|
99
99
|
import os
|
|
100
|
+
host_key_policy = _ssh_config.get('host_key_policy', 'auto').lower()
|
|
101
|
+
|
|
100
102
|
if os.getenv('IC_TEST_MODE') or os.getenv('IC_DEV_MODE'):
|
|
101
103
|
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
102
|
-
|
|
104
|
+
elif host_key_policy == 'reject':
|
|
103
105
|
ssh.set_missing_host_key_policy(paramiko.RejectPolicy())
|
|
106
|
+
elif host_key_policy == 'warning':
|
|
107
|
+
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
108
|
+
elif host_key_policy == 'auto':
|
|
109
|
+
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # nosec B507
|
|
110
|
+
else:
|
|
111
|
+
# 기본값: 보안을 위해 경고 정책 사용
|
|
112
|
+
ssh.set_missing_host_key_policy(paramiko.WarningPolicy()) # nosec B507
|
|
104
113
|
ssh.connect(
|
|
105
114
|
self.hostname,
|
|
106
115
|
username=self.username,
|
|
@@ -530,6 +539,19 @@ def main(args) -> None:
|
|
|
530
539
|
logger.error("서버 설정이 비어있어 종료합니다.")
|
|
531
540
|
return
|
|
532
541
|
|
|
542
|
+
# Host 필터링 적용
|
|
543
|
+
if hasattr(args, 'host') and args.host and args.host != 'default':
|
|
544
|
+
original_count = len(server_configs)
|
|
545
|
+
server_configs = [
|
|
546
|
+
config for config in server_configs
|
|
547
|
+
if args.host.lower() in config['servername'].lower()
|
|
548
|
+
]
|
|
549
|
+
filtered_count = len(server_configs)
|
|
550
|
+
if filtered_count == 0:
|
|
551
|
+
console.print(f"[red]'{args.host}' 패턴과 일치하는 서버를 찾을 수 없습니다.[/red]")
|
|
552
|
+
return
|
|
553
|
+
console.print(f"[cyan]Host 필터 적용:[/cyan] '{args.host}' → {filtered_count}/{original_count} 서버 선택됨")
|
|
554
|
+
|
|
533
555
|
# "Memory"로 헤더 변경
|
|
534
556
|
headers = [
|
|
535
557
|
"Server Name",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|