runbooks 1.1.3__py3-none-any.whl → 1.1.5__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 (247) 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/WEIGHT_CONFIG_README.md +1 -1
  8. runbooks/cfat/assessment/compliance.py +8 -8
  9. runbooks/cfat/assessment/runner.py +1 -0
  10. runbooks/cfat/cloud_foundations_assessment.py +227 -239
  11. runbooks/cfat/models.py +6 -2
  12. runbooks/cfat/tests/__init__.py +6 -1
  13. runbooks/cli/__init__.py +13 -0
  14. runbooks/cli/commands/cfat.py +274 -0
  15. runbooks/cli/commands/finops.py +1164 -0
  16. runbooks/cli/commands/inventory.py +379 -0
  17. runbooks/cli/commands/operate.py +239 -0
  18. runbooks/cli/commands/security.py +248 -0
  19. runbooks/cli/commands/validation.py +825 -0
  20. runbooks/cli/commands/vpc.py +310 -0
  21. runbooks/cli/registry.py +107 -0
  22. runbooks/cloudops/__init__.py +23 -30
  23. runbooks/cloudops/base.py +96 -107
  24. runbooks/cloudops/cost_optimizer.py +549 -547
  25. runbooks/cloudops/infrastructure_optimizer.py +5 -4
  26. runbooks/cloudops/interfaces.py +226 -227
  27. runbooks/cloudops/lifecycle_manager.py +5 -4
  28. runbooks/cloudops/mcp_cost_validation.py +252 -235
  29. runbooks/cloudops/models.py +78 -53
  30. runbooks/cloudops/monitoring_automation.py +5 -4
  31. runbooks/cloudops/notebook_framework.py +179 -215
  32. runbooks/cloudops/security_enforcer.py +125 -159
  33. runbooks/common/accuracy_validator.py +11 -0
  34. runbooks/common/aws_pricing.py +349 -326
  35. runbooks/common/aws_pricing_api.py +211 -212
  36. runbooks/common/aws_profile_manager.py +341 -0
  37. runbooks/common/aws_utils.py +75 -80
  38. runbooks/common/business_logic.py +127 -105
  39. runbooks/common/cli_decorators.py +36 -60
  40. runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
  41. runbooks/common/cross_account_manager.py +198 -205
  42. runbooks/common/date_utils.py +27 -39
  43. runbooks/common/decorators.py +235 -0
  44. runbooks/common/dry_run_examples.py +173 -208
  45. runbooks/common/dry_run_framework.py +157 -155
  46. runbooks/common/enhanced_exception_handler.py +15 -4
  47. runbooks/common/enhanced_logging_example.py +50 -64
  48. runbooks/common/enhanced_logging_integration_example.py +65 -37
  49. runbooks/common/env_utils.py +16 -16
  50. runbooks/common/error_handling.py +40 -38
  51. runbooks/common/lazy_loader.py +41 -23
  52. runbooks/common/logging_integration_helper.py +79 -86
  53. runbooks/common/mcp_cost_explorer_integration.py +478 -495
  54. runbooks/common/mcp_integration.py +63 -74
  55. runbooks/common/memory_optimization.py +140 -118
  56. runbooks/common/module_cli_base.py +37 -58
  57. runbooks/common/organizations_client.py +176 -194
  58. runbooks/common/patterns.py +204 -0
  59. runbooks/common/performance_monitoring.py +67 -71
  60. runbooks/common/performance_optimization_engine.py +283 -274
  61. runbooks/common/profile_utils.py +248 -39
  62. runbooks/common/rich_utils.py +643 -92
  63. runbooks/common/sre_performance_suite.py +177 -186
  64. runbooks/enterprise/__init__.py +1 -1
  65. runbooks/enterprise/logging.py +144 -106
  66. runbooks/enterprise/security.py +187 -204
  67. runbooks/enterprise/validation.py +43 -56
  68. runbooks/finops/__init__.py +29 -33
  69. runbooks/finops/account_resolver.py +1 -1
  70. runbooks/finops/advanced_optimization_engine.py +980 -0
  71. runbooks/finops/automation_core.py +268 -231
  72. runbooks/finops/business_case_config.py +184 -179
  73. runbooks/finops/cli.py +660 -139
  74. runbooks/finops/commvault_ec2_analysis.py +157 -164
  75. runbooks/finops/compute_cost_optimizer.py +336 -320
  76. runbooks/finops/config.py +20 -20
  77. runbooks/finops/cost_optimizer.py +488 -622
  78. runbooks/finops/cost_processor.py +332 -214
  79. runbooks/finops/dashboard_runner.py +1006 -172
  80. runbooks/finops/ebs_cost_optimizer.py +991 -657
  81. runbooks/finops/elastic_ip_optimizer.py +317 -257
  82. runbooks/finops/enhanced_mcp_integration.py +340 -0
  83. runbooks/finops/enhanced_progress.py +40 -37
  84. runbooks/finops/enhanced_trend_visualization.py +3 -2
  85. runbooks/finops/enterprise_wrappers.py +230 -292
  86. runbooks/finops/executive_export.py +203 -160
  87. runbooks/finops/helpers.py +130 -288
  88. runbooks/finops/iam_guidance.py +1 -1
  89. runbooks/finops/infrastructure/__init__.py +80 -0
  90. runbooks/finops/infrastructure/commands.py +506 -0
  91. runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
  92. runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
  93. runbooks/finops/markdown_exporter.py +338 -175
  94. runbooks/finops/mcp_validator.py +1952 -0
  95. runbooks/finops/nat_gateway_optimizer.py +1513 -482
  96. runbooks/finops/network_cost_optimizer.py +657 -587
  97. runbooks/finops/notebook_utils.py +226 -188
  98. runbooks/finops/optimization_engine.py +1136 -0
  99. runbooks/finops/optimizer.py +25 -29
  100. runbooks/finops/rds_snapshot_optimizer.py +367 -411
  101. runbooks/finops/reservation_optimizer.py +427 -363
  102. runbooks/finops/scenario_cli_integration.py +77 -78
  103. runbooks/finops/scenarios.py +1278 -439
  104. runbooks/finops/schemas.py +218 -182
  105. runbooks/finops/snapshot_manager.py +2289 -0
  106. runbooks/finops/tests/test_finops_dashboard.py +3 -3
  107. runbooks/finops/tests/test_reference_images_validation.py +2 -2
  108. runbooks/finops/tests/test_single_account_features.py +17 -17
  109. runbooks/finops/tests/validate_test_suite.py +1 -1
  110. runbooks/finops/types.py +3 -3
  111. runbooks/finops/validation_framework.py +263 -269
  112. runbooks/finops/vpc_cleanup_exporter.py +191 -146
  113. runbooks/finops/vpc_cleanup_optimizer.py +593 -575
  114. runbooks/finops/workspaces_analyzer.py +171 -182
  115. runbooks/hitl/enhanced_workflow_engine.py +1 -1
  116. runbooks/integration/__init__.py +89 -0
  117. runbooks/integration/mcp_integration.py +1920 -0
  118. runbooks/inventory/CLAUDE.md +816 -0
  119. runbooks/inventory/README.md +3 -3
  120. runbooks/inventory/Tests/common_test_data.py +30 -30
  121. runbooks/inventory/__init__.py +2 -2
  122. runbooks/inventory/cloud_foundations_integration.py +144 -149
  123. runbooks/inventory/collectors/aws_comprehensive.py +28 -11
  124. runbooks/inventory/collectors/aws_networking.py +111 -101
  125. runbooks/inventory/collectors/base.py +4 -0
  126. runbooks/inventory/core/collector.py +495 -313
  127. runbooks/inventory/discovery.md +2 -2
  128. runbooks/inventory/drift_detection_cli.py +69 -96
  129. runbooks/inventory/find_ec2_security_groups.py +1 -1
  130. runbooks/inventory/inventory_mcp_cli.py +48 -46
  131. runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
  132. runbooks/inventory/mcp_inventory_validator.py +549 -465
  133. runbooks/inventory/mcp_vpc_validator.py +359 -442
  134. runbooks/inventory/organizations_discovery.py +56 -52
  135. runbooks/inventory/rich_inventory_display.py +33 -32
  136. runbooks/inventory/unified_validation_engine.py +278 -251
  137. runbooks/inventory/vpc_analyzer.py +733 -696
  138. runbooks/inventory/vpc_architecture_validator.py +293 -348
  139. runbooks/inventory/vpc_dependency_analyzer.py +382 -378
  140. runbooks/inventory/vpc_flow_analyzer.py +3 -3
  141. runbooks/main.py +152 -9147
  142. runbooks/main_final.py +91 -60
  143. runbooks/main_minimal.py +22 -10
  144. runbooks/main_optimized.py +131 -100
  145. runbooks/main_ultra_minimal.py +7 -2
  146. runbooks/mcp/__init__.py +36 -0
  147. runbooks/mcp/integration.py +679 -0
  148. runbooks/metrics/dora_metrics_engine.py +2 -2
  149. runbooks/monitoring/performance_monitor.py +9 -4
  150. runbooks/operate/dynamodb_operations.py +3 -1
  151. runbooks/operate/ec2_operations.py +145 -137
  152. runbooks/operate/iam_operations.py +146 -152
  153. runbooks/operate/mcp_integration.py +1 -1
  154. runbooks/operate/networking_cost_heatmap.py +33 -10
  155. runbooks/operate/privatelink_operations.py +1 -1
  156. runbooks/operate/rds_operations.py +223 -254
  157. runbooks/operate/s3_operations.py +107 -118
  158. runbooks/operate/vpc_endpoints.py +1 -1
  159. runbooks/operate/vpc_operations.py +648 -618
  160. runbooks/remediation/base.py +1 -1
  161. runbooks/remediation/commons.py +10 -7
  162. runbooks/remediation/commvault_ec2_analysis.py +71 -67
  163. runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
  164. runbooks/remediation/multi_account.py +24 -21
  165. runbooks/remediation/rds_snapshot_list.py +91 -65
  166. runbooks/remediation/remediation_cli.py +92 -146
  167. runbooks/remediation/universal_account_discovery.py +83 -79
  168. runbooks/remediation/workspaces_list.py +49 -44
  169. runbooks/security/__init__.py +19 -0
  170. runbooks/security/assessment_runner.py +1150 -0
  171. runbooks/security/baseline_checker.py +812 -0
  172. runbooks/security/cloudops_automation_security_validator.py +509 -535
  173. runbooks/security/compliance_automation_engine.py +17 -17
  174. runbooks/security/config/__init__.py +2 -2
  175. runbooks/security/config/compliance_config.py +50 -50
  176. runbooks/security/config_template_generator.py +63 -76
  177. runbooks/security/enterprise_security_framework.py +1 -1
  178. runbooks/security/executive_security_dashboard.py +519 -508
  179. runbooks/security/integration_test_enterprise_security.py +5 -3
  180. runbooks/security/multi_account_security_controls.py +959 -1210
  181. runbooks/security/real_time_security_monitor.py +422 -444
  182. runbooks/security/run_script.py +1 -1
  183. runbooks/security/security_baseline_tester.py +1 -1
  184. runbooks/security/security_cli.py +143 -112
  185. runbooks/security/test_2way_validation.py +439 -0
  186. runbooks/security/two_way_validation_framework.py +852 -0
  187. runbooks/sre/mcp_reliability_engine.py +6 -6
  188. runbooks/sre/production_monitoring_framework.py +167 -177
  189. runbooks/tdd/__init__.py +15 -0
  190. runbooks/tdd/cli.py +1071 -0
  191. runbooks/utils/__init__.py +14 -17
  192. runbooks/utils/logger.py +7 -2
  193. runbooks/utils/version_validator.py +51 -48
  194. runbooks/validation/__init__.py +6 -6
  195. runbooks/validation/cli.py +9 -3
  196. runbooks/validation/comprehensive_2way_validator.py +754 -708
  197. runbooks/validation/mcp_validator.py +906 -228
  198. runbooks/validation/terraform_citations_validator.py +104 -115
  199. runbooks/validation/terraform_drift_detector.py +447 -451
  200. runbooks/vpc/README.md +617 -0
  201. runbooks/vpc/__init__.py +8 -1
  202. runbooks/vpc/analyzer.py +577 -0
  203. runbooks/vpc/cleanup_wrapper.py +476 -413
  204. runbooks/vpc/cli_cloudtrail_commands.py +339 -0
  205. runbooks/vpc/cli_mcp_validation_commands.py +480 -0
  206. runbooks/vpc/cloudtrail_audit_integration.py +717 -0
  207. runbooks/vpc/config.py +92 -97
  208. runbooks/vpc/cost_engine.py +411 -148
  209. runbooks/vpc/cost_explorer_integration.py +553 -0
  210. runbooks/vpc/cross_account_session.py +101 -106
  211. runbooks/vpc/enhanced_mcp_validation.py +917 -0
  212. runbooks/vpc/eni_gate_validator.py +961 -0
  213. runbooks/vpc/heatmap_engine.py +190 -162
  214. runbooks/vpc/mcp_no_eni_validator.py +681 -640
  215. runbooks/vpc/nat_gateway_optimizer.py +358 -0
  216. runbooks/vpc/networking_wrapper.py +15 -8
  217. runbooks/vpc/pdca_remediation_planner.py +528 -0
  218. runbooks/vpc/performance_optimized_analyzer.py +219 -231
  219. runbooks/vpc/runbooks_adapter.py +1167 -241
  220. runbooks/vpc/tdd_red_phase_stubs.py +601 -0
  221. runbooks/vpc/test_data_loader.py +358 -0
  222. runbooks/vpc/tests/conftest.py +314 -4
  223. runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
  224. runbooks/vpc/tests/test_cost_engine.py +0 -2
  225. runbooks/vpc/topology_generator.py +326 -0
  226. runbooks/vpc/unified_scenarios.py +1302 -1129
  227. runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
  228. runbooks-1.1.5.dist-info/METADATA +328 -0
  229. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
  230. runbooks/finops/README.md +0 -414
  231. runbooks/finops/accuracy_cross_validator.py +0 -647
  232. runbooks/finops/business_cases.py +0 -950
  233. runbooks/finops/dashboard_router.py +0 -922
  234. runbooks/finops/ebs_optimizer.py +0 -956
  235. runbooks/finops/embedded_mcp_validator.py +0 -1629
  236. runbooks/finops/enhanced_dashboard_runner.py +0 -527
  237. runbooks/finops/finops_dashboard.py +0 -584
  238. runbooks/finops/finops_scenarios.py +0 -1218
  239. runbooks/finops/legacy_migration.py +0 -730
  240. runbooks/finops/multi_dashboard.py +0 -1519
  241. runbooks/finops/single_dashboard.py +0 -1113
  242. runbooks/finops/unlimited_scenarios.py +0 -393
  243. runbooks-1.1.3.dist-info/METADATA +0 -799
  244. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
  245. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
  246. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
  247. {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -4,7 +4,7 @@
4
4
  AWS Security Baseline Tester Script
5
5
 
6
6
  Date: 2025-01-10
7
- Version: 1.1.0
7
+ Version: latest version
8
8
 
9
9
  This script evaluates AWS account security configurations against a baseline checklist
10
10
  and generates a multilingual report in HTML format.
@@ -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()