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
runbooks/common/date_utils.py
CHANGED
@@ -22,94 +22,82 @@ def get_current_year() -> int:
|
|
22
22
|
def get_current_month_period() -> Dict[str, str]:
|
23
23
|
"""
|
24
24
|
Generate current month's start and end dates for AWS API calls.
|
25
|
-
|
25
|
+
|
26
26
|
Returns:
|
27
27
|
Dict with 'Start' and 'End' keys in YYYY-MM-DD format
|
28
28
|
"""
|
29
29
|
now = datetime.now()
|
30
|
-
start_date = now.replace(day=1).strftime(
|
31
|
-
|
30
|
+
start_date = now.replace(day=1).strftime("%Y-%m-%d")
|
31
|
+
|
32
32
|
# Get last day of current month
|
33
33
|
if now.month == 12:
|
34
34
|
next_month = now.replace(year=now.year + 1, month=1, day=1)
|
35
35
|
else:
|
36
36
|
next_month = now.replace(month=now.month + 1, day=1)
|
37
|
-
|
38
|
-
end_date = (next_month - timedelta(days=1)).strftime(
|
39
|
-
|
40
|
-
return {
|
41
|
-
'Start': start_date,
|
42
|
-
'End': end_date
|
43
|
-
}
|
37
|
+
|
38
|
+
end_date = (next_month - timedelta(days=1)).strftime("%Y-%m-%d")
|
39
|
+
|
40
|
+
return {"Start": start_date, "End": end_date}
|
44
41
|
|
45
42
|
|
46
43
|
def get_previous_month_period() -> Dict[str, str]:
|
47
44
|
"""
|
48
45
|
Generate previous month's start and end dates for AWS API calls.
|
49
|
-
|
46
|
+
|
50
47
|
Returns:
|
51
48
|
Dict with 'Start' and 'End' keys in YYYY-MM-DD format
|
52
49
|
"""
|
53
50
|
now = datetime.now()
|
54
|
-
|
51
|
+
|
55
52
|
# Get first day of previous month
|
56
53
|
if now.month == 1:
|
57
54
|
prev_month = now.replace(year=now.year - 1, month=12, day=1)
|
58
55
|
else:
|
59
56
|
prev_month = now.replace(month=now.month - 1, day=1)
|
60
|
-
|
61
|
-
start_date = prev_month.strftime(
|
62
|
-
|
63
|
-
# Get last day of previous month
|
64
|
-
end_date = (now.replace(day=1) - timedelta(days=1)).strftime(
|
65
|
-
|
66
|
-
return {
|
67
|
-
'Start': start_date,
|
68
|
-
'End': end_date
|
69
|
-
}
|
57
|
+
|
58
|
+
start_date = prev_month.strftime("%Y-%m-%d")
|
59
|
+
|
60
|
+
# Get last day of previous month
|
61
|
+
end_date = (now.replace(day=1) - timedelta(days=1)).strftime("%Y-%m-%d")
|
62
|
+
|
63
|
+
return {"Start": start_date, "End": end_date}
|
70
64
|
|
71
65
|
|
72
66
|
def get_test_date_period(days_back: int = 30) -> Dict[str, str]:
|
73
67
|
"""
|
74
68
|
Generate test date periods for consistent test data.
|
75
|
-
|
69
|
+
|
76
70
|
Args:
|
77
71
|
days_back: Number of days back from today for start date
|
78
|
-
|
72
|
+
|
79
73
|
Returns:
|
80
74
|
Dict with 'Start' and 'End' keys in YYYY-MM-DD format
|
81
75
|
"""
|
82
|
-
end_date = datetime.now().strftime(
|
83
|
-
start_date = (datetime.now() - timedelta(days=days_back)).strftime(
|
84
|
-
|
85
|
-
return {
|
86
|
-
'Start': start_date,
|
87
|
-
'End': end_date
|
88
|
-
}
|
76
|
+
end_date = datetime.now().strftime("%Y-%m-%d")
|
77
|
+
start_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
|
78
|
+
|
79
|
+
return {"Start": start_date, "End": end_date}
|
89
80
|
|
90
81
|
|
91
82
|
def get_aws_cli_example_period() -> Tuple[str, str]:
|
92
83
|
"""
|
93
84
|
Generate example date period for AWS CLI documentation.
|
94
85
|
Uses yesterday and today to ensure valid time range.
|
95
|
-
|
86
|
+
|
96
87
|
Returns:
|
97
88
|
Tuple of (start_date, end_date) in YYYY-MM-DD format
|
98
89
|
"""
|
99
90
|
today = datetime.now()
|
100
91
|
yesterday = today - timedelta(days=1)
|
101
|
-
|
102
|
-
return (
|
103
|
-
yesterday.strftime('%Y-%m-%d'),
|
104
|
-
today.strftime('%Y-%m-%d')
|
105
|
-
)
|
92
|
+
|
93
|
+
return (yesterday.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d"))
|
106
94
|
|
107
95
|
|
108
96
|
def get_collection_timestamp() -> str:
|
109
97
|
"""
|
110
98
|
Generate collection timestamp for test data.
|
111
|
-
|
99
|
+
|
112
100
|
Returns:
|
113
101
|
ISO format timestamp string
|
114
102
|
"""
|
115
|
-
return datetime.now().isoformat()
|
103
|
+
return datetime.now().isoformat()
|
runbooks/common/decorators.py
CHANGED
@@ -41,8 +41,13 @@ def common_output_options(f):
|
|
41
41
|
- --format: Output format selection (table, csv, json, markdown, pdf)
|
42
42
|
- --output-file: File output destination
|
43
43
|
"""
|
44
|
-
f = click.option(
|
45
|
-
|
44
|
+
f = click.option(
|
45
|
+
"--format",
|
46
|
+
"output_format",
|
47
|
+
type=click.Choice(["table", "csv", "json", "markdown", "pdf"]),
|
48
|
+
default="table",
|
49
|
+
help="Output format",
|
50
|
+
)(f)
|
46
51
|
f = click.option("--output-file", type=click.Path(), help="Output file path")(f)
|
47
52
|
return f
|
48
53
|
|
@@ -69,6 +74,7 @@ def performance_timing(f):
|
|
69
74
|
Automatically tracks and reports command execution time for performance
|
70
75
|
monitoring and optimization analysis.
|
71
76
|
"""
|
77
|
+
|
72
78
|
@functools.wraps(f)
|
73
79
|
def wrapper(*args, **kwargs):
|
74
80
|
start_time = time.time()
|
@@ -98,6 +104,7 @@ def error_handler(f):
|
|
98
104
|
- Consistent error message structure
|
99
105
|
- Debug information when enabled
|
100
106
|
"""
|
107
|
+
|
101
108
|
@functools.wraps(f)
|
102
109
|
def wrapper(*args, **kwargs):
|
103
110
|
try:
|
@@ -124,14 +131,16 @@ def require_aws_profile(f):
|
|
124
131
|
Validates that the AWS profile exists and is accessible before
|
125
132
|
executing commands that require AWS API access.
|
126
133
|
"""
|
134
|
+
|
127
135
|
@functools.wraps(f)
|
128
136
|
def wrapper(*args, **kwargs):
|
129
137
|
# Get profile from context or kwargs
|
130
138
|
ctx = click.get_current_context()
|
131
|
-
profile = ctx.obj.get(
|
139
|
+
profile = ctx.obj.get("profile", "default")
|
132
140
|
|
133
141
|
try:
|
134
142
|
import boto3
|
143
|
+
|
135
144
|
# Test profile access
|
136
145
|
session = boto3.Session(profile_name=profile)
|
137
146
|
session.get_credentials()
|
@@ -154,36 +163,37 @@ def enterprise_audit_trail(f):
|
|
154
163
|
- User context and timestamp
|
155
164
|
- Execution results and duration
|
156
165
|
"""
|
166
|
+
|
157
167
|
@functools.wraps(f)
|
158
168
|
def wrapper(*args, **kwargs):
|
159
169
|
ctx = click.get_current_context()
|
160
170
|
|
161
171
|
# Log command execution start
|
162
172
|
audit_data = {
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
173
|
+
"command": ctx.command.name,
|
174
|
+
"profile": ctx.obj.get("profile", "default"),
|
175
|
+
"region": ctx.obj.get("region", "default"),
|
176
|
+
"dry_run": ctx.obj.get("dry_run", False),
|
177
|
+
"timestamp": time.time(),
|
168
178
|
}
|
169
179
|
|
170
180
|
try:
|
171
181
|
result = f(*args, **kwargs)
|
172
|
-
audit_data[
|
173
|
-
audit_data[
|
182
|
+
audit_data["status"] = "success"
|
183
|
+
audit_data["duration"] = time.time() - audit_data["timestamp"]
|
174
184
|
|
175
185
|
# Log successful execution
|
176
|
-
if ctx.obj.get(
|
186
|
+
if ctx.obj.get("debug"):
|
177
187
|
console.print(f"[dim]📋 Audit: {audit_data}[/dim]")
|
178
188
|
|
179
189
|
return result
|
180
190
|
except Exception as e:
|
181
|
-
audit_data[
|
182
|
-
audit_data[
|
183
|
-
audit_data[
|
191
|
+
audit_data["status"] = "error"
|
192
|
+
audit_data["error"] = str(e)
|
193
|
+
audit_data["duration"] = time.time() - audit_data["timestamp"]
|
184
194
|
|
185
195
|
# Log failed execution
|
186
|
-
if ctx.obj.get(
|
196
|
+
if ctx.obj.get("debug"):
|
187
197
|
console.print(f"[dim]📋 Audit: {audit_data}[/dim]")
|
188
198
|
|
189
199
|
raise
|
@@ -201,15 +211,14 @@ def rich_progress(description: str = "Processing"):
|
|
201
211
|
Automatically shows a progress spinner for operations that take time,
|
202
212
|
improving user experience for long-running commands.
|
203
213
|
"""
|
214
|
+
|
204
215
|
def decorator(f):
|
205
216
|
@functools.wraps(f)
|
206
217
|
def wrapper(*args, **kwargs):
|
207
218
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
208
219
|
|
209
220
|
with Progress(
|
210
|
-
SpinnerColumn(),
|
211
|
-
TextColumn("[progress.description]{task.description}"),
|
212
|
-
console=console
|
221
|
+
SpinnerColumn(), TextColumn("[progress.description]{task.description}"), console=console
|
213
222
|
) as progress:
|
214
223
|
task = progress.add_task(description, total=None)
|
215
224
|
|
@@ -222,4 +231,5 @@ def rich_progress(description: str = "Processing"):
|
|
222
231
|
raise
|
223
232
|
|
224
233
|
return wrapper
|
225
|
-
|
234
|
+
|
235
|
+
return decorator
|