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
@@ -8,10 +8,9 @@ import Inventory_Modules
8
8
  from account_class import aws_acct_access
9
9
  from ArgumentsClass import CommonArguments
10
10
  from botocore.exceptions import ClientError
11
- from colorama import Fore, init
12
- from prettytable import PrettyTable
11
+ from runbooks.common.rich_utils import console, print_success, print_error, print_info
12
+ from runbooks.common.rich_utils import console, create_table
13
13
 
14
- init()
15
14
  __version__ = "2023.05.04"
16
15
 
17
16
  parser = CommonArguments()
@@ -109,7 +108,6 @@ else:
109
108
  "us-west-2",
110
109
  ]
111
110
 
112
- ERASE_LINE = "\x1b[2K"
113
111
 
114
112
  ExplainMessage = """
115
113
 
@@ -175,37 +173,37 @@ but that's sometime in the future.
175
173
 
176
174
  print("This script does 6 things... ")
177
175
  print(
178
- f"{Fore.BLUE} 0.{Fore.RESET} Checks to ensure you have the necessary cross-account role access to the child account."
176
+ f"[blue] 0. Checks to ensure you have the necessary cross-account role access to the child account."
179
177
  )
180
- print(f"{Fore.BLUE} 1.{Fore.RESET} Checks to ensure the {Fore.RED}Default VPCs {Fore.RESET}in each region are deleted")
178
+ print(f"[blue] 1. Checks to ensure the [red]Default VPCs in each region are deleted")
181
179
  if FixRun and not pVPCConfirm:
182
180
  print(
183
- f"{Fore.BLUE} You've asked to delete any default VPCs we find - with confirmation on each one.{Fore.RESET}"
181
+ f"[blue] You've asked to delete any default VPCs we find - with confirmation on each one."
184
182
  )
185
183
  elif FixRun and pVPCConfirm:
186
184
  print()
187
185
  print(
188
- f"{Fore.RED} You've asked to delete any default VPCs we find - WITH NO CONFIRMATION on each one.{Fore.RESET}"
186
+ f"[red] You've asked to delete any default VPCs we find - WITH NO CONFIRMATION on each one."
189
187
  )
190
188
  print()
191
189
  elif pVPCConfirm and not FixRun:
192
190
  print()
193
191
  print(
194
- f"{Fore.BLUE} You asked us to delete the default VPCs with no confirmation, but didn't provide the '+fixrun' parameter, so we're proceeding with NOT deleting. You can safely interupt this script and run it again with the necessary parameters.{Fore.RESET}"
192
+ f"[blue] You asked us to delete the default VPCs with no confirmation, but didn't provide the '+fixrun' parameter, so we're proceeding with NOT deleting. You can safely interupt this script and run it again with the necessary parameters."
195
193
  )
196
194
  print()
197
- print(f"{Fore.BLUE} 2.{Fore.RESET} Checks the child account in each of the regions")
198
- print(f" to see if there's already a {Fore.RED}Config Recorder and Delivery Channel {Fore.RESET}enabled...")
195
+ print(f"[blue] 2. Checks the child account in each of the regions")
196
+ print(f" to see if there's already a [red]Config Recorder and Delivery Channel enabled...")
199
197
  print(
200
- f"{Fore.BLUE} 3.{Fore.RESET} Checks that there isn't a duplicate {Fore.RED}CloudTrail{Fore.RESET} trail in the account."
198
+ f"[blue] 3. Checks that there isn't a duplicate [red]CloudTrail trail in the account."
201
199
  )
202
200
  print(
203
- f"{Fore.BLUE} 4.{Fore.RESET} Checks to see if {Fore.RED}GuardDuty{Fore.RESET} has been enabled for this child account."
201
+ f"[blue] 4. Checks to see if [red]GuardDuty has been enabled for this child account."
204
202
  )
205
203
  print(" If it has been, it needs to be deleted before we can adopt this new account")
206
204
  print(" into the Org's Automated Landing Zone.")
207
205
  print(
208
- f"{Fore.BLUE} 5.{Fore.RESET} This child account {Fore.RED}must exist{Fore.RESET} within the Parent Organization."
206
+ f"[blue] 5. This child account [red]must exist within the Parent Organization."
209
207
  )
210
208
  print(" If it doesn't - then you must move it into this Org")
211
209
  print(" (this script can't do that for you).")
@@ -277,10 +275,10 @@ for childaccount in ChildAccountList:
277
275
  finally:
278
276
  if not account_credentials.get("Success", False):
279
277
  logging.error(
280
- f"Was {Fore.RED}not{Fore.RESET} able to successfully connect to account {childaccount} using credentials from account {aws_account.acct_number}... "
278
+ f"Was [red]not able to successfully connect to account {childaccount} using credentials from account {aws_account.acct_number}... "
281
279
  )
282
280
  print()
283
- print(f"{Fore.RED}** Step 0 failed for account {childaccount}{Fore.RESET}")
281
+ print(f"[red]** Step 0 failed for account {childaccount}")
284
282
  print()
285
283
  ProcessStatus[childaccount]["Step0"]["Success"] = False
286
284
  ProcessStatus[childaccount]["Step0"]["IssuesFound"] += 1
@@ -290,7 +288,7 @@ for childaccount in ChildAccountList:
290
288
  f"Was able to successfully connect to account {childaccount} using credentials from account {aws_account.acct_number}... "
291
289
  )
292
290
  print()
293
- print(f"{Fore.GREEN}** Step 0 completed without issues{Fore.RESET}")
291
+ print(f"[green]** Step 0 completed without issues")
294
292
  print()
295
293
  ProcessStatus[childaccount]["Step0"]["Success"] = True
296
294
 
@@ -305,7 +303,7 @@ for childaccount in ChildAccountList:
305
303
  for region in RegionList:
306
304
  print(
307
305
  ERASE_LINE,
308
- f"Checking account {childaccount} in region {region} for {Fore.RED}default VPCs{Fore.RESET}",
306
+ f"Checking account {childaccount} in region {region} for [red]default VPCs",
309
307
  end="\r",
310
308
  )
311
309
  logging.info("Looking for Default VPCs in account {} from Region {}}", childaccount, region)
@@ -364,18 +362,18 @@ for childaccount in ChildAccountList:
364
362
 
365
363
  print()
366
364
  if ProcessStatus[childaccount]["Step1"]["Success"]:
367
- print(f"{ERASE_LINE + Fore.GREEN}** Step 1 completed with no issues{Fore.RESET}")
365
+ print(f"{ERASE_LINE + Fore.GREEN}** Step 1 completed with no issues")
368
366
  elif ProcessStatus[childaccount]["Step1"]["IssuesFound"] - ProcessStatus[childaccount]["Step1"]["IssuesFixed"] == 0:
369
367
  print(
370
- f"{ERASE_LINE + Fore.GREEN}** Step 1 found {ProcessStatus[childaccount]['Step1']['IssuesFound']} issues, but they were fixed by deleting the default vpcs{Fore.RESET}"
368
+ f"{ERASE_LINE + Fore.GREEN}** Step 1 found {ProcessStatus[childaccount]['Step1']['IssuesFound']} issues, but they were fixed by deleting the default vpcs"
371
369
  )
372
370
  ProcessStatus[childaccount]["Step1"]["Success"] = True
373
371
  elif ProcessStatus[childaccount]["Step1"]["IssuesFound"] > ProcessStatus[childaccount]["Step1"]["IssuesFixed"]:
374
372
  print(
375
- f"{ERASE_LINE + Fore.RED}** Step 1 completed, but there were {ProcessStatus[childaccount]['Step1']['IssuesFound'] - ProcessStatus[childaccount]['Step1']['IssuesFixed']} vpcs that couldn't be fixed{Fore.RESET}"
373
+ f"{ERASE_LINE + Fore.RED}** Step 1 completed, but there were {ProcessStatus[childaccount]['Step1']['IssuesFound'] - ProcessStatus[childaccount]['Step1']['IssuesFixed']} vpcs that couldn't be fixed"
376
374
  )
377
375
  else:
378
- print(f"{ERASE_LINE + Fore.RED}** Step 1 completed with blockers found{Fore.RESET}")
376
+ print(f"{ERASE_LINE + Fore.RED}** Step 1 completed with blockers found")
379
377
 
380
378
  # Step 2
381
379
  # This part will check the Config Recorder and Delivery Channel. If they have one, we need to delete it, so we can create another. We'll ask whether this is ok before we delete.
@@ -422,7 +420,7 @@ for childaccount in ChildAccountList:
422
420
 
423
421
  for i in range(len(ConfigList)):
424
422
  logging.error(
425
- f"{Fore.RED}Found a config recorder for account %s in region %s",
423
+ f"[red]Found a config recorder for account %s in region %s",
426
424
  ConfigList[i]["AccountID"],
427
425
  ConfigList[i]["Region"] + Fore.RESET,
428
426
  )
@@ -442,7 +440,7 @@ for childaccount in ChildAccountList:
442
440
  ProcessStatus[childaccount]["Step2"]["IssuesFixed"] += 1
443
441
  for i in range(len(DeliveryChanList)):
444
442
  logging.error(
445
- f"{Fore.RED}I found a delivery channel for account %s in region %s",
443
+ f"[red]I found a delivery channel for account %s in region %s",
446
444
  DeliveryChanList[i]["AccountID"],
447
445
  DeliveryChanList[i]["Region"] + Fore.RESET,
448
446
  )
@@ -466,18 +464,18 @@ for childaccount in ChildAccountList:
466
464
  ProcessStatus[childaccount]["Step2"]["Success"] = True
467
465
 
468
466
  if ProcessStatus[childaccount]["Step2"]["Success"]:
469
- print(f"{ERASE_LINE + Fore.GREEN}** Step 2 completed with no issues{Fore.RESET}")
467
+ print(f"{ERASE_LINE + Fore.GREEN}** Step 2 completed with no issues")
470
468
  elif ProcessStatus[childaccount]["Step2"]["IssuesFound"] - ProcessStatus[childaccount]["Step2"]["IssuesFixed"] == 0:
471
469
  print(
472
- f"{ERASE_LINE + Fore.GREEN}** Step 2 found {ProcessStatus[childaccount]['Step2']['IssuesFound']} issues, but they were fixed by deleting the existing Config Recorders and Delivery Channels{Fore.RESET}"
470
+ f"{ERASE_LINE + Fore.GREEN}** Step 2 found {ProcessStatus[childaccount]['Step2']['IssuesFound']} issues, but they were fixed by deleting the existing Config Recorders and Delivery Channels"
473
471
  )
474
472
  ProcessStatus[childaccount]["Step2"]["Success"] = True
475
473
  elif ProcessStatus[childaccount]["Step2"]["IssuesFound"] > ProcessStatus[childaccount]["Step2"]["IssuesFixed"]:
476
474
  print(
477
- f"{ERASE_LINE + Fore.RED}** Step 2 completed, but there were {ProcessStatus[childaccount]['Step2']['IssuesFound'] - ProcessStatus[childaccount]['Step2']['IssuesFixed']} items found that couldn't be deleted{Fore.RESET}"
475
+ f"{ERASE_LINE + Fore.RED}** Step 2 completed, but there were {ProcessStatus[childaccount]['Step2']['IssuesFound'] - ProcessStatus[childaccount]['Step2']['IssuesFixed']} items found that couldn't be deleted"
478
476
  )
479
477
  else:
480
- print(f"{ERASE_LINE + Fore.RED}** Step 2 completed with blockers found{Fore.RESET}")
478
+ print(f"{ERASE_LINE + Fore.RED}** Step 2 completed with blockers found")
481
479
  print()
482
480
 
483
481
  # Step 3
@@ -505,7 +503,7 @@ for childaccount in ChildAccountList:
505
503
 
506
504
  for i in range(len(CTtrails2)):
507
505
  logging.error(
508
- f"{Fore.RED}Found a CloudTrail trail for account {childaccount} in region {CTtrails2[i]['HomeRegion']} named {CTtrails2[i]['Name']}{Fore.RESET}"
506
+ f"[red]Found a CloudTrail trail for account {childaccount} in region {CTtrails2[i]['HomeRegion']} named {CTtrails2[i]['Name']}"
509
507
  )
510
508
  ProcessStatus[childaccount]["Step3"]["IssuesFound"] += 1
511
509
  if FixRun:
@@ -523,18 +521,18 @@ for childaccount in ChildAccountList:
523
521
  ProcessStatus[childaccount]["Step3"]["Success"] = True
524
522
 
525
523
  if ProcessStatus[childaccount]["Step3"]["Success"]:
526
- print(f"{ERASE_LINE + Fore.GREEN}** Step 3 completed with no issues{Fore.RESET}")
524
+ print(f"{ERASE_LINE + Fore.GREEN}** Step 3 completed with no issues")
527
525
  elif ProcessStatus[childaccount]["Step3"]["IssuesFound"] - ProcessStatus[childaccount]["Step3"]["IssuesFixed"] == 0:
528
526
  print(
529
- f"{ERASE_LINE + Fore.GREEN}** Step 3 found {ProcessStatus[childaccount]['Step3']['IssuesFound']} issues, but they were fixed by deleting the existing CloudTrail trail names{Fore.RESET}"
527
+ f"{ERASE_LINE + Fore.GREEN}** Step 3 found {ProcessStatus[childaccount]['Step3']['IssuesFound']} issues, but they were fixed by deleting the existing CloudTrail trail names"
530
528
  )
531
529
  ProcessStatus[childaccount]["Step3"]["Success"] = True
532
530
  elif ProcessStatus[childaccount]["Step3"]["IssuesFound"] > ProcessStatus[childaccount]["Step3"]["IssuesFixed"]:
533
531
  print(
534
- f"{ERASE_LINE + Fore.RED}** Step 3 completed, but there were {ProcessStatus[childaccount]['Step3']['IssuesFound'] - ProcessStatus[childaccount]['Step3']['IssuesFixed']} trail names found that couldn't be deleted{Fore.RESET}"
532
+ f"{ERASE_LINE + Fore.RED}** Step 3 completed, but there were {ProcessStatus[childaccount]['Step3']['IssuesFound'] - ProcessStatus[childaccount]['Step3']['IssuesFixed']} trail names found that couldn't be deleted"
535
533
  )
536
534
  else:
537
- print(f"{ERASE_LINE + Fore.RED}** Step 3 completed with blockers found{Fore.RESET}")
535
+ print(f"{ERASE_LINE + Fore.RED}** Step 3 completed with blockers found")
538
536
  print()
539
537
 
540
538
  # Step 4
@@ -545,7 +543,7 @@ for childaccount in ChildAccountList:
545
543
  print(f"Checking account {childaccount} for any GuardDuty invites")
546
544
  for region in RegionList:
547
545
  print(
548
- f"{ERASE_LINE}Checking account {childaccount} in region {region} for {Fore.RED}GuardDuty{Fore.RESET}invitations",
546
+ f"{ERASE_LINE}Checking account {childaccount} in region {region} for [red]GuardDutyinvitations",
549
547
  end="\r",
550
548
  )
551
549
  GDinvites = Inventory_Modules.find_gd_invites2(account_credentials, region)
@@ -570,7 +568,7 @@ for childaccount in ChildAccountList:
570
568
 
571
569
  for i in range(len(GDinvites2)):
572
570
  logging.error(
573
- f"{Fore.RED}I found a GuardDuty invitation for account %s in region %s from account %s ",
571
+ f"[red]I found a GuardDuty invitation for account %s in region %s from account %s ",
574
572
  childaccount,
575
573
  GDinvites2[i]["Region"],
576
574
  GDinvites2[i]["AccountId"] + Fore.RESET,
@@ -593,18 +591,18 @@ for childaccount in ChildAccountList:
593
591
  ProcessStatus[childaccount]["Step4"]["Success"] = True
594
592
 
595
593
  if ProcessStatus[childaccount]["Step4"]["Success"]:
596
- print(f"{ERASE_LINE + Fore.GREEN}** Step 4 completed with no issues{Fore.RESET}")
594
+ print(f"{ERASE_LINE + Fore.GREEN}** Step 4 completed with no issues")
597
595
  elif ProcessStatus[childaccount]["Step4"]["IssuesFound"] - ProcessStatus[childaccount]["Step4"]["IssuesFixed"] == 0:
598
596
  print(
599
- f"{ERASE_LINE + Fore.GREEN}** Step 4 found {ProcessStatus[childaccount]['Step4']['IssuesFound']} guardduty invites, but they were deleted{Fore.RESET}"
597
+ f"{ERASE_LINE + Fore.GREEN}** Step 4 found {ProcessStatus[childaccount]['Step4']['IssuesFound']} guardduty invites, but they were deleted"
600
598
  )
601
599
  ProcessStatus[childaccount]["Step4"]["Success"] = True
602
600
  elif ProcessStatus[childaccount]["Step4"]["IssuesFound"] > ProcessStatus[childaccount]["Step4"]["IssuesFixed"]:
603
601
  print(
604
- f"{ERASE_LINE + Fore.RED}** Step 4 completed, but there were {ProcessStatus[childaccount]['Step4']['IssuesFound'] - ProcessStatus[childaccount]['Step4']['IssuesFixed']} guardduty invites found that couldn't be deleted{Fore.RESET}"
602
+ f"{ERASE_LINE + Fore.RED}** Step 4 completed, but there were {ProcessStatus[childaccount]['Step4']['IssuesFound'] - ProcessStatus[childaccount]['Step4']['IssuesFixed']} guardduty invites found that couldn't be deleted"
605
603
  )
606
604
  else:
607
- print(f"{ERASE_LINE + Fore.RED}** Step 4 completed with blockers found{Fore.RESET}")
605
+ print(f"{ERASE_LINE + Fore.RED}** Step 4 completed with blockers found")
608
606
  print()
609
607
 
610
608
  """
