diff --git a/.bazelignore b/.bazelignore index 4c4e2f91..a61acfce 100644 --- a/.bazelignore +++ b/.bazelignore @@ -1,2 +1,3 @@ # nested modules e2e/ +examples/ diff --git a/.bazelversion b/.bazelversion index 978bcb20..e0741a83 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1,7 +1 @@ -7.5.0 -# The first line of this file is used by Bazelisk and Bazel to be sure -# the right version of Bazel is used to build and test this repo. -# This also defines which version is used on CI. -# -# Note that you should also run integration_tests against other Bazel -# versions you support. +8.5.1 \ No newline at end of file diff --git a/MODULE.bazel b/MODULE.bazel index 0bd27a3c..5ab4b8cc 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,14 +1,14 @@ -"Bazel dependencies" - module( name = "rules_distroless", compatibility_level = 1, ) -bazel_dep(name = "platforms", version = "0.0.10") +bazel_dep(name = "aspect_bazel_lib", version = "2.14.0") bazel_dep(name = "bazel_features", version = "1.20.0") bazel_dep(name = "bazel_lib", version = "3.0.0-rc.0") bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "platforms", version = "0.0.10") +bazel_dep(name = "rules_cc", version = "0.2.8") bazel_dep(name = "rules_java", version = "8.8.0") bazel_dep(name = "rules_shell", version = "0.4.1") bazel_dep(name = "gawk", version = "5.3.2.bcr.3") @@ -35,76 +35,3 @@ use_repo(tar_toolchains, "bsd_tar_toolchains") bazel_dep(name = "gazelle", version = "0.34.0", dev_dependency = True, repo_name = "bazel_gazelle") bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.5.0", dev_dependency = True) bazel_dep(name = "buildifier_prebuilt", version = "8.0.1", dev_dependency = True) -bazel_dep(name = "rules_oci", version = "2.0.0", dev_dependency = True) -bazel_dep(name = "container_structure_test", version = "1.21.1", dev_dependency = True) -bazel_dep(name = "jq.bzl", version = "0.4.0", dev_dependency = True) - -http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "example-bullseye-ca-certificates", - build_file_content = 'exports_files(["data.tar.xz", "control.tar.xz"])', - sha256 = "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - urls = ["https://snapshot.debian.org/archive/debian/20231106T210201Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb"], -) - -http_archive( - name = "example-bullseye-libc-bin", - build_file_content = 'exports_files(["data.tar.xz"])', - sha256 = "8b048ab5c7e9f5b7444655541230e689631fd9855c384e8c4a802586d9bbc65a", - urls = ["https://snapshot.debian.org/archive/debian-security/20231106T230332Z/pool/updates/main/g/glibc/libc-bin_2.31-13+deb11u7_amd64.deb"], -) - -http_archive( - name = "example-bookworm-libc-bin", - build_file_content = 'exports_files(["data.tar.xz"])', - sha256 = "38c44247c5b3e864d6db2877edd9c9a0555fc4e23ae271b73d7f527802616df5", - urls = ["https://snapshot.debian.org/archive/debian-security/20231106T230332Z/pool/updates/main/g/glibc/libc-bin_2.36-9+deb12u3_armhf.deb"], -) - -apt = use_extension( - "@rules_distroless//apt:extensions.bzl", - "apt", - dev_dependency = True, -) -apt.install( - name = "bullseye", - lock = "//examples/debian_snapshot:bullseye.lock.json", - manifest = "//examples/debian_snapshot:bullseye.yaml", -) -apt.install( - name = "bullseye_nolock", - manifest = "//examples/debian_snapshot:bullseye.yaml", - nolock = True, -) -apt.install( - name = "noble", - lock = "//examples/ubuntu_snapshot:noble.lock.json", - manifest = "//examples/ubuntu_snapshot:noble.yaml", -) -apt.install( - name = "resolution_test", - manifest = "apt/tests/resolution/security.yaml", - nolock = True, -) -apt.install( - name = "resolution_test_empty_lock", - lock = "//apt/tests/resolution:empty.lock.json", - manifest = "apt/tests/resolution/security.yaml", -) -apt.install( - name = "arch_all_test", - manifest = "apt/tests/resolution/arch_all.yaml", - nolock = True, -) -apt.install( - name = "unique_dependencies", - manifest = "//apt/tests/resolution:dependencies.yaml", - nolock = True, -) -apt.install( - name = "clang", - manifest = "apt/tests/resolution/clang.yaml", - nolock = True, -) -use_repo(apt, "arch_all_test", "arch_all_test_resolve", "bullseye", "bullseye_nolock", "clang", "noble", "resolution_test", "resolution_test_empty_lock_resolve", "resolution_test_resolve", "unique_dependencies_resolve") diff --git a/apt/BUILD.bazel b/apt/BUILD.bazel index d9e8862d..732f62b5 100644 --- a/apt/BUILD.bazel +++ b/apt/BUILD.bazel @@ -1,7 +1,6 @@ load("@bazel_lib//:bzl_library.bzl", "bzl_library") exports_files([ - "apt.bzl", "extensions.bzl", ]) @@ -15,25 +14,17 @@ bzl_library( ], ) -bzl_library( - name = "apt", - srcs = ["apt.bzl"], - visibility = ["//visibility:public"], - deps = [ - "//apt/private:deb_resolve", - "//apt/private:deb_translate_lock", - ], -) - bzl_library( name = "extensions", srcs = ["extensions.bzl"], visibility = ["//visibility:public"], deps = [ + "//apt/private:apt_deb_repository", + "//apt/private:apt_dep_resolver", "//apt/private:deb_import", - "//apt/private:deb_resolve", - "//apt/private:deb_translate_lock", "//apt/private:lockfile", - "@bazel_features//:features", + "//apt/private:translate_dependency_set", + "//apt/private:util", + "//apt/private:version_constraint", ], ) diff --git a/apt/apt.bzl b/apt/apt.bzl deleted file mode 100644 index 402ecf34..00000000 --- a/apt/apt.bzl +++ /dev/null @@ -1,140 +0,0 @@ -""" -`apt.install` macro - -This documentation provides an overview of the convenience `apt.install` -repository macro to create Debian repositories with packages "installed" in -them and available to use in Bazel. -""" - -load("//apt/private:deb_resolve.bzl", _deb_resolve = "deb_resolve") -load("//apt/private:deb_translate_lock.bzl", _deb_translate_lock = "deb_translate_lock") - -def _apt_install( - name, - manifest, - lock = None, - nolock = False, - package_template = None, - resolve_transitive = True): - """Repository macro to create Debian repositories. - - > [!WARNING] - > THIS IS A LEGACY MACRO. Use it only if you are still using `WORKSPACE`. - > Otherwise please use the [`apt` module extension](apt.md). - - Here's an example to create a Debian repo with `apt.install`: - - ```starlark - # WORKSPACE - - load("@rules_distroless//apt:apt.bzl", "apt") - - apt.install( - name = "bullseye", - # lock = "//examples/apt:bullseye.lock.json", - manifest = "//examples/apt:bullseye.yaml", - ) - - load("@bullseye//:packages.bzl", "bullseye_packages") - bullseye_packages() - ``` - - Note that, for the initial setup (or if we want to run without a lock) the - lockfile attribute can be omitted. All you need is a YAML - [manifest](/examples/debian_snapshot/bullseye.yaml): - ```yaml - version: 1 - - sources: - - channel: bullseye main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - archs: - - amd64 - - packages: - - perl - ``` - - `apt.install` will parse the manifest and will fetch and install the - packages for the given architectures in the Bazel repo `@`. - - Each `/` has two targets that match the usual structure of a - Debian package: `data` and `control`. - - You can use the package like so: `@///:`. - - E.g. for the previous example, you could use `@bullseye//perl/amd64:data`. - - ### Lockfiles - - As mentioned, the macro can be used without a lock because the lock will be - generated internally on-demand. However, this comes with the cost of - performing a new package resolution on repository cache misses. - - The lockfile can be generated by running `bazel run @bullseye//:lock`. This - will generate a `.lock.json` file of the same name and in the same path as - the YAML `manifest` file. - - If you explicitly want to run without a lock and avoid the warning messages - set the `nolock` argument to `True`. - - ### Best Practice: use snapshot archive URLs - - While we strongly encourage users to check in the generated lockfile, it's - not always possible because Debian repositories are rolling by default. - Therefore, a lockfile generated today might not work later if the upstream - repository removes or publishes a new version of a package. - - To avoid this problems and increase the reproducibility it's recommended to - avoid using normal Debian mirrors and use snapshot archives instead. - - Snapshot archives provide a way to access Debian package mirrors at a point - in time. Basically, it's a "wayback machine" that allows access to (almost) - all past and current packages based on dates and version numbers. - - Debian has had snapshot archives for [10+ - years](https://lists.debian.org/debian-announce/2010/msg00002.html). Ubuntu - began providing a similar service recently and has packages available since - March 1st 2023. - - To use this services simply use a snapshot URL in the manifest. Here's two - examples showing how to do this for Debian and Ubuntu: - * [/examples/debian_snapshot](/examples/debian_snapshot) - * [/examples/ubuntu_snapshot](/examples/ubuntu_snapshot) - - For more infomation, please check https://snapshot.debian.org and/or - https://snapshot.ubuntu.com. - - Args: - name: name of the repository - manifest: label to a `manifest.yaml` - lock: label to a `lock.json` - nolock: bool, set to True if you explicitly want to run without a lock - and avoid the DEBUG messages. - package_template: (EXPERIMENTAL!) a template file for generated BUILD - files. Available template replacement keys are: - `{target_name}`, `{deps}`, `{urls}`, `{name}`, - `{arch}`, `{sha256}`, `{repo_name}` - resolve_transitive: whether dependencies of dependencies should be - resolved and added to the lockfile. - """ - _deb_resolve( - name = name + "_resolve", - manifest = manifest, - resolve_transitive = resolve_transitive, - ) - - if not lock and not nolock: - # buildifier: disable=print - print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % name) - - _deb_translate_lock( - name = name, - lock = lock if lock else "@" + name + "_resolve//:lock.json", - package_template = package_template, - ) - -apt = struct( - install = _apt_install, -) diff --git a/apt/extensions.bzl b/apt/extensions.bzl index 9617135a..9f1031a7 100644 --- a/apt/extensions.bzl +++ b/apt/extensions.bzl @@ -1,83 +1,484 @@ "apt extensions" -load("@bazel_features//:features.bzl", "bazel_features") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "read_netrc", "read_user_netrc", "use_netrc") +load("//apt/private:apt_deb_repository.bzl", "deb_repository") +load("//apt/private:apt_dep_resolver.bzl", "dependency_resolver") load("//apt/private:deb_import.bzl", "deb_import") -load("//apt/private:deb_resolve.bzl", "deb_resolve", "internal_resolve") -load("//apt/private:deb_translate_lock.bzl", "deb_translate_lock") load("//apt/private:lockfile.bzl", "lockfile") +load("//apt/private:translate_dependency_set.bzl", "translate_dependency_set") +load("//apt/private:util.bzl", "util") +load("//apt/private:version_constraint.bzl", "version_constraint") + +# https://wiki.debian.org/SupportedArchitectures +ALL_SUPPORTED_ARCHES = ["armel", "armhf", "arm64", "i386", "amd64", "mips64el", "ppc64el", "x390x"] + +ITERATION_MAX = 2147483646 + +def _parse_source(src): + parts = src.split(" ") + kind = parts.pop(0) + if parts[0].startswith("["): + # skip arch for now. + arch = parts.pop(0) + url = parts.pop(0) + dist = parts.pop(0) + components = parts + return struct( + kind = kind, + url = url, + dist = dist, + components = components, + ) + +def _get_auth(mctx, urls): + """Given the list of URLs obtain the correct auth dict.""" + if "NETRC" in mctx.os.environ: + netrc = read_netrc(mctx, mctx.os.environ["NETRC"]) + else: + netrc = read_user_netrc(mctx) + return use_netrc(netrc, urls, {}) + +def _start_downloads(mctx, urls, dist, comp, arch, integrity, index_type, cached_format = None): + """Initiate all format downloads for a given index type with block=False. + + If cached_format is set, only that extension is attempted — avoiding + 404 warnings for formats the remote doesn't serve. + """ + target_triple = "{}/{}/{}".format(dist, comp, arch) + + # See https://linux.die.net/man/1/xz , https://linux.die.net/man/1/gzip , and https://linux.die.net/man/1/bzip2 + # --keep -> keep the original file (Bazel might be still committing the output to the cache) + # --force -> overwrite the output if it exists + # --decompress -> decompress + # Order of these matter, we want to try the one that is most likely first. + if index_type == "Packages": + extensions = [ + (".xz", ["xz", "--decompress", "--keep", "--force"]), + (".gz", ["gzip", "--decompress", "--keep", "--force"]), + (".bz2", ["bzip2", "--decompress", "--keep", "--force"]), + ("", ["true"]), + ] + else: + extensions = [ + (".gz", ["gzip", "--decompress", "--keep", "--force"]), + (".xz", ["xz", "--decompress", "--keep", "--force"]), + (".bz2", ["bzip2", "--decompress", "--keep", "--force"]), + ("", ["true"]), + ] + + if cached_format != None: + extensions = [(ext, cmd) for (ext, cmd) in extensions if ext == cached_format] + + base_auth = _get_auth(mctx, urls) + tokens = [] + for (url_idx, url) in enumerate(urls): + for (ext, cmd) in extensions: + # Each (url, ext) gets a unique output directory to prevent + # concurrent downloads from clobbering each other's files. + # Without this, the uncompressed variant ("") and a decompressed + # .xz/.gz/.bz2 would both write to the same final path. + ext_name = ext.lstrip(".") if ext else "raw" + output = "{}/{}/{}/{}{}".format(target_triple, url_idx, ext_name, index_type, ext) + if index_type == "Packages": + dist_url = "{}/dists/{}/{}/binary-{}/{}{}".format(url, dist, comp, arch, index_type, ext) + else: + dist_url = "{}/dists/{}/{}/Contents-{}{}".format(url, dist, comp, arch, ext) + auth = {} + if url in base_auth: + auth = {dist_url: base_auth[url]} + token = mctx.download( + url = dist_url, + output = output, + integrity = integrity, + allow_fail = True, + auth = auth, + block = False, + ) + tokens.append((ext, cmd, url, url_idx, ext_name, output, token)) + return tokens + +def _resolve_downloads(mctx, tokens, index_type, dist, comp, arch): + """Wait on tokens in priority order, decompress the first success. + + Returns (output_path, url, integrity, ext) on success. + Returns None for optional Contents when all attempts fail. + """ + failed_attempts = [] + for (ext, cmd, url, url_idx, ext_name, output, token) in tokens: + download = token.wait() + decompress_r = None + if download.success: + decompress_r = mctx.execute(cmd + [output]) + if decompress_r.return_code == 0: + target_triple = "{}/{}/{}".format(dist, comp, arch) + + # Decompressed file lives in its own ext_name subdirectory + return ("{}/{}/{}/{}".format(target_triple, url_idx, ext_name, index_type), url, download.integrity, ext) + failed_attempts.append((url + "/.../" + index_type + ext, download, decompress_r)) + + if index_type == "Contents": + # Contents files are optional; some repositories (e.g. packages.cloud.google.com/apt) + # don't provide them. Print a warning and return None instead of failing. + print("Warning: Could not fetch Contents index for {}/{}/{}. Contents files are optional.".format(dist, comp, arch)) + return None + + # For Packages, fail with details + attempt_messages = [] + for (failed_url, download, decompress) in failed_attempts: + reason = "unknown" + if not download.success: + reason = "Download failed. See warning above for details." + elif decompress.return_code != 0: + reason = "Decompression failed with non-zero exit code.\n\n{}\n{}".format(decompress.stderr, decompress.stdout) + attempt_messages.append("""\n*) Failed '{}'\n\n{}""".format(failed_url, reason)) + + fail(""" +** Tried to download {} different package indices and all failed. + +{} + """.format(len(failed_attempts), "\n".join(attempt_messages))) + +def _fetch_and_parse_sources(mctx, repo, glock, snapshot_suites, formats): + """Fetch all package indices and contents in parallel, then parse them.""" + pending = [] + seen = {} + for source_key, source in repo.sources().items(): + (urls, dist, component, architecture) = source + + # Deduplicate: multiple dict entries can map to the same logical source + # (one entry per URL in the urls list). Only process each unique + # (dist, component, architecture) combination once. + dedup_key = "{}/{}/{}".format(dist, component, architecture) + if dedup_key in seen: + continue + seen[dedup_key] = True + + # We assume that `url` does not contain a trailing forward slash when passing to + # functions below. If one is present, remove it. Some HTTP servers do not handle + # redirects properly when a path contains "//" + urls = [url.rstrip("/") for url in urls] + + pkg_fact_key = dist + "/" + component + "/" + architecture + "/Packages" + cnt_fact_key = dist + "/" + component + "/" + architecture + "/Contents" + + # Check cached format info to avoid 404 warnings on subsequent runs + cached_pkg_format = formats.get(pkg_fact_key) + cached_cnt_format = formats.get(cnt_fact_key) + + # Pass 1: Initiate all downloads with block=False + # For snapshot suites, integrity hashes from facts enable instant cache hits. + # Cached formats narrow downloads to only the known-good extension. + mctx.report_progress("starting downloads: {}/{} for {}".format(dist, component, architecture)) + pkg_tokens = _start_downloads( + mctx, + urls, + dist, + component, + architecture, + glock.facts().get(pkg_fact_key, ""), + "Packages", + cached_format = cached_pkg_format, + ) + + cnt_tokens = None + if cached_cnt_format != "unavailable": + cnt_tokens = _start_downloads( + mctx, + urls, + dist, + component, + architecture, + glock.facts().get(cnt_fact_key, ""), + "Contents", + cached_format = cached_cnt_format, + ) -def _distroless_extension(module_ctx): + pending.append(( + urls, + dist, + component, + architecture, + pkg_tokens, + cnt_tokens, + pkg_fact_key, + cnt_fact_key, + )) + + # Pass 2: Wait, decompress, parse + for (urls, dist, comp, arch, pkg_tokens, cnt_tokens, pkg_fk, cnt_fk) in pending: + mctx.report_progress("resolving Package indices: {}/{} for {}".format(dist, comp, arch)) + (output, url, integrity, ext) = _resolve_downloads(mctx, pkg_tokens, "Packages", dist, comp, arch) + if dist in snapshot_suites: + glock.facts()[pkg_fk] = integrity + formats[pkg_fk] = ext + + mctx.report_progress("parsing Package indices: {}/{} for {}".format(dist, comp, arch)) + repo.parse_package_index(mctx.read(output), urls, dist) + + if cnt_tokens != None: + mctx.report_progress("resolving Contents: {}/{} for {}".format(dist, comp, arch)) + contents_result = _resolve_downloads(mctx, cnt_tokens, "Contents", dist, comp, arch) + else: + contents_result = None + + if contents_result != None: + (output, url, integrity, ext) = contents_result + if dist in snapshot_suites: + glock.facts()[cnt_fk] = integrity + formats[cnt_fk] = ext + + mctx.report_progress("parsing Contents: {}/{} for {}".format(dist, comp, arch)) + repo.parse_contents(mctx.read(output), arch) + else: + formats[cnt_fk] = "unavailable" + +def _distroless_extension(mctx): root_direct_deps = [] root_direct_dev_deps = [] reproducible = False - for mod in module_ctx.modules: - for install in mod.tags.install: - lockf = None - if not install.lock: - lockf = internal_resolve( - module_ctx, - "yq", - install.manifest, - install.resolve_transitive, + # Detect facts API availability + use_facts = hasattr(mctx, "facts") + cached_facts = mctx.facts if use_facts else {} + + # Seed glock from facts or lockfile + if use_facts: + glock = lockfile.empty(mctx) + for (k, v) in cached_facts.get("indices", {}).items(): + glock.facts()[k] = v + else: + # as-in-mach 9 + glock = lockfile.merge(mctx, [ + lockfile.from_json(mctx, mctx.read(lock.into)) + for mod in mctx.modules + for lock in mod.tags.lock + ]) + + # First pass over sources_list: classify suites as snapshot or rolling + snapshot_suites = {} + for mod in mctx.modules: + for sl in mod.tags.sources_list: + uris = [uri.removeprefix("mirror+") for uri in sl.uris] + is_snapshot = len(uris) > 0 and all([util.is_snapshot_uri(uri) for uri in uris]) + if is_snapshot: + for suite in sl.suites: + snapshot_suites[suite] = True + + repo = deb_repository.new() + resolver = dependency_resolver.new(repo) + + for mod in mctx.modules: + # TODO: also enfore that every module explicitly lists their sources_list + # otherwise they'll break if the sources_list that the module depends on + # magically disappears. + for sl in mod.tags.sources_list: + uris = [uri.removeprefix("mirror+") for uri in sl.uris] + architectures = sl.architectures + + for suite in sl.suites: + glock.add_source( + suite, + uris = uris, + types = sl.types, + components = sl.components, + architectures = architectures, ) - if not install.nolock: - # buildifier: disable=print - print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % install.name) - else: - if module_ctx.path(install.lock).exists: - lockf = lockfile.from_json(module_ctx, module_ctx.read(install.lock)) - else: - # buildifier: disable=print - print("\nSpecified lockfile '%s' not found. An empty lockfile is assumed." % install.lock) - lockf = lockfile.from_json(module_ctx, None) - reproducible = True - - for (package) in lockf.packages(): - package_key = lockfile.make_package_key( - package["name"], - package["version"], - package["arch"], + repo.add_source( + (uris, suite, sl.components, architectures), ) - deb_import( - name = "%s_%s" % (install.name, package_key), - urls = package["urls"], - sha256 = package["sha256"], - mergedusr = install.mergedusr, - ) + # Seed cached formats from facts (which extensions each remote serves) + formats = dict(cached_facts.get("formats", {})) - deb_resolve( - name = install.name + "_resolve", - manifest = install.manifest, - resolve_transitive = install.resolve_transitive, - ) + # Fetch all sources_list in parallel and parse them. + _fetch_and_parse_sources(mctx, repo, glock, snapshot_suites, formats) - deb_translate_lock( - name = install.name, - lock = install.lock, - lock_content = lockf.as_json(), - package_template = install.package_template, + sources = glock.sources() + dependency_sets = glock.dependency_sets() + + resolution_queue = [] + already_resolved = {} + + for mod in mctx.modules: + for install in mod.tags.install: + for dep_constraint in install.packages: + constraint = version_constraint.parse_dep(dep_constraint) + architectures = constraint["arch"] + if not architectures: + # For cases where architecture for the package is not specified we need + # to first find out which source contains the package. in order to do + # that we first need to resolve the package for amd64 architecture. + # Once the repository is found, then resolve the package for all the + # architectures the repository supports. + (package, warning) = resolver.resolve_package( + name = constraint["name"], + version = constraint["version"], + arch = "amd64", + suites = install.suites, + ) + if warning: + util.warning(mctx, warning) + + # If the package is not found then add the package + # to the resolution_queue to let the resolver handle + # the error messages. + if not package: + resolution_queue.append(( + install.dependency_set, + constraint["name"], + constraint["version"], + "amd64", + install.suites, + )) + continue + + source = sources[package["Dist"]] + architectures = source["architectures"] + + for arch in architectures: + resolution_queue.append(( + install.dependency_set, + constraint["name"], + constraint["version"], + arch, + install.suites, + )) + + for i in range(0, ITERATION_MAX + 1): + if not len(resolution_queue): + break + if i == ITERATION_MAX: + fail("apt.install exhausted, please file a bug") + + (dependency_set_name, name, version, arch, suites) = resolution_queue.pop() + + mctx.report_progress("Resolving %s:%s" % (name, arch)) + + # TODO: Flattening approach of resolving dependencies has to change. + (package, dependencies, unmet_dependencies, warnings) = resolver.resolve_all( + name = name, + version = version, + arch = arch, + include_transitive = True, + suites = suites, + ) + + if not package: + suite_msg = " in suite(s) [%s]" % ", ".join(suites) if suites else "" + fail( + "\n\nUnable to locate package `%s` for %s%s. It may only exist for specific set of architectures or suites. \n" % (name, arch, suite_msg) + + " 1 - Ensure that the package is available for the specified architecture. \n" + + " 2 - Ensure that the specified version of the package is available for the specified architecture. \n" + + " 3 - Ensure that an apt.sources_list is added for the specified architecture.\n" + + " 4 - If using suite constraints, ensure the package exists in the specified suite(s).", ) - if mod.is_root: - if module_ctx.is_dev_dependency(install): - root_direct_dev_deps.append(install.name) - else: - root_direct_deps.append(install.name) + for warning in warnings: + util.warning(mctx, warning) + + if len(unmet_dependencies): + util.warning( + mctx, + "Following dependencies could not be resolved for %s: %s (dependency set %s)" % ( + name, + ",".join([up[0] for up in unmet_dependencies]), + dependency_set_name, + ), + ) - metadata_kwargs = {} - if bazel_features.external_deps.extension_metadata_has_reproducible: - metadata_kwargs["reproducible"] = reproducible + # TODO: + # Ensure following statements are true. + # 1- Package was resolved from a source that module listed explicitly. + # 2- Package resolution was skipped because some other module asked for this package. + # 3- 1) is enforced even if 2) is the case. + glock.add_package(package) + + pkg_short_key = lockfile.short_package_key(package) + + already_resolved[pkg_short_key] = True + + for dep in dependencies: + glock.add_package(dep) + dep_key = lockfile.short_package_key(dep) + if dep_key not in already_resolved: + resolution_queue.append(( + None, + dep["Package"], + ("=", dep["Version"]), + arch, + suites, + )) + glock.add_package_dependency(package, dep) + + # Add it to dependency set + if dependency_set_name: + dependency_set = dependency_sets.setdefault(dependency_set_name, { + "sets": {}, + }) + arch_set = dependency_set["sets"].setdefault(arch, {}) + arch_set[pkg_short_key] = package["Version"] + + # Generate a hub repo for every dependency set + lock_content = glock.as_json() + for depset_name in dependency_sets.keys(): + translate_dependency_set( + name = depset_name, + depset_name = depset_name, + lock_content = lock_content, + ) + + # Generate a repo per package which will be aliased by hub repo. + for (package_key, package) in glock.packages().items(): + filemap = {} + for key in package["depends_on"]: + (suite, name, arch, version) = lockfile.parse_package_key(key) + filemap[name] = repo.filemap( + name = name, + arch = arch, + ) - return module_ctx.extension_metadata( - root_module_direct_deps = root_direct_deps, - root_module_direct_dev_deps = root_direct_dev_deps, - **metadata_kwargs - ) + deb_import( + name = util.sanitize(package_key), + target_name = util.sanitize(package_key), + urls = [ + uri + "/" + package["filename"] + for uri in sources[package["suite"]]["uris"] + ], + sha256 = package["sha256"], + mergedusr = False, + depends_on = package["depends_on"], + depends_file_map = json.encode(filemap), + package_name = package["name"], + ) + + if not use_facts: + for mod in mctx.modules: + if not mod.is_root: + continue + + if len(mod.tags.lock) > 1: + fail("There can only be one apt.lock per module.") + elif len(mod.tags.lock) == 1: + lock = mod.tags.lock[0] + lock_tmp = mctx.path("apt.lock.json") + glock.write(lock_tmp) + lockf_wksp = mctx.path(lock.into) + mctx.execute( + ["cp", "-f", lock_tmp, lockf_wksp], + ) -_install_doc = """ + if use_facts: + filtered_indices = { + k: v + for k, v in glock.facts().items() + if k.split("/")[0] in snapshot_suites + } + return mctx.extension_metadata( + facts = {"indices": filtered_indices, "formats": formats}, + ) + +_doc = """ Module extension to create Debian repositories. Create Debian repositories with packages "installed" in them and available @@ -88,33 +489,33 @@ Here's an example how to create a Debian repo: ```starlark apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") +apt.sources_list( + types = ["deb"], + uris = [ + "https://snapshot.ubuntu.com/ubuntu/20240301T030400Z", + "mirror+https://snapshot.ubuntu.com/ubuntu/20240301T030400Z" + ], + suites = ["noble", "noble-security", "noble-updates"], + components = ["main"], + architectures = ["all"] +) apt.install( - name = "bullseye", - lock = "//examples/apt:bullseye.lock.json", - manifest = "//examples/apt:bullseye.yaml", + # dependency set isolates these installs into their own scope. + dependency_set = "noble", + suites = ["noble", "noble-security", "noble-updates"], + packages = [ + "ncurses-base", + "libncurses6", + "tzdata", + "coreutils:arm64", + "libstdc++6:i386" + ] ) -use_repo(apt, "bullseye") ``` -Note that, for the initial setup (or if we want to run without a lock) the -lockfile attribute can be omitted. All you need is a YAML -[manifest](/examples/debian_snapshot/bullseye.yaml): -```yaml -version: 1 - -sources: - - channel: bullseye main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z -archs: - - amd64 - -packages: - - perl -``` - -`apt.install` will parse the manifest and will fetch and install the packages -for the given architectures in the Bazel repo `@`. +`apt.install` will install generate a package repository for each package and architecture +combination in the form of `@__`. Each `/` has two targets that match the usual structure of a Debian package: `data` and `control`. @@ -164,46 +565,45 @@ For more infomation, please check https://snapshot.debian.org and/or https://snapshot.ubuntu.com. """ +sources_list = tag_class( + attrs = { + "sources": attr.string_list( + # mandatory = True, + ), + "types": attr.string_list(), + "uris": attr.string_list(), + "suites": attr.string_list(), + "components": attr.string_list(), + "architectures": attr.string_list(), + }, +) + install = tag_class( attrs = { - "name": attr.string( - doc = "Name of the generated repository", + "packages": attr.string_list( mandatory = True, + allow_empty = False, ), - "manifest": attr.label( - doc = "The file used to generate the lock file", + "dependency_set": attr.string(), + "suites": attr.string_list(), + "include_transitive": attr.bool(default = True), + }, +) + +lock = tag_class( + attrs = { + "into": attr.label( mandatory = True, ), - "lock": attr.label( - doc = "The lock file to use for the index.", - ), - "nolock": attr.bool( - doc = "If you explicitly want to run without a lock, set it " + - "to `True` to avoid the DEBUG messages.", - default = False, - ), - "package_template": attr.label( - doc = "(EXPERIMENTAL!) a template file for generated BUILD " + - "files.", - ), - "resolve_transitive": attr.bool( - doc = "Whether dependencies of dependencies should be " + - "resolved and added to the lockfile.", - default = True, - ), - "mergedusr": attr.bool( - doc = "Whether packges should be normalized following mergedusr conventions.\n" + - "Turning this on might fix the following error thrown by docker for ambigious paths: `duplicate of paths are supported.` \n" + - "For more context please see https://salsa.debian.org/md/usrmerge/-/raw/master/debian/README.Debian?ref_type=heads", - default = False, - ), }, - doc = _install_doc, ) apt = module_extension( + doc = _doc, implementation = _distroless_extension, tag_classes = { "install": install, + "sources_list": sources_list, + "lock": lock, }, ) diff --git a/apt/private/BUILD.bazel b/apt/private/BUILD.bazel index 4340b63b..5dcd0b26 100644 --- a/apt/private/BUILD.bazel +++ b/apt/private/BUILD.bazel @@ -1,4 +1,4 @@ -load("@bazel_lib//:bzl_library.bzl", "bzl_library") +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") exports_files([ "dpkg_statusd.sh", @@ -21,20 +21,6 @@ bzl_library( deps = ["//distroless/private:tar"], ) -bzl_library( - name = "deb_translate_lock", - srcs = ["deb_translate_lock.bzl"], - visibility = ["//apt:__subpackages__"], - deps = [ - ":lockfile", - ":starlark_codegen_utils", - "@bazel_skylib//lib:new_sets", - "@bazel_tools//tools/build_defs/repo:cache.bzl", - "@bazel_tools//tools/build_defs/repo:http.bzl", - "@bazel_tools//tools/build_defs/repo:utils.bzl", - ], -) - bzl_library( name = "lockfile", srcs = ["lockfile.bzl"], @@ -62,23 +48,11 @@ bzl_library( ], ) -bzl_library( - name = "deb_resolve", - srcs = ["deb_resolve.bzl"], - visibility = ["//apt:__subpackages__"], - deps = [ - ":apt_deb_repository", - ":apt_dep_resolver", - ":lockfile", - "@bazel_lib//lib:repo_utils", - ], -) - bzl_library( name = "version", srcs = ["version.bzl"], visibility = ["//apt:__subpackages__"], - deps = ["@bazel_lib//lib:strings"], + deps = ["@aspect_bazel_lib//lib:strings"], ) bzl_library( @@ -106,3 +80,16 @@ bzl_library( srcs = ["util.bzl"], visibility = ["//apt:__subpackages__"], ) + +bzl_library( + name = "translate_dependency_set", + srcs = ["translate_dependency_set.bzl"], + visibility = ["//apt:__subpackages__"], + deps = [ + ":lockfile", + ":starlark_codegen_utils", + ":util", + "//apt:defs", + "//distroless:defs", + ], +) diff --git a/apt/private/apt_deb_repository.bzl b/apt/private/apt_deb_repository.bzl index 95657f59..037dbee6 100644 --- a/apt/private/apt_deb_repository.bzl +++ b/apt/private/apt_deb_repository.bzl @@ -1,83 +1,9 @@ "https://wiki.debian.org/DebianRepository" -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "read_netrc", "read_user_netrc", "use_netrc") load(":util.bzl", "util") load(":version_constraint.bzl", "version_constraint") -def _get_auth(ctx, urls): - """Given the list of URLs obtain the correct auth dict.""" - if "NETRC" in ctx.os.environ: - netrc = read_netrc(ctx, ctx.os.environ["NETRC"]) - else: - netrc = read_user_netrc(ctx) - return use_netrc(netrc, urls, {}) - -def _fetch_package_index(rctx, urls, dist, comp, arch, integrity): - target_triple = "{dist}/{comp}/{arch}".format(dist = dist, comp = comp, arch = arch) - - # See https://linux.die.net/man/1/xz , https://linux.die.net/man/1/gzip , and https://linux.die.net/man/1/bzip2 - # --keep -> keep the original file (Bazel might be still committing the output to the cache) - # --force -> overwrite the output if it exists - # --decompress -> decompress - # Order of these matter, we want to try the one that is most likely first. - supported_extensions = [ - (".xz", ["xz", "--decompress", "--keep", "--force"]), - (".gz", ["gzip", "--decompress", "--keep", "--force"]), - (".bz2", ["bzip2", "--decompress", "--keep", "--force"]), - ("", ["true"]), - ] - - failed_attempts = [] - - url = None - base_auth = _get_auth(rctx, urls) - for url in urls: - download = None - for (ext, cmd) in supported_extensions: - output = "{}/Packages{}".format(target_triple, ext) - dist_url = "{}/dists/{}/{}/binary-{}/Packages{}".format(url, dist, comp, arch, ext) - auth = {} - if url in base_auth: - auth = {dist_url: base_auth[url]} - download = rctx.download( - url = dist_url, - output = output, - integrity = integrity, - allow_fail = True, - auth = auth, - ) - decompress_r = None - if download.success: - decompress_r = rctx.execute(cmd + [output]) - if decompress_r.return_code == 0: - integrity = download.integrity - break - - failed_attempts.append((dist_url, download, decompress_r)) - - if download.success: - break - - if len(failed_attempts) == len(supported_extensions) * len(urls): - attempt_messages = [] - for (failed_url, download, decompress) in failed_attempts: - reason = "unknown" - if not download.success: - reason = "Download failed. See warning above for details." - elif decompress.return_code != 0: - reason = "Decompression failed with non-zero exit code.\n\n{}\n{}".format(decompress.stderr, decompress.stdout) - - attempt_messages.append("""\n*) Failed '{}'\n\n{}""".format(failed_url, reason)) - - fail(""" -** Tried to download {} different package indices and all failed. - -{} - """.format(len(failed_attempts), "\n".join(attempt_messages))) - - return ("{}/Packages".format(target_triple), url, integrity) - -def _parse_repository(state, contents, roots): +def _parse_repository(state, contents, roots, dist): last_key = "" pkg = {} for group in contents.split("\n\n"): @@ -106,10 +32,22 @@ def _parse_repository(state, contents, roots): if "Package" not in pkg: fail("Invalid debian package index format. No 'Package' key found in entry: {}".format(pkg)) pkg["Roots"] = roots + pkg["Dist"] = dist _add_package(state, pkg) last_key = "" pkg = {} +def _parse_contents(state, rcontents, arch): + contents = state.filemap.setdefault(arch, {}) + for line in rcontents.splitlines(): + last_empty_char = line.rfind(" ") + first_empty_char = line.find(" ") + filepath = line[:first_empty_char] + pkgs = line[last_empty_char + 1:].split(",") + for pkg in pkgs: + contents.setdefault(pkg[pkg.find("/") + 1:], []).append(filepath) + state.filemap[arch] = contents + def _add_package(state, package): util.set_dict( state.packages, @@ -151,41 +89,71 @@ def _add_package(state, package): (package["Architecture"], virtual["name"]), ) -def _virtual_packages(state, name, arch): - return util.get_dict(state.virtual_packages, [arch, name], []) - -def _package_versions(state, name, arch): - return util.get_dict(state.packages, [arch, name], {}).keys() - -def _package(state, name, version, arch): - return util.get_dict(state.packages, keys = (arch, name, version)) +def _virtual_packages(state, name, arch, suites = None): + all_providers = util.get_dict(state.virtual_packages, [arch, name], []) + if not suites: + return all_providers + return [(pkg, v) for (pkg, v) in all_providers if pkg["Dist"] in suites] + +def _package_versions(state, name, arch, suites = None): + all_packages = util.get_dict(state.packages, [arch, name], {}) + if not suites: + return all_packages.keys() + return [v for v, pkg in all_packages.items() if pkg["Dist"] in suites] + +def _package(state, name, version, arch, suites = None): + if not version: + return None + package = util.get_dict(state.packages, keys = (arch, name, version)) + if not package: + return None + if suites and package["Dist"] not in suites: + return None + return package + +def _filemap(state, name, arch): + if arch not in state.filemap: + return None + all = state.filemap[arch] + if name not in all: + return None + return state.filemap[arch][name] + +def _add_source_if_not_present(state, source): + (urls, dist, components, architectures) = source + + for arch in architectures: + for comp in components: + keys = [ + "%".join((url, dist, comp, arch)) + for url in urls + ] + found = any([ + key in state.sources + for key in keys + ]) + if found: + continue + for key in keys: + state.sources[key] = (urls, dist, comp, arch) -def _create(rctx, sources, archs): +def _create(): state = struct( + sources = dict(), + filemap = dict(), packages = dict(), virtual_packages = dict(), ) - for arch in archs: - for (urls, dist, comp) in sources: - # We assume that `url` does not contain a trailing forward slash when passing to - # functions below. If one is present, remove it. Some HTTP servers do not handle - # redirects properly when a path contains "//" - # (ie. https://mymirror.com/ubuntu//dists/noble/stable/... may return a 404 - # on misconfigured HTTP servers) - urls = [url.rstrip("/") for url in urls] - - rctx.report_progress("Fetching package index: {}/{} for {}".format(dist, comp, arch)) - (output, _, _) = _fetch_package_index(rctx, urls, dist, comp, arch, "") - - # TODO: this is expensive to perform. - rctx.report_progress("Parsing package index: {}/{} for {}".format(dist, comp, arch)) - _parse_repository(state, rctx.read(output), urls) - return struct( + add_source = lambda source: _add_source_if_not_present(state, source), + sources = lambda: state.sources, + parse_package_index = lambda contents, roots, dist: _parse_repository(state, contents, roots, dist), + parse_contents = lambda rcontents, arch: _parse_contents(state, rcontents, arch), package_versions = lambda **kwargs: _package_versions(state, **kwargs), virtual_packages = lambda **kwargs: _virtual_packages(state, **kwargs), package = lambda **kwargs: _package(state, **kwargs), + filemap = lambda **kwargs: _filemap(state, **kwargs), ) deb_repository = struct( @@ -207,7 +175,7 @@ def _create_test_only(): package_versions = lambda **kwargs: _package_versions(state, **kwargs), virtual_packages = lambda **kwargs: _virtual_packages(state, **kwargs), package = lambda **kwargs: _package(state, **kwargs), - parse_repository = lambda contents: _parse_repository(state, contents, "http://nowhere"), + parse_repository = lambda contents, dist = "test": _parse_repository(state, contents, "http://nowhere", dist), packages = state.packages, reset = reset, ) diff --git a/apt/private/apt_dep_resolver.bzl b/apt/private/apt_dep_resolver.bzl index 802a706f..aaa6d612 100644 --- a/apt/private/apt_dep_resolver.bzl +++ b/apt/private/apt_dep_resolver.bzl @@ -3,9 +3,13 @@ load(":version.bzl", version_lib = "version") load(":version_constraint.bzl", "version_constraint") -def _resolve_package(state, name, version, arch): - # First check if the constraint is satisfied by a virtual package - virtual_packages = state.repository.virtual_packages(name = name, arch = arch) +def _resolve_package(state, name, version, arch, suites = None): + # First check if the constraint is satisfied by a virtual package. + # Check both the specific arch and "all" since Architecture: all packages + # can provide virtual packages too. + virtual_packages_for_arch = state.repository.virtual_packages(name = name, arch = arch, suites = suites) + virtual_packages_for_all = state.repository.virtual_packages(name = name, arch = "all", suites = suites) + virtual_packages = virtual_packages_for_arch + virtual_packages_for_all candidates = [ package @@ -17,10 +21,13 @@ def _resolve_package(state, name, version, arch): ) ] + warning = None + if len(candidates) == 1: - return candidates[0] + return (candidates[0], warning) if len(candidates) > 1: + versions = {} for package in candidates: # Return 'required' packages immediately since it is implicit that # they should exist on a default debian install. @@ -32,19 +39,25 @@ def _resolve_package(state, name, version, arch): # # In the case of required packages, these defaults are not specified. if "Priority" in package and package["Priority"] == "required": - return package + return (package, warning) + versions[package["Version"]] = package + + sortedversions = version_lib.sort(versions.keys(), reverse = True) + + # First element in the versions list is the latest version. + selected_version = sortedversions[0] + return (versions[selected_version], warning) - # Otherwise, we can't disambiguate the virtual package providers so - # choose none and warn. - # buildifier: disable=print - print("\nMultiple candidates for virtual package '{}': {}".format( - name, - [package["Package"] for package in candidates], - )) + # # Otherwise, we can't disambiguate the virtual package providers so + # # choose none and warn. + # warning = "Multiple candidates for virtual package '{}': {}".format( + # name, + # ", ".join([package["Package"] + "" + package["Version"] for package in candidates]), + # ) # Get available versions of the package - versions_by_arch = state.repository.package_versions(name = name, arch = arch) - versions_by_any_arch = state.repository.package_versions(name = name, arch = "all") + versions_by_arch = state.repository.package_versions(name = name, arch = arch, suites = suites) + versions_by_any_arch = state.repository.package_versions(name = name, arch = "all", suites = suites) # Order packages by highest to lowest versions = version_lib.sort(versions_by_arch + versions_by_any_arch, reverse = True) @@ -64,26 +77,30 @@ def _resolve_package(state, name, version, arch): # First element in the versions list is the latest version. selected_version = versions[0] - package = state.repository.package(name = name, version = selected_version, arch = arch) + package = state.repository.package(name = name, version = selected_version, arch = arch, suites = suites) if not package: - package = state.repository.package(name = name, version = selected_version, arch = "all") + package = state.repository.package(name = name, version = selected_version, arch = "all", suites = suites) - return package + return (package, warning) _ITERATION_MAX_ = 2147483646 # For future: unfortunately this function uses a few state variables to track # certain conditions and package dependency groups. # TODO: Try to simplify it in the future. -def _resolve_all(state, name, version, arch, include_transitive = True): - root_package = None +def _resolve_all(state, name, version, arch, include_transitive = True, suites = None): unmet_dependencies = [] + root_package = None dependencies = [] + direct_dependencies = {} # state variables already_recursed = {} dependency_group = [] stack = [(name, version, -1)] + warnings = [] + + path = [] for i in range(0, _ITERATION_MAX_ + 1): if not len(stack): @@ -97,8 +114,13 @@ def _resolve_all(state, name, version, arch, include_transitive = True): if dependency_group_idx > -1 and dependency_group[dependency_group_idx][0]: continue - package = _resolve_package(state, name, version, arch) + path.append(name) + + (package, warning) = _resolve_package(state, name, version, arch, suites = suites) + if warning: + warnings.append(warning) + # Unmet optional dependency encountered # If this package is not found and is part of a dependency group, then just skip it. if not package and dependency_group_idx > -1: continue @@ -120,12 +142,13 @@ def _resolve_all(state, name, version, arch, include_transitive = True): # If we encountered package before in the transitive closure, skip it if key in already_recursed: + # fail(" -> ".join(path)) continue # Do not add dependency if it's a root package to avoid circular dependency. if i != 0 and key != root_package["Package"]: # Add it to the dependencies - already_recursed[key] = True + already_recursed[key] = package["Version"] dependencies.append(package) deps = [] @@ -157,7 +180,7 @@ def _resolve_all(state, name, version, arch, include_transitive = True): if not met: unmet_dependencies.append((dep, None)) - return (root_package, dependencies, unmet_dependencies) + return (root_package, dependencies, unmet_dependencies, warnings) def _create_resolution(repository): state = struct(repository = repository) diff --git a/apt/private/cc_deb_library.bzl b/apt/private/cc_deb_library.bzl new file mode 100644 index 00000000..d6e9ff87 --- /dev/null +++ b/apt/private/cc_deb_library.bzl @@ -0,0 +1,46 @@ +"cc_deb_library" + +def _cc_deb_library_impl(ctx): + system_include_path = ctx.bin_dir.path + "/" + ctx.label.workspace_root + "/usr/include" + + compilation_context = cc_common.create_compilation_context( + headers = depset(ctx.files.hdrs + ctx.files.additional_compiler_inputs), + system_includes = depset([system_include_path]), + ) + + expanded_linkopts = [ctx.expand_make_variables("linkopts", opt, {}) for opt in ctx.attr.linkopts] + + linker_input = cc_common.create_linker_input( + owner = ctx.label, + user_link_flags = depset(expanded_linkopts), + additional_inputs = depset(ctx.files.additional_linker_inputs), + ) + + linking_context = cc_common.create_linking_context( + linker_inputs = depset([linker_input]), + ) + + own_cc_info = CcInfo( + compilation_context = compilation_context, + linking_context = linking_context, + ) + + dep_cc_infos = [dep[CcInfo] for dep in ctx.attr.deps if CcInfo in dep] + + merged = cc_common.merge_cc_infos( + direct_cc_infos = [own_cc_info], + cc_infos = dep_cc_infos, + ) + + return [merged] + +cc_deb_library = rule( + implementation = _cc_deb_library_impl, + attrs = { + "hdrs": attr.label_list(allow_files = True), + "deps": attr.label_list(providers = [CcInfo]), + "linkopts": attr.string_list(), + "additional_compiler_inputs": attr.label_list(allow_files = True), + "additional_linker_inputs": attr.label_list(allow_files = True), + }, +) diff --git a/apt/private/deb_export.bzl b/apt/private/deb_export.bzl new file mode 100644 index 00000000..c9b7d5ce --- /dev/null +++ b/apt/private/deb_export.bzl @@ -0,0 +1,70 @@ +"normalization rules" + +load("@aspect_bazel_lib//lib:tar.bzl", tar = "tar_lib") + +TAR_TOOLCHAIN_TYPE = tar.toolchain_type + +def _deb_export_impl(ctx): + bsdtar = ctx.toolchains[TAR_TOOLCHAIN_TYPE] + + foreign_symlinks = { + symlink: json.decode(indices_json) + for (symlink, indices_json) in ctx.attr.foreign_symlinks.items() + } + + # foreign_symlinks maps label -> index string (reversed for Bazel 7.0.0 compatibility) + for (target, indices_json) in ctx.attr.foreign_symlinks.items(): + indices = json.decode(indices_json) + for i in indices: + ctx.actions.symlink( + output = ctx.outputs.symlink_outs[i], + # grossly inefficient + target_file = target[DefaultInfo].files.to_list()[0], + ) + + if len(ctx.outputs.outs): + fout = ctx.outputs.outs[0] + output = fout.path[:fout.path.find(fout.owner.repo_name) + len(fout.owner.repo_name)] + args = ctx.actions.args() + args.add("-xf") + args.add_all(ctx.files.srcs) + args.add("-C") + args.add(output) + args.add_all( + ctx.outputs.outs, + map_each = lambda src: src.short_path[len(src.owner.repo_name) + 4:], + allow_closure = True, + ) + ctx.actions.run( + executable = bsdtar.tarinfo.binary, + # the archive may contain symlinks that point to symlinks that reference + # files from other packages, therefore symlink_outs must be present in the + # sandbox for Bazel to succesfully track them. + inputs = ctx.files.srcs + ctx.outputs.symlink_outs, + outputs = ctx.outputs.outs, + arguments = [args], + mnemonic = "Unpack", + toolchain = TAR_TOOLCHAIN_TYPE, + ) + + return DefaultInfo( + files = depset( + ctx.outputs.outs + + ctx.outputs.symlink_outs + + ctx.files.foreign_symlinks, + ), + ) + +deb_export = rule( + implementation = _deb_export_impl, + attrs = { + "srcs": attr.label_list(allow_files = True), + # mapping of foreign label -> symlink_outs index (label_keyed for Bazel 7.0 compat) + "foreign_symlinks": attr.label_keyed_string_dict(allow_files = True), + "symlink_outs": attr.output_list(), + "outs": attr.output_list(), + }, + toolchains = [ + TAR_TOOLCHAIN_TYPE, + ], +) diff --git a/apt/private/deb_import.bzl b/apt/private/deb_import.bzl index 2c182103..8fc6e7aa 100644 --- a/apt/private/deb_import.bzl +++ b/apt/private/deb_import.bzl @@ -1,17 +1,24 @@ "deb_import" -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load(":lockfile.bzl", "lockfile") +load(":pkgconfig.bzl", "pkgconfig") +load(":util.bzl", "util") # BUILD.bazel template _DEB_IMPORT_BUILD_TMPL = ''' load("@rules_distroless//apt/private:deb_postfix.bzl", "deb_postfix") +load("@rules_distroless//apt/private:deb_export.bzl", "deb_export") +load("@rules_distroless//apt/private:so_library.bzl", "so_library") +load("@rules_cc//cc/private/rules_impl:cc_import.bzl", "cc_import") +load("@rules_cc//cc:cc_library.bzl", "cc_library") +load("@rules_distroless//apt/private:cc_deb_library.bzl", "cc_deb_library") +load("@bazel_skylib//rules/directory:directory.bzl", "directory") deb_postfix( name = "data", srcs = glob(["data.tar*"]), - outs = ["layer.tar.gz"], - mergedusr = {}, - + outs = ["content.tar.gz"], + mergedusr = {mergedusr}, visibility = ["//visibility:public"], ) @@ -20,10 +27,418 @@ filegroup( srcs = glob(["control.tar.*"]), visibility = ["//visibility:public"], ) + +filegroup( + name = "{target_name}", + srcs = {depends_on} + [":data"], + visibility = ["//visibility:public"], +) + + +deb_export( + name = "export", + srcs = glob(["data.tar*"]), + foreign_symlinks = {foreign_symlinks}, + symlink_outs = {symlink_outs}, + outs = {outs}, + visibility = ["//visibility:public"] +) + +directory( + name = "directory", + srcs = {symlink_outs} + {outs}, + visibility = ["//visibility:public"] +) + +{cc_import_targets} ''' -def deb_import(mergedusr = False, **kwargs): - http_archive( - build_file_content = _DEB_IMPORT_BUILD_TMPL.format(mergedusr), - **kwargs +_CC_LIBRARY_LIBC_TMPL = """ +alias( + name = "{name}_wodeps", + actual = ":{name}", + visibility = ["//visibility:public"] +) + +cc_library( + name = "{name}", + hdrs = {hdrs}, + additional_compiler_inputs = {additional_compiler_inputs}, + additional_linker_inputs = {additional_linker_inputs}, + includes = {includes}, + visibility = ["//visibility:public"], +) +""" + +_CC_IMPORT_TMPL = """ +cc_import( + name = "{name}", + hdrs = {hdrs}, + includes = {includes}, + linkopts = {linkopts}, + shared_library = {shared_lib}, + static_library = {static_lib}, +) +""" + +_CC_LIBRARY_TMPL = """ +cc_library( + name = "{name}_wodeps", + hdrs = {hdrs}, + deps = {direct_deps}, + linkopts = {linkopts}, + additional_compiler_inputs = {additional_compiler_inputs}, + additional_linker_inputs = {additional_linker_inputs}, + strip_include_prefix = {strip_include_prefix}, + visibility = ["//visibility:public"], +) + +cc_library( + name = "{name}", + deps = [":{name}_wodeps"] + {deps}, + visibility = ["//visibility:public"], +) +""" + +_CC_SYS_LIBRARY_TMPL = """ +cc_deb_library( + name = "{name}_wodeps", + hdrs = {hdrs}, + deps = {direct_deps}, + linkopts = {linkopts}, + additional_compiler_inputs = {additional_compiler_inputs}, + additional_linker_inputs = {additional_linker_inputs}, + visibility = ["//visibility:public"], +) + +cc_library( + name = "{name}", + deps = [":{name}_wodeps"] + {deps}, + visibility = ["//visibility:public"], +) +""" + +def resolve_symlink(target_path, relative_symlink): + # Split paths into components + target_parts = target_path.split("/") + symlink_parts = relative_symlink.split("/") + + # Remove the file name from target path to get the directory + target_dir_parts = target_parts[:-1] + + # Process the relative symlink + result_parts = target_dir_parts[:] + for part in symlink_parts: + if part == "..": + # Move up one directory by removing the last component + if result_parts: + result_parts.pop() + elif part == "." or part == "": + # Ignore current directory or empty components + continue + else: + # Append the component to the path + result_parts.append(part) + + # Join the parts back into a path + resolved_path = "/".join(result_parts) + return resolved_path + +def _discover_contents(rctx, depends_on, depends_file_map, target_name): + result = rctx.execute(["tar", "--exclude='./usr/share/**'", "--exclude='./**/'", "-tvf", "data.tar.xz"]) + contents_raw = result.stdout.splitlines() + + so_files = [] + a_files = [] + h_files = [] + hpp_files = [] + hpp_files_woext = [] + pc_files = [] + o_files = [] + symlinks = {} + + for line in contents_raw: + # Skip directories + if line.endswith("/"): + continue + + line = line[line.find(" ./") + 3:] + + # Skip everything in man pages and examples + if line.startswith("usr/share"): + continue + + is_symlink_idx = line.find(" -> ") + resolved_symlink = None + if is_symlink_idx != -1: + symlink_target = line[is_symlink_idx + 4:] + line = line[:is_symlink_idx] + if line.endswith(".pc"): + continue + + # An absolute symlink + if symlink_target.startswith("/"): + resolved_symlink = symlink_target.removeprefix("/") + else: + resolved_symlink = resolve_symlink(line, symlink_target).removeprefix("./") + + if (line.endswith(".so") or line.find(".so.") != -1) and line.find("lib") != -1: + if line.find("libthread_db") != -1: + continue + so_files.append(line) + elif line.endswith(".a") and line.find("lib"): + a_files.append(line) + elif line.endswith(".pc") and line.find("pkgconfig"): + pc_files.append(line) + elif line.endswith(".h"): + h_files.append(line) + elif line.endswith(".hpp"): + hpp_files.append(line) + elif line.find("include/c++") != -1 or (line.find("usr/include/") != -1 and line[line.rfind("/") + 1:].find(".") == -1): + hpp_files_woext.append(line) + elif line.endswith(".o"): + o_files.append(line) + else: + continue + + if resolved_symlink: + symlinks[line] = resolved_symlink + + # Resolve symlinks: + unresolved_symlinks = {} | symlinks + + # TODO: this is highly inefficient, change the filemapping to be + # file -> package instead of package -> files + for dep in depends_on: + (suite, name, arch, _) = lockfile.parse_package_key(dep) + filemap = depends_file_map.get(name, []) or [] + for file in filemap: + if len(unresolved_symlinks) == 0: + break + for (symlink, symlink_target) in unresolved_symlinks.items(): + if file == symlink_target: + unresolved_symlinks.pop(symlink) + symlinks[symlink] = "@%s//:%s" % (util.sanitize(dep), file) + + # Resolve self symlinks + self_symlinks = {} + for file in so_files + h_files + hpp_files + a_files + hpp_files_woext: + for (symlink, symlink_target) in unresolved_symlinks.items(): + if file == symlink_target: + self_symlinks[symlink] = symlinks.pop(symlink) + unresolved_symlinks.pop(symlink) + if len(unresolved_symlinks) == 0: + break + + if len(unresolved_symlinks): + util.warning( + rctx, + "some symlinks could not be solved for {}. \nresolved: {}\nunresolved:{}".format( + target_name, + json.encode_indent(symlinks), + json.encode_indent(unresolved_symlinks), + ), + ) + + outs = [] + + for out in so_files + h_files + hpp_files + a_files + hpp_files_woext + o_files: + if out not in symlinks: + outs.append(out) + + deps = [] + for dep in depends_on: + (suite, name, arch, version) = lockfile.parse_package_key(dep) + deps.append( + "@%s//:%s_wodeps" % (util.sanitize(dep), name.removesuffix("-dev")), + ) + + pkgconfigs = [] + if len(pc_files): + # TODO: use rctx.extract instead. + rctx.execute( + ["tar", "-xvf", "data.tar.xz"] + ["./" + pc for pc in pc_files], + ) + for pc in pc_files: + if rctx.path(pc).exists: + pkgconfigs.append(pc) + + build_file_content = """ +so_library( + name = "_so_libs", + dynamic_libs = {} +) +""".format(so_files) + + rpaths = {} + for so in so_files + a_files: + rpath = so[:so.rfind("/")] + rpaths[rpath] = None + + # Package has a pkgconfig, use that as the source of truth. + if len(pkgconfigs): + link_paths = [] + includes = [] + + static_lib = None + shared_lib = None + + import_targets = [] + + for pc_file in pkgconfigs: + pkgc = pkgconfig(rctx, pc_file) + includes += pkgc.includes + link_paths += pkgc.link_paths + + if len(pkgc.libnames) == 0: + continue + + for libname in pkgc.libnames: + if libname + "_import" in import_targets: + continue + + subtarget = libname + "_import" + import_targets.append(subtarget) + + # Look for a static archive + # for ar in a_files: + # if ar.endswith(pkgc.libname + ".a"): + # static_lib = '":%s"' % ar + # break + + # Look for a dynamic library + IGNORE = ["libfl"] + for so_lib in so_files: + if libname and libname not in IGNORE and so_lib.endswith(libname + ".so"): + shared_lib = '":%s"' % so_lib + break + + build_file_content += _CC_IMPORT_TMPL.format( + name = subtarget, + shared_lib = shared_lib, + static_lib = static_lib, + hdrs = [], + includes = { + "external/.." + include: True + for include in includes + ["/usr/include", "/usr/include/x86_64-linux-gnu"] + }.keys(), + linkopts = pkgc.linkopts, + ) + + build_file_content += _CC_LIBRARY_TMPL.format( + name = target_name, + hdrs = h_files + hpp_files, + additional_compiler_inputs = hpp_files_woext, + additional_linker_inputs = so_files + o_files, + linkopts = { + opt: True + for opt in [ + # # Needed for cc_test binaries to locate its dependencies. + # "-Wl,-rpath=../{}/{}".format(rctx.attr.name, rpath) + # for rp in rpaths + ] + [ + # Needed for cc_test binaries to locate its dependencies as a build tool + # "-Wl,-rpath=./external/{}/{}".format(rctx.attr.name, rpath) + # for rp in rpaths + ] + [ + "-L$(BINDIR)/external/{}/{}".format(rctx.attr.name, lp) + for lp in link_paths + ] + [ + "-Wl,-rpath=/" + rp + for rp in rpaths + ] + }.keys(), + direct_deps = import_targets + [":_so_libs"], + deps = deps, + strip_include_prefix = None, + ) + + elif (len(hpp_files) or len(h_files)) and ((target_name.find("libc") != -1 or target_name.find("libstdc") != -1 or target_name.find("libgcc") != -1)): + build_file_content += _CC_LIBRARY_LIBC_TMPL.format( + name = target_name, + hdrs = h_files + hpp_files, + additional_compiler_inputs = hpp_files_woext, + additional_linker_inputs = so_files + a_files + o_files, + includes = [], + ) + else: + extra_linkopts = [] + if target_name == "libbsd0": + extra_linkopts = [ + "-Wl,--remap-inputs=/usr/lib/x86_64-linux-gnu/libbsd.so.0.11.7=$(BINDIR)/external/{}/usr/lib/x86_64-linux-gnu/libbsd.so.0.11.7".format(rctx.attr.name), + ] + build_file_content += _CC_SYS_LIBRARY_TMPL.format( + name = target_name, + hdrs = h_files + hpp_files, + deps = deps, + additional_compiler_inputs = hpp_files_woext, + additional_linker_inputs = so_files + o_files, + linkopts = [ + # Required for linker to find .so libraries + "-L$(BINDIR)/external/{}/{}".format(rctx.attr.name, rp) + for rp in rpaths + ] + [ + # # Required for bazel test binary to find its dependencies. + # "-Wl,-rpath=../{}/{}".format(rctx.attr.name, rp) + # for rp in rpaths + ] + [ + # Required for ld to validate rpath entries + "-Wl,-rpath-link=$(BINDIR)/external/{}/{}".format(rctx.attr.name, rp) + for rp in rpaths + ] + [ + # Required for containers to find the dependencies at runtime. + "-Wl,-rpath=/" + rp + for rp in rpaths + ] + extra_linkopts, + direct_deps = [":_so_libs"], + ) + + return (build_file_content, outs, symlinks) + +def _deb_import_impl(rctx): + rctx.download_and_extract( + url = rctx.attr.urls, + sha256 = rctx.attr.sha256, ) + + # TODO: only do this if package is -dev or dependent of a -dev pkg. + cc_import_targets, outs, symlinks = _discover_contents( + rctx, + rctx.attr.depends_on, + json.decode(rctx.attr.depends_file_map), + rctx.attr.package_name.removesuffix("-dev"), + ) + + foreign_symlinks = {} + for (i, symlink) in enumerate(symlinks.values()): + if symlink not in foreign_symlinks: + foreign_symlinks[symlink] = [] + foreign_symlinks[symlink].append(i) + + foreign_symlinks = { + symlink: json.encode(indices) + for (symlink, indices) in foreign_symlinks.items() + } + + rctx.file("BUILD.bazel", _DEB_IMPORT_BUILD_TMPL.format( + mergedusr = rctx.attr.mergedusr, + depends_on = ["@" + util.sanitize(dep_key) + "//:data" for dep_key in rctx.attr.depends_on], + target_name = rctx.attr.target_name, + cc_import_targets = cc_import_targets, + outs = outs, + foreign_symlinks = foreign_symlinks, + symlink_outs = symlinks.keys(), + )) + +deb_import = repository_rule( + implementation = _deb_import_impl, + attrs = { + "urls": attr.string_list(mandatory = True, allow_empty = False), + "sha256": attr.string(), + "depends_on": attr.string_list(), + "depends_file_map": attr.string(), + "mergedusr": attr.bool(), + "target_name": attr.string(), + "package_name": attr.string(), + }, +) diff --git a/apt/private/deb_resolve.bzl b/apt/private/deb_resolve.bzl deleted file mode 100644 index c066c2f8..00000000 --- a/apt/private/deb_resolve.bzl +++ /dev/null @@ -1,162 +0,0 @@ -"repository rule for resolving and generating lockfile" - -load("@bazel_lib//lib:repo_utils.bzl", "repo_utils") -load(":apt_deb_repository.bzl", "deb_repository") -load(":apt_dep_resolver.bzl", "dependency_resolver") -load(":lockfile.bzl", "lockfile") -load(":util.bzl", "util") -load(":version_constraint.bzl", "version_constraint") - -def _parse_manifest(rctx, yq_toolchain_prefix, manifest): - is_windows = repo_utils.is_windows(rctx) - host_yq = Label("@{}_{}//:yq{}".format(yq_toolchain_prefix, repo_utils.platform(rctx), ".exe" if is_windows else "")) - - if hasattr(rctx, "watch"): - rctx.watch(manifest) - - yq_args = [ - str(rctx.path(host_yq)), - str(rctx.path(manifest)), - "-o=json", - ] - result = rctx.execute(yq_args) - if result.return_code: - fail("failed to parse manifest yq. '{}' exited with {}: \nSTDOUT:\n{}\nSTDERR:\n{}".format(" ".join(yq_args), result.return_code, result.stdout, result.stderr)) - - return json.decode(result.stdout if result.stdout != "null" else "{}") - -# This function is shared between BZLMOD and WORKSPACE implementations. -# INTERNAL: DO NOT DEPEND! -# buildifier: disable=function-docstring-args -def internal_resolve(rctx, yq_toolchain_prefix, manifest, include_transitive): - manifest = _parse_manifest(rctx, yq_toolchain_prefix, manifest) - - if manifest["version"] != 1: - fail("Unsupported manifest version, {}. Please use `version: 1` manifest.".format(manifest["version"])) - - if type(manifest["sources"]) != "list": - fail("`sources` should be an array") - - if type(manifest["archs"]) != "list": - fail("`archs` should be an array") - - if type(manifest["packages"]) != "list": - fail("`packages` should be an array") - - sources = [] - - for src in manifest["sources"]: - distr, components = src["channel"].split(" ", 1) - for comp in components.split(" "): - # TODO: only support urls before 1.0 - if "urls" in src: - urls = src["urls"] - elif "url" in src: - urls = [src["url"]] - else: - fail("Source missing 'url' or 'urls' field") - - sources.append(( - urls, - distr, - comp, - )) - - repository = deb_repository.new(rctx, sources = sources, archs = manifest["archs"]) - resolver = dependency_resolver.new(repository) - lockf = lockfile.empty(rctx) - - resolved_count = 0 - - for arch in manifest["archs"]: - resolved_count = 0 - dep_constraint_set = {} - for dep_constraint in manifest["packages"]: - if dep_constraint in dep_constraint_set: - fail("Duplicate package, {}. Please remove it from your manifest".format(dep_constraint)) - dep_constraint_set[dep_constraint] = True - - constraint = version_constraint.parse_depends(dep_constraint).pop() - - rctx.report_progress("Resolving %s for %s" % (dep_constraint, arch)) - (package, dependencies, unmet_dependencies) = resolver.resolve_all( - name = constraint["name"], - version = constraint["version"], - arch = arch, - include_transitive = include_transitive, - ) - - if not package: - fail("Unable to locate package `%s` for architecture: %s. It may only exist for specific set of architectures." % (dep_constraint, arch)) - - if len(unmet_dependencies): - # buildifier: disable=print - util.warning(rctx, "Following dependencies could not be resolved for %s: %s" % (constraint["name"], ",".join([up[0] for up in unmet_dependencies]))) - - lockf.add_package(package, arch) - - resolved_count += len(dependencies) + 1 - - for dep in dependencies: - lockf.add_package(dep, arch) - lockf.add_package_dependency(package, dep, arch) - - rctx.report_progress("Resolved %d packages for %s" % (resolved_count, arch)) - return lockf - -_BUILD_TMPL = """ -load("@rules_shell//shell:sh_binary.bzl", "sh_binary") - -filegroup( - name = "lockfile", - srcs = ["lock.json"], - tags = ["manual"], - visibility = ["//visibility:public"] -) - -sh_binary( - name = "lock", - srcs = ["copy.sh"], - data = ["lock.json"], - tags = ["manual"], - args = ["$(location :lock.json)"], - visibility = ["//visibility:public"] -) -""" - -def _deb_resolve_impl(rctx): - lockf = internal_resolve(rctx, rctx.attr.yq_toolchain_prefix, rctx.attr.manifest, rctx.attr.resolve_transitive) - lockf.write("lock.json") - - lock_filename = rctx.attr.manifest.name.replace(".yaml", ".lock.json") - lock_label = rctx.attr.manifest.relative(lock_filename) - workspace_relative_path = "{}{}".format( - ("%s/" % lock_label.package) if lock_label.package else "", - lock_label.name, - ) - - rctx.file( - "copy.sh", - rctx.read(rctx.attr._copy_sh_tmpl).format( - repo_name = util.get_repo_name(rctx.name).replace("_resolve", ""), - lock_label = lock_label, - workspace_relative_path = workspace_relative_path, - ), - executable = True, - ) - - rctx.file("BUILD.bazel", _BUILD_TMPL) - -deb_resolve = repository_rule( - implementation = _deb_resolve_impl, - attrs = { - "manifest": attr.label(), - "resolve_transitive": attr.bool(default = True), - "yq_toolchain_prefix": attr.string(default = "yq"), - "_copy_sh_tmpl": attr.label( - default = "//apt/private:copy.sh.tmpl", - doc = "INTERNAL, DO NOT USE - " + - "private attribute label to prevent repo restart", - ), - }, -) diff --git a/apt/private/deb_translate_lock.bzl b/apt/private/deb_translate_lock.bzl deleted file mode 100644 index fc0fc717..00000000 --- a/apt/private/deb_translate_lock.bzl +++ /dev/null @@ -1,242 +0,0 @@ -"repository rule for generating a dependency graph from a lockfile." - -load(":lockfile.bzl", "lockfile") -load(":starlark_codegen_utils.bzl", "starlark_codegen_utils") -load(":util.bzl", "util") - -# header template for packages.bzl file -_DEB_IMPORT_HEADER_TMPL = '''\ -"""Generated by rules_distroless. DO NOT EDIT.""" -load("@rules_distroless//apt/private:deb_import.bzl", "deb_import") - -# buildifier: disable=function-docstring -def {}_packages(): -''' - -# deb_import template for packages.bzl file -_DEB_IMPORT_TMPL = '''\ - deb_import( - name = "{name}", - urls = {urls}, - sha256 = "{sha256}", - ) -''' - -_PACKAGE_TEMPLATE = '''\ -"""Generated by rules_distroless. DO NOT EDIT.""" - -alias( - name = "data", - actual = select({data_targets}), - visibility = ["//visibility:public"], -) - -alias( - name = "control", - actual = select({control_targets}), - visibility = ["//visibility:public"], -) - -filegroup( - name = "{target_name}", - srcs = select({deps}) + [":data"], - visibility = ["//visibility:public"], -) -''' - -_ROOT_BUILD_TMPL = """\ -"Generated by rules_distroless. DO NOT EDIT." - -load("@rules_distroless//apt:defs.bzl", "dpkg_status") -load("@rules_distroless//distroless:defs.bzl", "flatten") - -exports_files(['packages.bzl']) - -# Map Debian architectures to platform CPUs. -# -# For more info on Debian architectures, see: -# * https://wiki.debian.org/SupportedArchitectures -# * https://wiki.debian.org/ArchitectureSpecificsMemo -# * https://www.debian.org/releases/stable/amd64/ch02s01.en.html#idm186 -# -# For more info on Bazel's platforms CPUs see: -# * https://github.com/bazelbuild/platforms/blob/main/cpu/BUILD -_ARCHITECTURE_MAP = {{ - "amd64": "x86_64", - "arm64": "arm64", - "ppc64el": "ppc64le", - "mips64el": "mips64", - "s390x": "s390x", - "i386": "x86_32", - "armhf": "armv7e-mf", - "riscv64": "riscv64", - "all": "all", -}} - -_ARCHITECTURES = {architectures} - -[ - config_setting( - name = os + "_" + arch, - constraint_values = [ - "@platforms//os:" + os, - "@platforms//cpu:" + _ARCHITECTURE_MAP[arch], - ], - visibility = ["//:__subpackages__"], - ) - for os in ["linux"] - for arch in _ARCHITECTURES -] - - -alias( - name = "lock", - actual = "@{target_name}_resolve//:lock", - visibility = ["//visibility:public"], -) - -# List of installed packages. For now it's private. -_PACKAGES = {packages} - -# Creates /var/lib/dpkg/status with installed package information. -dpkg_status( - name = "dpkg_status", - controls = select({{ - "//:linux_%s" % arch: ["//%s:control" % package for package in packages] - for arch, packages in _PACKAGES.items() - }}) if _PACKAGES else {{}}, - visibility = ["//visibility:public"], -) - -filegroup( - name = "packages", - srcs = select({{ - "//:linux_%s" % arch: ["//%s" % package for package in packages] - for arch, packages in _PACKAGES.items() - }}) if _PACKAGES else {{}}, - visibility = ["//visibility:public"], -) - - -# A filegroup that contains all the packages and the dpkg status file. -filegroup( - name = "{target_name}", - srcs = [ - ":dpkg_status", - ":packages", - ], - visibility = ["//visibility:public"], -) - -flatten( - name = "flat", - tars = [ - "{target_name}", - ], - deduplicate = True, - visibility = ["//visibility:public"], -) -""" - -def _deb_translate_lock_impl(rctx): - lock_content = rctx.attr.lock_content - package_template = rctx.read(rctx.attr.package_template) - lockf = lockfile.from_json(rctx, lock_content if lock_content else rctx.read(rctx.attr.lock)) - - package_defs = [] - - if not lock_content: - package_defs = [_DEB_IMPORT_HEADER_TMPL.format(rctx.attr.name)] - - if len(lockf.packages()) < 1: - package_defs.append(" pass") - - # TODO: rework lockfile to include architecure information - architectures = {} - packages = {} - - for (package) in lockf.packages(): - package_key = lockfile.make_package_key( - package["name"], - package["version"], - package["arch"], - ) - - if package["arch"] not in architectures: - architectures[package["arch"]] = [] - - if package["name"] not in architectures[package["arch"]]: - architectures[package["arch"]].append(package["name"]) - - if package["name"] not in packages: - packages[package["name"]] = [] - if package["arch"] not in packages[package["name"]]: - packages[package["name"]].append(package["arch"]) - - if not lock_content: - package_defs.append( - _DEB_IMPORT_TMPL.format( - name = "%s_%s" % (rctx.attr.name, package_key), - package_name = package["name"], - urls = package["urls"], - sha256 = package["sha256"], - ), - ) - - repo_name = "%s%s_%s" % ("@" if lock_content else "", rctx.attr.name, package_key) - - rctx.file( - "%s/%s/BUILD.bazel" % (package["name"], package["arch"]), - package_template.format( - target_name = package["arch"], - data_targets = '"@%s//:data"' % repo_name, - control_targets = '"@%s//:control"' % repo_name, - src = '"@%s//:data"' % repo_name, - deps = starlark_codegen_utils.to_list_attr([ - "//%s/%s" % (dep["name"], package["arch"]) - for dep in package["dependencies"] - ]), - urls = package["urls"], - name = package["name"], - arch = package["arch"], - sha256 = package["sha256"], - repo_name = "%s" % repo_name, - ), - ) - - # TODO: rework lockfile to include architecure information and merge these two loops - for package_name, package_archs in packages.items(): - rctx.file( - "%s/BUILD.bazel" % (package_name), - _PACKAGE_TEMPLATE.format( - target_name = package_name, - data_targets = starlark_codegen_utils.to_dict_attr({ - "//:linux_%s" % arch: "//%s/%s:data" % (package_name, arch) - for arch in package_archs - }), - control_targets = starlark_codegen_utils.to_dict_attr({ - "//:linux_%s" % arch: "//%s/%s:control" % (package_name, arch) - for arch in package_archs - }), - deps = starlark_codegen_utils.to_dict_list_attr({ - "//:linux_%s" % arch: ["//%s/%s" % (package_name, arch)] - for arch in package_archs - }), - ), - ) - - rctx.file("packages.bzl", "\n".join(package_defs)) - rctx.file("BUILD.bazel", _ROOT_BUILD_TMPL.format( - target_name = util.get_repo_name(rctx.attr.name), - packages = starlark_codegen_utils.to_dict_list_attr(architectures), - architectures = starlark_codegen_utils.to_list_attr(architectures.keys()), - )) - -deb_translate_lock = repository_rule( - implementation = _deb_translate_lock_impl, - attrs = { - "lock": attr.label(), - "lock_content": attr.string(doc = "INTERNAL: DO NOT USE"), - "package_template": attr.label(default = "//apt/private:package.BUILD.tmpl"), - }, -) diff --git a/apt/private/lockfile.bzl b/apt/private/lockfile.bzl index 4cde7fec..03b58e8b 100644 --- a/apt/private/lockfile.bzl +++ b/apt/private/lockfile.bzl @@ -1,101 +1,126 @@ "lock" -load("@bazel_skylib//lib:new_sets.bzl", "sets") -load(":util.bzl", "util") - -def _make_package_key(name, version, arch): - return "%s_%s_%s" % ( - util.sanitize(name), - util.sanitize(version), +def _make_package_key(suite, name, version, arch): + return "/%s/%s:%s=%s" % ( + suite, + name, arch, + version, ) -def _package_key(package, arch): - return _make_package_key(package["Package"], package["Version"], arch) +def _parse_package_key(key): + rest = key[1:] + (suite, rest) = rest.split("/", 1) + (name, rest) = rest.split(":", 1) + (arch, version) = rest.split("=", 1) + return (suite, name, arch, version) + +def _short_package_key(package): + return "/%s/%s:%s" % ( + package["Dist"], + package["Package"], + package["Architecture"], + ) -def _add_package(lock, package, arch): - k = _package_key(package, arch) - if k in lock.fast_package_lookup: +def _package_key(package): + return _make_package_key(package["Dist"], package["Package"], package["Version"], package["Architecture"]) + +def _add_package(lock, package): + k = _package_key(package) + if k in lock.packages: return - lock.packages.append({ - "key": k, + lock.packages[k] = { "name": package["Package"], "version": package["Version"], - "urls": [ - "%s/%s" % (root, package["Filename"]) - for root in package["Roots"] - ], + "architecture": package["Architecture"], "sha256": package["SHA256"], - "arch": arch, - "dependencies": [], - }) - lock.fast_package_lookup[k] = len(lock.packages) - 1 - lock.fast_package_dependencies_lookup[k] = sets.make() - -def _add_package_dependency(lock, package, dependency, arch): - k = _package_key(package, arch) - if k not in lock.fast_package_lookup: - fail("Broken state: %s is not in the lockfile." % package["Package"]) - i = lock.fast_package_lookup[k] - - dependency_key = _package_key(dependency, arch) - if not sets.contains(lock.fast_package_dependencies_lookup[k], dependency_key): - lock.packages[i]["dependencies"].append(dict( - key = dependency_key, - name = dependency["Package"], - version = dependency["Version"], - )) - lock.fast_package_dependencies_lookup[k] = sets.insert(lock.fast_package_dependencies_lookup[k], dependency_key) - -def _has_package(lock, name, version, arch): - key = "%s_%s_%s" % (util.sanitize(name), util.sanitize(version), arch) - return key in lock.fast_package_lookup - -def _create(rctx, lock): + "filename": package["Filename"], + "suite": package["Dist"], + "section": package["Section"], + "size": int(package["Size"]), + "depends_on": [], + } + +def _add_package_dependency(lock, package, dependency): + k = _package_key(package) + if k not in lock.packages: + fail("illegal state: %s is not in the lockfile." % package["Package"]) + sk = _package_key(dependency) + if sk in lock.packages[k]["depends_on"]: + return + lock.packages[k]["depends_on"].append(sk) + +def _has_package(lock, suite, name, version, arch): + return _make_package_key(suite, name, version, arch) in lock.packages + +def _add_source(lock, suite, types, uris, components, architectures): + lock.sources[suite] = { + "types": types, + "uris": uris, + "components": components, + "architectures": architectures, + } + +def _create(mctx, lock): return struct( has_package = lambda *args, **kwargs: _has_package(lock, *args, **kwargs), + add_source = lambda *args, **kwargs: _add_source(lock, *args, **kwargs), add_package = lambda *args, **kwargs: _add_package(lock, *args, **kwargs), add_package_dependency = lambda *args, **kwargs: _add_package_dependency(lock, *args, **kwargs), packages = lambda: lock.packages, - write = lambda out: rctx.file(out, json.encode_indent(struct(version = lock.version, packages = lock.packages)), executable = False), - as_json = lambda: json.encode_indent(struct(version = lock.version, packages = lock.packages)), + sources = lambda: lock.sources, + dependency_sets = lambda: lock.dependency_sets, + facts = lambda: lock.facts, + write = lambda out: mctx.file(out, _encode_compact(lock)), + as_json = lambda: _encode_compact(lock), ) -def _empty(rctx): +def _empty(mctx): lock = struct( - version = 1, - packages = list(), - fast_package_lookup = dict(), - fast_package_dependencies_lookup = dict(), + version = 2, + dependency_sets = dict(), + packages = dict(), + sources = dict(), + facts = dict(), ) - return _create(rctx, lock) + return _create(mctx, lock) + +def _encode_compact(lock): + return json.encode_indent(lock) -def _from_json(rctx, content): +def _from_json(mctx, content): if not content: - return _empty(rctx) + return _empty(mctx) lock = json.decode(content) - if lock["version"] != 1: - fail("invalid lockfile version") + if lock["version"] != 2: + fail("lock file version %d is not supported anymore. please upgrade your lock file" % lock["version"]) lock = struct( version = lock["version"], - packages = lock["packages"], - fast_package_lookup = dict(), - fast_package_dependencies_lookup = dict(), + dependency_sets = lock["dependency_sets"] if "dependency_sets" in lock else dict(), + packages = lock["packages"] if "packages" in lock else dict(), + sources = lock["sources"] if "sources" in lock else dict(), + facts = lock["facts"] if "facts" in lock else dict(), ) - for (i, package) in enumerate(lock.packages): - # TODO: only support urls before 1.0 - if "url" in package: - package["urls"] = [package.pop("url")] + return _create(mctx, lock) - lock.packages[i] = package - lock.fast_package_lookup[package["key"]] = i - lock.fast_package_dependencies_lookup[package["key"]] = sets.make([d["key"] for d in package["dependencies"]]) - return _create(rctx, lock) +def _merge(mctx, locks): + mlock = _empty(mctx) + packages = mlock.packages() + facts = mlock.facts() + for lock in locks: + for (key, pkg) in lock.packages().items(): + packages[key] = pkg + for (key, fact) in lock.facts().items(): + facts[key] = fact + return mlock lockfile = struct( empty = _empty, from_json = _from_json, - make_package_key = _make_package_key, + package_key = _package_key, + short_package_key = _short_package_key, + parse_package_key = _parse_package_key, + merge = _merge, ) diff --git a/apt/private/package.BUILD.tmpl b/apt/private/package.BUILD.tmpl index 563c33d2..0e7f4876 100644 --- a/apt/private/package.BUILD.tmpl +++ b/apt/private/package.BUILD.tmpl @@ -16,4 +16,4 @@ filegroup( name = "{target_name}", srcs = {deps} + [":data"], visibility = ["//visibility:public"], -) \ No newline at end of file +) diff --git a/apt/private/pkgconfig.bzl b/apt/private/pkgconfig.bzl new file mode 100644 index 00000000..78f90672 --- /dev/null +++ b/apt/private/pkgconfig.bzl @@ -0,0 +1,167 @@ +# Copyright thesayyn 2025 +# Taken from https://github.com/thesayyn/pkgconfig/blob/main/extensions.bzl +def _expand_value(value, variables): + # fast path + if value.find("$") == -1: + return value + + expanded_value = "" + key = "" + in_subs = False + + def assert_in_subs(): + if not in_subs: + fail("corrupted pc file") + + for c in value.elems(): + if c == "$": + in_subs = True + elif c == "{": + assert_in_subs() + elif c == "}": + assert_in_subs() + if key not in variables: + # fail("corrupted pc file") + value_of_key = "" + else: + value_of_key = variables[key] + + # reset subs state + key = "" + in_subs = False + + expanded_value += value_of_key + elif in_subs: + key += c + else: + expanded_value += c + + return expanded_value + +def parse_pc(pc): + variables = {} + directives = {} + for l in pc.splitlines(): + if l.startswith("#"): + continue + if not l.strip(): + continue + if l.find(": ") != -1: + (k, v) = _split_once(l, ":") + directives[k] = _expand_value(v.removeprefix(" "), variables) + elif l.find("=") != -1: + (k, v) = _split_once(l, "=") + variables[k] = _expand_value(v, variables) + + return (directives, variables) + +def _split_once(l, sep): + values = l.split(sep, 1) + if len(values) < 2: + fail("corrupted pc config") + return (values[0], values[1]) + +def _parse_requires(re): + if not re: + return [] + deps = re.split(",") + return [dep.strip(" ") for dep in deps if dep.strip(" ")] + +def _trim(str): + return str.rstrip(" ").lstrip(" ") + +def process_pcconfig(pc): + (directives, variables) = pc + includedir = "" + libdir = "" + if "includedir" in variables: + includedir = _trim(variables["includedir"]) + if "libdir" in variables: + libdir = _trim(variables["libdir"]) + linkopts = [] + includes = [] + link_paths = [] + defines = [] + libnames = [] + + IGNORE = [ + "-licui18n", + "-licuuc", + "-licudata", + "-lz", + "-llzma", + "-lfl", + ] + + if "Libs" in directives: + libs = _trim(directives["Libs"]).split(" ") + for arg in libs: + if arg.startswith("-L"): + linkpath = arg.removeprefix("-L") + + # skip bare -L args + if not linkpath: + continue + link_paths.append(linkpath) + linkopts.append("-Wl,-rpath=" + arg.removeprefix("-L")) + continue + elif arg.startswith("-l"): + libnames.append("lib" + arg.removeprefix("-l")) + continue + elif arg in IGNORE: + continue + linkopts.append(arg) + + if "Libs.private" in directives: + libs = _trim(directives["Libs.private"]).split(" ") + for arg in libs: + if arg in IGNORE: + continue + elif arg.startswith("-l"): + # The cc_imports we create based on these names are private already, + # so we don't need to do anything special for `Libs.private`. + libnames.append("lib" + arg.removeprefix("-l")) + + if "Cflags" in directives: + cflags = _trim(directives["Cflags"]).split(" ") + for flag in cflags: + if flag.startswith("-I"): + include = flag.removeprefix("-I") + + # skip bare -I arguments + if not include: + continue + includes.append(include) + + # If the include is direct include eg $includedir (/usr/include/hiredis) + # equals to -I/usr/include/hiredis then we need to add /usr/include into + # includes array to satify imports as `#include ` + if include == includedir: + includes.append(include.removesuffix("/" + directives["Name"])) + elif include.startswith(includedir): + includes.append(include.removesuffix("/" + directives["Name"])) + elif flag.startswith("-D"): + define = flag.removeprefix("-D") + defines.append(define) + + if len(includes) == 0: + includes = [ + # Standard include path if the package does not specify includes + "/usr/include", + ] + + return (libnames, includedir, libdir, linkopts, link_paths, includes, defines) + +def pkgconfig(rctx, path): + pc = parse_pc(rctx.read(path)) + (libnames, includedir, libdir, linkopts, link_paths, includes, defines) = process_pcconfig(pc) + + return struct( + libnames = libnames, + includedir = includedir, + libdir = libdir, + linkopts = linkopts, + link_paths = link_paths, + includes = includes, + defines = defines, + ) diff --git a/apt/private/so_library.bzl b/apt/private/so_library.bzl new file mode 100644 index 00000000..49c1a4ea --- /dev/null +++ b/apt/private/so_library.bzl @@ -0,0 +1,66 @@ +load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cpp_toolchain", "use_cc_toolchain") + +def _so_library_impl(ctx): + cc_toolchain = find_cpp_toolchain(ctx) + + feature_configuration = cc_common.configure_features( + ctx = ctx, + cc_toolchain = cc_toolchain, + language = "c++", + requested_features = ctx.features, + unsupported_features = ctx.disabled_features, + ) + + libraries = [] + + ifsos = {} + + for dyn_lib in ctx.files.dynamic_libs: + if dyn_lib.owner.package != ctx.label.package: + fail(".so libraries must reside in current package. %s != %s" % (dyn_lib.owner.package, ctx.label.package)) + short_path = dyn_lib.short_path + repo_relative_path = short_path[short_path.find(dyn_lib.owner.repo_name) + len(dyn_lib.owner.repo_name) + 1:] + ifso_name = repo_relative_path[:repo_relative_path.rfind("/")] + if ifso_name in ifsos: + ifso = ifsos[ifso_name] + else: + # TODO: this potentially wasterful, symlink all so libraries into a directory + # and create one ifso in the folder. + ifso = ctx.actions.declare_file(ifso_name + "/rpath.ifso") + ifsos[ifso_name] = ifso + ctx.actions.write(ifso, content = """ + /* GNU LD script + * Empty linker script for empty interface library */ + """) + lib = cc_common.create_library_to_link( + actions = ctx.actions, + cc_toolchain = cc_toolchain, + interface_library = ifso, + dynamic_library = dyn_lib, + feature_configuration = feature_configuration, + ) + libraries.append(lib) + + linker_input = cc_common.create_linker_input( + owner = ctx.label, + libraries = depset(libraries), + additional_inputs = depset([]), + user_link_flags = depset([]), + ) + + linking_context = cc_common.create_linking_context( + linker_inputs = depset([linker_input]), + ) + + return [ + CcInfo(linking_context = linking_context), + ] + +so_library = rule( + implementation = _so_library_impl, + attrs = { + "dynamic_libs": attr.label_list(allow_files = True), + }, + fragments = ["cpp"], + toolchains = use_cc_toolchain(), +) diff --git a/apt/private/translate_dependency_set.bzl b/apt/private/translate_dependency_set.bzl new file mode 100644 index 00000000..4ac20cff --- /dev/null +++ b/apt/private/translate_dependency_set.bzl @@ -0,0 +1,231 @@ +"repository rule for generating a dependency graph from a lockfile." + +load(":lockfile.bzl", "lockfile") +load(":starlark_codegen_utils.bzl", "starlark_codegen_utils") +load(":util.bzl", "util") + +_ROOT_BUILD_TMPL = """\ +"Generated by rules_distroless. DO NOT EDIT." + +load("@rules_distroless//apt:defs.bzl", "dpkg_status") +load("@rules_distroless//distroless:defs.bzl", "flatten") + +exports_files(['packages.bzl']) + +# Map Debian architectures to platform CPUs. +# +# For more info on Debian architectures, see: +# * https://wiki.debian.org/SupportedArchitectures +# * https://wiki.debian.org/ArchitectureSpecificsMemo +# * https://www.debian.org/releases/stable/amd64/ch02s01.en.html#idm186 +# +# For more info on Bazel's platforms CPUs see: +# * https://github.com/bazelbuild/platforms/blob/main/cpu/BUILD +_ARCHITECTURE_MAP = {{ + "amd64": "x86_64", + "arm64": "arm64", + "ppc64el": "ppc64le", + "mips64el": "mips64", + "s390x": "s390x", + "i386": "x86_32", + "armhf": "armv7e-mf", + "all": "all", +}} + +_ARCHITECTURES = {architectures} + +[ + config_setting( + name = os + "_" + arch, + constraint_values = [ + "@platforms//os:" + os, + "@platforms//cpu:" + _ARCHITECTURE_MAP[arch], + ], + ) + for os in ["linux"] + for arch in _ARCHITECTURES +] + + +# List of installed packages. For now it's private. +_PACKAGES = {packages} + +# Creates /var/lib/dpkg/status with installed package information. +dpkg_status( + name = "dpkg_status", + controls = select({{ + "//:linux_%s" % arch: ["//%s:control" % package for package in packages] + for arch, packages in _PACKAGES.items() + }}) if _PACKAGES else {{}}, + visibility = ["//visibility:public"], +) + +filegroup( + name = "packages", + srcs = select({{ + "//:linux_%s" % arch: ["//%s" % package for package in packages] + for arch, packages in _PACKAGES.items() + }}) if _PACKAGES else {{}}, + visibility = ["//visibility:public"], +) + + +# A filegroup that contains all the packages and the dpkg status file. +filegroup( + name = "{target_name}", + srcs = [ + ":dpkg_status", + ":packages", + ], + visibility = ["//visibility:public"], +) + +flatten( + name = "flat", + tars = [ + "{target_name}", + ], + deduplicate = True, + visibility = ["//visibility:public"], +) +""" + +_PACKAGE_TEMPLATE = '''\ +"""Generated by rules_distroless. DO NOT EDIT.""" + +NO_MATCH_ERROR=""" +Package "{target_name}" is not available for the current target platform. + +Available Platforms: {available_platforms} + +- Set `--platforms` on the command line. +- Perform a transition to one of the available platforms +""" + +alias( + name = "data", + actual = select({data_targets}, no_match_error = NO_MATCH_ERROR), + visibility = ["//visibility:public"], +) + +alias( + name = "control", + actual = select({control_targets}, no_match_error = NO_MATCH_ERROR), + visibility = ["//visibility:public"], +) + +filegroup( + name = "{target_name}", + srcs = select({deps}, no_match_error = NO_MATCH_ERROR) + [":data"], + visibility = ["//visibility:public"], +) + +{extra} +''' + +_DEB_CC_IMPORT = """ +alias( + name = "{target_name}", + actual = select({selects}), + visibility = ["//visibility:public"], +) +""" + +def _translate_dependency_set_impl(rctx): + package_template = rctx.read(rctx.attr.package_template) + lockf = lockfile.from_json(rctx, rctx.attr.lock_content) + + sources = lockf.sources() + packages = lockf.packages() + dependency_sets = lockf.dependency_sets() + dependency_set = dependency_sets[rctx.attr.depset_name] + + packages_to_architectures = {} + + for architecture in dependency_set["sets"].keys(): + for (short_key, version) in dependency_set["sets"][architecture].items(): + package_key = short_key + "=" + version + repo_name = util.sanitize(package_key) + package = packages[package_key] + + packages_to_architectures.setdefault( + package["name"] + "=" + version, + struct( + name = package["name"], + architectures = {}, + ), + ).architectures[architecture] = package_key + + rctx.file( + "%s/%s/BUILD.bazel" % (package["name"], architecture), + package_template.format( + target_name = architecture, + data_targets = '"@%s//:data"' % repo_name, + control_targets = '"@%s//:control"' % repo_name, + src = '"@%s//:data"' % repo_name, + deps = ["@" + util.sanitize(dep_key) for dep_key in package["depends_on"]], + urls = [ + uri + "/" + package["filename"] + for uri in sources[package["suite"]]["uris"] + ], + name = package["name"], + arch = package["architecture"], + sha256 = package["sha256"], + repo_name = repo_name, + ), + ) + + for (_, info) in packages_to_architectures.items(): + package_name = info.name + + architectures = info.architectures.keys() + + extra = "" + if package_name.endswith("-dev"): + target_name = package_name.removesuffix("-dev") + extra = _DEB_CC_IMPORT.format( + target_name = target_name, + selects = starlark_codegen_utils.to_dict_attr({ + "//:linux_%s" % architecture: "@%s//:%s" % (util.sanitize(package_key), target_name) + for (architecture, package_key) in info.architectures.items() + }), + ) + + rctx.file( + "%s/BUILD.bazel" % package_name, + _PACKAGE_TEMPLATE.format( + target_name = package_name, + data_targets = starlark_codegen_utils.to_dict_attr({ + "//:linux_%s" % architecture: "//%s/%s:data" % (package_name, architecture) + for architecture in architectures + }), + control_targets = starlark_codegen_utils.to_dict_attr({ + "//:linux_%s" % architecture: "//%s/%s:control" % (package_name, architecture) + for architecture in architectures + }), + deps = starlark_codegen_utils.to_dict_list_attr({ + "//:linux_%s" % architecture: ["//%s/%s" % (package_name, architecture)] + for architecture in architectures + }), + extra = extra, + available_platforms = " ".join([ + "linux/" + arch + for arch in architectures + ]), + ), + ) + + rctx.file("BUILD.bazel", _ROOT_BUILD_TMPL.format( + target_name = util.get_repo_name(rctx.attr.name), + packages = starlark_codegen_utils.to_dict_list_attr({}), + architectures = starlark_codegen_utils.to_list_attr(dependency_set["sets"].keys()), + )) + +translate_dependency_set = repository_rule( + implementation = _translate_dependency_set_impl, + attrs = { + "depset_name": attr.string(doc = "INTERNAL: DO NOT USE"), + "lock_content": attr.string(doc = "INTERNAL: DO NOT USE"), + "package_template": attr.label(default = "//apt/private:package.BUILD.tmpl"), + }, +) diff --git a/apt/private/util.bzl b/apt/private/util.bzl index fdf8d198..36189b5d 100644 --- a/apt/private/util.bzl +++ b/apt/private/util.bzl @@ -13,6 +13,8 @@ def _set_dict(struct, value = None, keys = []): def _get_dict(struct, keys = [], default_value = None): value = struct for k in keys: + if type(k) != "string": + fail("Invalid key type: {} {}".format(type(k), k)) if k in value: value = value[k] else: @@ -21,13 +23,25 @@ def _get_dict(struct, keys = [], default_value = None): return value def _sanitize(str): - return str.replace("+", "-p-").replace(":", "-").replace("~", "_") + return str.removeprefix("/").replace("+", "-").replace(":", "-").replace("~", "_").replace("/", "_").replace("=", "_") def _get_repo_name(st): if st.find("+") != -1: return st.split("+")[-1] return st.split("~")[-1] +_SNAPSHOT_DOMAINS = [ + "snapshot.debian.org", + "snapshot-cloudflare.debian.org", + "snapshot.ubuntu.com", +] + +def _is_snapshot_uri(uri): + for domain in _SNAPSHOT_DOMAINS: + if domain in uri: + return True + return False + def _warning(rctx, message): rctx.execute([ "echo", @@ -40,4 +54,5 @@ util = struct( get_dict = _get_dict, warning = _warning, get_repo_name = _get_repo_name, + is_snapshot_uri = _is_snapshot_uri, ) diff --git a/apt/private/version_constraint.bzl b/apt/private/version_constraint.bzl index b290f8b5..684bf3b8 100644 --- a/apt/private/version_constraint.bzl +++ b/apt/private/version_constraint.bzl @@ -70,11 +70,13 @@ def _version_relop(va, vb, op): return version_lib.eq(va, vb) fail("unknown op %s" % op) -def _is_satisfied_by(va, vb): - if vb[0] != "=": +def _is_satisfied_by(v_requested, v_provided): + if v_provided[0] != "=": fail("Per https://www.debian.org/doc/debian-policy/ch-relationships.html only = is allowed for Provides field.") - return _version_relop(va[1], vb[1], va[0]) + v_requested_op = v_requested[0] + return _version_relop(v_provided[1], v_requested[1], v_requested_op) + version_constraint = struct( relop = _version_relop, diff --git a/apt/tests/resolution/BUILD.bazel b/apt/tests/resolution/BUILD.bazel index 1b2f3799..ec3ad4ca 100644 --- a/apt/tests/resolution/BUILD.bazel +++ b/apt/tests/resolution/BUILD.bazel @@ -1,88 +1,3 @@ -load("@bazel_lib//lib:testing.bzl", "assert_contains") -load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@jq.bzl", "jq") - -jq( - name = "pick_libuuid_version", - srcs = [ - "@resolution_test_resolve//:lockfile", - ], - args = ["-rj"], - filter = '.packages | map(select(.name == "libuuid1")) | .[0].version', -) - -assert_contains( - name = "test_libuuid_version", - actual = ":pick_libuuid_version", - expected = "2.38.1-5+deb12u1", -) - -jq( - name = "pick_libuuid_version_empty_lock", - srcs = [ - "@resolution_test_empty_lock_resolve//:lockfile", - ], - args = ["-rj"], - filter = '.packages | map(select(.name == "libuuid1")) | .[0].version', -) - -assert_contains( - name = "test_libuuid_version_empty_lock", - actual = ":pick_libuuid_version_empty_lock", - expected = "2.38.1-5+deb12u1", -) - -jq( - name = "pick_quake_arch", - srcs = [ - "@arch_all_test_resolve//:lockfile", - ], - args = ["-rj"], - filter = '.packages | map(select(.name == "quake")) | .[0].arch', -) - -assert_contains( - name = "test_quake_arch", - actual = ":pick_quake_arch", - expected = "all", -) - -jq( - name = "pick_quake_version", - srcs = [ - "@arch_all_test_resolve//:lockfile", - ], - args = ["-rj"], - filter = '.packages | map(select(.name == "quake")) | .[0].version', -) - -assert_contains( - name = "test_quake_version", - actual = ":pick_quake_version", - expected = "73", -) - -jq( - name = "unique_dependencies", - srcs = [ - "@unique_dependencies_resolve//:lockfile", - ], - args = ["-rj"], - filter = '.packages | map(select(.name == "gcc")) | .[0].dependencies | group_by(.) | map(select(length>1) | .[0]) | length', -) - -assert_contains( - name = "test_unique_dependencies", - actual = ":unique_dependencies", - expected = "0", -) - -build_test( - name = "build_clang", - target_compatible_with = [ - "@platforms//os:linux", - ], - targets = [ - "@clang//clang", - ], -) +# Tests for the new bzlmod API are done via the bookworm dependency_set +# in the root MODULE.bazel. The old yaml-manifest based tests have been +# removed as part of the new API migration. diff --git a/apt/tests/resolution_test.bzl b/apt/tests/resolution_test.bzl index 7fd33021..1cb835f2 100644 --- a/apt/tests/resolution_test.bzl +++ b/apt/tests/resolution_test.bzl @@ -115,12 +115,14 @@ def _make_index(): def _add_package(idx, **kwargs): kwargs["architecture"] = kwargs.get("architecture", _test_arch) kwargs["version"] = kwargs.get("version", _test_version) + dist = kwargs.pop("dist", "test") r = "\n".join(["{}: {}".format(item[0].title(), item[1]) for item in kwargs.items()]) - idx.parse_repository(r) + idx.parse_repository(r, dist = dist) return struct( add_package = lambda **kwargs: _add_package(idx, **kwargs), resolution = resolution, + idx = idx, reset = lambda: idx.reset(), ) @@ -133,7 +135,7 @@ def _resolve_optionals_test(ctx): idx.add_package(package = "libc6-dev") idx.add_package(package = "eject", depends = "libc6-dev | libc-dev") - (root_package, dependencies, _) = idx.resolution.resolve_all( + (root_package, dependencies, _, _) = idx.resolution.resolve_all( name = "eject", version = ("=", _test_version), arch = _test_arch, @@ -157,7 +159,7 @@ def _resolve_architecture_specific_packages_test(ctx): idx.add_package(package = "glibc", architecture = "all", depends = "foo [i386], bar [amd64]") # bar for amd64 - (root_package, dependencies, _) = idx.resolution.resolve_all( + (root_package, dependencies, _, _) = idx.resolution.resolve_all( name = "glibc", version = ("=", _test_version), arch = "amd64", @@ -168,7 +170,7 @@ def _resolve_architecture_specific_packages_test(ctx): asserts.equals(env, 1, len(dependencies)) # foo for i386 - (root_package, dependencies, _) = idx.resolution.resolve_all( + (root_package, dependencies, _, _) = idx.resolution.resolve_all( name = "glibc", version = ("=", _test_version), arch = "i386", @@ -197,7 +199,7 @@ def _resolve_aliases(ctx): for package in with_packages: package(idx) - (root_package, dependencies, _) = idx.resolution.resolve_all( + (root_package, dependencies, _, _) = idx.resolution.resolve_all( name = "foo", version = ("=", _test_version), arch = "amd64", @@ -244,12 +246,12 @@ def _resolve_aliases(ctx): with_package(package = "bar-plus", provides = "bar (= 1.0)"), ], resolved_name = "bar-plus") - # Un-versioned does not match with multiple candidates + # Un-versioned with multiple candidates - picks the latest version check_resolves([ with_package(package = "foo", depends = "bar"), with_package(package = "bar-plus", provides = "bar"), with_package(package = "bar-plus2", provides = "bar"), - ], resolved_name = None) + ], resolved_name = "bar-plus2") return unittest.end(env) @@ -266,7 +268,7 @@ def _resolve_circular_deps_test(ctx): idx.add_package(package = "ruby-rubygems", depends = "ruby3.1") idx.add_package(package = "ruby", depends = "libruby, ruby-rubygems") - (root_package, dependencies, _) = idx.resolution.resolve_all( + (root_package, dependencies, _, _) = idx.resolution.resolve_all( name = "ruby", version = "", arch = _test_arch, @@ -280,6 +282,208 @@ def _resolve_circular_deps_test(ctx): resolve_circular_deps_test = unittest.make(_resolve_circular_deps_test) +def _resolve_suite_constraint_test(ctx): + env = unittest.begin(ctx) + + idx = _make_index() + + # Add same package name in different suites with different versions + idx.add_package(package = "curl", version = "7.68.0", dist = "noble") + idx.add_package(package = "curl", version = "7.88.0", dist = "jammy") + + # Without suite constraint - should get latest version (7.88.0 from jammy) + (package, _) = idx.resolution.resolve_package( + name = "curl", + version = None, + arch = _test_arch, + ) + asserts.equals(env, "7.88.0", package["Version"]) + asserts.equals(env, "jammy", package["Dist"]) + + # With suite constraint for noble - should get 7.68.0 + (package, _) = idx.resolution.resolve_package( + name = "curl", + version = None, + arch = _test_arch, + suites = ["noble"], + ) + asserts.equals(env, "7.68.0", package["Version"]) + asserts.equals(env, "noble", package["Dist"]) + + # With suite constraint for jammy - should get 7.88.0 + (package, _) = idx.resolution.resolve_package( + name = "curl", + version = None, + arch = _test_arch, + suites = ["jammy"], + ) + asserts.equals(env, "7.88.0", package["Version"]) + asserts.equals(env, "jammy", package["Dist"]) + + return unittest.end(env) + +resolve_suite_constraint_test = unittest.make(_resolve_suite_constraint_test) + +def _resolve_suite_constraint_not_found_test(ctx): + env = unittest.begin(ctx) + + idx = _make_index() + + # Add package only in noble suite + idx.add_package(package = "noble-only-pkg", version = "1.0", dist = "noble") + + # Without suite constraint - should find it + (package, _) = idx.resolution.resolve_package( + name = "noble-only-pkg", + version = None, + arch = _test_arch, + ) + asserts.equals(env, "noble-only-pkg", package["Package"]) + + # With suite constraint for jammy - should NOT find it + (package, _) = idx.resolution.resolve_package( + name = "noble-only-pkg", + version = None, + arch = _test_arch, + suites = ["jammy"], + ) + asserts.equals(env, None, package) + + return unittest.end(env) + +resolve_suite_constraint_not_found_test = unittest.make(_resolve_suite_constraint_not_found_test) + +def _resolve_suite_constraint_transitive_test(ctx): + env = unittest.begin(ctx) + + idx = _make_index() + + # Add packages in noble suite + idx.add_package(package = "libssl", version = "1.0", dist = "noble") + idx.add_package(package = "curl", version = "7.68.0", depends = "libssl", dist = "noble") + + # Add packages in jammy suite + idx.add_package(package = "libssl", version = "2.0", dist = "jammy") + idx.add_package(package = "curl", version = "7.88.0", depends = "libssl", dist = "jammy") + + # Resolve curl with noble suite constraint - should get noble's libssl + (root, deps, _, _) = idx.resolution.resolve_all( + name = "curl", + version = None, + arch = _test_arch, + suites = ["noble"], + ) + asserts.equals(env, "curl", root["Package"]) + asserts.equals(env, "7.68.0", root["Version"]) + asserts.equals(env, "noble", root["Dist"]) + asserts.equals(env, 1, len(deps)) + asserts.equals(env, "libssl", deps[0]["Package"]) + asserts.equals(env, "1.0", deps[0]["Version"]) + asserts.equals(env, "noble", deps[0]["Dist"]) + + # Resolve curl with jammy suite constraint - should get jammy's libssl + (root, deps, _, _) = idx.resolution.resolve_all( + name = "curl", + version = None, + arch = _test_arch, + suites = ["jammy"], + ) + asserts.equals(env, "curl", root["Package"]) + asserts.equals(env, "7.88.0", root["Version"]) + asserts.equals(env, "jammy", root["Dist"]) + asserts.equals(env, 1, len(deps)) + asserts.equals(env, "libssl", deps[0]["Package"]) + asserts.equals(env, "2.0", deps[0]["Version"]) + asserts.equals(env, "jammy", deps[0]["Dist"]) + + return unittest.end(env) + +resolve_suite_constraint_transitive_test = unittest.make(_resolve_suite_constraint_transitive_test) + +def _resolve_suite_constraint_multiple_suites_test(ctx): + env = unittest.begin(ctx) + + idx = _make_index() + + # Add packages across multiple suites + idx.add_package(package = "base-pkg", version = "1.0", dist = "noble") + idx.add_package(package = "security-pkg", version = "1.1", dist = "noble-security") + idx.add_package(package = "updates-pkg", version = "1.2", dist = "noble-updates") + + # Resolve with multiple suite constraint - should find packages in any of the suites + (package, _) = idx.resolution.resolve_package( + name = "base-pkg", + version = None, + arch = _test_arch, + suites = ["noble", "noble-security", "noble-updates"], + ) + asserts.equals(env, "base-pkg", package["Package"]) + asserts.equals(env, "noble", package["Dist"]) + + (package, _) = idx.resolution.resolve_package( + name = "security-pkg", + version = None, + arch = _test_arch, + suites = ["noble", "noble-security", "noble-updates"], + ) + asserts.equals(env, "security-pkg", package["Package"]) + asserts.equals(env, "noble-security", package["Dist"]) + + # Package not in any of the specified suites + idx.add_package(package = "other-pkg", version = "1.0", dist = "jammy") + (package, _) = idx.resolution.resolve_package( + name = "other-pkg", + version = None, + arch = _test_arch, + suites = ["noble", "noble-security", "noble-updates"], + ) + asserts.equals(env, None, package) + + return unittest.end(env) + +resolve_suite_constraint_multiple_suites_test = unittest.make(_resolve_suite_constraint_multiple_suites_test) + +def _resolve_virtual_package_suite_constraint_test(ctx): + env = unittest.begin(ctx) + + idx = _make_index() + + # Add virtual package providers in different suites + idx.add_package(package = "mawk", version = "1.0", provides = "awk", dist = "noble") + idx.add_package(package = "gawk", version = "2.0", provides = "awk", dist = "jammy") + + # Without suite constraint - should pick one (gawk has higher version) + (package, _) = idx.resolution.resolve_package( + name = "awk", + version = None, + arch = _test_arch, + ) + asserts.equals(env, "gawk", package["Package"]) + + # With noble suite constraint - should get mawk + (package, _) = idx.resolution.resolve_package( + name = "awk", + version = None, + arch = _test_arch, + suites = ["noble"], + ) + asserts.equals(env, "mawk", package["Package"]) + asserts.equals(env, "noble", package["Dist"]) + + # With jammy suite constraint - should get gawk + (package, _) = idx.resolution.resolve_package( + name = "awk", + version = None, + arch = _test_arch, + suites = ["jammy"], + ) + asserts.equals(env, "gawk", package["Package"]) + asserts.equals(env, "jammy", package["Dist"]) + + return unittest.end(env) + +resolve_virtual_package_suite_constraint_test = unittest.make(_resolve_virtual_package_suite_constraint_test) + _TEST_SUITE_PREFIX = "package_resolution/" def resolution_tests(): @@ -325,3 +529,8 @@ def resolution_tests(): resolve_architecture_specific_packages_test(name = _TEST_SUITE_PREFIX + "resolve_architectures_specific") resolve_aliases_test(name = _TEST_SUITE_PREFIX + "resolve_aliases") resolve_circular_deps_test(name = _TEST_SUITE_PREFIX + "parse_circular") + resolve_suite_constraint_test(name = _TEST_SUITE_PREFIX + "resolve_suite_constraint") + resolve_suite_constraint_not_found_test(name = _TEST_SUITE_PREFIX + "resolve_suite_constraint_not_found") + resolve_suite_constraint_transitive_test(name = _TEST_SUITE_PREFIX + "resolve_suite_constraint_transitive") + resolve_suite_constraint_multiple_suites_test(name = _TEST_SUITE_PREFIX + "resolve_suite_constraint_multiple_suites") + resolve_virtual_package_suite_constraint_test(name = _TEST_SUITE_PREFIX + "resolve_virtual_package_suite_constraint") diff --git a/apt/tests/version_test.bzl b/apt/tests/version_test.bzl index 27dd93bd..71cba2f5 100644 --- a/apt/tests/version_test.bzl +++ b/apt/tests/version_test.bzl @@ -100,6 +100,9 @@ def _is_satisfied_by_test(ctx): (">= 1.1", "= 1.1", True), ("<= 1.1", "= 1.1", True), (">> 1.1", "= 1.1", False), + (">> 1.1", "= 1.1", False), + (">= 246", "= 246.10", True), + (">= 1.5~dev0", "= 1.5~rc1", True), ] env = unittest.begin(ctx) diff --git a/e2e/smoke/BUILD b/e2e/smoke/BUILD index 8f3c0c5f..c97b224a 100644 --- a/e2e/smoke/BUILD +++ b/e2e/smoke/BUILD @@ -1,13 +1,3 @@ -""" -NOTE: - - This is the main test used in the e2e testing. - - PLEASE KEEP e2e/smoke/BUILD and examples/debian_snapshot/BUILD - IN-SYNC WITH EACH OTHER, AS WELL AS THE REST OF THE TEST FILES - (test_linux_ files and the bullseye YAML manifest) -""" - load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@container_structure_test//:defs.bzl", "container_structure_test") load("@rules_distroless//distroless:defs.bzl", "cacerts", "group", "passwd") diff --git a/e2e/smoke/MODULE.bazel b/e2e/smoke/MODULE.bazel index bdd87c6a..1117f3dc 100644 --- a/e2e/smoke/MODULE.bazel +++ b/e2e/smoke/MODULE.bazel @@ -1,9 +1,9 @@ -bazel_dep(name = "rules_distroless", version = "0.0.0", dev_dependency = True) bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) +bazel_dep(name = "bazel_lib", version = "3.0.0", dev_dependency = True) +bazel_dep(name = "container_structure_test", version = "1.21.1", dev_dependency = True) bazel_dep(name = "platforms", version = "0.0.10", dev_dependency = True) +bazel_dep(name = "rules_distroless", version = "0.0.0", dev_dependency = True) bazel_dep(name = "rules_oci", version = "2.0.0", dev_dependency = True) -bazel_dep(name = "container_structure_test", version = "1.21.1", dev_dependency = True) -bazel_dep(name = "bazel_lib", version = "3.0.0", dev_dependency = True) bazel_dep(name = "tar.bzl", version = "0.6.0") @@ -13,16 +13,75 @@ local_path_override( ) apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") -apt.install( - name = "bullseye", - lock = ":bullseye.lock.json", - manifest = ":bullseye.yaml", +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = [ + "main", + "contrib", + ], + suites = ["bullseye"], + types = ["deb"], + uris = [ + "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z", + "https://snapshot.debian.org/archive/debian/20240210T223313Z", + ], +) +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = ["main"], + suites = ["bullseye-security"], + types = ["deb"], + uris = ["https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z"], +) +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = ["main"], + suites = ["bullseye-updates"], + types = ["deb"], + uris = ["https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z"], +) +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = ["main"], + suites = ["cloud-sdk"], + types = ["deb"], + uris = ["https://packages.cloud.google.com/apt"], ) apt.install( - name = "bullseye_nolock", - manifest = ":bullseye.yaml", - nolock = True, + dependency_set = "bullseye", + packages = [ + "apt", + "bash", + "ca-certificates", + "coreutils", + "dpkg", + "google-cloud-cli", + "libncurses6", + "ncurses-base", + "nginx-core", + "nginx-full", + "nvidia-kernel-common", + "perl", + "tzdata", + ], + suites = [ + "bullseye", + "bullseye-security", + "bullseye-updates", + "cloud-sdk", + ], ) - -# bazel run @bullseye//:lock -use_repo(apt, "bullseye", "bullseye_nolock") +apt.lock(into = ":bullseye.lock.json") +use_repo(apt, "bullseye") diff --git a/e2e/smoke/bullseye.lock.json b/e2e/smoke/bullseye.lock.json deleted file mode 100644 index 2aaa6519..00000000 --- a/e2e/smoke/bullseye.lock.json +++ /dev/null @@ -1,6374 +0,0 @@ -{ - "packages": [ - { - "arch": "amd64", - "dependencies": [], - "key": "ncurses-base_6.2-p-20201114-2-p-deb11u2_amd64", - "name": "ncurses-base", - "sha256": "a55a5f94299448279da6a6c2031a9816dc768cd300668ff82ecfc6480bbfc83d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/ncurses-base_6.2+20201114-2+deb11u2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/ncurses-base_6.2+20201114-2+deb11u2_all.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_amd64", - "name": "libtinfo6", - "version": "6.2+20201114-2+deb11u2" - } - ], - "key": "libncurses6_6.2-p-20201114-2-p-deb11u2_amd64", - "name": "libncurses6", - "sha256": "5b75c540d26d0525f231d39e5cf27ea7919d57305ba7101ea430c975369095eb", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u2_amd64.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "sha256": "d55d9c9769336f9b8516c20bd8364ce90746fb860ae3dda242f421e711af3d1a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_amd64.deb" - ], - "version": "2.31-13+deb11u8" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "sha256": "f617952df0c57b4ee039448e3941bccd3f97bfff71e9b0f87ca6dae15cb3f5ef", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_amd64.deb" - ], - "version": "1:4.4.18-4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "sha256": "e478f2709d8474165bb664de42e16950c391f30eaa55bc9b3573281d83a29daf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_amd64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "sha256": "be65535e94f95fbf04b104e8ab36790476f063374430f7dfc6c516cbe2d2cd1e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_amd64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_amd64", - "name": "libtinfo6", - "sha256": "96ed58b8fd656521e08549c763cd18da6cff1b7801a3a22f29678701a95d7e7b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u2_amd64.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - } - ], - "key": "tzdata_2024a-0-p-deb11u1_amd64", - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" - ], - "version": "2024a-0+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "sha256": "d9ee4dff77aaad12674eed3ccefdcccd332424c9e2ac2ac00a37a1e06c84ab70", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debconf/debconf_1.5.77_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debconf/debconf_1.5.77_all.deb" - ], - "version": "1.5.77" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "sha256": "94c6299552866aadc58acb8ec5111a74b17bcb453f6e2f45ea5f7c4f42580d13", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u3_amd64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - } - ], - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "sha256": "eb2b7ba3a3c4e905a380045a2d1cd219d2d45755aba5966d6c804b79400beb05", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/dpkg/dpkg_1.20.13_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/dpkg/dpkg_1.20.13_amd64.deb" - ], - "version": "1.20.13" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "sha256": "41c9c31f67a76b3532036f09ceac1f40a9224f1680395d120a8b24eae60dd54a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tar/tar_1.34+dfsg-1+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tar/tar_1.34+dfsg-1+deb11u1_amd64.deb" - ], - "version": "1.34+dfsg-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "sha256": "339f5ede10500c16dd7192d73169c31c4b27ab12130347275f23044ec8c7d897", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb" - ], - "version": "3.1-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "sha256": "ee192c8d22624eb9d0a2ae95056bad7fb371e5abc17e23e16b1de3ddb17a1064", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_amd64.deb" - ], - "version": "10.36-2+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "sha256": "aa18d721be8aea50fbdb32cd9a319cb18a3f111ea6ad17399aa4ba9324c8e26a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_amd64.deb" - ], - "version": "2.2.53-10" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "sha256": "03d2ab2174af76df6f517b854b77460fbdafc3dac0dca979317da67538159a3e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_amd64.deb" - ], - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "sha256": "1c79a02415ca5ee7234ac60502fb33ee94fa70b02d1c329a6a14178f8329c435", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_amd64.deb" - ], - "version": "5.2.5-2.1~deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "sha256": "16e27c3ebd97981e70db3733f899963362748f178a62644df69d1f247e741379", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_amd64.deb" - ], - "version": "1.0.8-4" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_amd64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - } - ], - "key": "coreutils_8.32-4-p-b1_amd64", - "name": "coreutils", - "sha256": "3558a412ab51eee4b60641327cb145bb91415f127769823b68f9335585b308d4", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4+b1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4+b1_amd64.deb" - ], - "version": "8.32-4+b1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", - "name": "libgmp10", - "sha256": "fc117ccb084a98d25021f7e01e4dfedd414fa2118fdd1e27d2d801d7248aebbc", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_amd64.deb" - ], - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libattr1_1-2.4.48-6_amd64", - "name": "libattr1", - "sha256": "af3c3562eb2802481a2b9558df1b389f3c6d9b1bf3b4219e000e05131372ebaf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/attr/libattr1_2.4.48-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/attr/libattr1_2.4.48-6_amd64.deb" - ], - "version": "1:2.4.48-6" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "libsystemd0_247.3-7-p-deb11u4_amd64", - "name": "libsystemd0", - "version": "247.3-7+deb11u4" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_amd64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "liblz4-1_1.9.3-2_amd64", - "name": "liblz4-1", - "version": "1.9.3-2" - }, - { - "key": "libgcrypt20_1.8.7-6_amd64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_amd64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_amd64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libseccomp2_2.5.1-1-p-deb11u1_amd64", - "name": "libseccomp2", - "version": "2.5.1-1+deb11u1" - }, - { - "key": "libgnutls30_3.7.1-5-p-deb11u4_amd64", - "name": "libgnutls30", - "version": "3.7.1-5+deb11u4" - }, - { - "key": "libunistring2_0.9.10-4_amd64", - "name": "libunistring2", - "version": "0.9.10-4" - }, - { - "key": "libtasn1-6_4.16.0-2-p-deb11u1_amd64", - "name": "libtasn1-6", - "version": "4.16.0-2+deb11u1" - }, - { - "key": "libp11-kit0_0.23.22-1_amd64", - "name": "libp11-kit0", - "version": "0.23.22-1" - }, - { - "key": "libffi7_3.3-6_amd64", - "name": "libffi7", - "version": "3.3-6" - }, - { - "key": "libnettle8_3.7.3-1_amd64", - "name": "libnettle8", - "version": "3.7.3-1" - }, - { - "key": "libidn2-0_2.3.0-5_amd64", - "name": "libidn2-0", - "version": "2.3.0-5" - }, - { - "key": "libhogweed6_3.7.3-1_amd64", - "name": "libhogweed6", - "version": "3.7.3-1" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "debian-archive-keyring_2021.1.1-p-deb11u1_amd64", - "name": "debian-archive-keyring", - "version": "2021.1.1+deb11u1" - }, - { - "key": "libapt-pkg6.0_2.2.4_amd64", - "name": "libapt-pkg6.0", - "version": "2.2.4" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libxxhash0_0.8.0-2_amd64", - "name": "libxxhash0", - "version": "0.8.0-2" - }, - { - "key": "libudev1_247.3-7-p-deb11u4_amd64", - "name": "libudev1", - "version": "247.3-7+deb11u4" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "gpgv1_1.4.23-1.1_amd64", - "name": "gpgv1", - "version": "1.4.23-1.1" - }, - { - "key": "adduser_3.118-p-deb11u1_amd64", - "name": "adduser", - "version": "3.118+deb11u1" - }, - { - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "passwd_1-4.8.1-1_amd64", - "name": "passwd", - "version": "1:4.8.1-1" - }, - { - "key": "libpam-modules_1.4.0-9-p-deb11u1_amd64", - "name": "libpam-modules", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libpam-modules-bin_1.4.0-9-p-deb11u1_amd64", - "name": "libpam-modules-bin", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libpam0g_1.4.0-9-p-deb11u1_amd64", - "name": "libpam0g", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libaudit1_1-3.0-2_amd64", - "name": "libaudit1", - "version": "1:3.0-2" - }, - { - "key": "libcap-ng0_0.7.9-2.2-p-b1_amd64", - "name": "libcap-ng0", - "version": "0.7.9-2.2+b1" - }, - { - "key": "libaudit-common_1-3.0-2_amd64", - "name": "libaudit-common", - "version": "1:3.0-2" - }, - { - "key": "libtirpc3_1.3.1-1-p-deb11u1_amd64", - "name": "libtirpc3", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libtirpc-common_1.3.1-1-p-deb11u1_amd64", - "name": "libtirpc-common", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libgssapi-krb5-2_1.18.3-6-p-deb11u4_amd64", - "name": "libgssapi-krb5-2", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5support0_1.18.3-6-p-deb11u4_amd64", - "name": "libkrb5support0", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5-3_1.18.3-6-p-deb11u4_amd64", - "name": "libkrb5-3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "libkeyutils1_1.6.1-2_amd64", - "name": "libkeyutils1", - "version": "1.6.1-2" - }, - { - "key": "libk5crypto3_1.18.3-6-p-deb11u4_amd64", - "name": "libk5crypto3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libcom-err2_1.46.2-2_amd64", - "name": "libcom-err2", - "version": "1.46.2-2" - }, - { - "key": "libnsl2_1.3.0-2_amd64", - "name": "libnsl2", - "version": "1.3.0-2" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libsemanage1_3.1-1-p-b2_amd64", - "name": "libsemanage1", - "version": "3.1-1+b2" - }, - { - "key": "libsepol1_3.1-1_amd64", - "name": "libsepol1", - "version": "3.1-1" - }, - { - "key": "libsemanage-common_3.1-1_amd64", - "name": "libsemanage-common", - "version": "3.1-1" - } - ], - "key": "apt_2.2.4_amd64", - "name": "apt", - "sha256": "75f07c4965ff0813f26623a1164e162538f5e94defba6961347527ed71bc4f3d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/apt_2.2.4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/apt_2.2.4_amd64.deb" - ], - "version": "2.2.4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libsystemd0_247.3-7-p-deb11u4_amd64", - "name": "libsystemd0", - "sha256": "e6f3e65e388196a399c1a36564c38ad987337350358732056227db1b6e708878", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libsystemd0_247.3-7+deb11u4_amd64.deb" - ], - "version": "247.3-7+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libzstd1_1.4.8-p-dfsg-2.1_amd64", - "name": "libzstd1", - "sha256": "5dcadfbb743bfa1c1c773bff91c018f835e8e8c821d423d3836f3ab84773507b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_amd64.deb" - ], - "version": "1.4.8+dfsg-2.1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "liblz4-1_1.9.3-2_amd64", - "name": "liblz4-1", - "sha256": "79ac6e9ca19c483f2e8effcc3401d723dd9dbb3a4ae324714de802adb21a8117", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb" - ], - "version": "1.9.3-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgcrypt20_1.8.7-6_amd64", - "name": "libgcrypt20", - "sha256": "7a2e0eef8e0c37f03f3a5fcf7102a2e3dc70ba987f696ab71949f9abf36f35ef", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb" - ], - "version": "1.8.7-6" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgpg-error0_1.38-2_amd64", - "name": "libgpg-error0", - "sha256": "16a507fb20cc58b5a524a0dc254a9cb1df02e1ce758a2d8abde0bc4a3c9b7c26", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb" - ], - "version": "1.38-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libstdc-p--p-6_10.2.1-6_amd64", - "name": "libstdc++6", - "sha256": "5c155c58935870bf3b4bfe769116841c0d286a74f59eccfd5645693ac23f06b1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_amd64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libseccomp2_2.5.1-1-p-deb11u1_amd64", - "name": "libseccomp2", - "sha256": "2617fc8b99dca0fa8ed466ee0f5fe087aa4e8413b88ca45d717290f4a0551e36", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_amd64.deb" - ], - "version": "2.5.1-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgnutls30_3.7.1-5-p-deb11u4_amd64", - "name": "libgnutls30", - "sha256": "b2fa128881a16c2196caddb551d3577baa296a7bc5d38109a978e8e69fdb5c94", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_amd64.deb" - ], - "version": "3.7.1-5+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libunistring2_0.9.10-4_amd64", - "name": "libunistring2", - "sha256": "654433ad02d3a8b05c1683c6c29a224500bf343039c34dcec4e5e9515345e3d4", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_amd64.deb" - ], - "version": "0.9.10-4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libtasn1-6_4.16.0-2-p-deb11u1_amd64", - "name": "libtasn1-6", - "sha256": "6ebb579337cdc9d6201237a66578425a7a221db622524354e27c0c1bcb6dd7ca", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_amd64.deb" - ], - "version": "4.16.0-2+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libp11-kit0_0.23.22-1_amd64", - "name": "libp11-kit0", - "sha256": "bfef5f31ee1c730e56e16bb62cc5ff8372185106c75bf1ed1756c96703019457", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_amd64.deb" - ], - "version": "0.23.22-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libffi7_3.3-6_amd64", - "name": "libffi7", - "sha256": "30ca89bfddae5fa6e0a2a044f22b6e50cd17c4bc6bc850c579819aeab7101f0f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb" - ], - "version": "3.3-6" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnettle8_3.7.3-1_amd64", - "name": "libnettle8", - "sha256": "e4f8ec31ed14518b241eb7b423ad5ed3f4a4e8ac50aae72c9fd475c569582764", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_amd64.deb" - ], - "version": "3.7.3-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libidn2-0_2.3.0-5_amd64", - "name": "libidn2-0", - "sha256": "cb80cd769171537bafbb4a16c12ec427065795946b3415781bc9792e92d60b59", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb" - ], - "version": "2.3.0-5" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libhogweed6_3.7.3-1_amd64", - "name": "libhogweed6", - "sha256": "6aab2e892cdb2dfba45707601bc6c3b19aa228f70ae5841017f14c3b0ca3d22f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_amd64.deb" - ], - "version": "3.7.3-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "debian-archive-keyring_2021.1.1-p-deb11u1_amd64", - "name": "debian-archive-keyring", - "sha256": "28ca7749ab7978f3c571732c3aa1c56e3ad1d5db3c915293763d4f6cb8fcce89", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debian-archive-keyring/debian-archive-keyring_2021.1.1+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debian-archive-keyring/debian-archive-keyring_2021.1.1+deb11u1_all.deb" - ], - "version": "2021.1.1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libapt-pkg6.0_2.2.4_amd64", - "name": "libapt-pkg6.0", - "sha256": "4ae47bedf773ad1342e5aae8fa6275f864cfc87a45f4472775f5a9cdd60abbbf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_amd64.deb" - ], - "version": "2.2.4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxxhash0_0.8.0-2_amd64", - "name": "libxxhash0", - "sha256": "3fb82550a71d27d05672472508548576dfb34486847bc860d3066cda5aaf186f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_amd64.deb" - ], - "version": "0.8.0-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libudev1_247.3-7-p-deb11u4_amd64", - "name": "libudev1", - "sha256": "9274ca1aa37fcdf5895dad1de0895162351099ef8dff8a62f2f4c9eb181a8fce", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libudev1_247.3-7+deb11u4_amd64.deb" - ], - "version": "247.3-7+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "gpgv1_1.4.23-1.1_amd64", - "name": "gpgv1", - "sha256": "90b29048ca3a5dce708b1c0ed27522fcda9e946c0a2ff8117724f440f853adcf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnupg1/gpgv1_1.4.23-1.1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnupg1/gpgv1_1.4.23-1.1_amd64.deb" - ], - "version": "1.4.23-1.1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "adduser_3.118-p-deb11u1_amd64", - "name": "adduser", - "sha256": "1478a610fd50e190882ff41e16c57b628a508bcf5b5ac5313affb49d20818e0a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/adduser/adduser_3.118+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/adduser/adduser_3.118+deb11u1_all.deb" - ], - "version": "3.118+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "passwd_1-4.8.1-1_amd64", - "name": "passwd", - "sha256": "542593f26502e87b4276fa778e6e3ae52e66b973979986fff77803d9fcb2c2e8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/shadow/passwd_4.8.1-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/s/shadow/passwd_4.8.1-1_amd64.deb" - ], - "version": "1:4.8.1-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpam-modules_1.4.0-9-p-deb11u1_amd64", - "name": "libpam-modules", - "sha256": "ca1e121700bf4b3eb33e30e0774d3e63e1adae9d4b6a940ea3501225db3cc287", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_amd64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpam-modules-bin_1.4.0-9-p-deb11u1_amd64", - "name": "libpam-modules-bin", - "sha256": "abbbd181329c236676222d3e912df13f8d1d90a117559edd997d90006369e5c8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules-bin_1.4.0-9+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules-bin_1.4.0-9+deb11u1_amd64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpam0g_1.4.0-9-p-deb11u1_amd64", - "name": "libpam0g", - "sha256": "496771218fb585bb716fdae6ef8824dbfb5d544b4fa2f3cd4d0e4d7158ae2220", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_amd64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libaudit1_1-3.0-2_amd64", - "name": "libaudit1", - "sha256": "e3aa1383e387dc077a1176f7f3cbfdbc084bcc270a8938f598d5cb119773b268", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit1_3.0-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit1_3.0-2_amd64.deb" - ], - "version": "1:3.0-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libcap-ng0_0.7.9-2.2-p-b1_amd64", - "name": "libcap-ng0", - "sha256": "d34e29769b8ef23e9b9920814afb7905b8ee749db0814e6a8d937ccc4f309830", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_amd64.deb" - ], - "version": "0.7.9-2.2+b1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libaudit-common_1-3.0-2_amd64", - "name": "libaudit-common", - "sha256": "0d52f4826a57aea13cea1a85bfae354024c7b2f7b95e39cd1ce225e4db27d0f6", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb" - ], - "version": "1:3.0-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libtirpc3_1.3.1-1-p-deb11u1_amd64", - "name": "libtirpc3", - "sha256": "86b216d59b6efcd07d56d14b8f4281d5c47f24e9c962f46bbaf02fce762c5e6a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_amd64.deb" - ], - "version": "1.3.1-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libtirpc-common_1.3.1-1-p-deb11u1_amd64", - "name": "libtirpc-common", - "sha256": "b2f10cb79e7d7a2f9b30bcdf036127df55cd4a34688547bc2886fa38f4969f77", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb" - ], - "version": "1.3.1-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgssapi-krb5-2_1.18.3-6-p-deb11u4_amd64", - "name": "libgssapi-krb5-2", - "sha256": "037cc4bb34a6cd0d7a6e83bdcae6d68e0d0f9218eb7dedafc8099c8c0be491a2", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u4_amd64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libkrb5support0_1.18.3-6-p-deb11u4_amd64", - "name": "libkrb5support0", - "sha256": "da8d022e3dd7f4a72ea32e328b3ac382dbe6bdb91606c5738fe17a29f8ea8080", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u4_amd64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libkrb5-3_1.18.3-6-p-deb11u4_amd64", - "name": "libkrb5-3", - "sha256": "b785fa324cf27e6bf7f97fc0279470e6ce8a8cc54f8ccc6c9b24c8111ba5c952", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u4_amd64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", - "name": "libssl1.1", - "sha256": "aadf8b4b197335645b230c2839b4517aa444fd2e8f434e5438c48a18857988f7", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_amd64.deb" - ], - "version": "1.1.1w-0+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libkeyutils1_1.6.1-2_amd64", - "name": "libkeyutils1", - "sha256": "f01060b434d8cad3c58d5811d2082389f11b3db8152657d6c22c1d298953f2a5", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_amd64.deb" - ], - "version": "1.6.1-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libk5crypto3_1.18.3-6-p-deb11u4_amd64", - "name": "libk5crypto3", - "sha256": "f635062bcbfe2eef5a83fcba7d1a8ae343fc7c779cae88b11cae90fd6845a744", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libk5crypto3_1.18.3-6+deb11u4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libk5crypto3_1.18.3-6+deb11u4_amd64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libcom-err2_1.46.2-2_amd64", - "name": "libcom-err2", - "sha256": "d478f132871f4ab8352d39becf936d0ad74db905398bf98465d8fe3da6fb1126", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/e/e2fsprogs/libcom-err2_1.46.2-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/e/e2fsprogs/libcom-err2_1.46.2-2_amd64.deb" - ], - "version": "1.46.2-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnsl2_1.3.0-2_amd64", - "name": "libnsl2", - "sha256": "c0d83437fdb016cb289436f49f28a36be44b3e8f1f2498c7e3a095f709c0d6f8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb" - ], - "version": "1.3.0-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", - "name": "libdb5.3", - "sha256": "00b9e63e287f45300d4a4f59b6b88e25918443c932ae3e5845d5761ae193c530", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_amd64.deb" - ], - "version": "5.3.28+dfsg1-0.8" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libsemanage1_3.1-1-p-b2_amd64", - "name": "libsemanage1", - "sha256": "d8f2835b22df58ba45d52eb3aab224190f193576caf05e3f80deb2e4f927fad6", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_amd64.deb" - ], - "version": "3.1-1+b2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libsepol1_3.1-1_amd64", - "name": "libsepol1", - "sha256": "b6057dc6806a6dfaef74b09d84d1f18716d7a6d2f1da30520cef555210c6af62", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsepol/libsepol1_3.1-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsepol/libsepol1_3.1-1_amd64.deb" - ], - "version": "3.1-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libsemanage-common_3.1-1_amd64", - "name": "libsemanage-common", - "sha256": "d319a026ecd02e2f605c52350949279f3c331a19380f8b6888ce5b9ef0d31349", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb" - ], - "version": "3.1-1" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "libperl5.32_5.32.1-4-p-deb11u3_amd64", - "name": "libperl5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "perl-modules-5.32_5.32.1-4-p-deb11u3_amd64", - "name": "perl-modules-5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libgdbm6_1.19-2_amd64", - "name": "libgdbm6", - "version": "1.19-2" - }, - { - "key": "libgdbm-compat4_1.19-2_amd64", - "name": "libgdbm-compat4", - "version": "1.19-2" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - } - ], - "key": "perl_5.32.1-4-p-deb11u3_amd64", - "name": "perl", - "sha256": "d5f710c7db9fcd6d9d6f119cd0dea64a4f765867447dd97b24ab44be1de7c60f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl_5.32.1-4+deb11u3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl_5.32.1-4+deb11u3_amd64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libperl5.32_5.32.1-4-p-deb11u3_amd64", - "name": "libperl5.32", - "sha256": "078487a45916167e3e4ee2e584c50306c84368dd06dae276604861ca0426c34e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u3_amd64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "perl-modules-5.32_5.32.1-4-p-deb11u3_amd64", - "name": "perl-modules-5.32", - "sha256": "9a5cb99d0f33cb11c7f535aaebfb569c6b6f97a75d748a9a52ea3afed5bd3960", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u3_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u3_all.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgdbm6_1.19-2_amd64", - "name": "libgdbm6", - "sha256": "e54cfe4d8b8f209bb7df31a404ce040f7c2f9b1045114a927a7e1061cdf90727", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm6_1.19-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm6_1.19-2_amd64.deb" - ], - "version": "1.19-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgdbm-compat4_1.19-2_amd64", - "name": "libgdbm-compat4", - "sha256": "e62caed68b0ffaa03b5fa539d6fdc08c4151f66236d5878949bead0b71b7bb09", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_amd64.deb" - ], - "version": "1.19-2" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "openssl_1.1.1w-0-p-deb11u1_amd64", - "name": "openssl", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - } - ], - "key": "ca-certificates_20210119_amd64", - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" - ], - "version": "20210119" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "openssl_1.1.1w-0-p-deb11u1_amd64", - "name": "openssl", - "sha256": "04873d74cbe86bad3a9901f6e57f1150040eba9891b443c5c975a72a97238e35", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_amd64.deb" - ], - "version": "1.1.1w-0+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "nvidia-kernel-common_20151021-p-13_amd64", - "name": "nvidia-kernel-common", - "sha256": "fa4b007bf64cf8cf0e9b3aaae5dd388fcec3a589ce2475f16d64347945691533", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/contrib/n/nvidia-support/nvidia-kernel-common_20151021+13_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/contrib/n/nvidia-support/nvidia-kernel-common_20151021+13_amd64.deb" - ], - "version": "20151021+13" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "debianutils_4.11.2_amd64", - "name": "debianutils", - "version": "4.11.2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "base-files_11.1-p-deb11u9_amd64", - "name": "base-files", - "version": "11.1+deb11u9" - }, - { - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_amd64", - "name": "libtinfo6", - "version": "6.2+20201114-2+deb11u2" - } - ], - "key": "bash_5.1-2-p-deb11u1_amd64", - "name": "bash", - "sha256": "f702ef058e762d7208a9c83f6f6bbf02645533bfd615c54e8cdcce842cd57377", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/bash/bash_5.1-2+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/bash/bash_5.1-2+deb11u1_amd64.deb" - ], - "version": "5.1-2+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "debianutils_4.11.2_amd64", - "name": "debianutils", - "sha256": "83d21669c5957e3eaee20096a7d8c596bd07f57f1e95dc74f192b3fb7bb2e6a9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debianutils/debianutils_4.11.2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debianutils/debianutils_4.11.2_amd64.deb" - ], - "version": "4.11.2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "base-files_11.1-p-deb11u9_amd64", - "name": "base-files", - "sha256": "1ff08cf6e1b97af1e37cda830f3658f9af43a906abb80a21951c81aea02ce230", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_amd64.deb" - ], - "version": "11.1+deb11u9" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "nginx-core_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-core", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libpcre3_2-8.39-13_amd64", - "name": "libpcre3", - "version": "2:8.39-13" - }, - { - "key": "iproute2_5.10.0-4_amd64", - "name": "iproute2", - "version": "5.10.0-4" - }, - { - "key": "libcap2-bin_1-2.44-1_amd64", - "name": "libcap2-bin", - "version": "1:2.44-1" - }, - { - "key": "libcap2_1-2.44-1_amd64", - "name": "libcap2", - "version": "1:2.44-1" - }, - { - "key": "libxtables12_1.8.7-1_amd64", - "name": "libxtables12", - "version": "1.8.7-1" - }, - { - "key": "libmnl0_1.0.4-3_amd64", - "name": "libmnl0", - "version": "1.0.4-3" - }, - { - "key": "libelf1_0.183-1_amd64", - "name": "libelf1", - "version": "0.183-1" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libbsd0_0.11.3-1-p-deb11u1_amd64", - "name": "libbsd0", - "version": "0.11.3-1+deb11u1" - }, - { - "key": "libmd0_1.0.3-3_amd64", - "name": "libmd0", - "version": "1.0.3-3" - }, - { - "key": "libbpf0_1-0.3-2_amd64", - "name": "libbpf0", - "version": "1:0.3-2" - }, - { - "key": "nginx-common_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-common", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "lsb-base_11.1.0_amd64", - "name": "lsb-base", - "version": "11.1.0" - }, - { - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgeoip1_1.6.12-7_amd64", - "name": "libgeoip1", - "version": "1.6.12-7" - }, - { - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-mail", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-xslt-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libxslt1.1_1.1.34-4-p-deb11u1_amd64", - "name": "libxslt1.1", - "version": "1.1.34-4+deb11u1" - }, - { - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_amd64", - "name": "libxml2", - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "key": "libicu67_67.1-7_amd64", - "name": "libicu67", - "version": "67.1-7" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_amd64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libgcrypt20_1.8.7-6_amd64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_amd64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-image-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgd3_2.3.0-2_amd64", - "name": "libgd3", - "version": "2.3.0-2" - }, - { - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_amd64", - "name": "libxpm4", - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "key": "libx11-6_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-6", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libx11-data_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-data", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libxcb1_1.14-3_amd64", - "name": "libxcb1", - "version": "1.14-3" - }, - { - "key": "libxdmcp6_1-1.1.2-3_amd64", - "name": "libxdmcp6", - "version": "1:1.1.2-3" - }, - { - "key": "libxau6_1-1.0.9-1_amd64", - "name": "libxau6", - "version": "1:1.0.9-1" - }, - { - "key": "libwebp6_0.6.1-2.1-p-deb11u2_amd64", - "name": "libwebp6", - "version": "0.6.1-2.1+deb11u2" - }, - { - "key": "libtiff5_4.2.0-1-p-deb11u5_amd64", - "name": "libtiff5", - "version": "4.2.0-1+deb11u5" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_amd64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libjpeg62-turbo_1-2.0.6-4_amd64", - "name": "libjpeg62-turbo", - "version": "1:2.0.6-4" - }, - { - "key": "libjbig0_2.1-3.1-p-b2_amd64", - "name": "libjbig0", - "version": "2.1-3.1+b2" - }, - { - "key": "libdeflate0_1.7-1_amd64", - "name": "libdeflate0", - "version": "1.7-1" - }, - { - "key": "libpng16-16_1.6.37-3_amd64", - "name": "libpng16-16", - "version": "1.6.37-3" - }, - { - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_amd64", - "name": "libfreetype6", - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "key": "libbrotli1_1.0.9-2-p-b2_amd64", - "name": "libbrotli1", - "version": "1.0.9-2+b2" - }, - { - "key": "libfontconfig1_2.13.1-4.2_amd64", - "name": "libfontconfig1", - "version": "2.13.1-4.2" - }, - { - "key": "fontconfig-config_2.13.1-4.2_amd64", - "name": "fontconfig-config", - "version": "2.13.1-4.2" - }, - { - "key": "fonts-texgyre_20180621-3.1_amd64", - "name": "fonts-texgyre", - "version": "20180621-3.1" - }, - { - "key": "ucf_3.0043_amd64", - "name": "ucf", - "version": "3.0043" - }, - { - "key": "sensible-utils_0.0.14_amd64", - "name": "sensible-utils", - "version": "0.0.14" - }, - { - "key": "coreutils_8.32-4-p-b1_amd64", - "name": "coreutils", - "version": "8.32-4+b1" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_amd64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libuuid1_2.36.1-8-p-deb11u1_amd64", - "name": "libuuid1", - "version": "2.36.1-8+deb11u1" - }, - { - "key": "libexpat1_2.2.10-2-p-deb11u5_amd64", - "name": "libexpat1", - "version": "2.2.10-2+deb11u5" - }, - { - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream-geoip2_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream-geoip2", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libmaxminddb0_1.5.2-1_amd64", - "name": "libmaxminddb0", - "version": "1.5.2-1" - }, - { - "key": "libnginx-mod-http-upstream-fair_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-upstream-fair", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-subs-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-subs-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-geoip2_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-geoip2", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-echo_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-echo", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-dav-ext_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-dav-ext", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-auth-pam_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-auth-pam", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libpam0g_1.4.0-9-p-deb11u1_amd64", - "name": "libpam0g", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libaudit1_1-3.0-2_amd64", - "name": "libaudit1", - "version": "1:3.0-2" - }, - { - "key": "libcap-ng0_0.7.9-2.2-p-b1_amd64", - "name": "libcap-ng0", - "version": "0.7.9-2.2+b1" - }, - { - "key": "libaudit-common_1-3.0-2_amd64", - "name": "libaudit-common", - "version": "1:3.0-2" - } - ], - "key": "nginx-full_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-full", - "sha256": "4049950f648478009faeaf028ab7287240ebd28c27799a5b128a1623290b3e44", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-full_1.18.0-6.1+deb11u3_all.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [ - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_amd64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_amd64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_amd64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_amd64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "debconf_1.5.77_amd64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_amd64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_amd64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_amd64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_amd64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_amd64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_amd64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libpcre3_2-8.39-13_amd64", - "name": "libpcre3", - "version": "2:8.39-13" - }, - { - "key": "iproute2_5.10.0-4_amd64", - "name": "iproute2", - "version": "5.10.0-4" - }, - { - "key": "libcap2-bin_1-2.44-1_amd64", - "name": "libcap2-bin", - "version": "1:2.44-1" - }, - { - "key": "libcap2_1-2.44-1_amd64", - "name": "libcap2", - "version": "1:2.44-1" - }, - { - "key": "libxtables12_1.8.7-1_amd64", - "name": "libxtables12", - "version": "1.8.7-1" - }, - { - "key": "libmnl0_1.0.4-3_amd64", - "name": "libmnl0", - "version": "1.0.4-3" - }, - { - "key": "libelf1_0.183-1_amd64", - "name": "libelf1", - "version": "0.183-1" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libbsd0_0.11.3-1-p-deb11u1_amd64", - "name": "libbsd0", - "version": "0.11.3-1+deb11u1" - }, - { - "key": "libmd0_1.0.3-3_amd64", - "name": "libmd0", - "version": "1.0.3-3" - }, - { - "key": "libbpf0_1-0.3-2_amd64", - "name": "libbpf0", - "version": "1:0.3-2" - }, - { - "key": "nginx-common_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-common", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "lsb-base_11.1.0_amd64", - "name": "lsb-base", - "version": "11.1.0" - }, - { - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgeoip1_1.6.12-7_amd64", - "name": "libgeoip1", - "version": "1.6.12-7" - }, - { - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-mail", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-xslt-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libxslt1.1_1.1.34-4-p-deb11u1_amd64", - "name": "libxslt1.1", - "version": "1.1.34-4+deb11u1" - }, - { - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_amd64", - "name": "libxml2", - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "key": "libicu67_67.1-7_amd64", - "name": "libicu67", - "version": "67.1-7" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_amd64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libgcrypt20_1.8.7-6_amd64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_amd64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-image-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgd3_2.3.0-2_amd64", - "name": "libgd3", - "version": "2.3.0-2" - }, - { - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_amd64", - "name": "libxpm4", - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "key": "libx11-6_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-6", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libx11-data_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-data", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libxcb1_1.14-3_amd64", - "name": "libxcb1", - "version": "1.14-3" - }, - { - "key": "libxdmcp6_1-1.1.2-3_amd64", - "name": "libxdmcp6", - "version": "1:1.1.2-3" - }, - { - "key": "libxau6_1-1.0.9-1_amd64", - "name": "libxau6", - "version": "1:1.0.9-1" - }, - { - "key": "libwebp6_0.6.1-2.1-p-deb11u2_amd64", - "name": "libwebp6", - "version": "0.6.1-2.1+deb11u2" - }, - { - "key": "libtiff5_4.2.0-1-p-deb11u5_amd64", - "name": "libtiff5", - "version": "4.2.0-1+deb11u5" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_amd64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libjpeg62-turbo_1-2.0.6-4_amd64", - "name": "libjpeg62-turbo", - "version": "1:2.0.6-4" - }, - { - "key": "libjbig0_2.1-3.1-p-b2_amd64", - "name": "libjbig0", - "version": "2.1-3.1+b2" - }, - { - "key": "libdeflate0_1.7-1_amd64", - "name": "libdeflate0", - "version": "1.7-1" - }, - { - "key": "libpng16-16_1.6.37-3_amd64", - "name": "libpng16-16", - "version": "1.6.37-3" - }, - { - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_amd64", - "name": "libfreetype6", - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "key": "libbrotli1_1.0.9-2-p-b2_amd64", - "name": "libbrotli1", - "version": "1.0.9-2+b2" - }, - { - "key": "libfontconfig1_2.13.1-4.2_amd64", - "name": "libfontconfig1", - "version": "2.13.1-4.2" - }, - { - "key": "fontconfig-config_2.13.1-4.2_amd64", - "name": "fontconfig-config", - "version": "2.13.1-4.2" - }, - { - "key": "fonts-texgyre_20180621-3.1_amd64", - "name": "fonts-texgyre", - "version": "20180621-3.1" - }, - { - "key": "ucf_3.0043_amd64", - "name": "ucf", - "version": "3.0043" - }, - { - "key": "sensible-utils_0.0.14_amd64", - "name": "sensible-utils", - "version": "0.0.14" - }, - { - "key": "coreutils_8.32-4-p-b1_amd64", - "name": "coreutils", - "version": "8.32-4+b1" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_amd64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libuuid1_2.36.1-8-p-deb11u1_amd64", - "name": "libuuid1", - "version": "2.36.1-8+deb11u1" - }, - { - "key": "libexpat1_2.2.10-2-p-deb11u5_amd64", - "name": "libexpat1", - "version": "2.2.10-2+deb11u5" - }, - { - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-geoip", - "version": "1.18.0-6.1+deb11u3" - } - ], - "key": "nginx-core_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-core", - "sha256": "3d36d36ee74a62037159aeae87c51d2535bf7195a0fb325bde90a325034fc152", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-core_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpcre3_2-8.39-13_amd64", - "name": "libpcre3", - "sha256": "48efcf2348967c211cd9408539edf7ec3fa9d800b33041f6511ccaecc1ffa9d0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre3/libpcre3_8.39-13_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre3/libpcre3_8.39-13_amd64.deb" - ], - "version": "2:8.39-13" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "iproute2_5.10.0-4_amd64", - "name": "iproute2", - "sha256": "bad652452612c81b8cfdca1411a036a768f5fa3461a04d6662f1ee0807ea3791", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/iproute2/iproute2_5.10.0-4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/iproute2/iproute2_5.10.0-4_amd64.deb" - ], - "version": "5.10.0-4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libcap2-bin_1-2.44-1_amd64", - "name": "libcap2-bin", - "sha256": "a5b9717d8455cf8517c4c5f29aa04a4dec973430f0d3c1232f652abb9a4d93cc", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2-bin_2.44-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2-bin_2.44-1_amd64.deb" - ], - "version": "1:2.44-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libcap2_1-2.44-1_amd64", - "name": "libcap2", - "sha256": "7a3ae3e97d0d403a4c54663c0bb48e9341d98822420a4ab808c6dc8e8474558f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2_2.44-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2_2.44-1_amd64.deb" - ], - "version": "1:2.44-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxtables12_1.8.7-1_amd64", - "name": "libxtables12", - "sha256": "9702a4be6f267b58c8fc1cfa0747bbefccb8b9a9af2a3547535533fbf2a7c14d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/iptables/libxtables12_1.8.7-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/iptables/libxtables12_1.8.7-1_amd64.deb" - ], - "version": "1.8.7-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libmnl0_1.0.4-3_amd64", - "name": "libmnl0", - "sha256": "4581f42e3373cb72f9ea4e88163b17873afca614a6c6f54637e95aa75983ea7c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmnl/libmnl0_1.0.4-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmnl/libmnl0_1.0.4-3_amd64.deb" - ], - "version": "1.0.4-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libelf1_0.183-1_amd64", - "name": "libelf1", - "sha256": "e1ad132d502b255023c222d0cae1d02ca941f6b68fd0e9b908c6004cc326592c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/e/elfutils/libelf1_0.183-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/e/elfutils/libelf1_0.183-1_amd64.deb" - ], - "version": "0.183-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libbsd0_0.11.3-1-p-deb11u1_amd64", - "name": "libbsd0", - "sha256": "6ec5a08a4bb32c0dc316617f4bbefa8654c472d1cd4412ab8995f3955491f4a8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbsd/libbsd0_0.11.3-1+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbsd/libbsd0_0.11.3-1+deb11u1_amd64.deb" - ], - "version": "0.11.3-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libmd0_1.0.3-3_amd64", - "name": "libmd0", - "sha256": "9e425b3c128b69126d95e61998e1b5ef74e862dd1fc953d91eebcc315aea62ea", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmd/libmd0_1.0.3-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmd/libmd0_1.0.3-3_amd64.deb" - ], - "version": "1.0.3-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libbpf0_1-0.3-2_amd64", - "name": "libbpf0", - "sha256": "21775f2ae3e1221dab6b9cbb7743df54f751b831e89e005a6f3ce951ba3a30b9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbpf/libbpf0_0.3-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbpf/libbpf0_0.3-2_amd64.deb" - ], - "version": "1:0.3-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "nginx-common_1.18.0-6.1-p-deb11u3_amd64", - "name": "nginx-common", - "sha256": "bfd22beb7bd248db58eee6e6434a7c500f6e98e264219b3832f248696cd58f67", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-common_1.18.0-6.1+deb11u3_all.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "lsb-base_11.1.0_amd64", - "name": "lsb-base", - "sha256": "89ed6332074d827a65305f9a51e591dff20641d61ff5e11f4e1822a9987e96fe", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb" - ], - "version": "11.1.0" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream-geoip", - "sha256": "b1b22074e8586b9c2fa48fdd460fb43f719e4305a89209cd151102a012af4772", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream-geoip_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream", - "sha256": "1fbc038483013a78f884314a274bafa221000c8d6cddfd76fd217d23bf26b8d0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgeoip1_1.6.12-7_amd64", - "name": "libgeoip1", - "sha256": "d4d6076106a6f522144e8071baf6d5fdbd415035f51e081075053ca8223cad51", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/geoip/libgeoip1_1.6.12-7_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/geoip/libgeoip1_1.6.12-7_amd64.deb" - ], - "version": "1.6.12-7" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-mail", - "sha256": "3d401417fc74090544c8cd8586add33cbd2f8d88437072233bca9547922f3384", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-mail_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-xslt-filter", - "sha256": "e51af1373b99ce692dfcb11f185ceb4664b6009a50b4d92773af2c74601d2d4a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-xslt-filter_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxslt1.1_1.1.34-4-p-deb11u1_amd64", - "name": "libxslt1.1", - "sha256": "e6109d282ad9a330856b88944a953e86329b2c07d8b0f378a2fd0493f27352c8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_amd64.deb" - ], - "version": "1.1.34-4+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_amd64", - "name": "libxml2", - "sha256": "b29ea9026561ef0019a57b8b192bf08f725976cd1dddd3fc6bcf876840350989", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_amd64.deb" - ], - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libicu67_67.1-7_amd64", - "name": "libicu67", - "sha256": "2bf5c46254f527865bfd6368e1120908755fa57d83634bd7d316c9b3cfd57303", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/icu/libicu67_67.1-7_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/icu/libicu67_67.1-7_amd64.deb" - ], - "version": "67.1-7" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-image-filter", - "sha256": "811bae64a056aeb4d68329296b0d5f96749a688285977fd2b192f8c81f623304", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-image-filter_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libgd3_2.3.0-2_amd64", - "name": "libgd3", - "sha256": "fadaa01272200dcaa476c6b8908e1faa93d6840610beca909099647829f3fdc1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgd2/libgd3_2.3.0-2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgd2/libgd3_2.3.0-2_amd64.deb" - ], - "version": "2.3.0-2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_amd64", - "name": "libxpm4", - "sha256": "349a5a8cf0de6cb33c199027abfbd6b7a13f5160948e6db066a96080c61e4819", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxpm/libxpm4_3.5.12-1.1+deb11u1_amd64.deb" - ], - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libx11-6_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-6", - "sha256": "2b3b959cb10c07be065eb638a8577fe20f282045aaef76425dbd7310d1244b8c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libx11/libx11-6_1.7.2-1+deb11u2_amd64.deb" - ], - "version": "2:1.7.2-1+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libx11-data_2-1.7.2-1-p-deb11u2_amd64", - "name": "libx11-data", - "sha256": "9db24e1e7ed3cd738b503e7df5c1b9b52b1eadcb55019cd63b1409e578565d29", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libx11/libx11-data_1.7.2-1+deb11u2_all.deb" - ], - "version": "2:1.7.2-1+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxcb1_1.14-3_amd64", - "name": "libxcb1", - "sha256": "d5e0f047ed766f45eb7473947b70f9e8fddbe45ef22ecfd92ab712c0671a93ac", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcb/libxcb1_1.14-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcb/libxcb1_1.14-3_amd64.deb" - ], - "version": "1.14-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxdmcp6_1-1.1.2-3_amd64", - "name": "libxdmcp6", - "sha256": "ecb8536f5fb34543b55bb9dc5f5b14c9dbb4150a7bddb3f2287b7cab6e9d25ef", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_amd64.deb" - ], - "version": "1:1.1.2-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libxau6_1-1.0.9-1_amd64", - "name": "libxau6", - "sha256": "679db1c4579ec7c61079adeaae8528adeb2e4bf5465baa6c56233b995d714750", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxau/libxau6_1.0.9-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxau/libxau6_1.0.9-1_amd64.deb" - ], - "version": "1:1.0.9-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libwebp6_0.6.1-2.1-p-deb11u2_amd64", - "name": "libwebp6", - "sha256": "8abc2b1ca77a458bbbcdeb6af5d85316260977370fa2518d017222b3584d9653", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libw/libwebp/libwebp6_0.6.1-2.1+deb11u2_amd64.deb" - ], - "version": "0.6.1-2.1+deb11u2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libtiff5_4.2.0-1-p-deb11u5_amd64", - "name": "libtiff5", - "sha256": "7a70e9513e2b3c3a3d68f1614189f0be72b57eae2229aa64a3d7c8a3fe0639c9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/t/tiff/libtiff5_4.2.0-1+deb11u5_amd64.deb" - ], - "version": "4.2.0-1+deb11u5" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libjpeg62-turbo_1-2.0.6-4_amd64", - "name": "libjpeg62-turbo", - "sha256": "28de780a1605cf501c3a4ebf3e588f5110e814b208548748ab064100c32202ea", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_amd64.deb" - ], - "version": "1:2.0.6-4" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libjbig0_2.1-3.1-p-b2_amd64", - "name": "libjbig0", - "sha256": "9646d69eefce505407bf0437ea12fb7c2d47a3fd4434720ba46b642b6dcfd80f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_amd64.deb" - ], - "version": "2.1-3.1+b2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libdeflate0_1.7-1_amd64", - "name": "libdeflate0", - "sha256": "dadaf0d28360f6eb21ad389b2e0f12f8709c9de539b28de9c11d7ec7043dec95", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libd/libdeflate/libdeflate0_1.7-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libd/libdeflate/libdeflate0_1.7-1_amd64.deb" - ], - "version": "1.7-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libpng16-16_1.6.37-3_amd64", - "name": "libpng16-16", - "sha256": "7d5336af395d1f658d0e66d74d0e1f4c632028750e7e04314d1a650e0317f3d6", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_amd64.deb" - ], - "version": "1.6.37-3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_amd64", - "name": "libfreetype6", - "sha256": "b21cfdd12adf6cac4af320c2485fb62a8a5edc6f9768bc2288fd686f4fa6dfdf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_amd64.deb" - ], - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libbrotli1_1.0.9-2-p-b2_amd64", - "name": "libbrotli1", - "sha256": "65ca7d8b03e9dac09c5d544a89dd52d1aeb74f6a19583d32e4ff5f0c77624c24", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_amd64.deb" - ], - "version": "1.0.9-2+b2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libfontconfig1_2.13.1-4.2_amd64", - "name": "libfontconfig1", - "sha256": "b92861827627a76e74d6f447a5577d039ef2f95da18af1f29aa98fb96baea4c1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_amd64.deb" - ], - "version": "2.13.1-4.2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "fontconfig-config_2.13.1-4.2_amd64", - "name": "fontconfig-config", - "sha256": "48afb6ad7d15e6104a343b789f73697301ad8bff77b69927bc998f5a409d8e90", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb" - ], - "version": "2.13.1-4.2" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "fonts-texgyre_20180621-3.1_amd64", - "name": "fonts-texgyre", - "sha256": "cb7e9a4b2471cfdd57194c16364f9102f0639816a2662fed4b30d2a158747076", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tex-gyre/fonts-texgyre_20180621-3.1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tex-gyre/fonts-texgyre_20180621-3.1_all.deb" - ], - "version": "20180621-3.1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "ucf_3.0043_amd64", - "name": "ucf", - "sha256": "ebef6bcd777b5c0cc2699926f2159db08433aed07c50cb321fd828b28c5e8d53", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/u/ucf/ucf_3.0043_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/u/ucf/ucf_3.0043_all.deb" - ], - "version": "3.0043" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "sensible-utils_0.0.14_amd64", - "name": "sensible-utils", - "sha256": "b9a447dc4ec8714196b037e20a2209e62cd669f5450222952f259bda4416b71f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb" - ], - "version": "0.0.14" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libuuid1_2.36.1-8-p-deb11u1_amd64", - "name": "libuuid1", - "sha256": "31250af4dd3b7d1519326a9a6764d1466a93d8f498cf6545058761ebc38b2823", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_amd64.deb" - ], - "version": "2.36.1-8+deb11u1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libexpat1_2.2.10-2-p-deb11u5_amd64", - "name": "libexpat1", - "sha256": "5744040c4735bcdd51238aebfa3e402b857244897f1007f61154982ebe5abbd7", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/e/expat/libexpat1_2.2.10-2+deb11u5_amd64.deb" - ], - "version": "2.2.10-2+deb11u5" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-geoip", - "sha256": "639ceb3e17c3d5a3033757d86a57f3fa786be27ef51fd1618c8a84e9d55ef974", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-geoip_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-stream-geoip2_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-stream-geoip2", - "sha256": "20abf8d42ceebe21dcf76c9c4952b9b9a5d8c140affade21c8aebb22d38469d9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream-geoip2_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libmaxminddb0_1.5.2-1_amd64", - "name": "libmaxminddb0", - "sha256": "9779e86a61b8315d119939f3226472f17d707dce0673eff7b961a478e519e351", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmaxminddb/libmaxminddb0_1.5.2-1_amd64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmaxminddb/libmaxminddb0_1.5.2-1_amd64.deb" - ], - "version": "1.5.2-1" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-upstream-fair_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-upstream-fair", - "sha256": "9650cbb1808fd4d63703b70d5d4599c34e4781c85f5e2b2b47f0abc934397f28", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-upstream-fair_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-subs-filter_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-subs-filter", - "sha256": "fbfc00d65a6305911a7f025eb331912dadb6de7cdc5e65e5d94f2e65d70a5596", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-subs-filter_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-geoip2_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-geoip2", - "sha256": "de912c363bb1864148379f0784c8031194a3749ae930a5fd0eb1bc2df63d7957", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-geoip2_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-echo_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-echo", - "sha256": "a5be1358d4fb799fdd5941377dea2c45cd013e2c4130dfce98f4af94aead1ec3", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-echo_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-dav-ext_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-dav-ext", - "sha256": "48458923ac10ed4ad432237583b617702e8ca6b88da330989711aa734f7e06ee", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-dav-ext_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "libnginx-mod-http-auth-pam_1.18.0-6.1-p-deb11u3_amd64", - "name": "libnginx-mod-http-auth-pam", - "sha256": "08f23455c05eee95e8c0bf96d1a52e6a1ddcf509dd1b4dec97c778ff2c596c92", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-auth-pam_1.18.0-6.1+deb11u3_amd64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "amd64", - "dependencies": [], - "key": "google-cloud-cli_507.0.0-0_amd64", - "name": "google-cloud-cli", - "sha256": "d84b4e1891fac2f4132efdcdb42108a851b752612e08080c82a2eaff47b02afe", - "urls": [ - "https://packages.cloud.google.com/apt/pool/cloud-sdk/google-cloud-cli_507.0.0-0_amd64_563ffde9b6bc7a27c15f014c68905adf.deb" - ], - "version": "507.0.0-0" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "ncurses-base_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "ncurses-base", - "sha256": "a55a5f94299448279da6a6c2031a9816dc768cd300668ff82ecfc6480bbfc83d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/ncurses-base_6.2+20201114-2+deb11u2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/ncurses-base_6.2+20201114-2+deb11u2_all.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libtinfo6", - "version": "6.2+20201114-2+deb11u2" - } - ], - "key": "libncurses6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libncurses6", - "sha256": "039b71b8839538a92988003e13c29e7cf1149cdc6a77d3de882f1d386a5f3a5c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u2_arm64.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "sha256": "6eb629090615ebda5dcac2365a7358c035add00b89c2724c2e9e13ccd5bd9f7c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_arm64.deb" - ], - "version": "2.31-13+deb11u8" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "sha256": "22b586b29e840dabebf0bf227d233376628b87954915d064bc142ae85d1b7979", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_arm64.deb" - ], - "version": "1:4.4.18-4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "sha256": "e2fcdb378d3c1ad1bcb64d4fb6b37aab44011152beca12a4944f435a2582df1f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_arm64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "sha256": "7d782bece7b4a36bed045a7e17d17244cb8f7e4732466091b01412ebf215defb", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/gcc-10-base_10.2.1-6_arm64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libtinfo6", - "sha256": "58027c991756930a2abb2f87a829393d3fdbfb76f4eca9795ef38ea2b0510e27", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libtinfo6_6.2+20201114-2+deb11u2_arm64.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - } - ], - "key": "tzdata_2024a-0-p-deb11u1_arm64", - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" - ], - "version": "2024a-0+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "sha256": "d9ee4dff77aaad12674eed3ccefdcccd332424c9e2ac2ac00a37a1e06c84ab70", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debconf/debconf_1.5.77_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debconf/debconf_1.5.77_all.deb" - ], - "version": "1.5.77" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "sha256": "53e09d9594692c462f33d4e9394bff60f95fe74b70402772dc7396a5829b76e5", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-base_5.32.1-4+deb11u3_arm64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - } - ], - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "sha256": "87b0bce7361d94cc15caf27709fa8a70de44f9dd742cf0d69d25796a03d24853", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/dpkg/dpkg_1.20.13_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/dpkg/dpkg_1.20.13_arm64.deb" - ], - "version": "1.20.13" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "sha256": "0f94aac4e6d25e07ed23b7fc3ed06e69074c95276d82caae7fc7b207fd714e39", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tar/tar_1.34+dfsg-1+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tar/tar_1.34+dfsg-1+deb11u1_arm64.deb" - ], - "version": "1.34+dfsg-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "sha256": "da98279a47dabaa46a83514142f5c691c6a71fa7e582661a3a3db6887ad3e9d1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libselinux/libselinux1_3.1-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libselinux/libselinux1_3.1-3_arm64.deb" - ], - "version": "3.1-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "sha256": "27a4362a4793cb67a8ae571bd8c3f7e8654dc2e56d99088391b87af1793cca9c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_arm64.deb" - ], - "version": "10.36-2+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "sha256": "f164c48192cb47746101de6c59afa3f97777c8fc821e5a30bb890df1f4cb4cfd", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_arm64.deb" - ], - "version": "2.2.53-10" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "sha256": "e3963985d1a020d67ffd4180e6f9c4b5c600b515f0c9d8fda513d7a0e48e63a1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/z/zlib/zlib1g_1.2.11.dfsg-2+deb11u2_arm64.deb" - ], - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "sha256": "d865bba41952c707b3fa3ae8cab4d4bd337ee92991d2aead66c925bf7cc48846", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/x/xz-utils/liblzma5_5.2.5-2.1~deb11u1_arm64.deb" - ], - "version": "5.2.5-2.1~deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "sha256": "da340e8470e96445c56966f74e48a9a91dee0fa5c89876e88a4575cc17d17a97", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_arm64.deb" - ], - "version": "1.0.8-4" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_arm64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - } - ], - "key": "coreutils_8.32-4_arm64", - "name": "coreutils", - "sha256": "6210c84d6ff84b867dc430f661f22f536e1704c27bdb79de38e26f75b853d9c0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4_arm64.deb" - ], - "version": "8.32-4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", - "name": "libgmp10", - "sha256": "d52619b6ff8829aa5424dfe3189dd05f22118211e69273e9576030584ffcce80", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gmp/libgmp10_6.2.1+dfsg-1+deb11u1_arm64.deb" - ], - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libattr1_1-2.4.48-6_arm64", - "name": "libattr1", - "sha256": "cb9b59be719a6fdbaabaa60e22aa6158b2de7a68c88ccd7c3fb7f41a25fb43d0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/attr/libattr1_2.4.48-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/attr/libattr1_2.4.48-6_arm64.deb" - ], - "version": "1:2.4.48-6" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "libsystemd0_247.3-7-p-deb11u4_arm64", - "name": "libsystemd0", - "version": "247.3-7+deb11u4" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_arm64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "liblz4-1_1.9.3-2_arm64", - "name": "liblz4-1", - "version": "1.9.3-2" - }, - { - "key": "libgcrypt20_1.8.7-6_arm64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_arm64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_arm64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libseccomp2_2.5.1-1-p-deb11u1_arm64", - "name": "libseccomp2", - "version": "2.5.1-1+deb11u1" - }, - { - "key": "libgnutls30_3.7.1-5-p-deb11u4_arm64", - "name": "libgnutls30", - "version": "3.7.1-5+deb11u4" - }, - { - "key": "libunistring2_0.9.10-4_arm64", - "name": "libunistring2", - "version": "0.9.10-4" - }, - { - "key": "libtasn1-6_4.16.0-2-p-deb11u1_arm64", - "name": "libtasn1-6", - "version": "4.16.0-2+deb11u1" - }, - { - "key": "libp11-kit0_0.23.22-1_arm64", - "name": "libp11-kit0", - "version": "0.23.22-1" - }, - { - "key": "libffi7_3.3-6_arm64", - "name": "libffi7", - "version": "3.3-6" - }, - { - "key": "libnettle8_3.7.3-1_arm64", - "name": "libnettle8", - "version": "3.7.3-1" - }, - { - "key": "libidn2-0_2.3.0-5_arm64", - "name": "libidn2-0", - "version": "2.3.0-5" - }, - { - "key": "libhogweed6_3.7.3-1_arm64", - "name": "libhogweed6", - "version": "3.7.3-1" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "debian-archive-keyring_2021.1.1-p-deb11u1_arm64", - "name": "debian-archive-keyring", - "version": "2021.1.1+deb11u1" - }, - { - "key": "libapt-pkg6.0_2.2.4_arm64", - "name": "libapt-pkg6.0", - "version": "2.2.4" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libxxhash0_0.8.0-2_arm64", - "name": "libxxhash0", - "version": "0.8.0-2" - }, - { - "key": "libudev1_247.3-7-p-deb11u4_arm64", - "name": "libudev1", - "version": "247.3-7+deb11u4" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "gpgv1_1.4.23-1.1_arm64", - "name": "gpgv1", - "version": "1.4.23-1.1" - }, - { - "key": "adduser_3.118-p-deb11u1_arm64", - "name": "adduser", - "version": "3.118+deb11u1" - }, - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "passwd_1-4.8.1-1_arm64", - "name": "passwd", - "version": "1:4.8.1-1" - }, - { - "key": "libpam-modules_1.4.0-9-p-deb11u1_arm64", - "name": "libpam-modules", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libpam-modules-bin_1.4.0-9-p-deb11u1_arm64", - "name": "libpam-modules-bin", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libpam0g_1.4.0-9-p-deb11u1_arm64", - "name": "libpam0g", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libaudit1_1-3.0-2_arm64", - "name": "libaudit1", - "version": "1:3.0-2" - }, - { - "key": "libcap-ng0_0.7.9-2.2-p-b1_arm64", - "name": "libcap-ng0", - "version": "0.7.9-2.2+b1" - }, - { - "key": "libaudit-common_1-3.0-2_arm64", - "name": "libaudit-common", - "version": "1:3.0-2" - }, - { - "key": "libtirpc3_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc3", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libtirpc-common_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc-common", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libgssapi-krb5-2_1.18.3-6-p-deb11u4_arm64", - "name": "libgssapi-krb5-2", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5support0_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5support0", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5-3_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5-3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "libkeyutils1_1.6.1-2_arm64", - "name": "libkeyutils1", - "version": "1.6.1-2" - }, - { - "key": "libk5crypto3_1.18.3-6-p-deb11u4_arm64", - "name": "libk5crypto3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libcom-err2_1.46.2-2_arm64", - "name": "libcom-err2", - "version": "1.46.2-2" - }, - { - "key": "libnsl2_1.3.0-2_arm64", - "name": "libnsl2", - "version": "1.3.0-2" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libsemanage1_3.1-1-p-b2_arm64", - "name": "libsemanage1", - "version": "3.1-1+b2" - }, - { - "key": "libsepol1_3.1-1_arm64", - "name": "libsepol1", - "version": "3.1-1" - }, - { - "key": "libsemanage-common_3.1-1_arm64", - "name": "libsemanage-common", - "version": "3.1-1" - } - ], - "key": "apt_2.2.4_arm64", - "name": "apt", - "sha256": "39cbe42f3e64c6359b445d6fed7385273881e507b8be1d3b653ec9fb7d4c917c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/apt_2.2.4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/apt_2.2.4_arm64.deb" - ], - "version": "2.2.4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libsystemd0_247.3-7-p-deb11u4_arm64", - "name": "libsystemd0", - "sha256": "32e8c12301a9ada555adea9a4c2f15df788411dadd164baca5c31690fe06e381", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libsystemd0_247.3-7+deb11u4_arm64.deb" - ], - "version": "247.3-7+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libzstd1_1.4.8-p-dfsg-2.1_arm64", - "name": "libzstd1", - "sha256": "dd01659c6c122f983a3369a04ede63539f666585d52a03f8aa2c27b307e547e0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libz/libzstd/libzstd1_1.4.8+dfsg-2.1_arm64.deb" - ], - "version": "1.4.8+dfsg-2.1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "liblz4-1_1.9.3-2_arm64", - "name": "liblz4-1", - "sha256": "83f0ee547cd42854e1b2a2e4c1a5705e28259ee5fa6560119f918f961a5dada2", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/l/lz4/liblz4-1_1.9.3-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/l/lz4/liblz4-1_1.9.3-2_arm64.deb" - ], - "version": "1.9.3-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgcrypt20_1.8.7-6_arm64", - "name": "libgcrypt20", - "sha256": "61ec779149f20923b30adad7bdf4732957e88a5b6a26d94b2210dfe79409959b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_arm64.deb" - ], - "version": "1.8.7-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgpg-error0_1.38-2_arm64", - "name": "libgpg-error0", - "sha256": "d1116f4281d6db35279799a21051e0d0e2600d110d7ee2b95b3cca6bec28067c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_arm64.deb" - ], - "version": "1.38-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libstdc-p--p-6_10.2.1-6_arm64", - "name": "libstdc++6", - "sha256": "7869aa540cc46e9f3d4267d5bde2af0e5b429a820c1d6f1a4cfccfe788c31890", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_arm64.deb" - ], - "version": "10.2.1-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libseccomp2_2.5.1-1-p-deb11u1_arm64", - "name": "libseccomp2", - "sha256": "5b8983c2e330790dbe04ae990f166d7939a3e14b75556a8489309ae704fbeb50", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_arm64.deb" - ], - "version": "2.5.1-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgnutls30_3.7.1-5-p-deb11u4_arm64", - "name": "libgnutls30", - "sha256": "7153ec6ee985eebba710dcb6e425bb881c91ee5987a4517518f3f44a9bb5fc1a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_arm64.deb" - ], - "version": "3.7.1-5+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libunistring2_0.9.10-4_arm64", - "name": "libunistring2", - "sha256": "53ff395ea4d8cf17c52155a452a0dc15af0ee2fa5cb3b0085b9c7335de8d5f7f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_arm64.deb" - ], - "version": "0.9.10-4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libtasn1-6_4.16.0-2-p-deb11u1_arm64", - "name": "libtasn1-6", - "sha256": "f469147bbd3969055c51fc661c9aa0d56d48eccd070d233f1424b0d8b3f29295", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libt/libtasn1-6/libtasn1-6_4.16.0-2+deb11u1_arm64.deb" - ], - "version": "4.16.0-2+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libp11-kit0_0.23.22-1_arm64", - "name": "libp11-kit0", - "sha256": "ac6e8eda3277708069bc6f03aff06dc319855d64ede9fca219938e52f92ee09c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_arm64.deb" - ], - "version": "0.23.22-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libffi7_3.3-6_arm64", - "name": "libffi7", - "sha256": "eb748e33ae4ed46f5a4c14b7a2a09792569f2029ede319d0979c373829ba1532", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb" - ], - "version": "3.3-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnettle8_3.7.3-1_arm64", - "name": "libnettle8", - "sha256": "5061c931f95dc7277d95fc58bce7c17b1a95c6aa9a9aac781784f3b3dc909047", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_arm64.deb" - ], - "version": "3.7.3-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libidn2-0_2.3.0-5_arm64", - "name": "libidn2-0", - "sha256": "0d2e6d39bf65f16861f284be567c1a6c5d4dc6b54dcfdf9dba631546ff4e6796", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb" - ], - "version": "2.3.0-5" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libhogweed6_3.7.3-1_arm64", - "name": "libhogweed6", - "sha256": "3e9eea5e474dd98a7de9e4c1ecfbfd6f6efb1d40bf51d6473de9713cf41d2191", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_arm64.deb" - ], - "version": "3.7.3-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "debian-archive-keyring_2021.1.1-p-deb11u1_arm64", - "name": "debian-archive-keyring", - "sha256": "28ca7749ab7978f3c571732c3aa1c56e3ad1d5db3c915293763d4f6cb8fcce89", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debian-archive-keyring/debian-archive-keyring_2021.1.1+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debian-archive-keyring/debian-archive-keyring_2021.1.1+deb11u1_all.deb" - ], - "version": "2021.1.1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libapt-pkg6.0_2.2.4_arm64", - "name": "libapt-pkg6.0", - "sha256": "7cb6015ea5c185ef93706989fb730377406878c72f6943b6ecdd956697f1abe6", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_arm64.deb" - ], - "version": "2.2.4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxxhash0_0.8.0-2_arm64", - "name": "libxxhash0", - "sha256": "a31effcbd7a248b64dd480330557f41ea796a010b2c2e7ac91ed10f94e605065", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_arm64.deb" - ], - "version": "0.8.0-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libudev1_247.3-7-p-deb11u4_arm64", - "name": "libudev1", - "sha256": "d53ca63927b51ad6f9a85ee1e4ce74d20ef45651179fd70f3c8d72607071e393", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libudev1_247.3-7+deb11u4_arm64.deb" - ], - "version": "247.3-7+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "gpgv1_1.4.23-1.1_arm64", - "name": "gpgv1", - "sha256": "f65792c432a2a741dfb0a56b9e5f39fe87ff477636dafcf38644c6f726b1addc", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnupg1/gpgv1_1.4.23-1.1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnupg1/gpgv1_1.4.23-1.1_arm64.deb" - ], - "version": "1.4.23-1.1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "adduser_3.118-p-deb11u1_arm64", - "name": "adduser", - "sha256": "1478a610fd50e190882ff41e16c57b628a508bcf5b5ac5313affb49d20818e0a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/adduser/adduser_3.118+deb11u1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/adduser/adduser_3.118+deb11u1_all.deb" - ], - "version": "3.118+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "passwd_1-4.8.1-1_arm64", - "name": "passwd", - "sha256": "5a675c9d23f176ea195678a949e144b23c7a8b268b03e0df8919a2cfc198e585", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/shadow/passwd_4.8.1-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/s/shadow/passwd_4.8.1-1_arm64.deb" - ], - "version": "1:4.8.1-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpam-modules_1.4.0-9-p-deb11u1_arm64", - "name": "libpam-modules", - "sha256": "7f46ae216fdc6c69b0120d430936f40f3c5f37249296042324aeb584d5566a3c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_arm64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpam-modules-bin_1.4.0-9-p-deb11u1_arm64", - "name": "libpam-modules-bin", - "sha256": "bc20fa16c91a239de350ffcc019fbae5ce7c47c21235b332ff9d67638804866e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules-bin_1.4.0-9+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules-bin_1.4.0-9+deb11u1_arm64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpam0g_1.4.0-9-p-deb11u1_arm64", - "name": "libpam0g", - "sha256": "4905e523ce38e80b79f13f0227fca519f6833eb116dd9c58cbbecb39c0e01e3d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam0g_1.4.0-9+deb11u1_arm64.deb" - ], - "version": "1.4.0-9+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libaudit1_1-3.0-2_arm64", - "name": "libaudit1", - "sha256": "c93da146715dcd0c71759629c04afb01a41c879d91b2f5330adc74365db03763", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit1_3.0-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit1_3.0-2_arm64.deb" - ], - "version": "1:3.0-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libcap-ng0_0.7.9-2.2-p-b1_arm64", - "name": "libcap-ng0", - "sha256": "b7b14e0b7747872f04691efe6c126de5ed0bf1dc200f51b93039cc2f4a65a96a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap-ng/libcap-ng0_0.7.9-2.2+b1_arm64.deb" - ], - "version": "0.7.9-2.2+b1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libaudit-common_1-3.0-2_arm64", - "name": "libaudit-common", - "sha256": "0d52f4826a57aea13cea1a85bfae354024c7b2f7b95e39cd1ce225e4db27d0f6", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit-common_3.0-2_all.deb" - ], - "version": "1:3.0-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libtirpc3_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc3", - "sha256": "ccff0927f55b97fe9ea13057fab8bff9920bf4628eb2d5d48b9656f2fb74d2e1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libt/libtirpc/libtirpc3_1.3.1-1+deb11u1_arm64.deb" - ], - "version": "1.3.1-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libtirpc-common_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc-common", - "sha256": "b2f10cb79e7d7a2f9b30bcdf036127df55cd4a34688547bc2886fa38f4969f77", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libt/libtirpc/libtirpc-common_1.3.1-1+deb11u1_all.deb" - ], - "version": "1.3.1-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgssapi-krb5-2_1.18.3-6-p-deb11u4_arm64", - "name": "libgssapi-krb5-2", - "sha256": "5572a462c7f78f9610bd4f1dd9f8e4f8243fa9dc2d1deb5b1cf7cec1f1df83dc", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libgssapi-krb5-2_1.18.3-6+deb11u4_arm64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libkrb5support0_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5support0", - "sha256": "d44585771e26c9b8d115aad33736fcc3e03cf98238ea7c7985554f166441aa07", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5support0_1.18.3-6+deb11u4_arm64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libkrb5-3_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5-3", - "sha256": "3dcdadb1db461d14b6051a19c6a94ae9f61c3d2b1d35fd9d63326cd8f4ae49e5", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u4_arm64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "sha256": "fe7a7d313c87e46e62e614a07137e4a476a79fc9e5aab7b23e8235211280fee3", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_arm64.deb" - ], - "version": "1.1.1w-0+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libkeyutils1_1.6.1-2_arm64", - "name": "libkeyutils1", - "sha256": "7101c2380ab47a3627a6fa076a149ab71078263064f936fccbd43efbaed4a2da", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_arm64.deb" - ], - "version": "1.6.1-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libk5crypto3_1.18.3-6-p-deb11u4_arm64", - "name": "libk5crypto3", - "sha256": "d8f31a8bd83fe2593e83a930fc2713e1213f25311a629836dfcde5bd23a85e83", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libk5crypto3_1.18.3-6+deb11u4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libk5crypto3_1.18.3-6+deb11u4_arm64.deb" - ], - "version": "1.18.3-6+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libcom-err2_1.46.2-2_arm64", - "name": "libcom-err2", - "sha256": "fc95d415c35f5b687871f660a5bf66963fd117daa490110499119411e2d6145e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/e/e2fsprogs/libcom-err2_1.46.2-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/e/e2fsprogs/libcom-err2_1.46.2-2_arm64.deb" - ], - "version": "1.46.2-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnsl2_1.3.0-2_arm64", - "name": "libnsl2", - "sha256": "8f9ba58b219779b43c4ccc78c79b0a23f721fc96323c202abb31e02f942104b3", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_arm64.deb" - ], - "version": "1.3.0-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "sha256": "cf9aa3eae9cfc4c84f93e32f3d11e2707146e4d9707712909e3c61530b50353e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/db5.3/libdb5.3_5.3.28+dfsg1-0.8_arm64.deb" - ], - "version": "5.3.28+dfsg1-0.8" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libsemanage1_3.1-1-p-b2_arm64", - "name": "libsemanage1", - "sha256": "342a804007338314211981fac0bc083c3c66c6040bca0e47342c6d9ff44f103e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage1_3.1-1+b2_arm64.deb" - ], - "version": "3.1-1+b2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libsepol1_3.1-1_arm64", - "name": "libsepol1", - "sha256": "354d36c3084c14f242baba3a06372a3c034cec7a0cb38e626fc03cc4751b2cd3", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsepol/libsepol1_3.1-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsepol/libsepol1_3.1-1_arm64.deb" - ], - "version": "3.1-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libsemanage-common_3.1-1_arm64", - "name": "libsemanage-common", - "sha256": "d319a026ecd02e2f605c52350949279f3c331a19380f8b6888ce5b9ef0d31349", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb" - ], - "version": "3.1-1" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "libperl5.32_5.32.1-4-p-deb11u3_arm64", - "name": "libperl5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "perl-modules-5.32_5.32.1-4-p-deb11u3_arm64", - "name": "perl-modules-5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libgdbm6_1.19-2_arm64", - "name": "libgdbm6", - "version": "1.19-2" - }, - { - "key": "libgdbm-compat4_1.19-2_arm64", - "name": "libgdbm-compat4", - "version": "1.19-2" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - } - ], - "key": "perl_5.32.1-4-p-deb11u3_arm64", - "name": "perl", - "sha256": "6ed36a59241bbeec132eebec770567a4d23884f71dc922ac6770862cac1f3d9a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl_5.32.1-4+deb11u3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl_5.32.1-4+deb11u3_arm64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libperl5.32_5.32.1-4-p-deb11u3_arm64", - "name": "libperl5.32", - "sha256": "9a5524101015f14773246336cb615c0e58fff2e7420a79f511262df9a7ff1c91", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/libperl5.32_5.32.1-4+deb11u3_arm64.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "perl-modules-5.32_5.32.1-4-p-deb11u3_arm64", - "name": "perl-modules-5.32", - "sha256": "9a5cb99d0f33cb11c7f535aaebfb569c6b6f97a75d748a9a52ea3afed5bd3960", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u3_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/perl/perl-modules-5.32_5.32.1-4+deb11u3_all.deb" - ], - "version": "5.32.1-4+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgdbm6_1.19-2_arm64", - "name": "libgdbm6", - "sha256": "97a88c2698bd836d04e51ad70c76826850857869b51e90b5343621ba30bbf525", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm6_1.19-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm6_1.19-2_arm64.deb" - ], - "version": "1.19-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgdbm-compat4_1.19-2_arm64", - "name": "libgdbm-compat4", - "sha256": "0853cc0b0f92784b7fbd193d737c63b1d95f932e2b95dc1bb10c273e01a0f754", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_arm64.deb" - ], - "version": "1.19-2" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "openssl_1.1.1w-0-p-deb11u1_arm64", - "name": "openssl", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - } - ], - "key": "ca-certificates_20210119_arm64", - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" - ], - "version": "20210119" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "openssl_1.1.1w-0-p-deb11u1_arm64", - "name": "openssl", - "sha256": "d9159af073e95641e7eda440fa1d7623873b8c0034c9826a353f890bed107f3c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_arm64.deb" - ], - "version": "1.1.1w-0+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "nvidia-kernel-common_20151021-p-13_arm64", - "name": "nvidia-kernel-common", - "sha256": "5a1f10cffc5407a6b63dcdf3f72af842ad9e39a808bb9418a4805aa0be345c65", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/contrib/n/nvidia-support/nvidia-kernel-common_20151021+13_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/contrib/n/nvidia-support/nvidia-kernel-common_20151021+13_arm64.deb" - ], - "version": "20151021+13" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "debianutils_4.11.2_arm64", - "name": "debianutils", - "version": "4.11.2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "base-files_11.1-p-deb11u9_arm64", - "name": "base-files", - "version": "11.1+deb11u9" - }, - { - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libtinfo6", - "version": "6.2+20201114-2+deb11u2" - } - ], - "key": "bash_5.1-2-p-deb11u1_arm64", - "name": "bash", - "sha256": "d7c7af5d86f43a885069408a89788f67f248e8124c682bb73936f33874e0611b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/bash/bash_5.1-2+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/bash/bash_5.1-2+deb11u1_arm64.deb" - ], - "version": "5.1-2+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "debianutils_4.11.2_arm64", - "name": "debianutils", - "sha256": "6543b2b1a61b4b7b4b55b4bd25162309d7d23d14d3303649aee84ad314c30e02", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/debianutils/debianutils_4.11.2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/d/debianutils/debianutils_4.11.2_arm64.deb" - ], - "version": "4.11.2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "base-files_11.1-p-deb11u9_arm64", - "name": "base-files", - "sha256": "c40dc4d5c6b82f5cfe75efa1a12bd09b9d5b9b8446ea045a991896a1ead8b02c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_arm64.deb" - ], - "version": "11.1+deb11u9" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "nginx-core_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-core", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libpcre3_2-8.39-13_arm64", - "name": "libpcre3", - "version": "2:8.39-13" - }, - { - "key": "iproute2_5.10.0-4_arm64", - "name": "iproute2", - "version": "5.10.0-4" - }, - { - "key": "libcap2-bin_1-2.44-1_arm64", - "name": "libcap2-bin", - "version": "1:2.44-1" - }, - { - "key": "libcap2_1-2.44-1_arm64", - "name": "libcap2", - "version": "1:2.44-1" - }, - { - "key": "libxtables12_1.8.7-1_arm64", - "name": "libxtables12", - "version": "1.8.7-1" - }, - { - "key": "libmnl0_1.0.4-3_arm64", - "name": "libmnl0", - "version": "1.0.4-3" - }, - { - "key": "libelf1_0.183-1_arm64", - "name": "libelf1", - "version": "0.183-1" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libbsd0_0.11.3-1-p-deb11u1_arm64", - "name": "libbsd0", - "version": "0.11.3-1+deb11u1" - }, - { - "key": "libmd0_1.0.3-3_arm64", - "name": "libmd0", - "version": "1.0.3-3" - }, - { - "key": "libbpf0_1-0.3-2_arm64", - "name": "libbpf0", - "version": "1:0.3-2" - }, - { - "key": "nginx-common_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-common", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "lsb-base_11.1.0_arm64", - "name": "lsb-base", - "version": "11.1.0" - }, - { - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgeoip1_1.6.12-7_arm64", - "name": "libgeoip1", - "version": "1.6.12-7" - }, - { - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-mail", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-xslt-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libxslt1.1_1.1.34-4-p-deb11u1_arm64", - "name": "libxslt1.1", - "version": "1.1.34-4+deb11u1" - }, - { - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_arm64", - "name": "libxml2", - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "key": "libicu67_67.1-7_arm64", - "name": "libicu67", - "version": "67.1-7" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_arm64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libgcrypt20_1.8.7-6_arm64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_arm64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-image-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgd3_2.3.0-2_arm64", - "name": "libgd3", - "version": "2.3.0-2" - }, - { - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_arm64", - "name": "libxpm4", - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "key": "libx11-6_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-6", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libx11-data_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-data", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libxcb1_1.14-3_arm64", - "name": "libxcb1", - "version": "1.14-3" - }, - { - "key": "libxdmcp6_1-1.1.2-3_arm64", - "name": "libxdmcp6", - "version": "1:1.1.2-3" - }, - { - "key": "libxau6_1-1.0.9-1_arm64", - "name": "libxau6", - "version": "1:1.0.9-1" - }, - { - "key": "libwebp6_0.6.1-2.1-p-deb11u2_arm64", - "name": "libwebp6", - "version": "0.6.1-2.1+deb11u2" - }, - { - "key": "libtiff5_4.2.0-1-p-deb11u5_arm64", - "name": "libtiff5", - "version": "4.2.0-1+deb11u5" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_arm64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libjpeg62-turbo_1-2.0.6-4_arm64", - "name": "libjpeg62-turbo", - "version": "1:2.0.6-4" - }, - { - "key": "libjbig0_2.1-3.1-p-b2_arm64", - "name": "libjbig0", - "version": "2.1-3.1+b2" - }, - { - "key": "libdeflate0_1.7-1_arm64", - "name": "libdeflate0", - "version": "1.7-1" - }, - { - "key": "libpng16-16_1.6.37-3_arm64", - "name": "libpng16-16", - "version": "1.6.37-3" - }, - { - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_arm64", - "name": "libfreetype6", - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "key": "libbrotli1_1.0.9-2-p-b2_arm64", - "name": "libbrotli1", - "version": "1.0.9-2+b2" - }, - { - "key": "libfontconfig1_2.13.1-4.2_arm64", - "name": "libfontconfig1", - "version": "2.13.1-4.2" - }, - { - "key": "fontconfig-config_2.13.1-4.2_arm64", - "name": "fontconfig-config", - "version": "2.13.1-4.2" - }, - { - "key": "fonts-texgyre_20180621-3.1_arm64", - "name": "fonts-texgyre", - "version": "20180621-3.1" - }, - { - "key": "ucf_3.0043_arm64", - "name": "ucf", - "version": "3.0043" - }, - { - "key": "sensible-utils_0.0.14_arm64", - "name": "sensible-utils", - "version": "0.0.14" - }, - { - "key": "coreutils_8.32-4_arm64", - "name": "coreutils", - "version": "8.32-4" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_arm64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libuuid1_2.36.1-8-p-deb11u1_arm64", - "name": "libuuid1", - "version": "2.36.1-8+deb11u1" - }, - { - "key": "libexpat1_2.2.10-2-p-deb11u5_arm64", - "name": "libexpat1", - "version": "2.2.10-2+deb11u5" - }, - { - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream-geoip2_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream-geoip2", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libmaxminddb0_1.5.2-1_arm64", - "name": "libmaxminddb0", - "version": "1.5.2-1" - }, - { - "key": "libnginx-mod-http-upstream-fair_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-upstream-fair", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-subs-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-subs-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-geoip2_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-geoip2", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-echo_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-echo", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-dav-ext_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-dav-ext", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-auth-pam_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-auth-pam", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libpam0g_1.4.0-9-p-deb11u1_arm64", - "name": "libpam0g", - "version": "1.4.0-9+deb11u1" - }, - { - "key": "libaudit1_1-3.0-2_arm64", - "name": "libaudit1", - "version": "1:3.0-2" - }, - { - "key": "libcap-ng0_0.7.9-2.2-p-b1_arm64", - "name": "libcap-ng0", - "version": "0.7.9-2.2+b1" - }, - { - "key": "libaudit-common_1-3.0-2_arm64", - "name": "libaudit-common", - "version": "1:3.0-2" - } - ], - "key": "nginx-full_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-full", - "sha256": "4049950f648478009faeaf028ab7287240ebd28c27799a5b128a1623290b3e44", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-full_1.18.0-6.1+deb11u3_all.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libpcre3_2-8.39-13_arm64", - "name": "libpcre3", - "version": "2:8.39-13" - }, - { - "key": "iproute2_5.10.0-4_arm64", - "name": "iproute2", - "version": "5.10.0-4" - }, - { - "key": "libcap2-bin_1-2.44-1_arm64", - "name": "libcap2-bin", - "version": "1:2.44-1" - }, - { - "key": "libcap2_1-2.44-1_arm64", - "name": "libcap2", - "version": "1:2.44-1" - }, - { - "key": "libxtables12_1.8.7-1_arm64", - "name": "libxtables12", - "version": "1.8.7-1" - }, - { - "key": "libmnl0_1.0.4-3_arm64", - "name": "libmnl0", - "version": "1.0.4-3" - }, - { - "key": "libelf1_0.183-1_arm64", - "name": "libelf1", - "version": "0.183-1" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "libbsd0_0.11.3-1-p-deb11u1_arm64", - "name": "libbsd0", - "version": "0.11.3-1+deb11u1" - }, - { - "key": "libmd0_1.0.3-3_arm64", - "name": "libmd0", - "version": "1.0.3-3" - }, - { - "key": "libbpf0_1-0.3-2_arm64", - "name": "libbpf0", - "version": "1:0.3-2" - }, - { - "key": "nginx-common_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-common", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "lsb-base_11.1.0_arm64", - "name": "lsb-base", - "version": "11.1.0" - }, - { - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream-geoip", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgeoip1_1.6.12-7_arm64", - "name": "libgeoip1", - "version": "1.6.12-7" - }, - { - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-mail", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-xslt-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libxslt1.1_1.1.34-4-p-deb11u1_arm64", - "name": "libxslt1.1", - "version": "1.1.34-4+deb11u1" - }, - { - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_arm64", - "name": "libxml2", - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "key": "libicu67_67.1-7_arm64", - "name": "libicu67", - "version": "67.1-7" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_arm64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libgcrypt20_1.8.7-6_arm64", - "name": "libgcrypt20", - "version": "1.8.7-6" - }, - { - "key": "libgpg-error0_1.38-2_arm64", - "name": "libgpg-error0", - "version": "1.38-2" - }, - { - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-image-filter", - "version": "1.18.0-6.1+deb11u3" - }, - { - "key": "libgd3_2.3.0-2_arm64", - "name": "libgd3", - "version": "2.3.0-2" - }, - { - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_arm64", - "name": "libxpm4", - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "key": "libx11-6_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-6", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libx11-data_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-data", - "version": "2:1.7.2-1+deb11u2" - }, - { - "key": "libxcb1_1.14-3_arm64", - "name": "libxcb1", - "version": "1.14-3" - }, - { - "key": "libxdmcp6_1-1.1.2-3_arm64", - "name": "libxdmcp6", - "version": "1:1.1.2-3" - }, - { - "key": "libxau6_1-1.0.9-1_arm64", - "name": "libxau6", - "version": "1:1.0.9-1" - }, - { - "key": "libwebp6_0.6.1-2.1-p-deb11u2_arm64", - "name": "libwebp6", - "version": "0.6.1-2.1+deb11u2" - }, - { - "key": "libtiff5_4.2.0-1-p-deb11u5_arm64", - "name": "libtiff5", - "version": "4.2.0-1+deb11u5" - }, - { - "key": "libzstd1_1.4.8-p-dfsg-2.1_arm64", - "name": "libzstd1", - "version": "1.4.8+dfsg-2.1" - }, - { - "key": "libjpeg62-turbo_1-2.0.6-4_arm64", - "name": "libjpeg62-turbo", - "version": "1:2.0.6-4" - }, - { - "key": "libjbig0_2.1-3.1-p-b2_arm64", - "name": "libjbig0", - "version": "2.1-3.1+b2" - }, - { - "key": "libdeflate0_1.7-1_arm64", - "name": "libdeflate0", - "version": "1.7-1" - }, - { - "key": "libpng16-16_1.6.37-3_arm64", - "name": "libpng16-16", - "version": "1.6.37-3" - }, - { - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_arm64", - "name": "libfreetype6", - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "key": "libbrotli1_1.0.9-2-p-b2_arm64", - "name": "libbrotli1", - "version": "1.0.9-2+b2" - }, - { - "key": "libfontconfig1_2.13.1-4.2_arm64", - "name": "libfontconfig1", - "version": "2.13.1-4.2" - }, - { - "key": "fontconfig-config_2.13.1-4.2_arm64", - "name": "fontconfig-config", - "version": "2.13.1-4.2" - }, - { - "key": "fonts-texgyre_20180621-3.1_arm64", - "name": "fonts-texgyre", - "version": "20180621-3.1" - }, - { - "key": "ucf_3.0043_arm64", - "name": "ucf", - "version": "3.0043" - }, - { - "key": "sensible-utils_0.0.14_arm64", - "name": "sensible-utils", - "version": "0.0.14" - }, - { - "key": "coreutils_8.32-4_arm64", - "name": "coreutils", - "version": "8.32-4" - }, - { - "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", - "name": "libgmp10", - "version": "2:6.2.1+dfsg-1+deb11u1" - }, - { - "key": "libattr1_1-2.4.48-6_arm64", - "name": "libattr1", - "version": "1:2.4.48-6" - }, - { - "key": "libuuid1_2.36.1-8-p-deb11u1_arm64", - "name": "libuuid1", - "version": "2.36.1-8+deb11u1" - }, - { - "key": "libexpat1_2.2.10-2-p-deb11u5_arm64", - "name": "libexpat1", - "version": "2.2.10-2+deb11u5" - }, - { - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-geoip", - "version": "1.18.0-6.1+deb11u3" - } - ], - "key": "nginx-core_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-core", - "sha256": "932d9d78df093f037caf9a32af5f3a9f42f113ccc87ca59946f983753a9b83b8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-core_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpcre3_2-8.39-13_arm64", - "name": "libpcre3", - "sha256": "21cac4064a41dbc354295c437f37bf623f9004513a97a6fa030248566aa986e9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre3/libpcre3_8.39-13_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre3/libpcre3_8.39-13_arm64.deb" - ], - "version": "2:8.39-13" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "iproute2_5.10.0-4_arm64", - "name": "iproute2", - "sha256": "92d6c7ca67fca91257a3734d94417a3300c4240d8f6934c6b742c001814b4e31", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/iproute2/iproute2_5.10.0-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/iproute2/iproute2_5.10.0-4_arm64.deb" - ], - "version": "5.10.0-4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libcap2-bin_1-2.44-1_arm64", - "name": "libcap2-bin", - "sha256": "37915f4cc73cfaef7862043f2bdad062d1b1639df04c511665f1f9321c84d0db", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2-bin_2.44-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2-bin_2.44-1_arm64.deb" - ], - "version": "1:2.44-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libcap2_1-2.44-1_arm64", - "name": "libcap2", - "sha256": "7c5729a1cfd14876685217c5f0545301e7ff1b839262fb487d6a778e8cd8c05a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2_2.44-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libc/libcap2/libcap2_2.44-1_arm64.deb" - ], - "version": "1:2.44-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxtables12_1.8.7-1_arm64", - "name": "libxtables12", - "sha256": "fa07088a313d8dae7a8cba0780117e80ead683ac549fd9986a52a3280232272a", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/iptables/libxtables12_1.8.7-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/iptables/libxtables12_1.8.7-1_arm64.deb" - ], - "version": "1.8.7-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libmnl0_1.0.4-3_arm64", - "name": "libmnl0", - "sha256": "d63aafb6f2c07db8fcb135b00ff915baf72ef8a3397e773c9c24d67950c6a46c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmnl/libmnl0_1.0.4-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmnl/libmnl0_1.0.4-3_arm64.deb" - ], - "version": "1.0.4-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libelf1_0.183-1_arm64", - "name": "libelf1", - "sha256": "12e14110cd66b3bf0564e3b184985b3e91c9cd76e909531a7f7bd2cb9b35a1f3", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/e/elfutils/libelf1_0.183-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/e/elfutils/libelf1_0.183-1_arm64.deb" - ], - "version": "0.183-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libbsd0_0.11.3-1-p-deb11u1_arm64", - "name": "libbsd0", - "sha256": "614d36d41b670955a75526865bd321703f2accb6e0c07ee4c283fbba12e494df", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbsd/libbsd0_0.11.3-1+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbsd/libbsd0_0.11.3-1+deb11u1_arm64.deb" - ], - "version": "0.11.3-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libmd0_1.0.3-3_arm64", - "name": "libmd0", - "sha256": "3c490cdcce9d25e702e6587b6166cd8e7303fce8343642d9d5d99695282a9e5c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmd/libmd0_1.0.3-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmd/libmd0_1.0.3-3_arm64.deb" - ], - "version": "1.0.3-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libbpf0_1-0.3-2_arm64", - "name": "libbpf0", - "sha256": "1ef325a3bd9e43970cd8e7f9f44b13e36bc935ac496e56d96f715aa69ae7281b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbpf/libbpf0_0.3-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libb/libbpf/libbpf0_0.3-2_arm64.deb" - ], - "version": "1:0.3-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "nginx-common_1.18.0-6.1-p-deb11u3_arm64", - "name": "nginx-common", - "sha256": "bfd22beb7bd248db58eee6e6434a7c500f6e98e264219b3832f248696cd58f67", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/nginx-common_1.18.0-6.1+deb11u3_all.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "lsb-base_11.1.0_arm64", - "name": "lsb-base", - "sha256": "89ed6332074d827a65305f9a51e591dff20641d61ff5e11f4e1822a9987e96fe", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/l/lsb/lsb-base_11.1.0_all.deb" - ], - "version": "11.1.0" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-stream-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream-geoip", - "sha256": "140963ecb81a3ea933e96fd7c89d01c4ffdb12509e3869d769d7b21ca5d690bf", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream-geoip_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-stream_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream", - "sha256": "88d083135df9c2c1e2401f174b4e48dde2d92cca7fc8ef661f9d26f00b395a75", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgeoip1_1.6.12-7_arm64", - "name": "libgeoip1", - "sha256": "17225fb2ed7ce9a090c39d90acc2696e5582805a2a1f391e0a8278bb6a2d0178", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/geoip/libgeoip1_1.6.12-7_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/g/geoip/libgeoip1_1.6.12-7_arm64.deb" - ], - "version": "1.6.12-7" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-mail_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-mail", - "sha256": "f8fa0d620dcdea21669b5fd9f503528d53b94117a9c31ac36dc318db0fbac315", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-mail_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-xslt-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-xslt-filter", - "sha256": "5d9bb33231c8589a07063a73bb6b3061bc92fae79e5731e96b5b398f1fafee29", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-xslt-filter_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxslt1.1_1.1.34-4-p-deb11u1_arm64", - "name": "libxslt1.1", - "sha256": "2505ed3d8e6b049349ecfeff1cb6923eca43403d252e8ddd308a6a644b97eec7", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxslt/libxslt1.1_1.1.34-4+deb11u1_arm64.deb" - ], - "version": "1.1.34-4+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxml2_2.9.10-p-dfsg-6.7-p-deb11u4_arm64", - "name": "libxml2", - "sha256": "ccd9f449fa88827258bd51eeb8d5f6f33719df290f157c2b0be3c527a6ee45aa", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxml2/libxml2_2.9.10+dfsg-6.7+deb11u4_arm64.deb" - ], - "version": "2.9.10+dfsg-6.7+deb11u4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libicu67_67.1-7_arm64", - "name": "libicu67", - "sha256": "776303db230b275d8a17dfe8f0012bf61093dfc910f0d51f175be36707686efe", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/i/icu/libicu67_67.1-7_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/i/icu/libicu67_67.1-7_arm64.deb" - ], - "version": "67.1-7" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-image-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-image-filter", - "sha256": "d972b39dcca41c42f7c797fcc4472d81b64e99978845b2309e18e6d5937e384e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-image-filter_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libgd3_2.3.0-2_arm64", - "name": "libgd3", - "sha256": "1e6d6af0c90fe62193b3e51e45f69d075b86d7bde3fb4fd30b60da763aeca43f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgd2/libgd3_2.3.0-2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgd2/libgd3_2.3.0-2_arm64.deb" - ], - "version": "2.3.0-2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxpm4_1-3.5.12-1.1-p-deb11u1_arm64", - "name": "libxpm4", - "sha256": "83ba23ecaaf3f7b700f1ec2c1e349b5a63f3c8cdceb43cc78eb353e16051427d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libxpm/libxpm4_3.5.12-1.1+deb11u1_arm64.deb" - ], - "version": "1:3.5.12-1.1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libx11-6_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-6", - "sha256": "1ddb1a4d3dbdaeac8fd8d0009a27e6453b15d97362fdd1d3efb1d5f577364f30", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libx11/libx11-6_1.7.2-1+deb11u2_arm64.deb" - ], - "version": "2:1.7.2-1+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libx11-data_2-1.7.2-1-p-deb11u2_arm64", - "name": "libx11-data", - "sha256": "9db24e1e7ed3cd738b503e7df5c1b9b52b1eadcb55019cd63b1409e578565d29", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libx/libx11/libx11-data_1.7.2-1+deb11u2_all.deb" - ], - "version": "2:1.7.2-1+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxcb1_1.14-3_arm64", - "name": "libxcb1", - "sha256": "48f82b65c93adb7af7757961fdd2730928316459f008d767b7104a56bc20a8f1", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcb/libxcb1_1.14-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxcb/libxcb1_1.14-3_arm64.deb" - ], - "version": "1.14-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxdmcp6_1-1.1.2-3_arm64", - "name": "libxdmcp6", - "sha256": "e92569ac33247261aa09adfadc34ced3994ac301cf8b58de415a2d5dbf15ccfc", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxdmcp/libxdmcp6_1.1.2-3_arm64.deb" - ], - "version": "1:1.1.2-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libxau6_1-1.0.9-1_arm64", - "name": "libxau6", - "sha256": "36c2bf400641a80521093771dc2562c903df4065f9eb03add50d90564337ea6c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libx/libxau/libxau6_1.0.9-1_arm64.deb" - ], - "version": "1:1.0.9-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libwebp6_0.6.1-2.1-p-deb11u2_arm64", - "name": "libwebp6", - "sha256": "edeb260e528fecae77457a63a468e55837a98079fdd7f1e20e9813c358f8c755", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/libw/libwebp/libwebp6_0.6.1-2.1+deb11u2_arm64.deb" - ], - "version": "0.6.1-2.1+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libtiff5_4.2.0-1-p-deb11u5_arm64", - "name": "libtiff5", - "sha256": "6896296ef6193ff77434c5d1d09dd9a333633f7a208ab1cc7de3b286d2d45824", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/t/tiff/libtiff5_4.2.0-1+deb11u5_arm64.deb" - ], - "version": "4.2.0-1+deb11u5" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libjpeg62-turbo_1-2.0.6-4_arm64", - "name": "libjpeg62-turbo", - "sha256": "8903394de23dc6ead5abfc80972c8fd44300c9903ad4589d0df926e71977d881", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libj/libjpeg-turbo/libjpeg62-turbo_2.0.6-4_arm64.deb" - ], - "version": "1:2.0.6-4" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libjbig0_2.1-3.1-p-b2_arm64", - "name": "libjbig0", - "sha256": "b71b3e62e162f64cb24466bf7c6e40b05ce2a67ca7fed26d267d498f2896d549", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/j/jbigkit/libjbig0_2.1-3.1+b2_arm64.deb" - ], - "version": "2.1-3.1+b2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libdeflate0_1.7-1_arm64", - "name": "libdeflate0", - "sha256": "a1adc22600ea5e44e8ea715972ac2af7994cc7ff4d94bba8e8b01abb9ddbdfd0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libd/libdeflate/libdeflate0_1.7-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libd/libdeflate/libdeflate0_1.7-1_arm64.deb" - ], - "version": "1.7-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpng16-16_1.6.37-3_arm64", - "name": "libpng16-16", - "sha256": "f5f61274aa5f71b9e44b077bd7b9fa9cd5ff71d8b8295f47dc1b2d45378aa73e", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libp/libpng1.6/libpng16-16_1.6.37-3_arm64.deb" - ], - "version": "1.6.37-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libfreetype6_2.10.4-p-dfsg-1-p-deb11u1_arm64", - "name": "libfreetype6", - "sha256": "b25f1c148498dd2b49dc30da0a2b2537a7bd0cb34afb8ea681dd145053c9a3f8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/freetype/libfreetype6_2.10.4+dfsg-1+deb11u1_arm64.deb" - ], - "version": "2.10.4+dfsg-1+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libbrotli1_1.0.9-2-p-b2_arm64", - "name": "libbrotli1", - "sha256": "52ca7f90de6cb6576a0a5cf5712fc4ae7344b79c44b8a1548087fd5d92bf1f64", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/b/brotli/libbrotli1_1.0.9-2+b2_arm64.deb" - ], - "version": "1.0.9-2+b2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libfontconfig1_2.13.1-4.2_arm64", - "name": "libfontconfig1", - "sha256": "18b13ef8a46e9d79ba6a6ba2db0c86e42583277b5d47f6942f3223e349c22641", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/libfontconfig1_2.13.1-4.2_arm64.deb" - ], - "version": "2.13.1-4.2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "fontconfig-config_2.13.1-4.2_arm64", - "name": "fontconfig-config", - "sha256": "48afb6ad7d15e6104a343b789f73697301ad8bff77b69927bc998f5a409d8e90", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/f/fontconfig/fontconfig-config_2.13.1-4.2_all.deb" - ], - "version": "2.13.1-4.2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "fonts-texgyre_20180621-3.1_arm64", - "name": "fonts-texgyre", - "sha256": "cb7e9a4b2471cfdd57194c16364f9102f0639816a2662fed4b30d2a158747076", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tex-gyre/fonts-texgyre_20180621-3.1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/tex-gyre/fonts-texgyre_20180621-3.1_all.deb" - ], - "version": "20180621-3.1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "ucf_3.0043_arm64", - "name": "ucf", - "sha256": "ebef6bcd777b5c0cc2699926f2159db08433aed07c50cb321fd828b28c5e8d53", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/u/ucf/ucf_3.0043_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/u/ucf/ucf_3.0043_all.deb" - ], - "version": "3.0043" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "sensible-utils_0.0.14_arm64", - "name": "sensible-utils", - "sha256": "b9a447dc4ec8714196b037e20a2209e62cd669f5450222952f259bda4416b71f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/s/sensible-utils/sensible-utils_0.0.14_all.deb" - ], - "version": "0.0.14" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libuuid1_2.36.1-8-p-deb11u1_arm64", - "name": "libuuid1", - "sha256": "3d677da6a22e9cac519fed5a2ed5b20a4217f51ca420fce57434b5e813c26e03", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/u/util-linux/libuuid1_2.36.1-8+deb11u1_arm64.deb" - ], - "version": "2.36.1-8+deb11u1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libexpat1_2.2.10-2-p-deb11u5_arm64", - "name": "libexpat1", - "sha256": "8d20bfd061845bda0321d01accd6f8386ead5b1d7250a585d12b8d5fb1408ffa", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/e/expat/libexpat1_2.2.10-2+deb11u5_arm64.deb" - ], - "version": "2.2.10-2+deb11u5" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-geoip_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-geoip", - "sha256": "7b1d105339402426108d4d10fa733f24f2340c9b6482d10917c194d13f66072f", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-geoip_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-stream-geoip2_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-stream-geoip2", - "sha256": "da0e67b4cc318b7bb338bec7476c260fecd6cc06ecfad4c7f9acb22a4a74d07b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-stream-geoip2_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libmaxminddb0_1.5.2-1_arm64", - "name": "libmaxminddb0", - "sha256": "05504845f0fab5c54075e462b99b326a224ceaefaccda864f641f1bf6d99914d", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmaxminddb/libmaxminddb0_1.5.2-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/libm/libmaxminddb/libmaxminddb0_1.5.2-1_arm64.deb" - ], - "version": "1.5.2-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-upstream-fair_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-upstream-fair", - "sha256": "7be1dfa763e9158ccdea168b1103f5b6b16b3a0c95c3996076c7f4a20aa35bca", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-upstream-fair_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-subs-filter_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-subs-filter", - "sha256": "22354006f199cc3e8e51aac00ca649dd169ca91c2e565a4734f18f3741b061ef", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-subs-filter_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-geoip2_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-geoip2", - "sha256": "1ae5c1491a8f43ff3a0269270d1f954441cf6fb160b3f83bb2f10ae7b47eb0ce", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-geoip2_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-echo_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-echo", - "sha256": "ef014f5f294e744e465a9075722c1d7cb3423392b2bd029d60e0d952fd90fde7", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-echo_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-dav-ext_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-dav-ext", - "sha256": "8c65130c9d18a28eadfb657bbe818de567ed6625147e868c3bbd739189f8a991", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-dav-ext_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libnginx-mod-http-auth-pam_1.18.0-6.1-p-deb11u3_arm64", - "name": "libnginx-mod-http-auth-pam", - "sha256": "4e6e906608ef1960c2514f371445bf3a32ea72b7098cae38cedac4b5c10abf05", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z/pool/updates/main/n/nginx/libnginx-mod-http-auth-pam_1.18.0-6.1+deb11u3_arm64.deb" - ], - "version": "1.18.0-6.1+deb11u3" - }, - { - "arch": "arm64", - "dependencies": [ - { - "key": "python3_3.9.2-3_arm64", - "name": "python3", - "version": "3.9.2-3" - }, - { - "key": "libpython3-stdlib_3.9.2-3_arm64", - "name": "libpython3-stdlib", - "version": "3.9.2-3" - }, - { - "key": "libpython3.9-stdlib_3.9.2-1_arm64", - "name": "libpython3.9-stdlib", - "version": "3.9.2-1" - }, - { - "key": "libuuid1_2.36.1-8-p-deb11u1_arm64", - "name": "libuuid1", - "version": "2.36.1-8+deb11u1" - }, - { - "key": "libc6_2.31-13-p-deb11u8_arm64", - "name": "libc6", - "version": "2.31-13+deb11u8" - }, - { - "key": "libcrypt1_1-4.4.18-4_arm64", - "name": "libcrypt1", - "version": "1:4.4.18-4" - }, - { - "key": "libgcc-s1_10.2.1-6_arm64", - "name": "libgcc-s1", - "version": "10.2.1-6" - }, - { - "key": "gcc-10-base_10.2.1-6_arm64", - "name": "gcc-10-base", - "version": "10.2.1-6" - }, - { - "key": "libtirpc3_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc3", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libtirpc-common_1.3.1-1-p-deb11u1_arm64", - "name": "libtirpc-common", - "version": "1.3.1-1+deb11u1" - }, - { - "key": "libgssapi-krb5-2_1.18.3-6-p-deb11u4_arm64", - "name": "libgssapi-krb5-2", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5support0_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5support0", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libkrb5-3_1.18.3-6-p-deb11u4_arm64", - "name": "libkrb5-3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libssl1.1_1.1.1w-0-p-deb11u1_arm64", - "name": "libssl1.1", - "version": "1.1.1w-0+deb11u1" - }, - { - "key": "debconf_1.5.77_arm64", - "name": "debconf", - "version": "1.5.77" - }, - { - "key": "perl-base_5.32.1-4-p-deb11u3_arm64", - "name": "perl-base", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "dpkg_1.20.13_arm64", - "name": "dpkg", - "version": "1.20.13" - }, - { - "key": "tar_1.34-p-dfsg-1-p-deb11u1_arm64", - "name": "tar", - "version": "1.34+dfsg-1+deb11u1" - }, - { - "key": "libselinux1_3.1-3_arm64", - "name": "libselinux1", - "version": "3.1-3" - }, - { - "key": "libpcre2-8-0_10.36-2-p-deb11u1_arm64", - "name": "libpcre2-8-0", - "version": "10.36-2+deb11u1" - }, - { - "key": "libacl1_2.2.53-10_arm64", - "name": "libacl1", - "version": "2.2.53-10" - }, - { - "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", - "name": "zlib1g", - "version": "1:1.2.11.dfsg-2+deb11u2" - }, - { - "key": "liblzma5_5.2.5-2.1_deb11u1_arm64", - "name": "liblzma5", - "version": "5.2.5-2.1~deb11u1" - }, - { - "key": "libbz2-1.0_1.0.8-4_arm64", - "name": "libbz2-1.0", - "version": "1.0.8-4" - }, - { - "key": "libkeyutils1_1.6.1-2_arm64", - "name": "libkeyutils1", - "version": "1.6.1-2" - }, - { - "key": "libk5crypto3_1.18.3-6-p-deb11u4_arm64", - "name": "libk5crypto3", - "version": "1.18.3-6+deb11u4" - }, - { - "key": "libcom-err2_1.46.2-2_arm64", - "name": "libcom-err2", - "version": "1.46.2-2" - }, - { - "key": "libtinfo6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libtinfo6", - "version": "6.2+20201114-2+deb11u2" - }, - { - "key": "libsqlite3-0_3.34.1-3_arm64", - "name": "libsqlite3-0", - "version": "3.34.1-3" - }, - { - "key": "libreadline8_8.1-1_arm64", - "name": "libreadline8", - "version": "8.1-1" - }, - { - "key": "readline-common_8.1-1_arm64", - "name": "readline-common", - "version": "8.1-1" - }, - { - "key": "install-info_6.7.0.dfsg.2-6_arm64", - "name": "install-info", - "version": "6.7.0.dfsg.2-6" - }, - { - "key": "libnsl2_1.3.0-2_arm64", - "name": "libnsl2", - "version": "1.3.0-2" - }, - { - "key": "libncursesw6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libncursesw6", - "version": "6.2+20201114-2+deb11u2" - }, - { - "key": "libmpdec3_2.5.1-1_arm64", - "name": "libmpdec3", - "version": "2.5.1-1" - }, - { - "key": "libstdc-p--p-6_10.2.1-6_arm64", - "name": "libstdc++6", - "version": "10.2.1-6" - }, - { - "key": "libffi7_3.3-6_arm64", - "name": "libffi7", - "version": "3.3-6" - }, - { - "key": "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", - "name": "libdb5.3", - "version": "5.3.28+dfsg1-0.8" - }, - { - "key": "tzdata_2024a-0-p-deb11u1_arm64", - "name": "tzdata", - "version": "2024a-0+deb11u1" - }, - { - "key": "mime-support_3.66_arm64", - "name": "mime-support", - "version": "3.66" - }, - { - "key": "media-types_4.0.0_arm64", - "name": "media-types", - "version": "4.0.0" - }, - { - "key": "mailcap_3.69_arm64", - "name": "mailcap", - "version": "3.69" - }, - { - "key": "perl_5.32.1-4-p-deb11u3_arm64", - "name": "perl", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "libperl5.32_5.32.1-4-p-deb11u3_arm64", - "name": "libperl5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "perl-modules-5.32_5.32.1-4-p-deb11u3_arm64", - "name": "perl-modules-5.32", - "version": "5.32.1-4+deb11u3" - }, - { - "key": "libgdbm6_1.19-2_arm64", - "name": "libgdbm6", - "version": "1.19-2" - }, - { - "key": "libgdbm-compat4_1.19-2_arm64", - "name": "libgdbm-compat4", - "version": "1.19-2" - }, - { - "key": "libpython3.9-minimal_3.9.2-1_arm64", - "name": "libpython3.9-minimal", - "version": "3.9.2-1" - }, - { - "key": "python3.9_3.9.2-1_arm64", - "name": "python3.9", - "version": "3.9.2-1" - }, - { - "key": "python3.9-minimal_3.9.2-1_arm64", - "name": "python3.9-minimal", - "version": "3.9.2-1" - }, - { - "key": "libexpat1_2.2.10-2-p-deb11u5_arm64", - "name": "libexpat1", - "version": "2.2.10-2+deb11u5" - }, - { - "key": "python3-minimal_3.9.2-3_arm64", - "name": "python3-minimal", - "version": "3.9.2-3" - } - ], - "key": "google-cloud-cli_507.0.0-0_arm64", - "name": "google-cloud-cli", - "sha256": "631a094bcbbde91ba9e6dd338490feccc3c30d2354d281108a5b34bb3f905903", - "urls": [ - "https://packages.cloud.google.com/apt/pool/cloud-sdk/google-cloud-cli_507.0.0-0_arm64_f4f857cbc23508883b7a94bd63b553be.deb" - ], - "version": "507.0.0-0" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "python3_3.9.2-3_arm64", - "name": "python3", - "sha256": "79197285d25e73a2a07667efe80af152dd932ac5ef3e13717f1ac824d111ea81", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/python3_3.9.2-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/python3_3.9.2-3_arm64.deb" - ], - "version": "3.9.2-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpython3-stdlib_3.9.2-3_arm64", - "name": "libpython3-stdlib", - "sha256": "79ec02b6afc81938fd1418170c103cc90aabbc52e0e1738e2744c5a4ec69fde8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/libpython3-stdlib_3.9.2-3_arm64.deb" - ], - "version": "3.9.2-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpython3.9-stdlib_3.9.2-1_arm64", - "name": "libpython3.9-stdlib", - "sha256": "3b3612dcd7550f01ec3517fbe955838223f4cf115b6983e4ed6d7320cd4b05c4", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/libpython3.9-stdlib_3.9.2-1_arm64.deb" - ], - "version": "3.9.2-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libsqlite3-0_3.34.1-3_arm64", - "name": "libsqlite3-0", - "sha256": "1e33cd39dc4fff2a7edd7bb7e90a71e20fb528f6a581fe0287652e4dae77e0d0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/s/sqlite3/libsqlite3-0_3.34.1-3_arm64.deb" - ], - "version": "3.34.1-3" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libreadline8_8.1-1_arm64", - "name": "libreadline8", - "sha256": "500c3cdc00dcaea2c4ed736e00bfcb6cb43c3415e808566c5dfa266dbfc0c5e5", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/r/readline/libreadline8_8.1-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/r/readline/libreadline8_8.1-1_arm64.deb" - ], - "version": "8.1-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "readline-common_8.1-1_arm64", - "name": "readline-common", - "sha256": "3f947176ef949f93e4ad5d76c067d33fa97cf90b62ee0748acb4f5f64790edc8", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/r/readline/readline-common_8.1-1_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/r/readline/readline-common_8.1-1_all.deb" - ], - "version": "8.1-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "install-info_6.7.0.dfsg.2-6_arm64", - "name": "install-info", - "sha256": "f12d0f3d104419e4796d44f720a77d6e4b522d2ae800a24a784e5485a7fcc5c5", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/texinfo/install-info_6.7.0.dfsg.2-6_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/t/texinfo/install-info_6.7.0.dfsg.2-6_arm64.deb" - ], - "version": "6.7.0.dfsg.2-6" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libncursesw6_6.2-p-20201114-2-p-deb11u2_arm64", - "name": "libncursesw6", - "sha256": "26bd6f488b885d02dfe933038d1e15414f5fe98704b3f49d2cecf665ebcb0f5b", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u2_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncursesw6_6.2+20201114-2+deb11u2_arm64.deb" - ], - "version": "6.2+20201114-2+deb11u2" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libmpdec3_2.5.1-1_arm64", - "name": "libmpdec3", - "sha256": "171e2581970f36a39f65d1ca3c761e76b103844daae7903fcc07f7c3822a05bb", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/m/mpdecimal/libmpdec3_2.5.1-1_arm64.deb" - ], - "version": "2.5.1-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "mime-support_3.66_arm64", - "name": "mime-support", - "sha256": "b964e671e6c47674879a3e54130b6737e8760fbd3da6afcc015faa174af98ba0", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/m/mime-support/mime-support_3.66_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/m/mime-support/mime-support_3.66_all.deb" - ], - "version": "3.66" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "media-types_4.0.0_arm64", - "name": "media-types", - "sha256": "f9835dcf3cdbaf163104d4e511c9c4e0f41a56822e147e57f28f749fcbf7d44c", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/m/media-types/media-types_4.0.0_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/m/media-types/media-types_4.0.0_all.deb" - ], - "version": "4.0.0" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "mailcap_3.69_arm64", - "name": "mailcap", - "sha256": "63fa5520f05d2aea5ca23eee95981a5e029608e1186ded4143470c8f84184158", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/m/mailcap/mailcap_3.69_all.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/m/mailcap/mailcap_3.69_all.deb" - ], - "version": "3.69" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "libpython3.9-minimal_3.9.2-1_arm64", - "name": "libpython3.9-minimal", - "sha256": "b49736ab0e8b8577f97a474ca67e20c1c025f9d7394ec8d7820de6314c903cf9", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/libpython3.9-minimal_3.9.2-1_arm64.deb" - ], - "version": "3.9.2-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "python3.9_3.9.2-1_arm64", - "name": "python3.9", - "sha256": "88cbc8eee37ef1f240fdd458f984bd3770cdd8cb1703e8e1666e026f6ca61327", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/python3.9_3.9.2-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/python3.9_3.9.2-1_arm64.deb" - ], - "version": "3.9.2-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "python3.9-minimal_3.9.2-1_arm64", - "name": "python3.9-minimal", - "sha256": "bc0d0ed39ebc066020c3a16afdab4fd3e0260b41ae799273531d5b2403ae7b27", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3.9/python3.9-minimal_3.9.2-1_arm64.deb" - ], - "version": "3.9.2-1" - }, - { - "arch": "arm64", - "dependencies": [], - "key": "python3-minimal_3.9.2-3_arm64", - "name": "python3-minimal", - "sha256": "7c0e0e24c995d3419e3c80fa47407b8fef0b631c70dbadee75d1783e509c4783", - "urls": [ - "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/python3-minimal_3.9.2-3_arm64.deb", - "https://snapshot.debian.org/archive/debian/20240210T223313Z/pool/main/p/python3-defaults/python3-minimal_3.9.2-3_arm64.deb" - ], - "version": "3.9.2-3" - } - ], - "version": 1 -} \ No newline at end of file diff --git a/e2e/smoke/bullseye.yaml b/e2e/smoke/bullseye.yaml deleted file mode 100644 index 60384bf9..00000000 --- a/e2e/smoke/bullseye.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# Packages for examples/debian_snapshot. -# -# Anytime this file is changed, the lockfile needs to be regenerated. -# -# To generate the bullseye.lock.json run the following command -# -# bazel run @bullseye//:lock -# -# See debian_package_index at WORKSPACE.bazel -version: 1 - -sources: - - channel: bullseye main contrib - urls: - - https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - https://snapshot.debian.org/archive/debian/20240210T223313Z - - channel: bullseye-security main - url: https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z - - channel: bullseye-updates main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/ - - channel: cloud-sdk main - url: https://packages.cloud.google.com/apt - -archs: - - "amd64" - - "arm64" - -packages: - - "ncurses-base" - - "libncurses6" - - "tzdata" - - "coreutils" - - "dpkg" - - "apt" - - "perl" - - "ca-certificates" - - "nvidia-kernel-common" - - "bash" - - "nginx-full" - - "nginx-core" - - "google-cloud-cli" diff --git a/examples/.bazelignore b/examples/.bazelignore new file mode 100644 index 00000000..9633d322 --- /dev/null +++ b/examples/.bazelignore @@ -0,0 +1,2 @@ +# cc_lib is a standalone example with external dependencies +cc_lib/ diff --git a/examples/.bazelversion b/examples/.bazelversion new file mode 100644 index 00000000..66ce77b7 --- /dev/null +++ b/examples/.bazelversion @@ -0,0 +1 @@ +7.0.0 diff --git a/examples/MODULE.bazel b/examples/MODULE.bazel new file mode 100644 index 00000000..52314db3 --- /dev/null +++ b/examples/MODULE.bazel @@ -0,0 +1,134 @@ +"Examples module for rules_distroless" + +module( + name = "rules_distroless_examples", + version = "0.0.0", +) + +bazel_dep(name = "rules_distroless", version = "0.0.0") +local_path_override( + module_name = "rules_distroless", + path = "..", +) + +bazel_dep(name = "aspect_bazel_lib", version = "2.14.0") +bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "rules_oci", version = "2.0.0") +bazel_dep(name = "rules_java", version = "8.8.0") +bazel_dep(name = "container_structure_test", version = "1.16.0") +bazel_dep(name = "platforms", version = "0.0.10") + +# Toolchains from aspect_bazel_lib +bazel_lib_toolchains = use_extension("@aspect_bazel_lib//lib:extensions.bzl", "toolchains") +use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") +use_repo(bazel_lib_toolchains, "zstd_toolchains") + +# Test fixture packages +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "example-bullseye-ca-certificates", + build_file_content = 'exports_files(["data.tar.xz", "control.tar.xz"])', + sha256 = "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", + urls = ["https://snapshot.debian.org/archive/debian/20231106T210201Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb"], +) + +http_archive( + name = "example-bullseye-libc-bin", + build_file_content = 'exports_files(["data.tar.xz"])', + sha256 = "8b048ab5c7e9f5b7444655541230e689631fd9855c384e8c4a802586d9bbc65a", + urls = ["https://snapshot.debian.org/archive/debian-security/20231106T230332Z/pool/updates/main/g/glibc/libc-bin_2.31-13+deb11u7_amd64.deb"], +) + +http_archive( + name = "example-bookworm-libc-bin", + build_file_content = 'exports_files(["data.tar.xz"])', + sha256 = "38c44247c5b3e864d6db2877edd9c9a0555fc4e23ae271b73d7f527802616df5", + urls = ["https://snapshot.debian.org/archive/debian-security/20231106T230332Z/pool/updates/main/g/glibc/libc-bin_2.36-9+deb12u3_armhf.deb"], +) + +# APT extension for Debian/Ubuntu packages +apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") + +# Debian Bullseye sources (for debian_snapshot example) +# Using September 2024 snapshot +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = ["main"], + suites = [ + "bullseye", + "bullseye-updates", + ], + types = ["deb"], + uris = ["https://snapshot.debian.org/archive/debian/20240901T024950Z"], +) +apt.sources_list( + architectures = [ + "amd64", + "arm64", + ], + components = ["main"], + suites = ["bullseye-security"], + types = ["deb"], + uris = ["https://snapshot.debian.org/archive/debian-security/20240901T024950Z"], +) + +# Ubuntu Noble sources (for ubuntu_snapshot example) +# NOTE: Commented out because snapshot URLs are returning 404 +# apt.sources_list( +# architectures = [ +# "amd64", +# "arm64", +# ], +# components = ["main"], +# suites = [ +# "noble", +# "noble-security", +# "noble-updates", +# ], +# types = ["deb"], +# uris = ["https://snapshot.ubuntu.com/ubuntu/20240301T030400Z"], +# ) + +# Install packages for Debian Bullseye example +apt.install( + dependency_set = "bullseye", + packages = [ + "bash", + "ca-certificates", + "coreutils", + "dpkg", + "libncurses6", + "ncurses-base", + "tzdata", + ], + suites = [ + "bullseye", + "bullseye-updates", + "bullseye-security", + ], +) + +# Install packages for Ubuntu Noble example +# NOTE: Commented out because snapshot URLs are returning 404 +# apt.install( +# dependency_set = "noble", +# packages = [ +# "bash", +# "coreutils", +# "dpkg", +# "libncurses6", +# "ncurses-base", +# "tzdata", +# ], +# suites = [ +# "noble", +# "noble-security", +# "noble-updates", +# ], +# ) + +use_repo(apt, "bullseye") diff --git a/examples/WORKSPACE b/examples/WORKSPACE new file mode 100644 index 00000000..f9c14bd4 --- /dev/null +++ b/examples/WORKSPACE @@ -0,0 +1 @@ +# This file is intentionally empty - using bzlmod (MODULE.bazel) for dependencies. diff --git a/examples/cacerts/BUILD.bazel b/examples/cacerts/BUILD.bazel index 2eeadea2..175ff793 100644 --- a/examples/cacerts/BUILD.bazel +++ b/examples/cacerts/BUILD.bazel @@ -1,5 +1,5 @@ -load("//distroless:defs.bzl", "cacerts") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@rules_distroless//distroless:defs.bzl", "cacerts") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") cacerts( name = "cacerts", diff --git a/examples/cc_lib/MODULE.bazel b/examples/cc_lib/MODULE.bazel new file mode 100644 index 00000000..d1f2ca3e --- /dev/null +++ b/examples/cc_lib/MODULE.bazel @@ -0,0 +1,42 @@ +bazel_dep(name = "rules_cc", version = "0.2.8") +bazel_dep(name = "rules_distroless", version = "0.0.0") +local_path_override( + module_name = "rules_distroless", + path = "../..", +) + +bazel_dep(name = "sonic-build-infra", version = "0.0.0") +local_path_override( + module_name = "sonic-build-infra", + path = "../../../sonic-build-infra" +) + +register_toolchains("@sonic-build-infra//toolchains/gcc:host_gcc_toolchain") + +apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt") +apt.sources_list( + architectures = ["amd64"], + components = ["main"], + suites = [ + "bookworm", + "bookworm-updates", + ], + uris = ["https://snapshot.debian.org/archive/debian/20251001T023456Z"], +) +apt.sources_list( + architectures = ["amd64"], + components = ["main"], + suites = ["bookworm-security"], + uris = ["https://snapshot.debian.org/archive/debian-security/20251001T023456Z"], +) +apt.install( + dependency_set = "bookworm", + packages = [ + "libnl-3-dev", + "libnl-genl-3-dev", + "libnl-nf-3-dev", + "nlohmann-json3-dev", + ], + target_release = "bookworm", +) +use_repo(apt, "bookworm") diff --git a/examples/cc_lib/subfolder/BUILD.bazel b/examples/cc_lib/subfolder/BUILD.bazel new file mode 100644 index 00000000..9d6f9ba1 --- /dev/null +++ b/examples/cc_lib/subfolder/BUILD.bazel @@ -0,0 +1,13 @@ +load("@rules_cc//cc:cc_test.bzl", "cc_test") + +cc_test( + name = "test", + srcs = ["test.c"], + copts = ["-Wno-int-conversion"], + deps = [ + "@bookworm//libnl-3-dev:libnl-3", + "@bookworm//libnl-nf-3-dev:libnl-nf-3", + "@bookworm//libnl-genl-3-dev:libnl-genl-3", + # "@bookworm//nlohmann-json3-dev:nlohmann-json3" + ], +) diff --git a/examples/cc_lib/subfolder/test.c b/examples/cc_lib/subfolder/test.c new file mode 100644 index 00000000..cf709a6d --- /dev/null +++ b/examples/cc_lib/subfolder/test.c @@ -0,0 +1,67 @@ +#include +#include +#include +// #include // libnl-3 +// #include // libnl-genl-3 +// #include // libnl-genl-3 +// #include // libnl-nf-3 +// #include + +int main(void) +{ + char *buffer; + size_t size = 1024; // Initial buffer size + + // Allocate memory for the buffer + buffer = (char *)malloc(size); + if (buffer == NULL) { + perror("Failed to allocate memory"); + return 1; + } + if (getcwd(buffer, size) != NULL) { + printf("Current working directory: %s\n", buffer); + } else { + perror("Failed to get current working directory"); + } + return 1; +// struct nl_sock *sk_core = NULL; // from libnl-3 +// struct nl_sock *sk_nf = NULL; // from libnl-nf-3 +// int family_id; + +// /* === libnl-3: basic Netlink socket === */ +// sk_core = nl_socket_alloc(); +// if (!sk_core) { +// perror("nl_socket_alloc"); +// return EXIT_FAILURE; +// } + +// if (nl_connect(sk_core, NETLINK_GENERIC) < 0) { +// fprintf(stderr, "Failed to connect to Generic Netlink\n"); +// goto cleanup; +// } + +// /* === libnl-genl-3: resolve a generic netlink family === */ +// family_id = genl_ctrl_resolve(sk_core, "nl80211"); +// if (family_id < 0) { +// printf("nl80211 family not found (normal on systems without WiFi): %s\n", +// nl_geterror(family_id)); +// } else { +// printf("Found nl80211 family ID = %d\n", family_id); +// } + +// /* === libnl-nf-3: create a netfilter socket (forces linking against libnl-nf-3) === */ +// sk_nf = nfnl_connect(sk_core); // This symbol is ONLY in libnl-nf-3 +// if (!sk_nf) { +// fprintf(stderr, "nfnl_connect() failed — this proves libnl-nf-3 is linked correctly\n"); +// } else { +// printf("Successfully created Netfilter netlink socket (libnl-nf-3 is present)\n"); +// // No need to actually use it — just having the pointer forces the linker to resolve it +// } + +// printf("All three libnl libraries (libnl-3, libnl-genl-3, libnl-nf-3) are present and linked!\n"); + +// cleanup: +// if (sk_core) nl_socket_free(sk_core); +// /* sk_nf is just a pointer alias to sk_core in libnl-nf, no need to free twice */ +// return EXIT_SUCCESS; +} diff --git a/examples/debian_snapshot/BUILD.bazel b/examples/debian_snapshot/BUILD.bazel index 8f3c0c5f..d6481149 100644 --- a/examples/debian_snapshot/BUILD.bazel +++ b/examples/debian_snapshot/BUILD.bazel @@ -1,11 +1,8 @@ """ -NOTE: +Debian Bullseye example using the new bzlmod API. - This is the main test used in the e2e testing. - - PLEASE KEEP e2e/smoke/BUILD and examples/debian_snapshot/BUILD - IN-SYNC WITH EACH OTHER, AS WELL AS THE REST OF THE TEST FILES - (test_linux_ files and the bullseye YAML manifest) +This example demonstrates how to create a distroless container image +using packages from Debian Bullseye snapshot. """ load("@bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") @@ -80,9 +77,6 @@ oci_image( "SSL_CERT_FILE": "/etc/ssl/certs/ca-certificates.crt", }, os = "linux", - # NOTE: this is needed because, otherwise, bazel test //... fails, even - # when container_structure_test already has target_compatible_with. - # See 136 target_compatible_with = COMPATIBLE_WITH, tars = [ # This target contains all the installed packages. @@ -125,9 +119,6 @@ oci_load( repo_tags = [ "distroless/test:latest", ], - # NOTE: this is needed because, otherwise, bazel test //... fails, even - # when container_structure_test already has target_compatible_with. - # See 136 target_compatible_with = COMPATIBLE_WITH, ) diff --git a/examples/flatten/BUILD.bazel b/examples/flatten/BUILD.bazel index 67d7dd54..fed2a5cb 100644 --- a/examples/flatten/BUILD.bazel +++ b/examples/flatten/BUILD.bazel @@ -1,6 +1,6 @@ -load("@tar.bzl", "tar") -load("//distroless:defs.bzl", "flatten", "home", "passwd") -load("//distroless/tests:asserts.bzl", "assert_tar_listing", "assert_tar_mtree") +load("@aspect_bazel_lib//lib:tar.bzl", "tar") +load("@rules_distroless//distroless:defs.bzl", "flatten", "home", "passwd") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_listing", "assert_tar_mtree") passwd( name = "passwd", @@ -54,12 +54,11 @@ assert_tar_mtree( #mtree ./etc time=0.0 mode=755 gid=0 uid=0 type=dir ./etc/passwd time=0.0 mode=644 gid=0 uid=0 type=file size=34 -./examples time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir/changelog time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 -./examples/flatten/dir/sub time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir/sub/content.txt time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 +./flatten time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir/changelog time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 +./flatten/dir/sub time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir/sub/content.txt time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 ./home/nonroot time=0.0 mode=700 gid=666 uid=666 type=dir ./root time=0.0 mode=700 gid=0 uid=0 type=dir """, @@ -99,12 +98,11 @@ assert_tar_mtree( actual = "flatten_dedup", expected = """\ #mtree -./examples time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir/changelog time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 -./examples/flatten/dir/sub time=1672560000.0 mode=755 gid=0 uid=0 type=dir -./examples/flatten/dir/sub/content.txt time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 +./flatten time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir/changelog time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 +./flatten/dir/sub time=1672560000.0 mode=755 gid=0 uid=0 type=dir +./flatten/dir/sub/content.txt time=1672560000.0 mode=755 gid=0 uid=0 type=file size=0 """, ) @@ -112,11 +110,10 @@ assert_tar_listing( name = "test_flatten_dedup_listing", actual = "flatten_dedup", expected = """\ -examples/ -examples/flatten/ -examples/flatten/dir/ -examples/flatten/dir/changelog -examples/flatten/dir/sub/ -examples/flatten/dir/sub/content.txt +flatten/ +flatten/dir/ +flatten/dir/changelog +flatten/dir/sub/ +flatten/dir/sub/content.txt """, ) diff --git a/examples/group/BUILD.bazel b/examples/group/BUILD.bazel index 9b99e5c7..59538bfa 100644 --- a/examples/group/BUILD.bazel +++ b/examples/group/BUILD.bazel @@ -1,6 +1,6 @@ -load("@bazel_lib//lib:diff_test.bzl", "diff_test") -load("//distroless:defs.bzl", "group") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@aspect_bazel_lib//lib:diff_test.bzl", "diff_test") +load("@rules_distroless//distroless:defs.bzl", "group") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") group( name = "group", diff --git a/examples/home/BUILD.bazel b/examples/home/BUILD.bazel index 354d72f4..e170a07b 100644 --- a/examples/home/BUILD.bazel +++ b/examples/home/BUILD.bazel @@ -1,5 +1,5 @@ -load("//distroless:defs.bzl", "home") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@rules_distroless//distroless:defs.bzl", "home") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") home( name = "home", diff --git a/examples/java_keystore/BUILD.bazel b/examples/java_keystore/BUILD.bazel index 97ce1b2a..82f58ad7 100644 --- a/examples/java_keystore/BUILD.bazel +++ b/examples/java_keystore/BUILD.bazel @@ -1,5 +1,5 @@ -load("//distroless:defs.bzl", "java_keystore") -load("//distroless/tests:asserts.bzl", "assert_jks_listing", "assert_tar_mtree") +load("@rules_distroless//distroless:defs.bzl", "java_keystore") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_jks_listing", "assert_tar_mtree") java_keystore( name = "java_keystore", diff --git a/examples/locale/BUILD.bazel b/examples/locale/BUILD.bazel index df316303..ce923c95 100644 --- a/examples/locale/BUILD.bazel +++ b/examples/locale/BUILD.bazel @@ -1,5 +1,5 @@ -load("//distroless:defs.bzl", "locale") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@rules_distroless//distroless:defs.bzl", "locale") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") EPOCH = 123 diff --git a/examples/os_release/BUILD.bazel b/examples/os_release/BUILD.bazel index 56a6520b..18e91959 100644 --- a/examples/os_release/BUILD.bazel +++ b/examples/os_release/BUILD.bazel @@ -1,6 +1,6 @@ -load("@bazel_lib//lib:diff_test.bzl", "diff_test") -load("//distroless:defs.bzl", "os_release") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@aspect_bazel_lib//lib:diff_test.bzl", "diff_test") +load("@rules_distroless//distroless:defs.bzl", "os_release") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") os_release( name = "os_release", diff --git a/examples/passwd/BUILD.bazel b/examples/passwd/BUILD.bazel index acd1a162..830a98c6 100644 --- a/examples/passwd/BUILD.bazel +++ b/examples/passwd/BUILD.bazel @@ -1,6 +1,6 @@ -load("@bazel_lib//lib:diff_test.bzl", "diff_test") -load("//distroless:defs.bzl", "passwd") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@aspect_bazel_lib//lib:diff_test.bzl", "diff_test") +load("@rules_distroless//distroless:defs.bzl", "passwd") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") passwd( name = "passwd", diff --git a/examples/statusd/BUILD.bazel b/examples/statusd/BUILD.bazel index 146f0b01..e7bab5c2 100644 --- a/examples/statusd/BUILD.bazel +++ b/examples/statusd/BUILD.bazel @@ -1,6 +1,6 @@ # buildifier: disable=bzl-visibility -load("//apt:defs.bzl", "dpkg_statusd") -load("//distroless/tests:asserts.bzl", "assert_tar_mtree") +load("@rules_distroless//apt:defs.bzl", "dpkg_statusd") +load("@rules_distroless//distroless/tests:asserts.bzl", "assert_tar_mtree") dpkg_statusd( name = "statusd", diff --git a/examples/ubuntu_snapshot/BUILD.bazel b/examples/ubuntu_snapshot/BUILD.bazel index ff5935c4..8197104a 100644 --- a/examples/ubuntu_snapshot/BUILD.bazel +++ b/examples/ubuntu_snapshot/BUILD.bazel @@ -1,94 +1,8 @@ -load("@container_structure_test//:defs.bzl", "container_structure_test") -load("@rules_distroless//distroless:defs.bzl", "group", "passwd") -load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load") -load("@tar.bzl", "tar") - -COMPATIBLE_WITH = select({ - "@platforms//cpu:x86_64": ["@platforms//cpu:x86_64"], - "@platforms//cpu:arm64": ["@platforms//cpu:arm64"], -}) + [ - "@platforms//os:linux", -] - -passwd( - name = "passwd", - entries = [ - { - "uid": 0, - "gid": 0, - "home": "/root", - "shell": "/bin/bash", - "username": "r00t", - }, - { - "uid": 100, - "gid": 65534, - "home": "/home/_apt", - "shell": "/usr/sbin/nologin", - "username": "_apt", - }, - ], -) - -group( - name = "group", - entries = [ - { - "name": "root", - "gid": 0, - }, - { - "name": "_apt", - "gid": 65534, - }, - ], -) - -tar( - name = "sh", - mtree = [ - # needed as dpkg assumes sh is installed in a typical debian installation. - "./bin/sh type=link link=/bin/bash", - ], -) - -oci_image( - name = "noble", - architecture = select({ - "@platforms//cpu:arm64": "arm64", - "@platforms//cpu:x86_64": "amd64", - }), - os = "linux", - # NOTE: this is needed because, otherwise, bazel test //... fails, even - # when container_structure_test already has target_compatible_with. - # See 136 - target_compatible_with = COMPATIBLE_WITH, - tars = [ - ":sh", - ":passwd", - ":group", - "@noble//:noble", - ], -) - -oci_load( - name = "tarball", - image = ":noble", - repo_tags = [ - "distroless/noble:latest", - ], - # NOTE: this is needed because, otherwise, bazel test //... fails, even - # when container_structure_test already has target_compatible_with. - # See 136 - target_compatible_with = COMPATIBLE_WITH, -) - -container_structure_test( - name = "test", - configs = select({ - "@platforms//cpu:arm64": ["test_linux_arm64.yaml"], - "@platforms//cpu:x86_64": ["test_linux_amd64.yaml"], - }), - image = ":noble", - target_compatible_with = COMPATIBLE_WITH, -) +# Ubuntu Noble example is temporarily disabled. +# +# The snapshot URLs at https://snapshot.ubuntu.com/ubuntu/20240301T030400Z +# are returning 404 errors. This example will need to be updated with +# working snapshot URLs when available. +# +# See MODULE.bazel for the commented out apt.sources_list and apt.install +# configuration that was used.