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
@@ -57,12 +57,10 @@ from time import time
57
57
 
58
58
  from ArgumentsClass import CommonArguments
59
59
  from botocore.exceptions import ClientError
60
- from colorama import Fore, init
60
+ from runbooks.common.rich_utils import console
61
61
  from Inventory_Modules import display_results, find_private_hosted_zones2, get_all_credentials
62
62
 
63
- init()
64
63
  __version__ = "2023.11.08"
65
- ERASE_LINE = "\x1b[2K"
66
64
 
67
65
  ########################
68
66
 
@@ -307,12 +305,12 @@ if __name__ == "__main__":
307
305
  display_results(sorted_results, display_dict, None, pFilename)
308
306
 
309
307
  print(
310
- f"{Fore.RED}Found {len(AllHostedZones)} Hosted Zones across {len(AllAccountList)} accounts across {len(AllRegionList)} regions{Fore.RESET}"
308
+ f"[red]Found {len(AllHostedZones)} Hosted Zones across {len(AllAccountList)} accounts across {len(AllRegionList)} regions"
311
309
  )
312
310
  print()
313
311
  if pTiming:
314
312
  print(ERASE_LINE)
315
- print(f"{Fore.GREEN}This script took {time() - begin_time:.2f} seconds{Fore.RESET}")
313
+ print(f"[green]This script took {time() - begin_time:.2f} seconds")
316
314
  print(ERASE_LINE)
317
315
  print("Thanks for using this script...")
318
316
  print()
@@ -97,11 +97,10 @@ import Inventory_Modules
97
97
  from account_class import aws_acct_access
98
98
  from ArgumentsClass import CommonArguments
99
99
  from botocore.exceptions import ClientError, ProfileNotFound, UnknownCredentialError, UnknownRegionError
100
- from colorama import Fore, init
100
+ from runbooks.common.rich_utils import console
101
101
  from Inventory_Modules import display_results
102
- from tqdm.auto import tqdm
102
+ from runbooks.common.rich_utils import create_progress_bar
103
103
 
104
- init()
105
104
  __version__ = "2023.08.09"
106
105
 
107
106
  parser = CommonArguments()