@@ -631,21 +629,21 @@ for childaccount in ChildAccountList:
631
629
  ProcessStatus[childaccount]["Step5"]["IssuesFound"] += 1
632
630
 
633
631
  if ProcessStatus[childaccount]["Step5"]["Success"]:
634
- print(f"{ERASE_LINE + Fore.GREEN}** Step 5 completed with no issues{Fore.RESET}")
632
+ print(f"{ERASE_LINE + Fore.GREEN}** Step 5 completed with no issues")
635
633
  elif ProcessStatus[childaccount]["Step5"]["IssuesFound"] - ProcessStatus[childaccount]["Step5"]["IssuesFixed"] == 0:
636
634
  print(
637
- f"{ERASE_LINE + Fore.GREEN}** Step 5 found {ProcessStatus[childaccount]['Step5']['IssuesFound']} issues, but we were able to move the account into the they were able to be fixed{Fore.RESET}"
635
+ f"{ERASE_LINE + Fore.GREEN}** Step 5 found {ProcessStatus[childaccount]['Step5']['IssuesFound']} issues, but we were able to move the account into the they were able to be fixed"
638
636
  )
639
637
  ProcessStatus[childaccount]["Step5"]["Success"] = True
640
638
  elif ProcessStatus[childaccount]["Step5"]["IssuesFound"] > ProcessStatus[childaccount]["Step5"]["IssuesFixed"]:
