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.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/assessment/compliance.py +1 -1
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cli/__init__.py +1 -1
- runbooks/cli/commands/cfat.py +64 -23
- runbooks/cli/commands/finops.py +1005 -54
- runbooks/cli/commands/inventory.py +135 -91
- runbooks/cli/commands/operate.py +9 -36
- runbooks/cli/commands/security.py +42 -18
- runbooks/cli/commands/validation.py +432 -18
- runbooks/cli/commands/vpc.py +81 -17
- runbooks/cli/registry.py +22 -10
- runbooks/cloudops/__init__.py +20 -27
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +544 -542
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +224 -225
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +177 -213
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +17 -12
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +40 -36
- runbooks/common/aws_utils.py +74 -79
- runbooks/common/business_logic.py +126 -104
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +455 -463
- runbooks/common/cross_account_manager.py +197 -204
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +29 -19
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +476 -493
- runbooks/common/mcp_integration.py +99 -79
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +175 -193
- runbooks/common/patterns.py +23 -25
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +111 -37
- runbooks/common/rich_utils.py +315 -141
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +26 -30
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +484 -618
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +32 -29
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +223 -285
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +337 -174
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1512 -481
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +19 -23
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +64 -65
- runbooks/finops/scenarios.py +1277 -438
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +259 -265
- runbooks/finops/vpc_cleanup_exporter.py +189 -144
- runbooks/finops/vpc_cleanup_optimizer.py +591 -573
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/aws_decorators.py +2 -3
- runbooks/inventory/check_cloudtrail_compliance.py +2 -4
- runbooks/inventory/check_controltower_readiness.py +152 -151
- runbooks/inventory/check_landingzone_readiness.py +85 -84
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +1 -1
- runbooks/inventory/collectors/aws_networking.py +109 -99
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/core/formatter.py +11 -0
- runbooks/inventory/draw_org_structure.py +8 -9
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/ec2_vpc_utils.py +2 -2
- runbooks/inventory/find_cfn_drift_detection.py +5 -7
- runbooks/inventory/find_cfn_orphaned_stacks.py +7 -9
- runbooks/inventory/find_cfn_stackset_drift.py +5 -6
- runbooks/inventory/find_ec2_security_groups.py +48 -42
- runbooks/inventory/find_landingzone_versions.py +4 -6
- runbooks/inventory/find_vpc_flow_logs.py +7 -9
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/inventory_modules.py +103 -91
- runbooks/inventory/list_cfn_stacks.py +9 -10
- runbooks/inventory/list_cfn_stackset_operation_results.py +1 -3
- runbooks/inventory/list_cfn_stackset_operations.py +79 -57
- runbooks/inventory/list_cfn_stacksets.py +8 -10
- runbooks/inventory/list_config_recorders_delivery_channels.py +49 -39
- runbooks/inventory/list_ds_directories.py +65 -53
- runbooks/inventory/list_ec2_availability_zones.py +2 -4
- runbooks/inventory/list_ec2_ebs_volumes.py +32 -35
- runbooks/inventory/list_ec2_instances.py +23 -28
- runbooks/inventory/list_ecs_clusters_and_tasks.py +26 -34
- runbooks/inventory/list_elbs_load_balancers.py +22 -20
- runbooks/inventory/list_enis_network_interfaces.py +26 -33
- runbooks/inventory/list_guardduty_detectors.py +2 -4
- runbooks/inventory/list_iam_policies.py +2 -4
- runbooks/inventory/list_iam_roles.py +5 -7
- runbooks/inventory/list_iam_saml_providers.py +4 -6
- runbooks/inventory/list_lambda_functions.py +38 -38
- runbooks/inventory/list_org_accounts.py +6 -8
- runbooks/inventory/list_org_accounts_users.py +55 -44
- runbooks/inventory/list_rds_db_instances.py +31 -33
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/list_route53_hosted_zones.py +3 -5
- runbooks/inventory/list_servicecatalog_provisioned_products.py +37 -41
- runbooks/inventory/list_sns_topics.py +2 -4
- runbooks/inventory/list_ssm_parameters.py +4 -7
- runbooks/inventory/list_vpc_subnets.py +2 -4
- runbooks/inventory/list_vpcs.py +7 -10
- runbooks/inventory/mcp_inventory_validator.py +554 -468
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +63 -55
- runbooks/inventory/recover_cfn_stack_ids.py +7 -8
- runbooks/inventory/requirements.txt +0 -1
- runbooks/inventory/rich_inventory_display.py +35 -34
- runbooks/inventory/run_on_multi_accounts.py +3 -5
- runbooks/inventory/unified_validation_engine.py +281 -253
- runbooks/inventory/verify_ec2_security_groups.py +1 -1
- runbooks/inventory/vpc_analyzer.py +735 -697
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +384 -380
- runbooks/inventory/vpc_flow_analyzer.py +1 -1
- runbooks/main.py +49 -34
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/networking_cost_heatmap.py +29 -8
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_operations.py +646 -616
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +70 -66
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +86 -60
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +46 -41
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +50 -47
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +745 -704
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +461 -454
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +185 -160
- runbooks/vpc/mcp_no_eni_validator.py +680 -639
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1297 -1124
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.6.dist-info/METADATA +327 -0
- runbooks-1.1.6.dist-info/RECORD +489 -0
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -973
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.4.dist-info/METADATA +0 -800
- runbooks-1.1.4.dist-info/RECORD +0 -468
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/WHEEL +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.4.dist-info → runbooks-1.1.6.dist-info}/licenses/LICENSE +0 -0
- {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
|
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"
|
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"
|
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
|
100
|
+
from runbooks.common.rich_utils import console
|
101
101
|
from Inventory_Modules import display_results
|
102
|
-
from
|
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"
|
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"
|
208
|
+
logging.info(f"[red]Found the Account ID: {AccountID}")
|
210
209
|
if AccountID in SuspendedAccounts:
|
211
210
|
logging.error(
|
212
|
-
f"
|
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
|
-
|
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
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
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
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
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"
|
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"
|
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"
|
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 {
|
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 {
|
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 {
|
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"
|
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
|
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"
|
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
|
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 {
|
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"
|
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
|
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
|
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"
|
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")
|
runbooks/inventory/list_vpcs.py
CHANGED
@@ -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"
|
329
|
-
end="
|
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(
|
413
|
-
print(f"
|
414
|
-
print(
|
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(
|