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
@@ -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
|
12
|
-
from
|
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"
|
176
|
+
f"[blue] 0. Checks to ensure you have the necessary cross-account role access to the child account."
|
179
177
|
)
|
180
|
-
print(f"
|
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"
|
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"
|
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"
|
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"
|
198
|
-
print(f" to see if there's already a
|
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"
|
198
|
+
f"[blue] 3. Checks that there isn't a duplicate [red]CloudTrail trail in the account."
|
201
199
|
)
|
202
200
|
print(
|
203
|
-
f"
|
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"
|
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
|
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"
|
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"
|
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
|
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
|
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
|
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
|
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
|
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"
|
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"
|
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
|
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
|
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
|
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
|
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"
|
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
|
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
|
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
|
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
|
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
|
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"
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
643
|
+
print(f"{ERASE_LINE + Fore.RED}** Step 5 completed with blockers found")
|
646
644
|
print()
|
647
645
|
|
648
|
-
print(f"
|
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 =
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
"
|
667
|
-
|
668
|
-
|
669
|
-
|
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
|
-
|
679
|
-
|
680
|
-
|
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
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
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]")
|