@@ -175,7 +174,7 @@ def find_account_stacksets(faws_acct, f_SCProducts, fRegion=None, fstacksetname=
175
174
  # Get the work from the queue and expand the tuple
176
175
  c_sc_product, c_region, c_fstacksetname, c_PlacesToLook, c_PlaceCount = self.queue.get()
177
176
  logging.info(f"De-queued info for SC Product: {c_sc_product['SCPName']}")
178
- logging.info(f"{Fore.RED}Checking {PlaceCount} of {len(f_SCProducts)} products{Fore.RESET}")
177
+ logging.info(f"[red]Checking {PlaceCount} of {len(f_SCProducts)} products")
179
178
  CFNresponse = Inventory_Modules.find_stacks3(faws_acct, pRegion, c_sc_product["SCPId"])
180
179
  logging.info(
181
180
  f"There are {len(CFNresponse)} matches for SC Provisioned Product Name {c_sc_product['SCPName']}"
@@ -206,10 +205,10 @@ def find_account_stacksets(faws_acct, f_SCProducts, fRegion=None, fstacksetname=
206
205
  AccountStatus = AccountHistogram[AccountID]
207
206
  else:
208
207
  AccountStatus = "Closed"
209
- logging.info(f"{Fore.RED}Found the Account ID: {AccountID}{Fore.RESET}")
208
+ logging.info(f"[red]Found the Account ID: {AccountID}")
210
209
  if AccountID in SuspendedAccounts:
211
210
  logging.error(
212
- f"{Fore.RED}Account ID {AccountID} has been suspended{Fore.RESET}"
211
+ f"[red]Account ID {AccountID} has been suspended"
213
212
  )
214
213
  break
215
214
  else:
@@ -258,7 +257,7 @@ def find_account_stacksets(faws_acct, f_SCProducts, fRegion=None, fstacksetname=
258
257
  logging.info(
259
258
  f"Finished finding product {c_sc_product['SCPName']} - {c_PlaceCount} / {c_PlacesToLook}"
260
259
  )
261
- pbar.update()
260
+ progress.update(task, advance=1)
262
261
  self.queue.task_done()
263
262
 
264
263
  if fRegion is None:
@@ -269,33 +268,31 @@ def find_account_stacksets(faws_acct, f_SCProducts, fRegion=None, fstacksetname=
269
268
  PlaceCount = 0
270
269
  PlacesToLook = WorkerThreads = min(len(f_SCProducts), 10)
271
270
 
272
- pbar = tqdm(
273
- desc=f"Reconciling SC Products with CloudFormation Stacks in accounts",
274
- leave=True,
275
- total=len(f_SCProducts),
276
- unit=" products",
277
- )
271
+ with create_progress_bar() as progress:
272
+ task = progress.add_task(
273
+ f"Reconciling SC Products with CloudFormation Stacks in accounts",
274
+ total=len(f_SCProducts)
275
+ )
278
276
 
279
- # Create and start the worker threads
280
- for x in range(WorkerThreads):
281
- worker = CheckProducts(checkqueue)
282
- # Setting daemon to True will let the main thread exit even though the workers are blocking
283
- worker.daemon = True
284
- worker.start()
285
-
286
- for SCProduct in SCProducts:
287
- logging.info(f"Checking service catalog product: {SCProduct['SCPName']}")
288
- try:
289
- # print(f"{ERASE_LINE}Queuing account {credential['AccountId']} in region {region}", end='\r')
290
- checkqueue.put((SCProduct, fRegion, fstacksetname, PlacesToLook, PlaceCount))
291
- PlaceCount += 1
292
- except ClientError as my_Error:
293
- if "AuthFailure" in str(my_Error):
294
- logging.error(f"Authorization Failure accessing account {faws_acct.acct_number} in {fRegion} region")
295
- logging.warning(f"It's possible that the region {fRegion} hasn't been opted-into")
296
- pass
297
- checkqueue.join()
298
- pbar.close()
277
+ # Create and start the worker threads
278
+ for x in range(WorkerThreads):
279
+ worker = CheckProducts(checkqueue)
280
+ # Setting daemon to True will let the main thread exit even though the workers are blocking
281
+ worker.daemon = True
282
+ worker.start()
283
+
284
+ for SCProduct in SCProducts:
285
+ logging.info(f"Checking service catalog product: {SCProduct['SCPName']}")
286
+ try:
287
+ # print(f"{ERASE_LINE}Queuing account {credential['AccountId']} in region {region}", end='\r')
288
+ checkqueue.put((SCProduct, fRegion, fstacksetname, PlacesToLook, PlaceCount))
289
+ PlaceCount += 1
290
+ except ClientError as my_Error:
291
+ if "AuthFailure" in str(my_Error):
292
+ logging.error(f"Authorization Failure accessing account {faws_acct.acct_number} in {fRegion} region")
293
+ logging.warning(f"It's possible that the region {fRegion} hasn't been opted-into")
294
+ pass
295
+ checkqueue.join()
299
296
  return SCP2Stacks
300
297
 
301
298
 
@@ -320,7 +317,6 @@ Significant Variable Explanation:
320
317
  """
321
318
  begin_time = time()
322
319
 
323
- ERASE_LINE = "\x1b[2K"
324
320
 
325
321
  print()
326
322
 
@@ -437,7 +433,7 @@ def main():
437
433
 
438
434
  if pTiming:
439
435
  print(
440
- f"{Fore.GREEN}Finding stacks in your account has taken {time() - begin_time:.2f} seconds now...{Fore.RESET}"
436
+ f"[green]Finding stacks in your account has taken {time() - begin_time:.2f} seconds now..."
441
437
  )
442
438
  milestone1 = time()
443
439
 
@@ -454,7 +450,7 @@ def main():
454
450
 
455
451
  if pTiming:
456
452
  print(
457
- f"{Fore.GREEN}Reconciling products to the CloudFormation stacks took {time() - milestone1:.2f} seconds{Fore.RESET}"
453
+ f"[green]Reconciling products to the CloudFormation stacks took {time() - milestone1:.2f} seconds"
458
454
  )
459
455
 
460
456
  # TODO: This might not be a good idea, if it misses the stacks which are associated with accounts no longer within the Org.
@@ -501,21 +497,21 @@ def main():
501
497
  pass # This is the desired state, so no user output is needed.
502
498
  elif AccountHistogram[acctnum] == "SUSPENDED":
503
499
  print(
504
- f"{Fore.RED}While there is no SC Product associated, account number {acctnum} appears to be a suspended account.{Fore.RESET}"
500
+ f"[red]While there is no SC Product associated, account number {acctnum} appears to be a suspended account."
505
501
  )
506
502
  elif (
507
503
  AccountHistogram[acctnum] == "ACTIVE"
508
504
  ): # This compare needs to be separate from below, since we can't compare a string with a "<" operator
509
505
  print(
510
- f"Account Number {Fore.RED}{acctnum}{Fore.RESET} appears to have no SC Product associated with it. This can be a problem"
506
+ f"Account Number [red]{acctnum} appears to have no SC Product associated with it. This can be a problem"
511
507
  )
512
508
  elif AccountHistogram[acctnum] < 1:
513
509
  print(
514
- f"Account Number {Fore.RED}{acctnum}{Fore.RESET} appears to have no SC Product associated with it. This can be a problem"
510
+ f"Account Number [red]{acctnum} appears to have no SC Product associated with it. This can be a problem"
515
511
  )
516
512
  elif AccountHistogram[acctnum] > 1:
517
513
  print(
518
- f"Account Number {Fore.RED}{acctnum}{Fore.RESET} appears to have multiple SC Products associated with it. This can be a problem"
514
+ f"Account Number [red]{acctnum} appears to have multiple SC Products associated with it. This can be a problem"
519
515
  )
520
516
 
521
517
  if ErroredSCProductExists:
@@ -561,7 +557,7 @@ def main():
561
557
  end_time = time()
562
558
  duration = end_time - begin_time
563
559
  if pTiming:
564
- print(f"{Fore.GREEN}This script took {duration:.2f} seconds{Fore.RESET}")
560
+ print(f"[green]This script took {duration:.2f} seconds")
565
561
  print(f"We found {len(aws_acct.ChildAccounts)} accounts within the Org")
566
562
  print(f"We found {len(SCProducts)} Service Catalog Products")
567
563
  print(f"We found {len(SuspendedAccounts)} Suspended accounts")
@@ -69,10 +69,9 @@ from time import time
69
69
  import Inventory_Modules
70
70
  from ArgumentsClass import CommonArguments
71
71
  from botocore.exceptions import ClientError
72
- from colorama import Fore, init
72
+ from runbooks.common.rich_utils import console
73
73
  from Inventory_Modules import display_results, get_all_credentials
74
74
 
75
- init()
76
75
  __version__ = "2023.11.08"
77
76
  begin_time = time()
78
77
 
@@ -317,7 +316,6 @@ def present_results(f_data_found: list):
317
316
 
318
317
 
319
318
  ##########################
320
- ERASE_LINE = "\x1b[2K"
321
319
 
322
320
  if __name__ == "__main__":
323
321
  args = parse_args(sys.argv[1:])
@@ -355,6 +353,6 @@ if __name__ == "__main__":
355
353
 
356
354
  print()
357
355
  if pTiming:
358
- print(f"{Fore.GREEN}This script completed in {time() - begin_time:.2f} seconds{Fore.RESET}")
356
+ print(f"[green]This script completed in {time() - begin_time:.2f} seconds")
359
357
  print()
360
358
  print("Thank you for using this script.")
@@ -64,14 +64,11 @@ from time import time
64
64
 
65
65
  from ArgumentsClass import CommonArguments
66
66
  from botocore.exceptions import ClientError
67
- from colorama import Fore, init
67
+ from runbooks.common.rich_utils import console
68
68
  from Inventory_Modules import display_results, find_ssm_parameters2, get_all_credentials
69
- from tqdm.auto import tqdm
70
69
 
71
- init()
72
70
  __version__ = "2024.05.07"
73
71
  begin_time = time()
74
- ERASE_LINE = "\x1b[2K"
75
72
 
76
73
 
77
74
  ##################
@@ -236,7 +233,7 @@ def find_ssm_parameters(f_credentialList):
236
233
  parameter_list.extend(find_ssm_parameters2(credential))
237
234
  # Optional verbose logging for parameter discovery progress (currently commented)
238
235
  # if verbose < 50 or len(parameter_list) == 0:
239
- # print(f"Found a running total of {len(parameter_list)} parameters in account {Fore.RED}{credential['AccountNumber']}{Fore.RESET} in region {Fore.RED}{credential['Region']}{Fore.RESET}")
236
+ # print(f"Found a running total of {len(parameter_list)} parameters in account [red]{credential['AccountNumber']} in region [red]{credential['Region']}")
240
237
  except ClientError as my_Error:
241
238
  # Handle AWS API authorization failures gracefully
242
239
  if "AuthFailure" in str(my_Error):
@@ -404,7 +401,7 @@ if __name__ == "__main__":
404
401
  # Display performance timing metrics for operational optimization
405
402
  if pTiming:
406
403
  print(ERASE_LINE)
407
- print(f"{Fore.GREEN}This script took {time() - begin_time:.2f} seconds{Fore.RESET}")
404
+ print(f"[green]This script took {time() - begin_time:.2f} seconds")
408
405
 
409
406
  print()
410
407
 
@@ -424,7 +421,7 @@ if __name__ == "__main__":
424
421
  # Display completion message and output file information
425
422
  print("Thank you for using this script")
426
423
  print(
427
- f"Your output was saved to {Fore.GREEN}'{pFilename}-{datetime.now().strftime('%y-%m-%d--%H:%M:%S')}'{Fore.RESET}"
424
+ f"Your output was saved to [green]'{pFilename}-{datetime.now().strftime('%y-%m-%d--%H:%M:%S')}'"
428
425
  ) if pFilename is not None else None
429
426
 
430
427
  print()
@@ -76,10 +76,9 @@ from time import time
76
76
  import Inventory_Modules
77
77
  from ArgumentsClass import CommonArguments
78
78
  from botocore.exceptions import ClientError
79
- from colorama import Fore, init
79
+ from runbooks.common.rich_utils import console
80
80
  from Inventory_Modules import display_results, get_all_credentials
81
81
 
82
- init()
83
82
  __version__ = "2024.10.24"
84
83
 
85
84
  # TODO: Add Elastic IPs to this script as well.
@@ -384,7 +383,6 @@ def analyze_results(fSubnetsFound: list):
384
383
  ##################
385
384
 
386
385
 
387
- ERASE_LINE = "\x1b[2K"
388
386
  begin_time = time()
389
387
 
390
388
  if __name__ == "__main__":
@@ -426,7 +424,7 @@ if __name__ == "__main__":
426
424
  analyze_results(SubnetsFound)
427
425
  if pTiming:
428
426
  print(ERASE_LINE)
429
- print(f"{Fore.GREEN}This script completed in {time() - begin_time:.2f} seconds{Fore.RESET}")
427
+ print(f"[green]This script completed in {time() - begin_time:.2f} seconds")
430
428
 
431
429
  print()
432
430
  print("Thank you for using this script")
@@ -62,10 +62,9 @@ from time import time
62
62
  import Inventory_Modules
63
63
  from ArgumentsClass import CommonArguments
64
64
  from botocore.exceptions import ClientError
65
- from colorama import Fore, init
66
65
  from Inventory_Modules import display_results, get_all_credentials
66
+ from runbooks.common.rich_utils import console
67
67
 
68
- init()
69
68
  __version__ = "2024.01.26"
70
69
 
71
70
 
@@ -324,9 +323,9 @@ def find_all_vpcs(fAllCredentials, fDefaultOnly=False):
324
323
 
325
324
  for credential in fAllCredentials:
326
325
  logging.info(f"Beginning to queue data - starting with {credential['AccountId']}")
327
- print(
328
- f"{ERASE_LINE}Checking {credential['AccountId']} in region {credential['Region']} - {PlaceCount + 1} / {len(fAllCredentials)}",
329
- end="\r",
326
+ console.print(
327
+ f"Checking {credential['AccountId']} in region {credential['Region']} - {PlaceCount + 1} / {len(fAllCredentials)}",
328
+ end="",
330
329
  )
331
330
  # for region in fRegionList:
332
331
  try:
@@ -361,8 +360,6 @@ if __name__ == "__main__":
361
360
  verbose = args.loglevel
362
361
  logging.basicConfig(level=verbose, format="[%(filename)s:%(lineno)s - %(funcName)30s() ] %(message)s")
363
362
 
364
- ERASE_LINE = "\x1b[2K"
365
-
366
363
  begin_time = time()
367
364
 
368
365
  NumVpcsFound = 0
@@ -409,9 +406,9 @@ if __name__ == "__main__":
409
406
  logging.info(f"Threads all done - took {time() - begin_time:.2f} seconds")
410
407
 
411
408
  if pTiming:
412
- print(ERASE_LINE)
413
- print(f"{Fore.GREEN}This script took {time() - begin_time:.2f} seconds{Fore.RESET}")
414
- print(ERASE_LINE)
409
+ console.print()
410
+ console.print(f"[green]This script took {time() - begin_time:.2f} seconds[/green]")
411
+ console.print()
415
412
  # Had to do this, because some of the VPCs that show up in the "sorted_AllVPCs" list are actually the same VPC, with a different CIDR range.
416
413
  Num_of_unique_VPCs = len(set([x["VpcId"] for x in sorted_AllVPCs]))
417
414
  print(