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.
Files changed (256) hide show
  1. {ic_code-1.0.9/src/ic_code.egg-info → ic_code-1.1.0}/PKG-INFO +1 -1
  2. ic_code-1.1.0/docs/ssh/configuration.md +109 -0
  3. {ic_code-1.0.9 → ic_code-1.1.0}/pyproject.toml +1 -1
  4. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/config.py +4 -18
  5. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/auto_ssh.py +30 -4
  6. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/server_info.py +24 -2
  7. {ic_code-1.0.9 → ic_code-1.1.0/src/ic_code.egg-info}/PKG-INFO +1 -1
  8. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/SOURCES.txt +1 -0
  9. {ic_code-1.0.9 → ic_code-1.1.0}/CHANGELOG.md +0 -0
  10. {ic_code-1.0.9 → ic_code-1.1.0}/LICENSE +0 -0
  11. {ic_code-1.0.9 → ic_code-1.1.0}/MANIFEST.in +0 -0
  12. {ic_code-1.0.9 → ic_code-1.1.0}/README.md +0 -0
  13. {ic_code-1.0.9 → ic_code-1.1.0}/SECURITY.md +0 -0
  14. {ic_code-1.0.9 → ic_code-1.1.0}/common/__init__.py +0 -0
  15. {ic_code-1.0.9 → ic_code-1.1.0}/common/azure_utils.py +0 -0
  16. {ic_code-1.0.9 → ic_code-1.1.0}/common/gather_env.py +0 -0
  17. {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_config_validator.py +0 -0
  18. {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_monitoring.py +0 -0
  19. {ic_code-1.0.9 → ic_code-1.1.0}/common/gcp_utils.py +0 -0
  20. {ic_code-1.0.9 → ic_code-1.1.0}/common/log.py +0 -0
  21. {ic_code-1.0.9 → ic_code-1.1.0}/common/ncp_security_utils.py +0 -0
  22. {ic_code-1.0.9 → ic_code-1.1.0}/common/ncp_utils.py +0 -0
  23. {ic_code-1.0.9 → ic_code-1.1.0}/common/ncpgov_utils.py +0 -0
  24. {ic_code-1.0.9 → ic_code-1.1.0}/common/progress_decorator.py +0 -0
  25. {ic_code-1.0.9 → ic_code-1.1.0}/common/slack.py +0 -0
  26. {ic_code-1.0.9 → ic_code-1.1.0}/common/utils.py +0 -0
  27. {ic_code-1.0.9 → ic_code-1.1.0}/docs/README.md +0 -0
  28. {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/configuration.md +0 -0
  29. {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/installation.md +0 -0
  30. {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/troubleshooting.md +0 -0
  31. {ic_code-1.0.9 → ic_code-1.1.0}/docs/_templates/usage.md +0 -0
  32. {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/AWS_IMPLEMENTATION_SUMMARY.md +0 -0
  33. {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/README.md +0 -0
  34. {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/aws_cli_prd.md +0 -0
  35. {ic_code-1.0.9 → ic_code-1.1.0}/docs/aws/installation.md +0 -0
  36. {ic_code-1.0.9 → ic_code-1.1.0}/docs/azure/README.md +0 -0
  37. {ic_code-1.0.9 → ic_code-1.1.0}/docs/config_migration.md +0 -0
  38. {ic_code-1.0.9 → ic_code-1.1.0}/docs/deployment.md +0 -0
  39. {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/GCP_CONFIGURATION_GUIDE.md +0 -0
  40. {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/GCP_SECURITY_BEST_PRACTICES.md +0 -0
  41. {ic_code-1.0.9 → ic_code-1.1.0}/docs/gcp/README.md +0 -0
  42. {ic_code-1.0.9 → ic_code-1.1.0}/docs/general/configuration.md +0 -0
  43. {ic_code-1.0.9 → ic_code-1.1.0}/docs/installation.md +0 -0
  44. {ic_code-1.0.9 → ic_code-1.1.0}/docs/mcp_integration.md +0 -0
  45. {ic_code-1.0.9 → ic_code-1.1.0}/docs/migration.md +0 -0
  46. {ic_code-1.0.9 → ic_code-1.1.0}/docs/migration_guide.md +0 -0
  47. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/README.md +0 -0
  48. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/configuration.md +0 -0
  49. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/installation.md +0 -0
  50. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/troubleshooting.md +0 -0
  51. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncp/usage.md +0 -0
  52. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncpgov/README.md +0 -0
  53. {ic_code-1.0.9 → ic_code-1.1.0}/docs/ncpgov/installation.md +0 -0
  54. {ic_code-1.0.9 → ic_code-1.1.0}/docs/oci/README.md +0 -0
  55. {ic_code-1.0.9 → ic_code-1.1.0}/docs/oci/installation.md +0 -0
  56. {ic_code-1.0.9 → ic_code-1.1.0}/docs/security.md +0 -0
  57. {ic_code-1.0.9 → ic_code-1.1.0}/docs/troubleshooting.md +0 -0
  58. {ic_code-1.0.9 → ic_code-1.1.0}/docs/user_guide.md +0 -0
  59. {ic_code-1.0.9 → ic_code-1.1.0}/mcp/__init__.py +0 -0
  60. {ic_code-1.0.9 → ic_code-1.1.0}/mcp/gcp_connector.py +0 -0
  61. {ic_code-1.0.9 → ic_code-1.1.0}/requirements.txt +0 -0
  62. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/analysis_summary.py +0 -0
  63. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/bump-version.sh +0 -0
  64. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/cf_edge_nsg_make/cf_edge_nsg_make.py +0 -0
  65. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/cli_usage_analysis.py +0 -0
  66. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/dependency_mapper.py +0 -0
  67. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/deploy.sh +0 -0
  68. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/final_validation_and_documentation.py +0 -0
  69. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/fix_consolidated_imports.py +0 -0
  70. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/migration_execution_and_validation.py +0 -0
  71. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/ncp_security_scanner.py +0 -0
  72. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/oracle-policy/user_policy.py +0 -0
  73. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/performance_optimization.py +0 -0
  74. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/setup_venv.py +0 -0
  75. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/unset_env.sh +0 -0
  76. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_config.py +0 -0
  77. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_dependencies.py +0 -0
  78. {ic_code-1.0.9 → ic_code-1.1.0}/scripts/validate_ncp_security.py +0 -0
  79. {ic_code-1.0.9 → ic_code-1.1.0}/setup.cfg +0 -0
  80. {ic_code-1.0.9 → ic_code-1.1.0}/setup.py +0 -0
  81. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/__init__.py +0 -0
  82. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/cli.py +0 -0
  83. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/__init__.py +0 -0
  84. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/migration.py +0 -0
  85. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/commands/security.py +0 -0
  86. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/__init__.py +0 -0
  87. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/cli.py +0 -0
  88. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/compat/common.py +0 -0
  89. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/__init__.py +0 -0
  90. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/cleanup.py +0 -0
  91. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/docs_organizer.py +0 -0
  92. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/external.py +0 -0
  93. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/installer.py +0 -0
  94. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/manager.py +0 -0
  95. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/migration.py +0 -0
  96. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/migration_utils.py +0 -0
  97. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/path_manager.py +0 -0
  98. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/schema.py +0 -0
  99. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/secrets.py +0 -0
  100. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/config/security.py +0 -0
  101. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/__init__.py +0 -0
  102. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/dependency_validator.py +0 -0
  103. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/logging.py +0 -0
  104. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/mcp_manager.py +0 -0
  105. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/session.py +0 -0
  106. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/core/silence_logging.py +0 -0
  107. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/__init__.py +0 -0
  108. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/manager.py +0 -0
  109. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/post_validation.py +0 -0
  110. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/rollback.py +0 -0
  111. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/migration/validation.py +0 -0
  112. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/__init__.py +0 -0
  113. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/__init__.py +0 -0
  114. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/cloudfront/__init__.py +0 -0
  115. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/cloudfront/info.py +0 -0
  116. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/__init__.py +0 -0
  117. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/build.py +0 -0
  118. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/codepipeline/deploy.py +0 -0
  119. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/__init__.py +0 -0
  120. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/info.py +0 -0
  121. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/list_tags.py +0 -0
  122. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ec2/tag_check.py +0 -0
  123. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/__init__.py +0 -0
  124. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/info.py +0 -0
  125. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/service.py +0 -0
  126. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/ecs/task.py +0 -0
  127. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/__init__.py +0 -0
  128. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/addons.py +0 -0
  129. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/fargate.py +0 -0
  130. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/info.py +0 -0
  131. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/nodes.py +0 -0
  132. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/pods.py +0 -0
  133. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/eks/update_config.py +0 -0
  134. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/fargate/__init__.py +0 -0
  135. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/fargate/info.py +0 -0
  136. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/__init__.py +0 -0
  137. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/info.py +0 -0
  138. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/list_tags.py +0 -0
  139. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/lb/tag_check.py +0 -0
  140. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/__init__.py +0 -0
  141. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/broker.py +0 -0
  142. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/msk/info.py +0 -0
  143. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/__init__.py +0 -0
  144. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/list_tags.py +0 -0
  145. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/nat/tag_check.py +0 -0
  146. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/profile/__init__.py +0 -0
  147. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/profile/info.py +0 -0
  148. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/__init__.py +0 -0
  149. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/info.py +0 -0
  150. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/list_tags.py +0 -0
  151. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/rds/tag_check.py +0 -0
  152. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/__init__.py +0 -0
  153. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/info.py +0 -0
  154. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/list_tags.py +0 -0
  155. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/s3/tag_check.py +0 -0
  156. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/sg/__init__.py +0 -0
  157. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/sg/info.py +0 -0
  158. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/__init__.py +0 -0
  159. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/info.py +0 -0
  160. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/list_tags.py +0 -0
  161. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpc/tag_check.py +0 -0
  162. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpn/__init__.py +0 -0
  163. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/aws/vpn/info.py +0 -0
  164. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/__init__.py +0 -0
  165. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/aci/info.py +0 -0
  166. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/aks/info.py +0 -0
  167. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/lb/info.py +0 -0
  168. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/nsg/info.py +0 -0
  169. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/storage/info.py +0 -0
  170. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/vm/info.py +0 -0
  171. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/azure/vnet/info.py +0 -0
  172. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/__init__.py +0 -0
  173. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/dns/__init__.py +0 -0
  174. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/cloudflare/dns/list_info.py +0 -0
  175. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/__init__.py +0 -0
  176. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/billing/__init__.py +0 -0
  177. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/billing/info.py +0 -0
  178. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/compute/__init__.py +0 -0
  179. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/compute/info.py +0 -0
  180. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/firewall/__init__.py +0 -0
  181. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/firewall/info.py +0 -0
  182. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/functions/__init__.py +0 -0
  183. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/functions/info.py +0 -0
  184. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/gke/__init__.py +0 -0
  185. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/gke/info.py +0 -0
  186. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/lb/__init__.py +0 -0
  187. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/lb/info.py +0 -0
  188. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/run/__init__.py +0 -0
  189. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/run/info.py +0 -0
  190. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/sql/__init__.py +0 -0
  191. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/sql/info.py +0 -0
  192. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/storage/__init__.py +0 -0
  193. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/storage/info.py +0 -0
  194. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/vpc/__init__.py +0 -0
  195. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/gcp/vpc/info.py +0 -0
  196. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/__init__.py +0 -0
  197. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/client.py +0 -0
  198. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/ec2/__init__.py +0 -0
  199. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/ec2/info.py +0 -0
  200. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/rds/__init__.py +0 -0
  201. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/rds/info.py +0 -0
  202. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/s3/__init__.py +0 -0
  203. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/s3/info.py +0 -0
  204. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/sg/__init__.py +0 -0
  205. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/sg/info.py +0 -0
  206. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/vpc/__init__.py +0 -0
  207. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncp/vpc/info.py +0 -0
  208. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/__init__.py +0 -0
  209. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/client.py +0 -0
  210. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/ec2/__init__.py +0 -0
  211. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/ec2/info.py +0 -0
  212. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/rds/__init__.py +0 -0
  213. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/rds/info.py +0 -0
  214. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/s3/__init__.py +0 -0
  215. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/s3/info.py +0 -0
  216. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/sg/__init__.py +0 -0
  217. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/sg/info.py +0 -0
  218. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/vpc/__init__.py +0 -0
  219. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ncpgov/vpc/info.py +0 -0
  220. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/__init__.py +0 -0
  221. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/common/__init__.py +0 -0
  222. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/common/utils.py +0 -0
  223. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/compartment/__init__.py +0 -0
  224. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/compartment/info.py +0 -0
  225. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/__init__.py +0 -0
  226. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/credit.py +0 -0
  227. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/cost/usage.py +0 -0
  228. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/info/__init__.py +0 -0
  229. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/info/oci_info.py +0 -0
  230. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/lb/__init__.py +0 -0
  231. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/lb/info.py +0 -0
  232. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/nsg/__init__.py +0 -0
  233. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/nsg/info.py +0 -0
  234. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/obj/__init__.py +0 -0
  235. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/obj/info.py +0 -0
  236. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/__init__.py +0 -0
  237. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/info.py +0 -0
  238. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/policy/search.py +0 -0
  239. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vcn/__init__.py +0 -0
  240. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vcn/info.py +0 -0
  241. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vm/__init__.py +0 -0
  242. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/vm/info.py +0 -0
  243. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/volume/__init__.py +0 -0
  244. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/oci/volume/info.py +0 -0
  245. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/platforms/ssh/__init__.py +0 -0
  246. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/__init__.py +0 -0
  247. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/config.py +0 -0
  248. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/detector.py +0 -0
  249. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/guidance.py +0 -0
  250. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/hooks.py +0 -0
  251. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/patterns.py +0 -0
  252. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic/security/scanner.py +0 -0
  253. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/dependency_links.txt +0 -0
  254. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/entry_points.txt +0 -0
  255. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/requires.txt +0 -0
  256. {ic_code-1.0.9 → ic_code-1.1.0}/src/ic_code.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ic-code
3
- Version: 1.0.9
3
+ Version: 1.1.0
4
4
  Summary: Infrastructure CLI tool for managing AWS, Azure, GCP, OCI, NCP, CloudFlare, SSH, and more
5
5
  Home-page: https://github.com/dgr009/ic
6
6
  Author: SangYun Kim
@@ -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
+ ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ic-code"
7
- version = "1.0.9"
7
+ version = "1.1.0"
8
8
  authors = [
9
9
  {name = "sykim", email = "cruiser594@gmail.com"},
10
10
  ]
@@ -441,22 +441,8 @@ class ConfigCommands:
441
441
  """
442
442
 
443
443
  try:
444
- # Load configuration
445
- self.config_manager.load_config()
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 configuration
560
- self.config_manager.load_config()
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
- else:
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
- else:
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
- else:
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",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ic-code
3
- Version: 1.0.9
3
+ Version: 1.1.0
4
4
  Summary: Infrastructure CLI tool for managing AWS, Azure, GCP, OCI, NCP, CloudFlare, SSH, and more
5
5
  Home-page: https://github.com/dgr009/ic
6
6
  Author: SangYun Kim
@@ -51,6 +51,7 @@ docs/ncpgov/README.md
51
51
  docs/ncpgov/installation.md
52
52
  docs/oci/README.md
53
53
  docs/oci/installation.md
54
+ docs/ssh/configuration.md
54
55
  mcp/__init__.py
55
56
  mcp/gcp_connector.py
56
57
  scripts/analysis_summary.py
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