aws-inventory-manager 0.13.2__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.

Potentially problematic release.


This version of aws-inventory-manager might be problematic. Click here for more details.

Files changed (145) hide show
  1. aws_inventory_manager-0.13.2.dist-info/LICENSE +21 -0
  2. aws_inventory_manager-0.13.2.dist-info/METADATA +1226 -0
  3. aws_inventory_manager-0.13.2.dist-info/RECORD +145 -0
  4. aws_inventory_manager-0.13.2.dist-info/WHEEL +5 -0
  5. aws_inventory_manager-0.13.2.dist-info/entry_points.txt +2 -0
  6. aws_inventory_manager-0.13.2.dist-info/top_level.txt +1 -0
  7. src/__init__.py +3 -0
  8. src/aws/__init__.py +11 -0
  9. src/aws/client.py +128 -0
  10. src/aws/credentials.py +191 -0
  11. src/aws/rate_limiter.py +177 -0
  12. src/cli/__init__.py +12 -0
  13. src/cli/config.py +130 -0
  14. src/cli/main.py +3626 -0
  15. src/config_service/__init__.py +21 -0
  16. src/config_service/collector.py +346 -0
  17. src/config_service/detector.py +256 -0
  18. src/config_service/resource_type_mapping.py +328 -0
  19. src/cost/__init__.py +5 -0
  20. src/cost/analyzer.py +226 -0
  21. src/cost/explorer.py +209 -0
  22. src/cost/reporter.py +237 -0
  23. src/delta/__init__.py +5 -0
  24. src/delta/calculator.py +206 -0
  25. src/delta/differ.py +185 -0
  26. src/delta/formatters.py +272 -0
  27. src/delta/models.py +154 -0
  28. src/delta/reporter.py +234 -0
  29. src/models/__init__.py +21 -0
  30. src/models/config_diff.py +135 -0
  31. src/models/cost_report.py +87 -0
  32. src/models/deletion_operation.py +104 -0
  33. src/models/deletion_record.py +97 -0
  34. src/models/delta_report.py +122 -0
  35. src/models/efs_resource.py +80 -0
  36. src/models/elasticache_resource.py +90 -0
  37. src/models/group.py +318 -0
  38. src/models/inventory.py +133 -0
  39. src/models/protection_rule.py +123 -0
  40. src/models/report.py +288 -0
  41. src/models/resource.py +111 -0
  42. src/models/security_finding.py +102 -0
  43. src/models/snapshot.py +122 -0
  44. src/restore/__init__.py +20 -0
  45. src/restore/audit.py +175 -0
  46. src/restore/cleaner.py +461 -0
  47. src/restore/config.py +209 -0
  48. src/restore/deleter.py +976 -0
  49. src/restore/dependency.py +254 -0
  50. src/restore/safety.py +115 -0
  51. src/security/__init__.py +0 -0
  52. src/security/checks/__init__.py +0 -0
  53. src/security/checks/base.py +56 -0
  54. src/security/checks/ec2_checks.py +88 -0
  55. src/security/checks/elasticache_checks.py +149 -0
  56. src/security/checks/iam_checks.py +102 -0
  57. src/security/checks/rds_checks.py +140 -0
  58. src/security/checks/s3_checks.py +95 -0
  59. src/security/checks/secrets_checks.py +96 -0
  60. src/security/checks/sg_checks.py +142 -0
  61. src/security/cis_mapper.py +97 -0
  62. src/security/models.py +53 -0
  63. src/security/reporter.py +174 -0
  64. src/security/scanner.py +87 -0
  65. src/snapshot/__init__.py +6 -0
  66. src/snapshot/capturer.py +451 -0
  67. src/snapshot/filter.py +259 -0
  68. src/snapshot/inventory_storage.py +236 -0
  69. src/snapshot/report_formatter.py +250 -0
  70. src/snapshot/reporter.py +189 -0
  71. src/snapshot/resource_collectors/__init__.py +5 -0
  72. src/snapshot/resource_collectors/apigateway.py +140 -0
  73. src/snapshot/resource_collectors/backup.py +136 -0
  74. src/snapshot/resource_collectors/base.py +81 -0
  75. src/snapshot/resource_collectors/cloudformation.py +55 -0
  76. src/snapshot/resource_collectors/cloudwatch.py +109 -0
  77. src/snapshot/resource_collectors/codebuild.py +69 -0
  78. src/snapshot/resource_collectors/codepipeline.py +82 -0
  79. src/snapshot/resource_collectors/dynamodb.py +65 -0
  80. src/snapshot/resource_collectors/ec2.py +240 -0
  81. src/snapshot/resource_collectors/ecs.py +215 -0
  82. src/snapshot/resource_collectors/efs_collector.py +102 -0
  83. src/snapshot/resource_collectors/eks.py +200 -0
  84. src/snapshot/resource_collectors/elasticache_collector.py +79 -0
  85. src/snapshot/resource_collectors/elb.py +126 -0
  86. src/snapshot/resource_collectors/eventbridge.py +156 -0
  87. src/snapshot/resource_collectors/iam.py +188 -0
  88. src/snapshot/resource_collectors/kms.py +111 -0
  89. src/snapshot/resource_collectors/lambda_func.py +139 -0
  90. src/snapshot/resource_collectors/rds.py +109 -0
  91. src/snapshot/resource_collectors/route53.py +86 -0
  92. src/snapshot/resource_collectors/s3.py +105 -0
  93. src/snapshot/resource_collectors/secretsmanager.py +70 -0
  94. src/snapshot/resource_collectors/sns.py +68 -0
  95. src/snapshot/resource_collectors/sqs.py +82 -0
  96. src/snapshot/resource_collectors/ssm.py +160 -0
  97. src/snapshot/resource_collectors/stepfunctions.py +74 -0
  98. src/snapshot/resource_collectors/vpcendpoints.py +79 -0
  99. src/snapshot/resource_collectors/waf.py +159 -0
  100. src/snapshot/storage.py +351 -0
  101. src/storage/__init__.py +21 -0
  102. src/storage/audit_store.py +419 -0
  103. src/storage/database.py +294 -0
  104. src/storage/group_store.py +749 -0
  105. src/storage/inventory_store.py +320 -0
  106. src/storage/resource_store.py +413 -0
  107. src/storage/schema.py +288 -0
  108. src/storage/snapshot_store.py +346 -0
  109. src/utils/__init__.py +12 -0
  110. src/utils/export.py +305 -0
  111. src/utils/hash.py +60 -0
  112. src/utils/logging.py +63 -0
  113. src/utils/pagination.py +41 -0
  114. src/utils/paths.py +51 -0
  115. src/utils/progress.py +41 -0
  116. src/utils/unsupported_resources.py +306 -0
  117. src/web/__init__.py +5 -0
  118. src/web/app.py +97 -0
  119. src/web/dependencies.py +69 -0
  120. src/web/routes/__init__.py +1 -0
  121. src/web/routes/api/__init__.py +18 -0
  122. src/web/routes/api/charts.py +156 -0
  123. src/web/routes/api/cleanup.py +186 -0
  124. src/web/routes/api/filters.py +253 -0
  125. src/web/routes/api/groups.py +305 -0
  126. src/web/routes/api/inventories.py +80 -0
  127. src/web/routes/api/queries.py +202 -0
  128. src/web/routes/api/resources.py +379 -0
  129. src/web/routes/api/snapshots.py +314 -0
  130. src/web/routes/api/views.py +260 -0
  131. src/web/routes/pages.py +198 -0
  132. src/web/services/__init__.py +1 -0
  133. src/web/templates/base.html +949 -0
  134. src/web/templates/components/navbar.html +31 -0
  135. src/web/templates/components/sidebar.html +104 -0
  136. src/web/templates/pages/audit_logs.html +86 -0
  137. src/web/templates/pages/cleanup.html +279 -0
  138. src/web/templates/pages/dashboard.html +227 -0
  139. src/web/templates/pages/diff.html +175 -0
  140. src/web/templates/pages/error.html +30 -0
  141. src/web/templates/pages/groups.html +721 -0
  142. src/web/templates/pages/queries.html +246 -0
  143. src/web/templates/pages/resources.html +2251 -0
  144. src/web/templates/pages/snapshot_detail.html +271 -0
  145. src/web/templates/pages/snapshots.html +429 -0