641
639
  print(
642
- f"{ERASE_LINE + Fore.RED}** Step 5 completed, but there were {ProcessStatus[childaccount]['Step5']['IssuesFound'] - ProcessStatus[childaccount]['Step5']['IssuesFixed']} blockers found that couldn't be fixed{Fore.RESET}"
640
+ f"{ERASE_LINE + Fore.RED}** Step 5 completed, but there were {ProcessStatus[childaccount]['Step5']['IssuesFound'] - ProcessStatus[childaccount]['Step5']['IssuesFixed']} blockers found that couldn't be fixed"
643
641
  )
644
642
  else:
645
- print(f"{ERASE_LINE + Fore.RED}** Step 5 completed with blockers found{Fore.RESET}")
643
+ print(f"{ERASE_LINE + Fore.RED}** Step 5 completed with blockers found")
646
644
  print()
647
645
 
648
- print(f"{Fore.CYAN}Account {childaccount} is complete. {accountsleft} more to go!!{Fore.RESET}")
646
+ print(f"[cyan]Account {childaccount} is complete. {accountsleft} more to go!!")
649
647
 
650
648
  """
651
649
  # Step 6
@@ -653,59 +651,62 @@ for childaccount in ChildAccountList:
653
651
  So we'll need to verify that the parent OU of the account is the root of the organization.
654
652
  """
