runbooks 1.1.4__py3-none-any.whl → 1.1.6__py3-none-any.whl

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 (273) hide show
  1. runbooks/__init__.py +31 -2
  2. runbooks/__init___optimized.py +18 -4
  3. runbooks/_platform/__init__.py +1 -5
  4. runbooks/_platform/core/runbooks_wrapper.py +141 -138
  5. runbooks/aws2/accuracy_validator.py +812 -0
  6. runbooks/base.py +7 -0
  7. runbooks/cfat/assessment/compliance.py +1 -1
  8. runbooks/cfat/assessment/runner.py +1 -0
  9. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  10. runbooks/cli/__init__.py +1 -1
  11. runbooks/cli/commands/cfat.py +64 -23
  12. runbooks/cli/commands/finops.py +1005 -54
  13. runbooks/cli/commands/inventory.py +135 -91
  14. runbooks/cli/commands/operate.py +9 -36
  15. runbooks/cli/commands/security.py +42 -18
  16. runbooks/cli/commands/validation.py +432 -18
  17. runbooks/cli/commands/vpc.py +81 -17
  18. runbooks/cli/registry.py +22 -10
  19. runbooks/cloudops/__init__.py +20 -27
  20. runbooks/cloudops/base.py +96 -107
  21. runbooks/cloudops/cost_optimizer.py +544 -542
  22. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  23. runbooks/cloudops/interfaces.py +224 -225
  24. runbooks/cloudops/lifecycle_manager.py +5 -4
  25. runbooks/cloudops/mcp_cost_validation.py +252 -235
  26. runbooks/cloudops/models.py +78 -53
  27. runbooks/cloudops/monitoring_automation.py +5 -4
  28. runbooks/cloudops/notebook_framework.py +177 -213
  29. runbooks/cloudops/security_enforcer.py +125 -159
  30. runbooks/common/accuracy_validator.py +17 -12
  31. runbooks/common/aws_pricing.py +349 -326
  32. runbooks/common/aws_pricing_api.py +211 -212
  33. runbooks/common/aws_profile_manager.py +40 -36
  34. runbooks/common/aws_utils.py +74 -79
  35. runbooks/common/business_logic.py +126 -104
  36. runbooks/common/cli_decorators.py +36 -60
  37. runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
  38. runbooks/common/cross_account_manager.py +197 -204
  39. runbooks/common/date_utils.py +27 -39
  40. runbooks/common/decorators.py +29 -19
  41. runbooks/common/dry_run_examples.py +173 -208
  42. runbooks/common/dry_run_framework.py +157 -155
  43. runbooks/common/enhanced_exception_handler.py +15 -4
  44. runbooks/common/enhanced_logging_example.py +50 -64
  45. runbooks/common/enhanced_logging_integration_example.py +65 -37
  46. runbooks/common/env_utils.py +16 -16
  47. runbooks/common/error_handling.py +40 -38
  48. runbooks/common/lazy_loader.py +41 -23
  49. runbooks/common/logging_integration_helper.py +79 -86
  50. runbooks/common/mcp_cost_explorer_integration.py +476 -493
  51. runbooks/common/mcp_integration.py +99 -79
  52. runbooks/common/memory_optimization.py +140 -118
  53. runbooks/common/module_cli_base.py +37 -58
  54. runbooks/common/organizations_client.py +175 -193
  55. runbooks/common/patterns.py +23 -25
  56. runbooks/common/performance_monitoring.py +67 -71
  57. runbooks/common/performance_optimization_engine.py +283 -274
  58. runbooks/common/profile_utils.py +111 -37
  59. runbooks/common/rich_utils.py +315 -141
  60. runbooks/common/sre_performance_suite.py +177 -186
  61. runbooks/enterprise/__init__.py +1 -1
  62. runbooks/enterprise/logging.py +144 -106
  63. runbooks/enterprise/security.py +187 -204
  64. runbooks/enterprise/validation.py +43 -56
  65. runbooks/finops/__init__.py +26 -30
  66. runbooks/finops/account_resolver.py +1 -1
  67. runbooks/finops/advanced_optimization_engine.py +980 -0
  68. runbooks/finops/automation_core.py +268 -231
  69. runbooks/finops/business_case_config.py +184 -179
  70. runbooks/finops/cli.py +660 -139
  71. runbooks/finops/commvault_ec2_analysis.py +157 -164
  72. runbooks/finops/compute_cost_optimizer.py +336 -320
  73. runbooks/finops/config.py +20 -20
  74. runbooks/finops/cost_optimizer.py +484 -618
  75. runbooks/finops/cost_processor.py +332 -214
  76. runbooks/finops/dashboard_runner.py +1006 -172
  77. runbooks/finops/ebs_cost_optimizer.py +991 -657
  78. runbooks/finops/elastic_ip_optimizer.py +317 -257
  79. runbooks/finops/enhanced_mcp_integration.py +340 -0
  80. runbooks/finops/enhanced_progress.py +32 -29
  81. runbooks/finops/enhanced_trend_visualization.py +3 -2
  82. runbooks/finops/enterprise_wrappers.py +223 -285
  83. runbooks/finops/executive_export.py +203 -160
  84. runbooks/finops/helpers.py +130 -288
  85. runbooks/finops/iam_guidance.py +1 -1
  86. runbooks/finops/infrastructure/__init__.py +80 -0
  87. runbooks/finops/infrastructure/commands.py +506 -0
  88. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  89. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  90. runbooks/finops/markdown_exporter.py +337 -174
  91. runbooks/finops/mcp_validator.py +1952 -0
  92. runbooks/finops/nat_gateway_optimizer.py +1512 -481
  93. runbooks/finops/network_cost_optimizer.py +657 -587
  94. runbooks/finops/notebook_utils.py +226 -188
  95. runbooks/finops/optimization_engine.py +1136 -0
  96. runbooks/finops/optimizer.py +19 -23
  97. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  98. runbooks/finops/reservation_optimizer.py +427 -363
  99. runbooks/finops/scenario_cli_integration.py +64 -65
  100. runbooks/finops/scenarios.py +1277 -438
  101. runbooks/finops/schemas.py +218 -182
  102. runbooks/finops/snapshot_manager.py +2289 -0
  103. runbooks/finops/types.py +3 -3
  104. runbooks/finops/validation_framework.py +259 -265
  105. runbooks/finops/vpc_cleanup_exporter.py +189 -144
  106. runbooks/finops/vpc_cleanup_optimizer.py +591 -573
  107. runbooks/finops/workspaces_analyzer.py +171 -182
  108. runbooks/integration/__init__.py +89 -0
  109. runbooks/integration/mcp_integration.py +1920 -0
  110. runbooks/inventory/CLAUDE.md +816 -0
  111. runbooks/inventory/__init__.py +2 -2
  112. runbooks/inventory/aws_decorators.py +2 -3
  113. runbooks/inventory/check_cloudtrail_compliance.py +2 -4
  114. runbooks/inventory/check_controltower_readiness.py +152 -151
  115. runbooks/inventory/check_landingzone_readiness.py +85 -84
  116. runbooks/inventory/cloud_foundations_integration.py +144 -149
  117. runbooks/inventory/collectors/aws_comprehensive.py +1 -1
  118. runbooks/inventory/collectors/aws_networking.py +109 -99
  119. runbooks/inventory/collectors/base.py +4 -0
  120. runbooks/inventory/core/collector.py +495 -313
  121. runbooks/inventory/core/formatter.py +11 -0
  122. runbooks/inventory/draw_org_structure.py +8 -9
  123. runbooks/inventory/drift_detection_cli.py +69 -96
  124. runbooks/inventory/ec2_vpc_utils.py +2 -2
  125. runbooks/inventory/find_cfn_drift_detection.py +5 -7
  126. runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
  127. runbooks/inventory/find_cfn_stackset_drift.py +5 -6
  128. runbooks/inventory/find_ec2_security_groups.py +48 -42
  129. runbooks/inventory/find_landingzone_versions.py +4 -6
  130. runbooks/inventory/find_vpc_flow_logs.py +7 -9
  131. runbooks/inventory/inventory_mcp_cli.py +48 -46
  132. runbooks/inventory/inventory_modules.py +103 -91
  133. runbooks/inventory/list_cfn_stacks.py +9 -10
  134. runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
  135. runbooks/inventory/list_cfn_stackset_operations.py +79 -57
  136. runbooks/inventory/list_cfn_stacksets.py +8 -10
  137. runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
  138. runbooks/inventory/list_ds_directories.py +65 -53
  139. runbooks/inventory/list_ec2_availability_zones.py +2 -4
  140. runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
  141. runbooks/inventory/list_ec2_instances.py +23 -28
  142. runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
  143. runbooks/inventory/list_elbs_load_balancers.py +22 -20
  144. runbooks/inventory/list_enis_network_interfaces.py +26 -33
  145. runbooks/inventory/list_guardduty_detectors.py +2 -4
  146. runbooks/inventory/list_iam_policies.py +2 -4
  147. runbooks/inventory/list_iam_roles.py +5 -7
  148. runbooks/inventory/list_iam_saml_providers.py +4 -6
  149. runbooks/inventory/list_lambda_functions.py +38 -38
  150. runbooks/inventory/list_org_accounts.py +6 -8
  151. runbooks/inventory/list_org_accounts_users.py +55 -44
  152. runbooks/inventory/list_rds_db_instances.py +31 -33
  153. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  154. runbooks/inventory/list_route53_hosted_zones.py +3 -5
  155. runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
  156. runbooks/inventory/list_sns_topics.py +2 -4
  157. runbooks/inventory/list_ssm_parameters.py +4 -7
  158. runbooks/inventory/list_vpc_subnets.py +2 -4
  159. runbooks/inventory/list_vpcs.py +7 -10
  160. runbooks/inventory/mcp_inventory_validator.py +554 -468
  161. runbooks/inventory/mcp_vpc_validator.py +359 -442
  162. runbooks/inventory/organizations_discovery.py +63 -55
  163. runbooks/inventory/recover_cfn_stack_ids.py +7 -8
  164. runbooks/inventory/requirements.txt +0 -1
  165. runbooks/inventory/rich_inventory_display.py +35 -34
  166. runbooks/inventory/run_on_multi_accounts.py +3 -5
  167. runbooks/inventory/unified_validation_engine.py +281 -253
  168. runbooks/inventory/verify_ec2_security_groups.py +1 -1
  169. runbooks/inventory/vpc_analyzer.py +735 -697
  170. runbooks/inventory/vpc_architecture_validator.py +293 -348
  171. runbooks/inventory/vpc_dependency_analyzer.py +384 -380
  172. runbooks/inventory/vpc_flow_analyzer.py +1 -1
  173. runbooks/main.py +49 -34
  174. runbooks/main_final.py +91 -60
  175. runbooks/main_minimal.py +22 -10
  176. runbooks/main_optimized.py +131 -100
  177. runbooks/main_ultra_minimal.py +7 -2
  178. runbooks/mcp/__init__.py +36 -0
  179. runbooks/mcp/integration.py +679 -0
  180. runbooks/monitoring/performance_monitor.py +9 -4
  181. runbooks/operate/dynamodb_operations.py +3 -1
  182. runbooks/operate/ec2_operations.py +145 -137
  183. runbooks/operate/iam_operations.py +146 -152
  184. runbooks/operate/networking_cost_heatmap.py +29 -8
  185. runbooks/operate/rds_operations.py +223 -254
  186. runbooks/operate/s3_operations.py +107 -118
  187. runbooks/operate/vpc_operations.py +646 -616
  188. runbooks/remediation/base.py +1 -1
  189. runbooks/remediation/commons.py +10 -7
  190. runbooks/remediation/commvault_ec2_analysis.py +70 -66
  191. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  192. runbooks/remediation/multi_account.py +24 -21
  193. runbooks/remediation/rds_snapshot_list.py +86 -60
  194. runbooks/remediation/remediation_cli.py +92 -146
  195. runbooks/remediation/universal_account_discovery.py +83 -79
  196. runbooks/remediation/workspaces_list.py +46 -41
  197. runbooks/security/__init__.py +19 -0
  198. runbooks/security/assessment_runner.py +1150 -0
  199. runbooks/security/baseline_checker.py +812 -0
  200. runbooks/security/cloudops_automation_security_validator.py +509 -535
  201. runbooks/security/compliance_automation_engine.py +17 -17
  202. runbooks/security/config/__init__.py +2 -2
  203. runbooks/security/config/compliance_config.py +50 -50
  204. runbooks/security/config_template_generator.py +63 -76
  205. runbooks/security/enterprise_security_framework.py +1 -1
  206. runbooks/security/executive_security_dashboard.py +519 -508
  207. runbooks/security/multi_account_security_controls.py +959 -1210
  208. runbooks/security/real_time_security_monitor.py +422 -444
  209. runbooks/security/security_baseline_tester.py +1 -1
  210. runbooks/security/security_cli.py +143 -112
  211. runbooks/security/test_2way_validation.py +439 -0
  212. runbooks/security/two_way_validation_framework.py +852 -0
  213. runbooks/sre/production_monitoring_framework.py +167 -177
  214. runbooks/tdd/__init__.py +15 -0
  215. runbooks/tdd/cli.py +1071 -0
  216. runbooks/utils/__init__.py +14 -17
  217. runbooks/utils/logger.py +7 -2
  218. runbooks/utils/version_validator.py +50 -47
  219. runbooks/validation/__init__.py +6 -6
  220. runbooks/validation/cli.py +9 -3
  221. runbooks/validation/comprehensive_2way_validator.py +745 -704
  222. runbooks/validation/mcp_validator.py +906 -228
  223. runbooks/validation/terraform_citations_validator.py +104 -115
  224. runbooks/validation/terraform_drift_detector.py +461 -454
  225. runbooks/vpc/README.md +617 -0
  226. runbooks/vpc/__init__.py +8 -1
  227. runbooks/vpc/analyzer.py +577 -0
  228. runbooks/vpc/cleanup_wrapper.py +476 -413
  229. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  230. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  231. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  232. runbooks/vpc/config.py +92 -97
  233. runbooks/vpc/cost_engine.py +411 -148
  234. runbooks/vpc/cost_explorer_integration.py +553 -0
  235. runbooks/vpc/cross_account_session.py +101 -106
  236. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  237. runbooks/vpc/eni_gate_validator.py +961 -0
  238. runbooks/vpc/heatmap_engine.py +185 -160
  239. runbooks/vpc/mcp_no_eni_validator.py +680 -639
  240. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  241. runbooks/vpc/networking_wrapper.py +15 -8
  242. runbooks/vpc/pdca_remediation_planner.py +528 -0
  243. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  244. runbooks/vpc/runbooks_adapter.py +1167 -241
  245. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  246. runbooks/vpc/test_data_loader.py +358 -0
  247. runbooks/vpc/tests/conftest.py +314 -4
  248. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  249. runbooks/vpc/tests/test_cost_engine.py +0 -2
  250. runbooks/vpc/topology_generator.py +326 -0
  251. runbooks/vpc/unified_scenarios.py +1297 -1124
  252. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  253. runbooks-1.1.6.dist-info/METADATA +327 -0
  254. runbooks-1.1.6.dist-info/RECORD +489 -0
  255. runbooks/finops/README.md +0 -414
  256. runbooks/finops/accuracy_cross_validator.py +0 -647
  257. runbooks/finops/business_cases.py +0 -950
  258. runbooks/finops/dashboard_router.py +0 -922
  259. runbooks/finops/ebs_optimizer.py +0 -973
  260. runbooks/finops/embedded_mcp_validator.py +0 -1629
  261. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  262. runbooks/finops/finops_dashboard.py +0 -584
  263. runbooks/finops/finops_scenarios.py +0 -1218
  264. runbooks/finops/legacy_migration.py +0 -730
  265. runbooks/finops/multi_dashboard.py +0 -1519
  266. runbooks/finops/single_dashboard.py +0 -1113
  267. runbooks/finops/unlimited_scenarios.py +0 -393
  268. runbooks-1.1.4.dist-info/METADATA +0 -800
  269. runbooks-1.1.4.dist-info/RECORD +0 -468
  270. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
  271. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
  272. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
  273. {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/top_level.txt +0 -0
@@ -48,7 +48,7 @@ class SecurityBaselineTester:
48
48
 
49
49
  def _create_session(self):
50
50
  # Use enterprise profile management for security operations (management profile for cross-account)
51
- return create_management_session(profile=self.profile)
51
+ return create_management_session(profile_name=self.profile)
52
52
 
53
53
  def _load_config(self):
54
54
  ## Get the absolute directory where *this script* is located
@@ -35,24 +35,17 @@ from runbooks.common.rich_utils import (
35
35
  from .compliance_automation_engine import ComplianceAutomationEngine, ComplianceFramework
36
36
  from .security_baseline_tester import SecurityBaselineTester
37
37
  from .config_template_generator import SecurityConfigTemplateGenerator
38
+ from .two_way_validation_framework import execute_2way_validation
38
39
 
39
40
 
40
41
  @click.group()
41
- @click.option(
42
- "--profile",
43
- default=None,
44
- help="AWS profile to use (overrides environment variables)"
45
- )
46
- @click.option(
47
- "--output-dir",
48
- default="./artifacts/security",
49
- help="Output directory for security reports"
50
- )
42
+ @click.option("--profile", default=None, help="AWS profile to use (overrides environment variables)")
43
+ @click.option("--output-dir", default="./artifacts/security", help="Output directory for security reports")
51
44
  @click.pass_context
52
45
  def security(ctx, profile: Optional[str], output_dir: str):
53
46
  """
54
47
  Enterprise Security Operations with Dynamic Configuration.
55
-
48
+
56
49
  Supports configuration via:
57
50
  - Environment variables
58
51
  - Configuration files
@@ -62,7 +55,7 @@ def security(ctx, profile: Optional[str], output_dir: str):
62
55
  ctx.ensure_object(dict)
63
56
  ctx.obj["profile"] = profile
64
57
  ctx.obj["output_dir"] = output_dir
65
-
58
+
66
59
  # Validate profile if specified
67
60
  if profile:
68
61
  resolved_profile = get_profile_for_operation("management", profile)
@@ -75,46 +68,29 @@ def security(ctx, profile: Optional[str], output_dir: str):
75
68
  @click.option(
76
69
  "--frameworks",
77
70
  multiple=True,
78
- type=click.Choice([
79
- "aws-well-architected",
80
- "soc2-type-ii",
81
- "pci-dss",
82
- "hipaa",
83
- "iso27001",
84
- "nist-cybersecurity",
85
- "cis-benchmarks"
86
- ]),
71
+ type=click.Choice(
72
+ ["aws-well-architected", "soc2-type-ii", "pci-dss", "hipaa", "iso27001", "nist-cybersecurity", "cis-benchmarks"]
73
+ ),
87
74
  default=["aws-well-architected"],
88
- help="Compliance frameworks to assess"
89
- )
90
- @click.option(
91
- "--accounts",
92
- help="Comma-separated account IDs (overrides discovery)"
93
- )
94
- @click.option(
95
- "--all",
96
- "all_accounts",
97
- is_flag=True,
98
- help="Assess all discovered accounts via Organizations API"
99
- )
100
- @click.option(
101
- "--scope",
102
- type=click.Choice(["full", "quick", "critical"]),
103
- default="full",
104
- help="Assessment scope"
75
+ help="Compliance frameworks to assess",
105
76
  )
77
+ @click.option("--accounts", help="Comma-separated account IDs (overrides discovery)")
78
+ @click.option("--all", "all_accounts", is_flag=True, help="Assess all discovered accounts via Organizations API")
79
+ @click.option("--scope", type=click.Choice(["full", "quick", "critical"]), default="full", help="Assessment scope")
106
80
  @click.option(
107
81
  "--export-formats",
108
82
  multiple=True,
109
83
  type=click.Choice(["json", "csv", "html", "pdf"]),
110
84
  default=["json", "csv"],
111
- help="Export formats for compliance reports"
85
+ help="Export formats for compliance reports",
112
86
  )
113
87
  @click.pass_context
114
- def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bool, scope: str, export_formats: List[str]):
88
+ def assess(
89
+ ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bool, scope: str, export_formats: List[str]
90
+ ):
115
91
  """
116
92
  Execute comprehensive compliance assessment with dynamic configuration.
117
-
93
+
118
94
  Environment Variables Supported:
119
95
  - COMPLIANCE_TARGET_ACCOUNTS: Comma-separated account IDs
120
96
  - COMPLIANCE_ACCOUNTS_CONFIG: Path to accounts configuration file
@@ -123,7 +99,7 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
123
99
  """
124
100
  profile = ctx.obj["profile"]
125
101
  output_dir = ctx.obj["output_dir"]
126
-
102
+
127
103
  try:
128
104
  # Convert framework names to enum values
129
105
  framework_mapping = {
@@ -135,9 +111,9 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
135
111
  "nist-cybersecurity": ComplianceFramework.NIST_CYBERSECURITY,
136
112
  "cis-benchmarks": ComplianceFramework.CIS_BENCHMARKS,
137
113
  }
138
-
114
+
139
115
  selected_frameworks = [framework_mapping[f] for f in frameworks]
140
-
116
+
141
117
  # Parse target accounts
142
118
  target_accounts = None
143
119
  if accounts:
@@ -148,7 +124,7 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
148
124
  # target_accounts will be None, triggering discovery
149
125
  else:
150
126
  print_info("Using default account discovery")
151
-
127
+
152
128
  # Initialize compliance engine
153
129
  console.print(
154
130
  create_panel(
@@ -161,55 +137,47 @@ def assess(ctx, frameworks: List[str], accounts: Optional[str], all_accounts: bo
161
137
  border_style="cyan",
162
138
  )
163
139
  )
164
-
165
- compliance_engine = ComplianceAutomationEngine(
166
- profile=profile,
167
- output_dir=output_dir
168
- )
169
-
140
+
141
+ compliance_engine = ComplianceAutomationEngine(profile=profile, output_dir=output_dir)
142
+
170
143
  # Execute assessment
171
- reports = asyncio.run(compliance_engine.assess_compliance(
172
- frameworks=selected_frameworks,
173
- target_accounts=target_accounts,
174
- scope=scope
175
- ))
176
-
144
+ reports = asyncio.run(
145
+ compliance_engine.assess_compliance(
146
+ frameworks=selected_frameworks, target_accounts=target_accounts, scope=scope
147
+ )
148
+ )
149
+
177
150
  # Display summary
178
151
  print_success(f"Assessment completed! Generated {len(reports)} compliance reports")
179
152
  print_info(f"Reports saved to: {output_dir}")
180
-
153
+
181
154
  # Display configuration sources used
182
155
  _display_configuration_sources()
183
-
156
+
184
157
  except Exception as e:
185
158
  print_error(f"Compliance assessment failed: {str(e)}")
186
159
  raise click.Abort()
187
160
 
188
161
 
189
162
  @security.command()
163
+ @click.option("--language", type=click.Choice(["en", "ja", "ko", "vi"]), default="en", help="Report language")
190
164
  @click.option(
191
- "--language",
192
- type=click.Choice(["en", "ja", "ko", "vi"]),
193
- default="en",
194
- help="Report language"
195
- )
196
- @click.option(
197
- "--export-formats",
165
+ "--export-formats",
198
166
  multiple=True,
199
167
  type=click.Choice(["json", "csv", "html", "pdf"]),
200
168
  default=["json", "csv"],
201
- help="Export formats for security reports"
169
+ help="Export formats for security reports",
202
170
  )
203
171
  @click.pass_context
204
172
  def baseline(ctx, language: str, export_formats: List[str]):
205
173
  """
206
174
  Execute security baseline assessment with dynamic configuration.
207
-
175
+
208
176
  Uses enterprise profile management and configuration-driven approach.
209
177
  """
210
178
  profile = ctx.obj["profile"]
211
179
  output_dir = ctx.obj["output_dir"]
212
-
180
+
213
181
  try:
214
182
  console.print(
215
183
  create_panel(
@@ -221,21 +189,18 @@ def baseline(ctx, language: str, export_formats: List[str]):
221
189
  border_style="green",
222
190
  )
223
191
  )
224
-
192
+
225
193
  # Initialize security baseline tester
226
194
  baseline_tester = SecurityBaselineTester(
227
- profile=profile,
228
- lang_code=language,
229
- output_dir=output_dir,
230
- export_formats=list(export_formats)
195
+ profile=profile, lang_code=language, output_dir=output_dir, export_formats=list(export_formats)
231
196
  )
232
-
197
+
233
198
  # Execute baseline assessment
234
199
  baseline_tester.run()
235
-
200
+
236
201
  print_success("Security baseline assessment completed successfully!")
237
202
  print_info(f"Results saved to: {output_dir}")
238
-
203
+
239
204
  except Exception as e:
240
205
  print_error(f"Security baseline assessment failed: {str(e)}")
241
206
  raise click.Abort()
@@ -247,16 +212,11 @@ def config_info(ctx):
247
212
  """
248
213
  Display current security configuration and environment setup.
249
214
  """
250
- console.print(
251
- Panel.fit(
252
- "[bold cyan]Security Configuration Information[/bold cyan]",
253
- border_style="cyan"
254
- )
255
- )
256
-
215
+ console.print(Panel.fit("[bold cyan]Security Configuration Information[/bold cyan]", border_style="cyan"))
216
+
257
217
  # Display environment variables
258
218
  print_info("Environment Configuration:")
259
-
219
+
260
220
  env_vars = {
261
221
  "Profile Configuration": {
262
222
  "MANAGEMENT_PROFILE": os.getenv("MANAGEMENT_PROFILE", "Not set"),
@@ -272,22 +232,22 @@ def config_info(ctx):
272
232
  "Remediation Configuration": {
273
233
  "REMEDIATION_TARGET_ACCOUNTS": os.getenv("REMEDIATION_TARGET_ACCOUNTS", "Not set"),
274
234
  "REMEDIATION_ACCOUNT_CONFIG": os.getenv("REMEDIATION_ACCOUNT_CONFIG", "Not set"),
275
- }
235
+ },
276
236
  }
277
-
237
+
278
238
  for category, variables in env_vars.items():
279
239
  console.print(f"\n[bold]{category}:[/bold]")
280
240
  for var_name, var_value in variables.items():
281
241
  status = "✅" if var_value != "Not set" else "❌"
282
242
  console.print(f" {status} {var_name}: {var_value}")
283
-
243
+
284
244
  # Display example configuration files
285
245
  console.print("\n[bold]Example Configuration Files:[/bold]")
286
246
  config_examples = [
287
247
  "src/runbooks/security/config/compliance_weights_example.json",
288
- "src/runbooks/remediation/config/accounts_example.json"
248
+ "src/runbooks/remediation/config/accounts_example.json",
289
249
  ]
290
-
250
+
291
251
  for config_file in config_examples:
292
252
  if os.path.exists(config_file):
293
253
  console.print(f" ✅ {config_file}")
@@ -298,80 +258,151 @@ def config_info(ctx):
298
258
  def _display_configuration_sources():
299
259
  """Display information about configuration sources used."""
300
260
  console.print("\n[bold]Configuration Sources:[/bold]")
301
-
261
+
302
262
  # Check environment variables
303
263
  if os.getenv("COMPLIANCE_TARGET_ACCOUNTS"):
304
264
  console.print(" ✅ Using COMPLIANCE_TARGET_ACCOUNTS environment variable")
305
-
265
+
306
266
  if os.getenv("COMPLIANCE_ACCOUNTS_CONFIG"):
307
267
  config_path = os.getenv("COMPLIANCE_ACCOUNTS_CONFIG")
308
268
  if os.path.exists(config_path):
309
269
  console.print(f" ✅ Using accounts config file: {config_path}")
310
270
  else:
311
271
  console.print(f" ⚠️ Accounts config file not found: {config_path}")
312
-
272
+
313
273
  if os.getenv("COMPLIANCE_WEIGHTS_CONFIG"):
314
274
  config_path = os.getenv("COMPLIANCE_WEIGHTS_CONFIG")
315
275
  if os.path.exists(config_path):
316
276
  console.print(f" ✅ Using compliance weights config: {config_path}")
317
277
  else:
318
278
  console.print(f" ⚠️ Compliance weights config not found: {config_path}")
319
-
279
+
320
280
  # Check for dynamic control weights
321
281
  weight_vars = [var for var in os.environ.keys() if var.startswith("COMPLIANCE_WEIGHT_")]
322
282
  if weight_vars:
323
283
  console.print(f" ✅ Using {len(weight_vars)} dynamic control weights")
324
-
284
+
325
285
  # Check for dynamic thresholds
326
286
  threshold_vars = [var for var in os.environ.keys() if var.startswith("COMPLIANCE_THRESHOLD_")]
327
287
  if threshold_vars:
328
288
  console.print(f" ✅ Using {len(threshold_vars)} dynamic framework thresholds")
329
-
330
- if not any([
331
- os.getenv("COMPLIANCE_TARGET_ACCOUNTS"),
332
- os.getenv("COMPLIANCE_ACCOUNTS_CONFIG"),
333
- weight_vars,
334
- threshold_vars
335
- ]):
289
+
290
+ if not any(
291
+ [os.getenv("COMPLIANCE_TARGET_ACCOUNTS"), os.getenv("COMPLIANCE_ACCOUNTS_CONFIG"), weight_vars, threshold_vars]
292
+ ):
336
293
  console.print(" ℹ️ Using default configuration (Organizations API discovery)")
337
294
 
338
295
 
296
+ @security.command("2way-validate")
297
+ @click.option("--profile", default="ams-admin-ReadOnlyAccess-909135376185", help="AWS profile for validation testing")
298
+ @click.option(
299
+ "--certification-required", is_flag=True, help="Require production certification (≥97% combined accuracy)"
300
+ )
301
+ @click.pass_context
302
+ def two_way_validate(ctx, profile: str, certification_required: bool):
303
+ """
304
+ Execute comprehensive 2-Way Validation Framework for production readiness.
305
+
306
+ Combines Playwright MCP (UI/browser testing) with AWS MCP (real API validation)
307
+ to achieve ≥97% combined accuracy for enterprise production deployment.
308
+
309
+ **SECURITY VALIDATION SCOPE**:
310
+ - Playwright MCP: >98% browser testing success rate
311
+ - AWS MCP: >97.5% real AWS API validation accuracy
312
+ - Combined Accuracy: ≥97% overall validation requirement
313
+ - Enterprise Compliance: Audit trail and production certification
314
+ """
315
+ try:
316
+ console.print(
317
+ create_panel(
318
+ f"[bold cyan]🚨 Enterprise 2-Way Validation Framework[/bold cyan]\n\n"
319
+ f"[dim]Profile: {profile}[/dim]\n"
320
+ f"[dim]Certification Required: {'Yes' if certification_required else 'No'}[/dim]\n"
321
+ f"[dim]Target Accuracy: ≥97% Combined[/dim]",
322
+ title="🛡️ Security Validation Execution",
323
+ border_style="cyan",
324
+ )
325
+ )
326
+
327
+ print_info("🚀 Initiating comprehensive 2-way validation framework...")
328
+
329
+ # Execute 2-way validation
330
+ results = asyncio.run(execute_2way_validation(profile))
331
+
332
+ # Display results
333
+ certification_status = results["overall_status"]
334
+ combined_accuracy = results["combined_accuracy"]["combined_accuracy"]
335
+
336
+ if certification_status == "CERTIFIED":
337
+ print_success(f"🏆 2-Way Validation: PRODUCTION CERTIFIED")
338
+ print_success(f"📊 Combined Accuracy: {combined_accuracy * 100:.1f}%")
339
+ else:
340
+ print_warning(f"⚠️ 2-Way Validation: REQUIRES REVIEW")
341
+ print_warning(f"📊 Combined Accuracy: {combined_accuracy * 100:.1f}%")
342
+
343
+ # Display detailed metrics
344
+ playwright_success = results["playwright_validation"]["success_rate"]
345
+ aws_mcp_accuracy = results["aws_mcp_validation"]["accuracy_rate"]
346
+ compliance_score = results["enterprise_compliance"]["compliance_score"]
347
+
348
+ console.print(f"\n[bold cyan]Validation Metrics:[/bold cyan]")
349
+ console.print(f"🎭 Playwright Success Rate: {playwright_success * 100:.1f}%")
350
+ console.print(f"☁️ AWS MCP Accuracy Rate: {aws_mcp_accuracy * 100:.1f}%")
351
+ console.print(f"🏢 Enterprise Compliance Score: {compliance_score * 100:.1f}%")
352
+
353
+ # Handle certification requirements
354
+ if certification_required and certification_status != "CERTIFIED":
355
+ print_error("❌ Production certification required but not achieved")
356
+
357
+ if results["recommendations"]:
358
+ console.print(f"\n[bold yellow]Recommendations:[/bold yellow]")
359
+ for recommendation in results["recommendations"]:
360
+ console.print(f"• {recommendation}")
361
+
362
+ raise click.Abort()
363
+
364
+ print_success("✅ 2-Way Validation Framework execution completed")
365
+ print_info(f"📁 Evidence package saved to: ./artifacts/2way_validation_evidence/")
366
+
367
+ except Exception as e:
368
+ print_error(f"2-Way validation failed: {str(e)}")
369
+ raise click.Abort()
370
+
371
+
339
372
  @security.command("generate-config")
340
373
  @click.option(
341
- "--output-dir",
342
- default="./artifacts/security/config",
343
- help="Output directory for configuration templates"
374
+ "--output-dir", default="./artifacts/security/config", help="Output directory for configuration templates"
344
375
  )
345
376
  @click.pass_context
346
377
  def generate_config_templates(ctx, output_dir: str):
347
378
  """
348
379
  Generate universal configuration templates for security operations.
349
-
380
+
350
381
  Creates templates for:
351
382
  - Compliance weights and thresholds
352
383
  - Account discovery configuration
353
384
  - Environment variable examples
354
385
  - Complete setup documentation
355
-
386
+
356
387
  All templates support universal AWS compatibility with no hardcoded values.
357
388
  """
358
389
  print_info(f"Generating universal security configuration templates in {output_dir}...")
359
-
390
+
360
391
  try:
361
392
  generator = SecurityConfigTemplateGenerator(output_dir)
362
393
  generator.generate_all_templates()
363
-
394
+
364
395
  print_success("Configuration templates generated successfully!")
365
396
  console.print("\n[bold yellow]Next steps:[/bold yellow]")
366
397
  console.print("1. Review and customize the generated configuration files")
367
398
  console.print("2. Set environment variables or copy configuration files to your preferred location")
368
399
  console.print("3. Run: runbooks security assess --help")
369
- console.print("4. Run: runbooks remediation --help")
370
-
400
+ console.print("4. Run: runbooks security 2way-validate --help")
401
+
371
402
  except Exception as e:
372
403
  print_error(f"Failed to generate configuration templates: {e}")
373
404
  raise click.Abort()
374
405
 
375
406
 
376
407
  if __name__ == "__main__":
377
- security()
408
+ security()