src/cli/__init__.py ADDED
@@ -0,0 +1,12 @@
1
+ """CLI module for AWS Baseline Snapshot tool."""
2
+
3
+ __all__ = ["app", "cli_main"]
4
+
5
+
6
+ def __getattr__(name: str):
7
+ """Lazy import to avoid RuntimeWarning when running with python -m."""
8
+ if name in ("app", "cli_main"):
9
+ from .main import app, cli_main
10
+
11
+ return app if name == "app" else cli_main
12
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
src/cli/config.py ADDED
@@ -0,0 +1,130 @@
1
+ """Configuration loader for CLI."""
2
+
3
+ import logging
4
+ import os
5
+ from pathlib import Path
6
+ from typing import Any, Dict, List, Optional
7
+
8
+ import yaml
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class Config:
14
+ """Application configuration manager."""
15
+
16
+ def __init__(self) -> None:
17
+ """Initialize configuration with defaults."""
18
+ self.snapshot_dir: str = ".snapshots"
19
+ self.storage_path: Optional[str] = None # Runtime override for snapshot storage path
20
+ self.regions: List[str] = [] # Empty means all enabled regions
21
+ self.resource_types: List[str] = [] # Empty means all supported types
22
+ self.aws_profile: Optional[str] = None
23
+ self.parallel_workers: int = 10
24
+ self.auto_compress_mb: int = 10
25
+ self.log_level: str = "INFO"
26
+
27
+ @classmethod
28
+ def load(cls, config_file: Optional[str] = None) -> "Config":
29
+ """Load configuration from file and environment variables.
30
+
31
+ Priority (highest to lowest):
32
+ 1. Environment variables
33
+ 2. Config file
34
+ 3. Defaults
35
+
36
+ Args:
37
+ config_file: Path to config file (optional)
38
+
39
+ Returns:
40
+ Config instance
41
+ """
42
+ config = cls()
43
+
44
+ # Try to load from config file
45
+ config_path = None
46
+ if config_file:
47
+ config_path = Path(config_file)
48
+ else:
49
+ # Try current directory first
50
+ config_path = Path(".aws-baseline.yaml")
51
+ if not config_path.exists():
52
+ # Try home directory
53
+ config_path = Path.home() / ".aws-baseline.yaml"
54
+
55
+ if config_path and config_path.exists():
56
+ config._load_from_file(config_path)
57
+
58
+ # Override with environment variables
59
+ config._load_from_env()
60
+
61
+ return config
62
+
63
+ def _load_from_file(self, config_path: Path) -> None:
64
+ """Load configuration from YAML file.
65
+
66
+ Args:
67
+ config_path: Path to config file
68
+ """
69
+ try:
70
+ with open(config_path, "r") as f:
71
+ data = yaml.safe_load(f)
72
+
73
+ if not data:
74
+ return
75
+
76
+ self.snapshot_dir = data.get("snapshot_dir", self.snapshot_dir)
77
+ self.regions = data.get("regions", self.regions)
78
+ self.aws_profile = data.get("aws_profile", self.aws_profile)
79
+ self.parallel_workers = data.get("parallel_workers", self.parallel_workers)
80
+ self.auto_compress_mb = data.get("auto_compress_mb", self.auto_compress_mb)
81
+
82
+ # Handle resource_types (include/exclude)
83
+ resource_types_config = data.get("resource_types", {})
84
+ if isinstance(resource_types_config, dict):
85
+ self.resource_types = resource_types_config.get("include", [])
86
+ elif isinstance(resource_types_config, list):
87
+ self.resource_types = resource_types_config
88
+
89
+ logger.info(f"Loaded configuration from {config_path}")
90
+
91
+ except Exception as e:
92
+ logger.warning(f"Could not load config file {config_path}: {e}")
93
+
94
+ def _load_from_env(self) -> None:
95
+ """Load configuration from environment variables."""
96
+ # AWS_BASELINE_SNAPSHOT_DIR
97
+ snapshot_dir = os.getenv("AWS_BASELINE_SNAPSHOT_DIR")
98
+ if snapshot_dir:
99
+ self.snapshot_dir = snapshot_dir
100
+
101
+ # AWS_BASELINE_LOG_LEVEL
102
+ log_level = os.getenv("AWS_BASELINE_LOG_LEVEL")
103
+ if log_level:
104
+ self.log_level = log_level
105
+
106
+ # AWS_PROFILE
107
+ aws_profile = os.getenv("AWS_PROFILE")
108
+ if aws_profile:
109
+ self.aws_profile = aws_profile
110
+
111
+ # AWS_REGION (single region from env)
112
+ aws_region = os.getenv("AWS_REGION")
113
+ if aws_region:
114
+ self.regions = [aws_region]
115
+
116
+ def to_dict(self) -> Dict[str, Any]:
117
+ """Convert configuration to dictionary.
118
+
119
+ Returns:
120
+ Configuration as dictionary
121
+ """
122
+ return {
123
+ "snapshot_dir": self.snapshot_dir,
124
+ "regions": self.regions,
125
+ "resource_types": self.resource_types,
126
+ "aws_profile": self.aws_profile,
127
+ "parallel_workers": self.parallel_workers,
128
+ "auto_compress_mb": self.auto_compress_mb,
129
+ "log_level": self.log_level,
130
+ }