655
653
 
656
- x = PrettyTable()
657
- y = PrettyTable()
658
-
659
- x.field_names = ["Account", "Issues Found", "Issues Fixed", "Ready?"]
660
- # The following headers represent Step0 through Step5,
661
- y.field_names = [
662
- "Account",
663
- "Account Access",
664
- "Default VPCs",
665
- "Recorders",
666
- "CloudTrail",
667
- "GuardDuty",
668
- "Org Member",
669
- "Ready?",
670
- ]
654
+ x = create_table(
655
+ title="Account Readiness Summary",
656
+ columns=[
657
+ {"header": "Account", "justify": "left"},
658
+ {"header": "Issues Found", "justify": "center"},
659
+ {"header": "Issues Fixed", "justify": "center"},
660
+ {"header": "Ready?", "justify": "center"},
661
+ ]
662
+ )
663
+ y = create_table(
664
+ title="Account Issue Details",
665
+ columns=[
666
+ {"header": "Account", "justify": "left"},
667
+ {"header": "Account Access", "justify": "center"},
668
+ {"header": "Default VPCs", "justify": "center"},
669
+ {"header": "Recorders", "justify": "center"},
670
+ {"header": "CloudTrail", "justify": "center"},
671
+ {"header": "GuardDuty", "justify": "center"},
672
+ {"header": "Org Member", "justify": "center"},
673
+ {"header": "Ready?", "justify": "center"},
674
+ ]
675
+ )
671
676
  for item in ProcessStatus:
672
677
  for _ in range(Steps):
673
678
  Step = f"Step{str(_)}"
674
679
  ProcessStatus[item]["IssuesFound"] += ProcessStatus[item][Step]["IssuesFound"]
675
680
  ProcessStatus[item]["IssuesFound"] += ProcessStatus[item][Step]["IssuesFixed"]
676
681
  x.add_row(
677
- [
678
- item,
679
- ProcessStatus[item]["IssuesFound"],
680
- ProcessStatus[item]["IssuesFixed"],
681
- ProcessStatus[item]["ChildIsReady"],
682
- ]
682
+ item,
683
+ str(ProcessStatus[item]["IssuesFound"]),
684
+ str(ProcessStatus[item]["IssuesFixed"]),
685
+ str(ProcessStatus[item]["ChildIsReady"]),
683
686
  )
684
687
  y.add_row(
685
- [
686
- item,
687
- ProcessStatus[item]["Step0"]["IssuesFound"] - ProcessStatus[item]["Step0"]["IssuesFixed"],
688
- ProcessStatus[item]["Step1"]["IssuesFound"] - ProcessStatus[item]["Step1"]["IssuesFixed"],
689
- ProcessStatus[item]["Step2"]["IssuesFound"] - ProcessStatus[item]["Step2"]["IssuesFixed"],
690
- ProcessStatus[item]["Step3"]["IssuesFound"] - ProcessStatus[item]["Step3"]["IssuesFixed"],
691
- ProcessStatus[item]["Step4"]["IssuesFound"] - ProcessStatus[item]["Step4"]["IssuesFixed"],
692
- ProcessStatus[item]["Step5"]["IssuesFound"] - ProcessStatus[item]["Step5"]["IssuesFixed"],
693
- ProcessStatus[item]["Step0"]["Success"]
688
+ item,
689
+ str(ProcessStatus[item]["Step0"]["IssuesFound"] - ProcessStatus[item]["Step0"]["IssuesFixed"]),
690
+ str(ProcessStatus[item]["Step1"]["IssuesFound"] - ProcessStatus[item]["Step1"]["IssuesFixed"]),
691
+ str(ProcessStatus[item]["Step2"]["IssuesFound"] - ProcessStatus[item]["Step2"]["IssuesFixed"]),
692
+ str(ProcessStatus[item]["Step3"]["IssuesFound"] - ProcessStatus[item]["Step3"]["IssuesFixed"]),
693
+ str(ProcessStatus[item]["Step4"]["IssuesFound"] - ProcessStatus[item]["Step4"]["IssuesFixed"]),
694
+ str(ProcessStatus[item]["Step5"]["IssuesFound"] - ProcessStatus[item]["Step5"]["IssuesFixed"]),
695
+ str(ProcessStatus[item]["Step0"]["Success"]
694
696
  and ProcessStatus[item]["Step1"]["Success"]
695
697
  and ProcessStatus[item]["Step2"]["Success"]
696
698
  and ProcessStatus[item]["Step3"]["Success"]
697
699
  and ProcessStatus[item]["Step4"]["Success"]
698
- and ProcessStatus[item]["Step5"]["Success"],
699
- ]
700
+ and ProcessStatus[item]["Step5"]["Success"]),
700
701
  )
701
- print(
702
- "The following table represents the accounts looked at, and whether they are ready to be incorporated into an ALZ environment."
702
+ console.print(
703
+ "\n[bold cyan]The following table represents the accounts looked at, and whether they are ready to be incorporated into an ALZ environment.[/bold cyan]"
703
704
  )
704
- print(x)
705
- print()
706
- print(
707
- "The following table represents the accounts looked at, and gives details under each type of issue as to what might prevent a successful migration of this account into an ALZ environment."
705
+ console.print(x)
706
+ console.print()
707
+ console.print(
708
+ "[bold cyan]The following table represents the accounts looked at, and gives details under each type of issue as to what might prevent a successful migration of this account into an ALZ environment.[/bold cyan]"
708
709
  )
709
- print(y)
710
+ console.print(y)
710
711
 
711
- print("Thanks for using this script...")
712
+ console.print("\n[green]Thanks for using this script...[/green]")