localstack-core 4.5.1.dev60__py3-none-any.whl → 4.5.1.dev61__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.
- localstack/packages/core.py +61 -20
- localstack/packages/ffmpeg.py +6 -1
- localstack/packages/terraform.py +6 -0
- localstack/utils/archives.py +47 -3
- localstack/utils/checksum.py +313 -0
- localstack/utils/files.py +1 -1
- localstack/version.py +2 -2
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/METADATA +1 -1
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/RECORD +17 -16
- localstack_core-4.5.1.dev61.dist-info/plux.json +1 -0
- localstack_core-4.5.1.dev60.dist-info/plux.json +0 -1
- {localstack_core-4.5.1.dev60.data → localstack_core-4.5.1.dev61.data}/scripts/localstack +0 -0
- {localstack_core-4.5.1.dev60.data → localstack_core-4.5.1.dev61.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.5.1.dev60.data → localstack_core-4.5.1.dev61.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/WHEEL +0 -0
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/top_level.txt +0 -0
localstack/packages/core.py
CHANGED
@@ -63,7 +63,12 @@ class DownloadInstaller(ExecutableInstaller):
|
|
63
63
|
|
64
64
|
|
65
65
|
class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
|
66
|
-
def __init__(
|
66
|
+
def __init__(
|
67
|
+
self,
|
68
|
+
name: str,
|
69
|
+
version: str,
|
70
|
+
extract_single_directory: bool = False,
|
71
|
+
):
|
67
72
|
"""
|
68
73
|
:param name: technical package name, f.e. "opensearch"
|
69
74
|
:param version: version of the package to install
|
@@ -78,6 +83,16 @@ class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
|
|
78
83
|
def _get_download_url(self) -> str:
|
79
84
|
raise NotImplementedError()
|
80
85
|
|
86
|
+
def _get_checksum_url(self) -> str | None:
|
87
|
+
"""
|
88
|
+
Checksum URL for the archive. This is used to verify the integrity of the downloaded archive.
|
89
|
+
This method can be implemented by subclasses to provide the correct URL for the checksum file.
|
90
|
+
If not implemented, checksum verification will be skipped.
|
91
|
+
|
92
|
+
:return: URL to the checksum file for the archive, or None if not available.
|
93
|
+
"""
|
94
|
+
return None
|
95
|
+
|
81
96
|
def get_installed_dir(self) -> str | None:
|
82
97
|
installed_dir = super().get_installed_dir()
|
83
98
|
subdir = self._get_archive_subdir()
|
@@ -107,29 +122,55 @@ class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
|
|
107
122
|
return self._get_install_marker_path(install_dir)
|
108
123
|
return None
|
109
124
|
|
110
|
-
def
|
125
|
+
def _handle_single_directory_extraction(self, target_directory: str) -> None:
|
126
|
+
"""
|
127
|
+
Handle extraction of archives that contain a single root directory.
|
128
|
+
Moves the contents up one level if extract_single_directory is True.
|
129
|
+
|
130
|
+
:param target_directory: The target extraction directory
|
131
|
+
:return: None
|
132
|
+
"""
|
133
|
+
if not self.extract_single_directory:
|
134
|
+
return
|
135
|
+
|
136
|
+
dir_contents = os.listdir(target_directory)
|
137
|
+
if len(dir_contents) != 1:
|
138
|
+
return
|
139
|
+
target_subdir = os.path.join(target_directory, dir_contents[0])
|
140
|
+
if not os.path.isdir(target_subdir):
|
141
|
+
return
|
142
|
+
os.rename(target_subdir, f"{target_directory}.backup")
|
143
|
+
rm_rf(target_directory)
|
144
|
+
os.rename(f"{target_directory}.backup", target_directory)
|
145
|
+
|
146
|
+
def _download_archive(
|
147
|
+
self,
|
148
|
+
target: InstallTarget,
|
149
|
+
download_url: str,
|
150
|
+
) -> None:
|
111
151
|
target_directory = self._get_install_dir(target)
|
112
152
|
mkdir(target_directory)
|
113
|
-
download_url = self._get_download_url()
|
153
|
+
download_url = download_url or self._get_download_url()
|
114
154
|
archive_name = os.path.basename(download_url)
|
115
155
|
archive_path = os.path.join(config.dirs.tmp, archive_name)
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
156
|
+
|
157
|
+
# Get checksum info if available
|
158
|
+
checksum_url = self._get_checksum_url()
|
159
|
+
|
160
|
+
try:
|
161
|
+
download_and_extract(
|
162
|
+
download_url,
|
163
|
+
retries=3,
|
164
|
+
tmp_archive=archive_path,
|
165
|
+
target_dir=target_directory,
|
166
|
+
checksum_url=checksum_url,
|
167
|
+
)
|
168
|
+
self._handle_single_directory_extraction(target_directory)
|
169
|
+
finally:
|
170
|
+
rm_rf(archive_path)
|
171
|
+
|
172
|
+
def _install(self, target: InstallTarget) -> None:
|
173
|
+
self._download_archive(target, self._get_download_url())
|
133
174
|
|
134
175
|
|
135
176
|
class PermissionDownloadInstaller(DownloadInstaller, ABC):
|
localstack/packages/ffmpeg.py
CHANGED
@@ -9,7 +9,9 @@ from localstack.utils.platform import Arch, get_arch
|
|
9
9
|
ARCH_MAPPING = {Arch.amd64: "linux64", Arch.arm64: "linuxarm64"}
|
10
10
|
|
11
11
|
# Download URL template for ffmpeg 7.1 LGPL builds from BtbN GitHub Releases
|
12
|
-
|
12
|
+
FFMPEG_BASE_URL = "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest"
|
13
|
+
FFMPEG_STATIC_BIN_URL = FFMPEG_BASE_URL + "/ffmpeg-n{version}-latest-{arch}-lgpl-{version}.tar.xz"
|
14
|
+
FFMPEG_STATIC_CHECKSUM_URL = FFMPEG_BASE_URL + "/checksums.sha256"
|
13
15
|
|
14
16
|
|
15
17
|
class FfmpegPackage(Package["FfmpegPackageInstaller"]):
|
@@ -42,5 +44,8 @@ class FfmpegPackageInstaller(ArchiveDownloadAndExtractInstaller):
|
|
42
44
|
def get_ffprobe_path(self) -> str:
|
43
45
|
return os.path.join(self.get_installed_dir(), "bin", "ffprobe") # type: ignore[arg-type]
|
44
46
|
|
47
|
+
def _get_checksum_url(self) -> str | None:
|
48
|
+
return FFMPEG_STATIC_CHECKSUM_URL
|
49
|
+
|
45
50
|
|
46
51
|
ffmpeg_package = FfmpegPackage()
|
localstack/packages/terraform.py
CHANGED
@@ -11,6 +11,9 @@ TERRAFORM_VERSION = os.getenv("TERRAFORM_VERSION", "1.5.7")
|
|
11
11
|
TERRAFORM_URL_TEMPLATE = (
|
12
12
|
"https://releases.hashicorp.com/terraform/{version}/terraform_{version}_{os}_{arch}.zip"
|
13
13
|
)
|
14
|
+
TERRAFORM_CHECKSUM_URL_TEMPLATE = (
|
15
|
+
"https://releases.hashicorp.com/terraform/{version}/terraform_{version}_SHA256SUMS"
|
16
|
+
)
|
14
17
|
|
15
18
|
|
16
19
|
class TerraformPackage(Package["TerraformPackageInstaller"]):
|
@@ -37,5 +40,8 @@ class TerraformPackageInstaller(ArchiveDownloadAndExtractInstaller):
|
|
37
40
|
super()._install(target)
|
38
41
|
chmod_r(self.get_executable_path(), 0o777) # type: ignore[arg-type]
|
39
42
|
|
43
|
+
def _get_checksum_url(self) -> str | None:
|
44
|
+
return TERRAFORM_CHECKSUM_URL_TEMPLATE.format(version=TERRAFORM_VERSION)
|
45
|
+
|
40
46
|
|
41
47
|
terraform_package = TerraformPackage()
|
localstack/utils/archives.py
CHANGED
@@ -15,6 +15,7 @@ from localstack.utils.files import load_file, mkdir, new_tmp_file, rm_rf, save_f
|
|
15
15
|
from localstack.utils.http import download
|
16
16
|
from localstack.utils.run import run
|
17
17
|
|
18
|
+
from .checksum import verify_local_file_with_checksum_url
|
18
19
|
from .run import is_command_available
|
19
20
|
from .strings import truncate
|
20
21
|
|
@@ -176,7 +177,22 @@ def download_and_extract(
|
|
176
177
|
retries: Optional[int] = 0,
|
177
178
|
sleep: Optional[int] = 3,
|
178
179
|
tmp_archive: Optional[str] = None,
|
180
|
+
checksum_url: Optional[str] = None,
|
179
181
|
) -> None:
|
182
|
+
"""
|
183
|
+
Download and extract an archive to a target directory with optional checksum verification.
|
184
|
+
|
185
|
+
Checksum verification is only performed if a `checksum_url` is provided.
|
186
|
+
Else, the archive is downloaded and extracted without verification.
|
187
|
+
|
188
|
+
:param archive_url: URL of the archive to download
|
189
|
+
:param target_dir: Directory to extract the archive contents to
|
190
|
+
:param retries: Number of download retries (default: 0)
|
191
|
+
:param sleep: Sleep time between retries in seconds (default: 3)
|
192
|
+
:param tmp_archive: Optional path for the temporary archive file
|
193
|
+
:param checksum_url: Optional URL of the checksum file for verification
|
194
|
+
:return: None
|
195
|
+
"""
|
180
196
|
mkdir(target_dir)
|
181
197
|
|
182
198
|
_, ext = os.path.splitext(tmp_archive or archive_url)
|
@@ -204,6 +220,19 @@ def download_and_extract(
|
|
204
220
|
if os.path.getsize(tmp_archive) <= 0:
|
205
221
|
raise Exception("Failed to download archive from %s: . Retries exhausted", archive_url)
|
206
222
|
|
223
|
+
# Verify checksum if provided
|
224
|
+
if checksum_url:
|
225
|
+
LOG.info("Verifying archive integrity...")
|
226
|
+
try:
|
227
|
+
verify_local_file_with_checksum_url(
|
228
|
+
file_path=tmp_archive,
|
229
|
+
checksum_url=checksum_url,
|
230
|
+
)
|
231
|
+
except Exception as e:
|
232
|
+
# clean up the corrupted download
|
233
|
+
rm_rf(tmp_archive)
|
234
|
+
raise e
|
235
|
+
|
207
236
|
if ext == ".zip":
|
208
237
|
unzip(tmp_archive, target_dir)
|
209
238
|
elif ext in (
|
@@ -217,11 +246,26 @@ def download_and_extract(
|
|
217
246
|
raise Exception(f"Unsupported archive format: {ext}")
|
218
247
|
|
219
248
|
|
220
|
-
def download_and_extract_with_retry(
|
249
|
+
def download_and_extract_with_retry(
|
250
|
+
archive_url,
|
251
|
+
tmp_archive,
|
252
|
+
target_dir,
|
253
|
+
checksum_url: Optional[str] = None,
|
254
|
+
):
|
221
255
|
try:
|
222
|
-
download_and_extract(
|
256
|
+
download_and_extract(
|
257
|
+
archive_url,
|
258
|
+
target_dir,
|
259
|
+
tmp_archive=tmp_archive,
|
260
|
+
checksum_url=checksum_url,
|
261
|
+
)
|
223
262
|
except Exception as e:
|
224
263
|
# try deleting and re-downloading the zip file
|
225
264
|
LOG.info("Unable to extract file, re-downloading ZIP archive %s: %s", tmp_archive, e)
|
226
265
|
rm_rf(tmp_archive)
|
227
|
-
download_and_extract(
|
266
|
+
download_and_extract(
|
267
|
+
archive_url,
|
268
|
+
target_dir,
|
269
|
+
tmp_archive=tmp_archive,
|
270
|
+
checksum_url=checksum_url,
|
271
|
+
)
|
@@ -0,0 +1,313 @@
|
|
1
|
+
import hashlib
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
import re
|
5
|
+
import tempfile
|
6
|
+
from abc import ABC, abstractmethod
|
7
|
+
|
8
|
+
from localstack.utils.files import load_file, rm_rf
|
9
|
+
|
10
|
+
# Setup logger
|
11
|
+
LOG = logging.getLogger(__name__)
|
12
|
+
|
13
|
+
|
14
|
+
class ChecksumException(Exception):
|
15
|
+
"""Base exception for checksum errors."""
|
16
|
+
|
17
|
+
pass
|
18
|
+
|
19
|
+
|
20
|
+
class ChecksumFormat(ABC):
|
21
|
+
"""Abstract base class for checksum format parsers."""
|
22
|
+
|
23
|
+
@abstractmethod
|
24
|
+
def can_parse(self, content: str) -> bool:
|
25
|
+
"""
|
26
|
+
Check if this parser can handle the given content.
|
27
|
+
|
28
|
+
:param content: The content to check
|
29
|
+
:return: True if parser can handle content, False otherwise
|
30
|
+
"""
|
31
|
+
pass
|
32
|
+
|
33
|
+
@abstractmethod
|
34
|
+
def parse(self, content: str) -> dict[str, str]:
|
35
|
+
"""
|
36
|
+
Parse the content and return filename to checksum mapping.
|
37
|
+
|
38
|
+
:param content: The content to parse
|
39
|
+
:return: Dictionary mapping filenames to checksums
|
40
|
+
"""
|
41
|
+
pass
|
42
|
+
|
43
|
+
|
44
|
+
class StandardFormat(ChecksumFormat):
|
45
|
+
"""
|
46
|
+
Handles standard checksum format.
|
47
|
+
|
48
|
+
Supports formats like:
|
49
|
+
|
50
|
+
* ``checksum filename``
|
51
|
+
* ``checksum *filename``
|
52
|
+
"""
|
53
|
+
|
54
|
+
def can_parse(self, content: str) -> bool:
|
55
|
+
lines = content.strip().split("\n")
|
56
|
+
for line in lines[:5]: # Check first 5 lines
|
57
|
+
if re.match(r"^[a-fA-F0-9]{32,128}\s+\S+", line.strip()):
|
58
|
+
return True
|
59
|
+
return False
|
60
|
+
|
61
|
+
def parse(self, content: str) -> dict[str, str]:
|
62
|
+
checksums = {}
|
63
|
+
for line in content.strip().split("\n"):
|
64
|
+
line = line.strip()
|
65
|
+
if not line or line.startswith("#"):
|
66
|
+
continue
|
67
|
+
|
68
|
+
# Match: checksum (whitespace) filename
|
69
|
+
match = re.match(r"^([a-fA-F0-9]{32,128})\s+(\*?)(.+)$", line)
|
70
|
+
if match:
|
71
|
+
checksum, star, filename = match.groups()
|
72
|
+
checksums[filename.strip()] = checksum.lower()
|
73
|
+
|
74
|
+
return checksums
|
75
|
+
|
76
|
+
|
77
|
+
class BSDFormat(ChecksumFormat):
|
78
|
+
"""
|
79
|
+
Handles BSD-style checksum format.
|
80
|
+
|
81
|
+
Format: ``SHA512 (filename) = checksum``
|
82
|
+
"""
|
83
|
+
|
84
|
+
def can_parse(self, content: str) -> bool:
|
85
|
+
lines = content.strip().split("\n")
|
86
|
+
for line in lines[:5]:
|
87
|
+
if re.match(r"^(MD5|SHA1|SHA256|SHA512)\s*\(.+\)\s*=\s*[a-fA-F0-9]+", line):
|
88
|
+
return True
|
89
|
+
return False
|
90
|
+
|
91
|
+
def parse(self, content: str) -> dict[str, str]:
|
92
|
+
checksums = {}
|
93
|
+
for line in content.strip().split("\n"):
|
94
|
+
line = line.strip()
|
95
|
+
if not line:
|
96
|
+
continue
|
97
|
+
|
98
|
+
# Match: ALGORITHM (filename) = checksum
|
99
|
+
match = re.match(r"^(MD5|SHA1|SHA256|SHA512)\s*\((.+)\)\s*=\s*([a-fA-F0-9]+)$", line)
|
100
|
+
if match:
|
101
|
+
algo, filename, checksum = match.groups()
|
102
|
+
checksums[filename.strip()] = checksum.lower()
|
103
|
+
|
104
|
+
return checksums
|
105
|
+
|
106
|
+
|
107
|
+
class ApacheBSDFormat(ChecksumFormat):
|
108
|
+
"""
|
109
|
+
Handles Apache's BSD-style format with split checksums.
|
110
|
+
|
111
|
+
Format::
|
112
|
+
|
113
|
+
filename: CHECKSUM_PART1
|
114
|
+
CHECKSUM_PART2
|
115
|
+
CHECKSUM_PART3
|
116
|
+
"""
|
117
|
+
|
118
|
+
def can_parse(self, content: str) -> bool:
|
119
|
+
lines = content.strip().split("\n")
|
120
|
+
if lines and ":" in lines[0]:
|
121
|
+
# Check if it looks like filename: hex_data
|
122
|
+
parts = lines[0].split(":", 1)
|
123
|
+
if len(parts) == 2 and re.search(r"[a-fA-F0-9\s]+", parts[1]):
|
124
|
+
return True
|
125
|
+
return False
|
126
|
+
|
127
|
+
def parse(self, content: str) -> dict[str, str]:
|
128
|
+
checksums = {}
|
129
|
+
lines = content.strip().split("\n")
|
130
|
+
|
131
|
+
current_file = None
|
132
|
+
checksum_parts = []
|
133
|
+
|
134
|
+
for line in lines:
|
135
|
+
if ":" in line and not line.startswith(" "):
|
136
|
+
# New file entry
|
137
|
+
if current_file and checksum_parts:
|
138
|
+
# Save previous file's checksum
|
139
|
+
full_checksum = "".join(checksum_parts).replace(" ", "").lower()
|
140
|
+
if re.match(r"^[a-fA-F0-9]+$", full_checksum):
|
141
|
+
checksums[current_file] = full_checksum
|
142
|
+
|
143
|
+
# Start new file
|
144
|
+
parts = line.split(":", 1)
|
145
|
+
current_file = parts[0].strip()
|
146
|
+
checksum_part = parts[1].strip()
|
147
|
+
checksum_parts = [checksum_part]
|
148
|
+
elif line.strip() and current_file:
|
149
|
+
# Continuation of checksum
|
150
|
+
checksum_parts.append(line.strip())
|
151
|
+
|
152
|
+
# Don't forget the last file
|
153
|
+
if current_file and checksum_parts:
|
154
|
+
full_checksum = "".join(checksum_parts).replace(" ", "").lower()
|
155
|
+
if re.match(r"^[a-fA-F0-9]+$", full_checksum):
|
156
|
+
checksums[current_file] = full_checksum
|
157
|
+
|
158
|
+
return checksums
|
159
|
+
|
160
|
+
|
161
|
+
class ChecksumParser:
|
162
|
+
"""Main parser that tries different checksum formats."""
|
163
|
+
|
164
|
+
def __init__(self):
|
165
|
+
"""Initialize parser with available format parsers."""
|
166
|
+
self.formats = [
|
167
|
+
StandardFormat(),
|
168
|
+
BSDFormat(),
|
169
|
+
ApacheBSDFormat(),
|
170
|
+
]
|
171
|
+
|
172
|
+
def parse(self, content: str) -> dict[str, str]:
|
173
|
+
"""
|
174
|
+
Try each format parser until one works.
|
175
|
+
|
176
|
+
:param content: The content to parse
|
177
|
+
:return: Dictionary mapping filenames to checksums
|
178
|
+
"""
|
179
|
+
for format_parser in self.formats:
|
180
|
+
if format_parser.can_parse(content):
|
181
|
+
result = format_parser.parse(content)
|
182
|
+
if result:
|
183
|
+
return result
|
184
|
+
|
185
|
+
return {}
|
186
|
+
|
187
|
+
|
188
|
+
def parse_checksum_file_from_url(checksum_url: str) -> dict[str, str]:
|
189
|
+
"""
|
190
|
+
Parse a SHA checksum file from a URL using multiple format parsers.
|
191
|
+
|
192
|
+
:param checksum_url: URL of the checksum file
|
193
|
+
:return: Dictionary mapping filenames to checksums
|
194
|
+
"""
|
195
|
+
# import here to avoid circular dependency issues
|
196
|
+
from localstack.utils.http import download
|
197
|
+
|
198
|
+
checksum_name = os.path.basename(checksum_url)
|
199
|
+
checksum_path = os.path.join(tempfile.gettempdir(), checksum_name)
|
200
|
+
try:
|
201
|
+
download(checksum_url, checksum_path)
|
202
|
+
checksum_content = load_file(checksum_path)
|
203
|
+
|
204
|
+
parser = ChecksumParser()
|
205
|
+
checksums = parser.parse(checksum_content)
|
206
|
+
|
207
|
+
return checksums
|
208
|
+
finally:
|
209
|
+
rm_rf(checksum_path)
|
210
|
+
|
211
|
+
|
212
|
+
def calculate_file_checksum(file_path: str, algorithm: str = "sha256") -> str:
|
213
|
+
"""
|
214
|
+
Calculate checksum of a local file.
|
215
|
+
|
216
|
+
:param file_path: Path to the file
|
217
|
+
:param algorithm: Hash algorithm to use
|
218
|
+
:return: Calculated checksum as hexadecimal string
|
219
|
+
|
220
|
+
note: Supported algorithms: 'md5', 'sha1', 'sha256', 'sha512'
|
221
|
+
"""
|
222
|
+
hash_func = getattr(hashlib, algorithm)()
|
223
|
+
|
224
|
+
with open(file_path, "rb") as f:
|
225
|
+
# Read file in chunks to handle large files efficiently
|
226
|
+
for chunk in iter(lambda: f.read(8192), b""):
|
227
|
+
hash_func.update(chunk)
|
228
|
+
|
229
|
+
return hash_func.hexdigest()
|
230
|
+
|
231
|
+
|
232
|
+
def verify_local_file_with_checksum_url(file_path: str, checksum_url: str, filename=None) -> bool:
|
233
|
+
"""
|
234
|
+
Verify a local file against checksums from an online checksum file.
|
235
|
+
|
236
|
+
:param file_path: Path to the local file to verify
|
237
|
+
:param checksum_url: URL of the checksum file
|
238
|
+
:param filename: Filename to look for in checksum file (defaults to basename of file_path)
|
239
|
+
:return: True if verification succeeds, False otherwise
|
240
|
+
|
241
|
+
note: The algorithm is automatically detected based on checksum length:
|
242
|
+
|
243
|
+
* 32 characters: MD5
|
244
|
+
* 40 characters: SHA1
|
245
|
+
* 64 characters: SHA256
|
246
|
+
* 128 characters: SHA512
|
247
|
+
"""
|
248
|
+
# Get checksums from URL
|
249
|
+
LOG.debug("Fetching checksums from %s...", checksum_url)
|
250
|
+
checksums = parse_checksum_file_from_url(checksum_url)
|
251
|
+
|
252
|
+
if not checksums:
|
253
|
+
raise ChecksumException(f"No checksums found in {checksum_url}")
|
254
|
+
|
255
|
+
# Determine filename to look for
|
256
|
+
if filename is None:
|
257
|
+
filename = os.path.basename(file_path)
|
258
|
+
|
259
|
+
# Find checksum for our file
|
260
|
+
if filename not in checksums:
|
261
|
+
# Try with different path variations
|
262
|
+
possible_names = [
|
263
|
+
filename,
|
264
|
+
os.path.basename(filename), # just filename without path
|
265
|
+
filename.replace("\\", "/"), # Unix-style paths
|
266
|
+
filename.replace("/", "\\"), # Windows-style paths
|
267
|
+
]
|
268
|
+
|
269
|
+
found = False
|
270
|
+
for name in possible_names:
|
271
|
+
if name in checksums:
|
272
|
+
filename = name
|
273
|
+
found = True
|
274
|
+
break
|
275
|
+
|
276
|
+
if not found:
|
277
|
+
raise ChecksumException(f"Checksum for {filename} not found in {checksum_url}")
|
278
|
+
|
279
|
+
expected_checksum = checksums[filename]
|
280
|
+
|
281
|
+
# Detect algorithm based on checksum length
|
282
|
+
checksum_length = len(expected_checksum)
|
283
|
+
if checksum_length == 32:
|
284
|
+
algorithm = "md5"
|
285
|
+
elif checksum_length == 40:
|
286
|
+
algorithm = "sha1"
|
287
|
+
elif checksum_length == 64:
|
288
|
+
algorithm = "sha256"
|
289
|
+
elif checksum_length == 128:
|
290
|
+
algorithm = "sha512"
|
291
|
+
else:
|
292
|
+
raise ChecksumException(f"Unsupported checksum length: {checksum_length}")
|
293
|
+
|
294
|
+
# Calculate checksum of local file
|
295
|
+
LOG.debug("Calculating %s checksum of %s...", algorithm, file_path)
|
296
|
+
calculated_checksum = calculate_file_checksum(file_path, algorithm)
|
297
|
+
|
298
|
+
is_valid = calculated_checksum == expected_checksum.lower()
|
299
|
+
|
300
|
+
if not is_valid:
|
301
|
+
LOG.error(
|
302
|
+
"Checksum mismatch for %s: calculated %s, expected %s",
|
303
|
+
file_path,
|
304
|
+
calculated_checksum,
|
305
|
+
expected_checksum,
|
306
|
+
)
|
307
|
+
raise ChecksumException(
|
308
|
+
f"Checksum mismatch for {file_path}: calculated {calculated_checksum}, expected {expected_checksum}"
|
309
|
+
)
|
310
|
+
LOG.debug("Checksum verification successful for %s", file_path)
|
311
|
+
|
312
|
+
# Compare checksums
|
313
|
+
return calculated_checksum == expected_checksum.lower()
|
localstack/utils/files.py
CHANGED
@@ -81,7 +81,7 @@ def save_file(file, content, append=False, permissions=None):
|
|
81
81
|
f.flush()
|
82
82
|
|
83
83
|
|
84
|
-
def load_file(file_path, default=None, mode=None):
|
84
|
+
def load_file(file_path: str, default=None, mode=None):
|
85
85
|
if not os.path.isfile(file_path):
|
86
86
|
return default
|
87
87
|
if not mode:
|
localstack/version.py
CHANGED
@@ -17,5 +17,5 @@ __version__: str
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
18
18
|
version_tuple: VERSION_TUPLE
|
19
19
|
|
20
|
-
__version__ = version = '4.5.1.
|
21
|
-
__version_tuple__ = version_tuple = (4, 5, 1, '
|
20
|
+
__version__ = version = '4.5.1.dev61'
|
21
|
+
__version_tuple__ = version_tuple = (4, 5, 1, 'dev61')
|
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
|
|
4
4
|
localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
|
5
5
|
localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
|
6
6
|
localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
-
localstack/version.py,sha256=
|
7
|
+
localstack/version.py,sha256=FjxN4bR44gs_Q2TWSmMVOqI6NjQfFLE7vZCPtWzhRbk,526
|
8
8
|
localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
9
|
localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
|
10
10
|
localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
|
@@ -149,12 +149,12 @@ localstack/logging/format.py,sha256=AkTRZcLapZFKx7e6SjOAQ5Hxim19HhbL2sz-Z9WyRpk,
|
|
149
149
|
localstack/logging/setup.py,sha256=tFUU8Jbw5Pa3Y3a0vyFXcBplz3qc-yGewVfrm59i1vk,4901
|
150
150
|
localstack/packages/__init__.py,sha256=o22iDQIrfvTS3Qj2CSHQ7ouKpYhtcIa5DPPM73xe8kI,533
|
151
151
|
localstack/packages/api.py,sha256=N1cJQ4Wl4H8BEutmJ_9zPfmbVlIoCZlqUnimb-h1MNo,17148
|
152
|
-
localstack/packages/core.py,sha256=
|
152
|
+
localstack/packages/core.py,sha256=wvgZHyMS-Fs0dRiq8bG9NmAE6ff5aO8Z21DA00Ogu_8,16081
|
153
153
|
localstack/packages/debugpy.py,sha256=L3VPJ6_iK7kzp1Yn6wqSKKsxtEyTmS_Y41qefhvBrdk,1388
|
154
|
-
localstack/packages/ffmpeg.py,sha256=
|
154
|
+
localstack/packages/ffmpeg.py,sha256=PQNCuZaRLzVzzfuz914YiI8F7UDyIvSuEbyfhCb2fEo,1961
|
155
155
|
localstack/packages/java.py,sha256=3Rmzo6g5RweLoa2pxJ8ETeT-JL48fo8xRcR2YPUMwzk,7764
|
156
156
|
localstack/packages/plugins.py,sha256=Ban7a_1tSzu0j5hD2nPN67K_8MQH7e4NrNUkpk9omM0,803
|
157
|
-
localstack/packages/terraform.py,sha256=
|
157
|
+
localstack/packages/terraform.py,sha256=4SfKvMlqvfKSlpRDc3-wpMe1AlyZnT_8sBZW1wNXAN4,1676
|
158
158
|
localstack/runtime/__init__.py,sha256=th-8bfJFd011WcYnrlmpe0-79UWJ2LOqEZWLpVQno5Y,83
|
159
159
|
localstack/runtime/analytics.py,sha256=0ytf5BpRuL3ZIfdxdwiUXkH2jGuxCTs4E-uqtA5xiHI,4813
|
160
160
|
localstack/runtime/components.py,sha256=Mkbukxm1TM2uKFKHXf5HoPsQ5jEywZ2hADxbPBteLOY,1641
|
@@ -1199,13 +1199,14 @@ localstack/testing/testselection/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5
|
|
1199
1199
|
localstack/testing/testselection/scripts/filter_by_test_selection.py,sha256=NXMEJtAEbS1wEMWBA2TkpbYJvpcvqZF2DsHN-6SRHUc,1043
|
1200
1200
|
localstack/testing/testselection/scripts/generate_test_selection.py,sha256=CGTgsSian0_F0BSyyspW3dLoIrzz1LDpkP3_tF3DK3M,4410
|
1201
1201
|
localstack/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1202
|
-
localstack/utils/archives.py,sha256=
|
1202
|
+
localstack/utils/archives.py,sha256=5jA-vioItIfqWw7wy0DSlaXFVLco4nXuj4I-DywNTxM,9857
|
1203
1203
|
localstack/utils/async_utils.py,sha256=diN_tDL6hIs1n7k1kWN5gOl141lFToLt6Tjf0dGNyBQ,282
|
1204
1204
|
localstack/utils/asyncio.py,sha256=hBn7XH7Txk0WA_kwRvVjHudWJuDZxOkiNd9pQJl4_Lk,5210
|
1205
1205
|
localstack/utils/auth.py,sha256=uZNbD3hoQE29BykHANiy0uh-yLcvR05zjyYGN7gDmXQ,2415
|
1206
1206
|
localstack/utils/backoff.py,sha256=mVyADce0BzHFA0MzbQ3VH6R9i3DBLitxGOEj-LeLD48,4117
|
1207
1207
|
localstack/utils/batch_policy.py,sha256=jLzSb5y_-fszblGXfz7hDCpTmomTBTfsTjU4uP8QS5Q,4243
|
1208
1208
|
localstack/utils/bootstrap.py,sha256=b6zB9Z9xpIA03T8bQdlBEAZCaWpCKI4Xs1Cu1PJspS8,50144
|
1209
|
+
localstack/utils/checksum.py,sha256=1-TjZs7faIX23wi9cBfNOooe8SsJIdIsE6a7G49xLjg,9726
|
1209
1210
|
localstack/utils/collections.py,sha256=RbNxoAeEp12PBriCkueMTBgShlsQ1sTM9QgkvKPh6vY,17517
|
1210
1211
|
localstack/utils/common.py,sha256=A6pfxPHyDR8xsFTcxmxmKDSfGY1NMhn6NFXaS-sJDVM,6427
|
1211
1212
|
localstack/utils/config_listener.py,sha256=x7mStigWGTM6vg4HViXdSeD8kE3GpWUOcRwvHrraghE,1218
|
@@ -1215,7 +1216,7 @@ localstack/utils/crypto.py,sha256=tz02ZyXsSL5O_nKyQDHfeBt1DbaVT0qJLdRCZmjMVLc,72
|
|
1215
1216
|
localstack/utils/diagnose.py,sha256=n-Eerc9HfGAUCIwv-qDBnmNcN08ZqznP2_QdJ8VjSQA,4735
|
1216
1217
|
localstack/utils/docker_utils.py,sha256=1LfOjtyImeQPQdicmL0UCf4-f8cE2rHsrFjNGHYlFEc,9637
|
1217
1218
|
localstack/utils/event_matcher.py,sha256=_DtCZI0ba4Zcit_-TwCUSIG_NXiYgIjmWbuKuMrsZkk,2024
|
1218
|
-
localstack/utils/files.py,sha256=
|
1219
|
+
localstack/utils/files.py,sha256=6LVStQYQEMpwAd3oj9iV-3X1nHak3zve2S-991hYw2U,9418
|
1219
1220
|
localstack/utils/functions.py,sha256=J_CfhahMm4VBED8ZJ9FGRH-ku_KyOE0W13UY1lHw5RQ,2981
|
1220
1221
|
localstack/utils/http.py,sha256=wt9H-6jw1MbMgZsVpoGQdlFIHMdEBVXM_IzCdVVflLA,11690
|
1221
1222
|
localstack/utils/id_generator.py,sha256=ncGLyjA8QOy-2n16bBf3B_oTI1Kck1-RJcTLcJEvQHA,1697
|
@@ -1285,13 +1286,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
|
|
1285
1286
|
localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
1286
1287
|
localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
|
1287
1288
|
localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
|
1288
|
-
localstack_core-4.5.1.
|
1289
|
-
localstack_core-4.5.1.
|
1290
|
-
localstack_core-4.5.1.
|
1291
|
-
localstack_core-4.5.1.
|
1292
|
-
localstack_core-4.5.1.
|
1293
|
-
localstack_core-4.5.1.
|
1294
|
-
localstack_core-4.5.1.
|
1295
|
-
localstack_core-4.5.1.
|
1296
|
-
localstack_core-4.5.1.
|
1297
|
-
localstack_core-4.5.1.
|
1289
|
+
localstack_core-4.5.1.dev61.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
|
1290
|
+
localstack_core-4.5.1.dev61.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
|
1291
|
+
localstack_core-4.5.1.dev61.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
|
1292
|
+
localstack_core-4.5.1.dev61.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
|
1293
|
+
localstack_core-4.5.1.dev61.dist-info/METADATA,sha256=-UBrgzB2nWxdlQMjD3w0Nj7EKqyhd45UFiv4dByw6YU,5539
|
1294
|
+
localstack_core-4.5.1.dev61.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
1295
|
+
localstack_core-4.5.1.dev61.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
|
1296
|
+
localstack_core-4.5.1.dev61.dist-info/plux.json,sha256=DBmKVc7QBEP-HeK-4cGfwH0wRf2n0YMoMXojKBrV4-o,20891
|
1297
|
+
localstack_core-4.5.1.dev61.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
|
1298
|
+
localstack_core-4.5.1.dev61.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"localstack.cloudformation.resource_providers": ["AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.on_infra_shutdown": ["_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services"], "localstack.hooks.on_infra_start": ["_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "eager_load_services=localstack.services.plugins:eager_load_services", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"]}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"localstack.cloudformation.resource_providers": ["AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "eager_load_services=localstack.services.plugins:eager_load_services", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package"], "localstack.hooks.on_infra_shutdown": ["run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"]}
|
File without changes
|
{localstack_core-4.5.1.dev60.data → localstack_core-4.5.1.dev61.data}/scripts/localstack-supervisor
RENAMED
File without changes
|
{localstack_core-4.5.1.dev60.data → localstack_core-4.5.1.dev61.data}/scripts/localstack.bat
RENAMED
File without changes
|
File without changes
|
{localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/entry_points.txt
RENAMED
File without changes
|
{localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/licenses/LICENSE.txt
RENAMED
File without changes
|
{localstack_core-4.5.1.dev60.dist-info → localstack_core-4.5.1.dev61.dist-info}/top_level.txt
RENAMED
File without changes
|