From c80f358afd56229322918f9ac5d9b69f70aca8b1 Mon Sep 17 00:00:00 2001 From: thesayyn Date: Wed, 13 Mar 2024 12:50:03 -0700 Subject: [PATCH] statusd --- .bazelrc | 4 + MODULE.bazel | 2 + WORKSPACE.bazel | 27 +- apt/defs.bzl | 7 + apt/index.bzl | 23 +- apt/private/BUILD.bazel | 4 + apt/private/dpkg_status.bzl | 46 + apt/private/dpkg_status.sh | 22 + apt/private/dpkg_statusd.bzl | 54 + apt/private/dpkg_statusd.sh | 23 + apt/private/index.bzl | 220 +-- apt/private/lockfile.bzl | 49 +- apt/private/package_resolution.bzl | 69 +- apt/private/resolve.bzl | 141 ++ apt/tests/BUILD.bazel | 2 +- ...h_test.bzl => package_resolution_test.bzl} | 10 +- distroless/private/cacerts.bzl | 1 - distroless/private/cacerts.sh | 6 +- docs/rules.md | 1 - examples/apt/BUILD.bazel | 112 ++ examples/apt/bookworm.lock.json | 12 - examples/apt/bookworm.yaml | 16 - examples/apt/bullseye.lock.json | 1529 ++++++++++++++--- examples/apt/bullseye.yaml | 38 +- examples/apt/test.yaml | 23 + examples/apt/trixie.lock.json | 4 - examples/apt/trixie.yaml | 15 - examples/statusd/BUILD.bazel | 19 + 28 files changed, 1920 insertions(+), 559 deletions(-) create mode 100644 apt/defs.bzl create mode 100644 apt/private/dpkg_status.bzl create mode 100755 apt/private/dpkg_status.sh create mode 100644 apt/private/dpkg_statusd.bzl create mode 100755 apt/private/dpkg_statusd.sh create mode 100644 apt/private/resolve.bzl rename apt/tests/{graph_test.bzl => package_resolution_test.bzl} (74%) delete mode 100755 examples/apt/bookworm.lock.json delete mode 100644 examples/apt/bookworm.yaml create mode 100644 examples/apt/test.yaml delete mode 100755 examples/apt/trixie.lock.json delete mode 100644 examples/apt/trixie.yaml create mode 100644 examples/statusd/BUILD.bazel diff --git a/.bazelrc b/.bazelrc index 66aa14b..9c2fe68 100644 --- a/.bazelrc +++ b/.bazelrc @@ -21,6 +21,10 @@ build --java_runtime_version=remotejdk_11 # https://github.com/GoogleContainerTools/rules_distroless/actions/runs/7118944984/job/19382981899?pr=9#step:8:51 common:linux --sandbox_tmpfs_path=/tmp + +# Allow external dependencies to be retried. debian snapshot is unreliable and needs retries. +common --experimental_repository_downloader_retries=200 + # Load any settings specific to the current user. # .bazelrc.user should appear in .gitignore so that settings are not shared with team members # This needs to be last statement in this diff --git a/MODULE.bazel b/MODULE.bazel index 2b030f3..b99edd8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -8,6 +8,8 @@ module( bazel_dep(name = "bazel_skylib", version = "1.5.0") bazel_dep(name = "aspect_bazel_lib", version = "2.5.3") +bazel_dep(name = "container_structure_test", version = "1.16.0") +bazel_dep(name = "rules_oci", version = "1.7.4") bazel_lib_toolchains = use_extension("@aspect_bazel_lib//lib:extensions.bzl", "toolchains") use_repo(bazel_lib_toolchains, "bsd_tar_toolchains") diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 2363eb2..ed52801 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -4,7 +4,7 @@ load("@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"])', + 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"], ) @@ -25,34 +25,11 @@ http_archive( load("//apt:index.bzl", "deb_package_index") -# bazel build @trixie//:packages.bzl -deb_package_index( - name = "trixie", - lock = "@@//examples/apt:trixie.lock.json", - manifest = "//examples/apt:trixie.yaml", -) - -load("@trixie//:packages.bzl", "trixie_packages") - -trixie_packages() - -# bazel build @bookworm//:packages.bzl -deb_package_index( - name = "bookworm", - lock = "@@//examples/apt:bookworm.lock.json", - manifest = "//examples/apt:bookworm.yaml", -) - -load("@bookworm//:packages.bzl", "bookworm_packages") - -bookworm_packages() - -# bazel build @bullseye//:packages.bzl +# bazel run @bullseye//:lock deb_package_index( name = "bullseye", lock = "@@//examples/apt:bullseye.lock.json", manifest = "//examples/apt:bullseye.yaml", - resolve_transitive = False, ) load("@bullseye//:packages.bzl", "bullseye_packages") diff --git a/apt/defs.bzl b/apt/defs.bzl new file mode 100644 index 0000000..df59c3d --- /dev/null +++ b/apt/defs.bzl @@ -0,0 +1,7 @@ +"EXPERIMENTAL! Public API" + +load("//apt/private:dpkg_status.bzl", _dpkg_status = "dpkg_status") +load("//apt/private:dpkg_statusd.bzl", _dpkg_statusd = "dpkg_statusd") + +dpkg_status = _dpkg_status +dpkg_statusd = _dpkg_statusd diff --git a/apt/index.bzl b/apt/index.bzl index 5d6ecf3..1034a31 100644 --- a/apt/index.bzl +++ b/apt/index.bzl @@ -1,5 +1,26 @@ "apt-get" load("//apt/private:index.bzl", _deb_package_index = "deb_package_index") +load("//apt/private:resolve.bzl", _deb_resolve = "deb_resolve") -deb_package_index = _deb_package_index +def deb_package_index( + name, + manifest, + lock = None, + package_template = None, + resolve_transitive = True): + _deb_resolve( + name = name + "_resolution", + manifest = manifest, + resolve_transitive = resolve_transitive, + ) + + if not lock: + # buildifier: disable=print + print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % name) + + _deb_package_index( + name = name, + lock = lock if lock else "@" + name + "_resolution//:lock.json", + package_template = package_template, + ) diff --git a/apt/private/BUILD.bazel b/apt/private/BUILD.bazel index e69de29..ebce076 100644 --- a/apt/private/BUILD.bazel +++ b/apt/private/BUILD.bazel @@ -0,0 +1,4 @@ +exports_files([ + "dpkg_statusd.sh", + "dpkg_status.sh", +]) diff --git a/apt/private/dpkg_status.bzl b/apt/private/dpkg_status.bzl new file mode 100644 index 0000000..25fa0d2 --- /dev/null +++ b/apt/private/dpkg_status.bzl @@ -0,0 +1,46 @@ +"dpkg_status" + +# buildifier: disable=bzl-visibility +load("//distroless/private:tar.bzl", "tar_lib") + +_DOC = """TODO: docs""" + +def _dpkg_status_impl(ctx): + bsdtar = ctx.toolchains[tar_lib.TOOLCHAIN_TYPE] + + output = ctx.actions.declare_file(ctx.attr.name + ".tar") + + args = ctx.actions.args() + args.add(bsdtar.tarinfo.binary) + args.add(output) + args.add_all(ctx.files.controls) + + ctx.actions.run( + executable = ctx.executable._dpkg_status_sh, + inputs = ctx.files.controls, + outputs = [output], + tools = bsdtar.default.files, + arguments = [args], + ) + + return [ + DefaultInfo(files = depset([output])), + ] + +dpkg_status = rule( + doc = _DOC, + attrs = { + "_dpkg_status_sh": attr.label( + allow_single_file = True, + executable = True, + cfg = "exec", + default = ":dpkg_status.sh", + ), + "controls": attr.label_list( + allow_files = [".tar.xz", ".tar.gz", ".tar"], + mandatory = True, + ), + }, + implementation = _dpkg_status_impl, + toolchains = [tar_lib.TOOLCHAIN_TYPE], +) diff --git a/apt/private/dpkg_status.sh b/apt/private/dpkg_status.sh new file mode 100755 index 0000000..e137ccb --- /dev/null +++ b/apt/private/dpkg_status.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -o pipefail -o errexit -o nounset + +readonly bsdtar="$1" +readonly out="$2" +shift 2 + +tmp_out=$(mktemp) + +while (( $# > 0 )); do + control="$($bsdtar -xf "$1" --to-stdout ./control)" + echo "$control" | head -n 1 >> $tmp_out + echo "Status: install ok installed" >> $tmp_out + echo "$control" | tail -n +2 >> $tmp_out + echo "" >> $tmp_out + shift +done + +echo "#mtree +./var/lib/dpkg/status type=file uid=0 gid=0 mode=0644 contents=$tmp_out +" | "$bsdtar" $@ -cf "$out" @- + diff --git a/apt/private/dpkg_statusd.bzl b/apt/private/dpkg_statusd.bzl new file mode 100644 index 0000000..c8862b0 --- /dev/null +++ b/apt/private/dpkg_statusd.bzl @@ -0,0 +1,54 @@ +"dpkg_statusd" + +# buildifier: disable=bzl-visibility +load("//distroless/private:tar.bzl", "tar_lib") + +_DOC = """TODO: docs""" + +def _dpkg_statusd_impl(ctx): + bsdtar = ctx.toolchains[tar_lib.TOOLCHAIN_TYPE] + + ext = tar_lib.common.compression_to_extension[ctx.attr.compression] if ctx.attr.compression else ".tar" + output = ctx.actions.declare_file(ctx.attr.name + ext) + + args = ctx.actions.args() + args.add(bsdtar.tarinfo.binary) + args.add(output) + args.add(ctx.file.control) + args.add(ctx.attr.package_name) + tar_lib.common.add_compression_args(ctx.attr.compression, args) + + ctx.actions.run( + executable = ctx.executable._dpkg_statusd_sh, + inputs = [ctx.file.control], + outputs = [output], + tools = bsdtar.default.files, + arguments = [args], + ) + + return [ + DefaultInfo(files = depset([output])), + ] + +dpkg_statusd = rule( + doc = _DOC, + attrs = { + "_dpkg_statusd_sh": attr.label( + allow_single_file = True, + executable = True, + cfg = "exec", + default = ":dpkg_statusd.sh", + ), + "package_name": attr.string(mandatory = True), + "control": attr.label( + allow_single_file = [".tar.xz", ".tar.gz", ".tar"], + mandatory = True, + ), + "compression": attr.string( + doc = "Compress the archive file with a supported algorithm.", + values = tar_lib.common.accepted_compression_types, + ), + }, + implementation = _dpkg_statusd_impl, + toolchains = [tar_lib.TOOLCHAIN_TYPE], +) diff --git a/apt/private/dpkg_statusd.sh b/apt/private/dpkg_statusd.sh new file mode 100755 index 0000000..e2e1fb5 --- /dev/null +++ b/apt/private/dpkg_statusd.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -o pipefail -o errexit -o nounset + +readonly bsdtar="$1" +readonly out="$2" +readonly control_path="$3" +readonly package_name="$4" +shift 4 + +include=(--include "^./control$" --include "^./md5sums$") + +tmp=$(mktemp -d) +"$bsdtar" -xf "$control_path" "${include[@]}" -C "$tmp" + +"$bsdtar" -cf - $@ --format=mtree "${include[@]}" --options '!gname,!uname,!sha1,!nlink,!time' "@$control_path" | \ +awk -v pkg="$package_name" '{ + if ($1=="#mtree") { + print $1; next + }; + sub(/^\.?\//, "", $1); + $1 = "./var/lib/dpkg/status.d/" pkg "/" $1 " contents=./" $1; + print $0 +}' | "$bsdtar" $@ -cf "$out" -C "$tmp/" @- diff --git a/apt/private/index.bzl b/apt/private/index.bzl index 9d87603..fd72949 100644 --- a/apt/private/index.bzl +++ b/apt/private/index.bzl @@ -1,170 +1,62 @@ "apt-get" -load("@aspect_bazel_lib//lib:repo_utils.bzl", "repo_utils") load(":lockfile.bzl", "lockfile") -load(":package_index.bzl", "package_index") -load(":package_resolution.bzl", "package_resolution") _DEB_IMPORT_TMPL = '''\ http_archive( name = "{name}", urls = {urls}, sha256 = "{sha256}", - build_file_content = """exports_files(["data.tar.xz"])""" - ) -''' - -_PACKAGE_TMPL = '''\ + build_file_content = """\ +load("@rules_distroless//apt/private:dpkg_statusd.bzl", "dpkg_statusd") load("@rules_distroless//distroless:defs.bzl", "flatten") +filegroup( + name = "odata", + srcs = ["data.tar.xz"] +) + +dpkg_statusd( + name = "statusd", + control = ":control", + package_name = "{package_name}", + visibility = ["//visibility:public"], +) + flatten( - name = "{name}", + name = "data", visibility = ["//visibility:public"], tars = [ - {srcs} + ":odata", + ":statusd" ], compression = "gzip" ) -''' - -_COPY_SH = """\ -#!/usr/bin/env bash -set -o pipefail -o errexit -o nounset - -lock=$(realpath $1) - -cd $BUILD_WORKING_DIRECTORY - -echo '' -echo 'Writing lockfile to {workspace_relative_path}' -cp $lock {workspace_relative_path} -if [[ "${{2:-}}" == "--autofix" ]]; then - echo '' - buildozer 'set lock "{label}"' WORKSPACE.bazel:{name} -else - echo '' - echo 'Run the following command to add the lockfile or pass --autofix flag to do it automatically.' - echo '' - echo ' buildozer 'set lock "{label}"' WORKSPACE.bazel:{name}' - echo '' -fi +filegroup( + name = "control", + visibility = ["//visibility:public"], + srcs = ["control.tar.xz"] +) """ - -def _parse_manifest(rctx): - is_windows = repo_utils.is_windows(rctx) - host_yq = Label("@{}_{}//:yq{}".format(rctx.attr.yq_toolchain_prefix, repo_utils.platform(rctx), ".exe" if is_windows else "")) - yq_args = [ - str(rctx.path(host_yq)), - str(rctx.path(rctx.attr.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 "{}") - -def _deb_resolve_impl(rctx): - manifest = _parse_manifest(rctx) - - 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 = [] - - dist = None - for src in manifest["sources"]: - (distr, _, comp) = src["channel"].partition(" ") - if not dist: - dist = distr - sources.append(( - src["url"], - distr, - comp, - )) - - pkgindex = package_index.new(rctx, sources = sources, archs = manifest["archs"]) - pkgresolution = package_resolution.new(index = pkgindex) - lockf = lockfile.empty(rctx) - - for arch in manifest["archs"]: - for dep_constraint in manifest["packages"]: - constraint = package_resolution.parse_depends(dep_constraint).pop() - - rctx.report_progress("Resolving %s" % dep_constraint) - package = pkgresolution.resolve_package(name = constraint["name"], version = constraint["version"], arch = arch) - - if not package: - fail("Unable to locate package `%s`" % dep_constraint) - - lockf.add_package(package, arch) - - if rctx.attr.resolve_transitive: - (dependencies, unmet_dependencies) = pkgresolution.resolve_dependencies( - name = constraint["name"], - version = constraint["version"], - arch = arch, - ) - - # TODO: resolve_dependencies should not return package itself - dependencies.pop() - - if len(unmet_dependencies): - # buildifier: disable=print - print("the following packages have unmet dependencies: %s" % ",".join([up[0] for up in unmet_dependencies])) - - for dep in dependencies: - lockf.add_package(dep, arch) - lockf.add_package_dependency(package, dep, arch) - - lockf.write("lock.json") - - locklabel = rctx.attr.manifest.relative(rctx.attr.manifest.name.replace(".yaml", ".lock.json")) - - rctx.file( - "copy.sh", - _COPY_SH.format( - name = rctx.name.removesuffix("_resolution"), - label = locklabel, - workspace_relative_path = "%s/%s" % (locklabel.package, locklabel.name), - ), - executable = True, ) +''' - rctx.file("BUILD.bazel", """\ +_PACKAGE_TMPL = '''\ filegroup( - name = "lockfile", - srcs = ["lock.json"], - tags = ["manual"], + name = "{target_name}", + visibility = ["//visibility:public"], + srcs = [ + {deps} + ] ) -sh_binary( - name = "lock", - srcs = ["copy.sh"], - data = ["lock.json"], - tags = ["manual"], - args = ["$(location :lock.json)"], - visibility = ["//visibility:public"] -) -""") -_deb_resolve = repository_rule( - implementation = _deb_resolve_impl, - attrs = { - "manifest": attr.label(), - "resolve_transitive": attr.bool(), - "yq_toolchain_prefix": attr.string(default = "yq"), - }, +alias( + name = "control", + actual = "@{repo_name}//:control", + visibility = ["//visibility:public"], ) +''' def _deb_package_index_impl(rctx): package_defs = [ @@ -181,10 +73,16 @@ def _deb_package_index_impl(rctx): if len(lockf.packages()) < 1: package_defs.append(" pass") - for (name, package) in lockf.packages().items(): + for (package) in lockf.packages(): + name = lockfile.make_package_key( + package["name"], + package["version"], + package["arch"], + ) package_defs.append( _DEB_IMPORT_TMPL.format( - name = name, + name = "%s_%s" % (rctx.attr.name, package["key"]), + package_name = package["name"], urls = [package["url"]], sha256 = package["sha256"], ), @@ -192,9 +90,14 @@ def _deb_package_index_impl(rctx): rctx.file( "%s/%s/BUILD.bazel" % (package["name"], package["arch"]), - _PACKAGE_TMPL.format( - name = package["arch"], - srcs = ",\n ".join(['"@%s//:data.tar.xz"' % dep for dep in package["dependencies"] + [name]]), + rctx.attr.package_template.format( + target_name = package["arch"], + deps = ",\n ".join(['"@%s_%s//:data"' % (rctx.attr.name, dep) for dep in package["dependencies"] + [name]]), + urls = [package["url"]], + name = package["name"], + arch = package["arch"], + sha256 = package["sha256"], + repo_name = "%s_%s" % (rctx.attr.name, name), ), ) @@ -208,29 +111,10 @@ alias( exports_files(glob(['packages.bzl'])) """.format(rctx.attr.name)) -_deb_package_index = repository_rule( +deb_package_index = repository_rule( implementation = _deb_package_index_impl, attrs = { "lock": attr.label(), + "package_template": attr.string(default = _PACKAGE_TMPL), }, ) - -def deb_package_index( - name, - manifest, - lock = None, - resolve_transitive = None): - _deb_resolve( - name = name + "_resolution", - manifest = manifest, - resolve_transitive = resolve_transitive, - ) - - if not lock: - # buildifier: disable=print - print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % name) - - _deb_package_index( - name = name, - lock = lock if lock else "@" + name + "_resolution//:lock.json", - ) diff --git a/apt/private/lockfile.bzl b/apt/private/lockfile.bzl index f0d71d1..12fcd08 100644 --- a/apt/private/lockfile.bzl +++ b/apt/private/lockfile.bzl @@ -2,49 +2,76 @@ load(":util.bzl", "util") -def _make_package_key(package, arch): +def _make_package_key(name, version, arch): return "%s_%s_%s" % ( - util.sanitize(package["Package"]), - util.sanitize(package["Version"]), + util.sanitize(name), + util.sanitize(version), arch, ) +def _package_key(package, arch): + return _make_package_key(package["Package"], package["Version"], arch) + def _add_package(lock, package, arch): - k = _make_package_key(package, arch) - if k in lock.packages: + k = _package_key(package, arch) + if k in lock.fast_package_lookup: return - lock.packages[_make_package_key(package, arch)] = { + lock.packages.append({ + "key": k, "name": package["Package"], "version": package["Version"], "url": "%s/%s" % (package["Root"], package["Filename"]), "sha256": package["SHA256"], "arch": arch, "dependencies": [], - } + }) + lock.fast_package_lookup[k] = len(lock.packages) - 1 def _add_package_dependency(lock, package, dependency, arch): - lock.packages[_make_package_key(package, arch)]["dependencies"].append(_make_package_key(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] + lock.packages[i]["dependencies"].append(_package_key(dependency, arch)) + +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): return struct( + has_package = lambda *args, **kwargs: _has_package(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(lock)), + packages = lambda: lock.packages, + write = lambda out: rctx.file(out, json.encode_indent(struct(version = lock.version, packages = lock.packages))), ) def _empty(rctx): lock = struct( version = 1, - packages = dict(), + packages = list(), + fast_package_lookup = dict(), ) return _create(rctx, lock) def _from_json(rctx, path): lock = json.decode(rctx.read(path)) + if lock["version"] != 1: + fail("invalid lockfile version") + + lock = struct( + version = lock["version"], + packages = lock["packages"], + fast_package_lookup = dict(), + ) + for (i, package) in enumerate(lock.packages): + lock.packages[i] = package + lock.fast_package_lookup[package["key"]] = i return _create(rctx, lock) lockfile = struct( empty = _empty, from_json = _from_json, + make_package_key = _make_package_key, ) diff --git a/apt/private/package_resolution.bzl b/apt/private/package_resolution.bzl index 8c1ba39..09ab165 100644 --- a/apt/private/package_resolution.bzl +++ b/apt/private/package_resolution.bzl @@ -66,17 +66,20 @@ def _resolve_package(state, name, version, arch): if version: for av in versions: if _version_relop(av, version[1], version[0]): - # print("match", name, av) package = state.index.package(name = name, version = av, arch = arch) + break elif len(versions) > 0: # TODO: what do we do when there is no version constraint? package = state.index.package(name = name, version = versions[0], arch = arch) return package -def _resolve_dependencies(state, name, version, arch): - dependecies = {} - unmet_dependencies = {} +def _resolve_all(state, name, version, arch, in_lock, include_transitive): + root_package = None + already_recursed = {} + unmet_dependencies = [] + dependencies = [] iteration_max = 2147483646 + stack = [(name, version)] for i in range(0, iteration_max + 1): @@ -90,28 +93,56 @@ def _resolve_dependencies(state, name, version, arch): if not package: key = "%s~~%s" % (name, version[1] if version else "") - unmet_dependencies[key] = (name, version) - else: - key = "%s~~%s" % (package["Package"], package["Version"]) - if key in dependecies: + unmet_dependencies.append((name, version)) + continue + + if i == 0: + # Set the root package + root_package = package + + # PERF: If the lockfile has this package already, it means we did the transitive closure + # resolution already. + if in_lock(package["Package"], package["Version"]): + continue + + key = "%s~~%s" % (package["Package"], package["Version"]) + + # If we encountered package before in the transitive closure, skip it + if key in already_recursed: + continue + + if i != 0: + # Add it to the dependencies + already_recursed[key] = True + dependencies.append(package) + + deps = [] + + # Extend the lookup with all the items in the dependency closure + if "Pre-Depends" in package and include_transitive: + deps.extend(_parse_depends(package["Pre-Depends"])) + + # Extend the lookup with all the items in the dependency closure + if "Depends" in package and include_transitive: + deps.extend(_parse_depends(package["Depends"])) + + for dep in deps: + if type(dep) == "list": + # buildifier: disable=print + print("Warning: optional dependencies are not supported yet. https://github.com/GoogleContainerTools/rules_distroless/issues/27") + + # TODO: optional dependencies continue - dependecies[key] = package - if "Depends" in package: - deps = _parse_depends(package["Depends"]) - for dep in deps: - if type(dep) == "list": - # TODO: optional dependencies - continue - # TODO: arch - stack.append((dep["name"], dep["version"])) + # TODO: arch + stack.append((dep["name"], dep["version"])) - return (dependecies.values(), unmet_dependencies.values()) + return (root_package, dependencies, unmet_dependencies) def _create_resolution(index): state = struct(index = index) return struct( - resolve_dependencies = lambda **kwargs: _resolve_dependencies(state, **kwargs), + resolve_all = lambda **kwargs: _resolve_all(state, **kwargs), resolve_package = lambda **kwargs: _resolve_package(state, **kwargs), ) diff --git a/apt/private/resolve.bzl b/apt/private/resolve.bzl new file mode 100644 index 0000000..ea443d2 --- /dev/null +++ b/apt/private/resolve.bzl @@ -0,0 +1,141 @@ +"repository rule for resolving and generating lockfile" + +load("@aspect_bazel_lib//lib:repo_utils.bzl", "repo_utils") +load(":lockfile.bzl", "lockfile") +load(":package_index.bzl", "package_index") +load(":package_resolution.bzl", "package_resolution") + +_COPY_SH = """\ +#!/usr/bin/env bash +set -o pipefail -o errexit -o nounset + +lock=$(realpath $1) + +cd $BUILD_WORKING_DIRECTORY + +echo '' +echo 'Writing lockfile to {workspace_relative_path}' +cp $lock {workspace_relative_path} + +if [[ "${{2:-}}" == "--autofix" ]]; then + echo '' + buildozer 'set lock "{label}"' WORKSPACE.bazel:{name} +else + echo '' + echo 'Run the following command to add the lockfile or pass --autofix flag to do it automatically.' + echo '' + echo ' buildozer 'set lock "{label}"' WORKSPACE.bazel:{name}' + echo '' +fi +""" + +def _parse_manifest(rctx): + is_windows = repo_utils.is_windows(rctx) + host_yq = Label("@{}_{}//:yq{}".format(rctx.attr.yq_toolchain_prefix, repo_utils.platform(rctx), ".exe" if is_windows else "")) + yq_args = [ + str(rctx.path(host_yq)), + str(rctx.path(rctx.attr.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 "{}") + +def _deb_resolve_impl(rctx): + manifest = _parse_manifest(rctx) + + 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 = [] + + dist = None + for src in manifest["sources"]: + (distr, _, comp) = src["channel"].partition(" ") + if not dist: + dist = distr + sources.append(( + src["url"], + distr, + comp, + )) + + pkgindex = package_index.new(rctx, sources = sources, archs = manifest["archs"]) + pkgresolution = package_resolution.new(index = pkgindex) + lockf = lockfile.empty(rctx) + + for arch in manifest["archs"]: + for dep_constraint in manifest["packages"]: + constraint = package_resolution.parse_depends(dep_constraint).pop() + + rctx.report_progress("Resolving %s" % dep_constraint) + (package, dependencies, unmet_dependencies) = pkgresolution.resolve_all( + name = constraint["name"], + version = constraint["version"], + arch = arch, + include_transitive = rctx.attr.resolve_transitive, + in_lock = lambda name, version: lockf.has_package(name, version, arch), + ) + + if not package: + fail("Unable to locate package `%s`" % dep_constraint) + + if len(unmet_dependencies): + # buildifier: disable=print + print("the following packages have unmet dependencies: %s" % ",".join([up[0] for up in unmet_dependencies])) + + lockf.add_package(package, arch) + + for dep in dependencies: + lockf.add_package(dep, arch) + lockf.add_package_dependency(package, dep, arch) + + lockf.write("lock.json") + + locklabel = rctx.attr.manifest.relative(rctx.attr.manifest.name.replace(".yaml", ".lock.json")) + + rctx.file( + "copy.sh", + _COPY_SH.format( + name = rctx.name.removesuffix("_resolution"), + label = locklabel, + workspace_relative_path = "%s/%s" % (locklabel.package, locklabel.name), + ), + executable = True, + ) + + rctx.file("BUILD.bazel", """\ +filegroup( + name = "lockfile", + srcs = ["lock.json"], + tags = ["manual"], +) +sh_binary( + name = "lock", + srcs = ["copy.sh"], + data = ["lock.json"], + tags = ["manual"], + args = ["$(location :lock.json)"], + visibility = ["//visibility:public"] +) +""") + +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"), + }, +) diff --git a/apt/tests/BUILD.bazel b/apt/tests/BUILD.bazel index 8e82f7f..b4afaef 100644 --- a/apt/tests/BUILD.bazel +++ b/apt/tests/BUILD.bazel @@ -1,5 +1,5 @@ +load(":package_resolution_test.bzl", "version_depends_test") load(":version_test.bzl", "version_compare_test", "version_parse_test") -load(":graph_test.bzl", "version_depends_test") version_compare_test(name = "version_compare_test") diff --git a/apt/tests/graph_test.bzl b/apt/tests/package_resolution_test.bzl similarity index 74% rename from apt/tests/graph_test.bzl rename to apt/tests/package_resolution_test.bzl index 7ad0dc3..a078075 100644 --- a/apt/tests/graph_test.bzl +++ b/apt/tests/package_resolution_test.bzl @@ -1,7 +1,7 @@ "unit tests for version parsing" load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") -load("//apt/private:graph.bzl", "graph") +load("//apt/private:package_resolution.bzl", "package_resolution") def _parse_depends_test(ctx): env = unittest.begin(ctx) @@ -11,7 +11,7 @@ def _parse_depends_test(ctx): {"name": "libc6", "version": (">=", "2.2.1"), "arch": None}, [{"name": "default-mta", "version": None, "arch": None}, {"name": "mail-transport-agent", "version": None, "arch": None}], ], - graph._parse_depends("libc6 (>= 2.2.1), default-mta | mail-transport-agent"), + package_resolution.parse_depends("libc6 (>= 2.2.1), default-mta | mail-transport-agent"), ) asserts.equals( @@ -20,7 +20,7 @@ def _parse_depends_test(ctx): {"name": "libluajit5.1-dev", "version": None, "arch": ["i386", "amd64", "kfreebsd-i386", "armel", "armhf", "powerpc", "mips"]}, {"name": "liblua5.1-dev", "version": None, "arch": ["hurd-i386", "ia64", "kfreebsd-amd64", "s390x", "sparc"]}, ], - graph._parse_depends("libluajit5.1-dev [i386 amd64 kfreebsd-i386 armel armhf powerpc mips], liblua5.1-dev [hurd-i386 ia64 kfreebsd-amd64 s390x sparc]"), + package_resolution.parse_depends("libluajit5.1-dev [i386 amd64 kfreebsd-i386 armel armhf powerpc mips], liblua5.1-dev [hurd-i386 ia64 kfreebsd-amd64 s390x sparc]"), ) asserts.equals( @@ -33,7 +33,7 @@ def _parse_depends_test(ctx): {"name": "make", "version": None, "arch": None}, {"name": "debianutils", "version": (">=", "1.7"), "arch": None}, ], - graph._parse_depends("emacs | emacsen, make, debianutils (>= 1.7)"), + package_resolution.parse_depends("emacs | emacsen, make, debianutils (>= 1.7)"), ) asserts.equals( @@ -47,7 +47,7 @@ def _parse_depends_test(ctx): {"name": "libpaper1", "version": None, "arch": None}, {"name": "psutils", "version": None, "arch": None}, ], - graph._parse_depends("libcap-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], autoconf, debhelper (>> 5.0.0), file, libc6 (>= 2.7-1), libpaper1, psutils"), + package_resolution.parse_depends("libcap-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], autoconf, debhelper (>> 5.0.0), file, libc6 (>= 2.7-1), libpaper1, psutils"), ) return unittest.end(env) diff --git a/distroless/private/cacerts.bzl b/distroless/private/cacerts.bzl index ed50466..4e67f18 100644 --- a/distroless/private/cacerts.bzl +++ b/distroless/private/cacerts.bzl @@ -17,7 +17,6 @@ http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "ht http_archive( name = "ca-certificates", type = ".deb", - canonical_id = "test", sha256 = "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", urls = ["https://snapshot.debian.org/archive/debian/20231106T210201Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb"], build_file_content = "exports_files(["data.tar.xz"])" diff --git a/distroless/private/cacerts.sh b/distroless/private/cacerts.sh index 278ebee..b174eaf 100755 --- a/distroless/private/cacerts.sh +++ b/distroless/private/cacerts.sh @@ -7,9 +7,9 @@ readonly cacerts_out="$3" readonly copyright_out="$4" readonly tmp="$(mktemp -d)" -"$bsdtar" -xf "$package_path" -C "$tmp" --strip-components 3 ./usr/share/ca-certificates ./usr/share/doc/ca-certificates/copyright +"$bsdtar" -xf "$package_path" -C "$tmp" ./usr/share/ca-certificates ./usr/share/doc/ca-certificates/copyright -mv "$tmp/doc/ca-certificates/copyright" "$copyright_out" +mv "$tmp/usr/share/doc/ca-certificates/copyright" "$copyright_out" function add_cert () { local dir="$1" @@ -22,5 +22,5 @@ function add_cert () { done } -add_cert "$tmp/ca-certificates" +add_cert "$tmp/usr/share/ca-certificates" rm -rf "$tmp" diff --git a/docs/rules.md b/docs/rules.md index 396f09e..1c105ce 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -25,7 +25,6 @@ http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "ht http_archive( name = "ca-certificates", type = ".deb", - canonical_id = "test", sha256 = "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", urls = ["https://snapshot.debian.org/archive/debian/20231106T210201Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb"], build_file_content = "exports_files(["data.tar.xz"])" diff --git a/examples/apt/BUILD.bazel b/examples/apt/BUILD.bazel index e69de29..55c64b7 100644 --- a/examples/apt/BUILD.bazel +++ b/examples/apt/BUILD.bazel @@ -0,0 +1,112 @@ +load("@aspect_bazel_lib//lib:tar.bzl", "tar") +load("@container_structure_test//:defs.bzl", "container_structure_test") +load("@rules_distroless//apt:defs.bzl", "dpkg_status") +load("@rules_distroless//distroless:defs.bzl", "group", "passwd") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_tarball") + +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", + srcs = [], + mtree = [ + # needed as dpkg assumes sh is installed in a typical debian installation. + "./bin/sh type=link link=/bin/bash", + ], +) + +PACKAGES = [ + "@bullseye//ncurses-base", + "@bullseye//libncurses6", + "@bullseye//tzdata", + "@bullseye//bash", + "@bullseye//coreutils", + "@bullseye//dpkg", + "@bullseye//apt", + "@bullseye//perl", +] + +# Creates /var/lib/dpkg/status with installed package information. +dpkg_status( + name = "dpkg_status", + controls = select({ + "@platforms//cpu:arm64": [ + "%s/arm64:control" % package + for package in PACKAGES + ], + "@platforms//cpu:x86_64": [ + "%s/amd64:control" % package + for package in PACKAGES + ], + }), +) + +oci_image( + name = "apt", + architecture = select({ + "@platforms//cpu:arm64": "arm64", + "@platforms//cpu:x86_64": "amd64", + }), + os = "linux", + tars = [ + ":sh", + ":passwd", + ":group", + ":dpkg_status", + ] + select({ + "@platforms//cpu:arm64": [ + "%s/arm64" % package + for package in PACKAGES + ], + "@platforms//cpu:x86_64": [ + "%s/amd64" % package + for package in PACKAGES + ], + }), +) + +oci_tarball( + name = "tarball", + image = ":apt", + repo_tags = [ + "distroless/test:latest", + ], +) + +container_structure_test( + name = "test", + configs = ["test.yaml"], + image = ":apt", +) diff --git a/examples/apt/bookworm.lock.json b/examples/apt/bookworm.lock.json deleted file mode 100755 index 153ea7b..0000000 --- a/examples/apt/bookworm.lock.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "packages": { - "libarchive13_3.6.2-1_amd64": { - "arch": "amd64", - "dependencies": [], - "name": "libarchive13", - "sha256": "82cc6d094f9b7c872e5bc5c4613151a7a8c20ac1a3d7d6c128dca64da618857b", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/liba/libarchive/libarchive13_3.6.2-1_amd64.deb" - } - }, - "version": 1 -} diff --git a/examples/apt/bookworm.yaml b/examples/apt/bookworm.yaml deleted file mode 100644 index 5992098..0000000 --- a/examples/apt/bookworm.yaml +++ /dev/null @@ -1,16 +0,0 @@ -# Packages for bookworm -version: 1 - -sources: - - channel: bookworm main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: bookworm-updates main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: bookworm-security main - url: https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z - -archs: - - amd64 - -packages: - - libarchive13 (>= 3.2.1) diff --git a/examples/apt/bullseye.lock.json b/examples/apt/bullseye.lock.json index 079234a..d4bc04a 100755 --- a/examples/apt/bullseye.lock.json +++ b/examples/apt/bullseye.lock.json @@ -1,390 +1,1401 @@ { - "packages": { - "base-files_11.1-p-deb11u9_amd64": { + "packages": [ + { "arch": "amd64", "dependencies": [], + "key": "ncurses-base_6.2-p-20201114-2-p-deb11u2_amd64", + "name": "ncurses-base", + "sha256": "a55a5f94299448279da6a6c2031a9816dc768cd300668ff82ecfc6480bbfc83d", + "url": "https://snapshot-cloudflare.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": [ + "libc6_2.31-13-p-deb11u8_amd64", + "libcrypt1_1-4.4.18-4_amd64", + "libgcc-s1_10.2.1-6_amd64", + "gcc-10-base_10.2.1-6_amd64", + "libtinfo6_6.2-p-20201114-2-p-deb11u2_amd64" + ], + "key": "libncurses6_6.2-p-20201114-2-p-deb11u2_amd64", + "name": "libncurses6", + "sha256": "5b75c540d26d0525f231d39e5cf27ea7919d57305ba7101ea430c975369095eb", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "tzdata_2024a-0-p-deb11u1_amd64", + "name": "tzdata", + "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb", + "version": "2024a-0+deb11u1" + }, + { + "arch": "amd64", + "dependencies": [ + "debianutils_4.11.2_amd64", + "base-files_11.1-p-deb11u9_amd64" + ], + "key": "bash_5.1-2-p-deb11u1_amd64", + "name": "bash", + "sha256": "f702ef058e762d7208a9c83f6f6bbf02645533bfd615c54e8cdcce842cd57377", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_amd64.deb" + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_amd64.deb", + "version": "11.1+deb11u9" }, - "base-files_11.1-p-deb11u9_arm64": { - "arch": "arm64", + { + "arch": "amd64", + "dependencies": [ + "libselinux1_3.1-3_amd64", + "libpcre2-8-0_10.36-2-p-deb11u1_amd64", + "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", + "libattr1_1-2.4.48-6_amd64", + "libacl1_2.2.53-10_amd64" + ], + "key": "coreutils_8.32-4-p-b1_amd64", + "name": "coreutils", + "sha256": "3558a412ab51eee4b60641327cb145bb91415f127769823b68f9335585b308d4", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4+b1_amd64.deb", + "version": "8.32-4+b1" + }, + { + "arch": "amd64", "dependencies": [], - "name": "base-files", - "sha256": "c40dc4d5c6b82f5cfe75efa1a12bd09b9d5b9b8446ea045a991896a1ead8b02c", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_arm64.deb" + "key": "libselinux1_3.1-3_amd64", + "name": "libselinux1", + "sha256": "339f5ede10500c16dd7192d73169c31c4b27ab12130347275f23044ec8c7d897", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libselinux/libselinux1_3.1-3_amd64.deb", + "version": "3.1-3" }, - "base-files_11.1-p-deb11u9_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "base-files", - "sha256": "1fd89e64ee334b51e15ef7b6f97347346ea3bba17a2e484765f7849d785ef885", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_armhf.deb" + "key": "libpcre2-8-0_10.36-2-p-deb11u1_amd64", + "name": "libpcre2-8-0", + "sha256": "ee192c8d22624eb9d0a2ae95056bad7fb371e5abc17e23e16b1de3ddb17a1064", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pcre2/libpcre2-8-0_10.36-2+deb11u1_amd64.deb", + "version": "10.36-2+deb11u1" }, - "base-files_11.1-p-deb11u9_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "base-files", - "sha256": "3a1aa4b4ec456070582847c580b1a515a392e52a2ba68d51b84a924cbc27b453", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_ppc64el.deb" + "key": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_amd64", + "name": "libgmp10", + "sha256": "fc117ccb084a98d25021f7e01e4dfedd414fa2118fdd1e27d2d801d7248aebbc", + "url": "https://snapshot-cloudflare.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" }, - "base-files_11.1-p-deb11u9_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "base-files", - "sha256": "a92d049666d98a0ec0d52c2d550d2339d739579cc201294c69787d21c44ec5d1", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_s390x.deb" + "key": "libattr1_1-2.4.48-6_amd64", + "name": "libattr1", + "sha256": "af3c3562eb2802481a2b9558df1b389f3c6d9b1bf3b4219e000e05131372ebaf", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/attr/libattr1_2.4.48-6_amd64.deb", + "version": "1:2.4.48-6" }, - "ca-certificates_20210119_amd64": { + { "arch": "amd64", "dependencies": [], - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" + "key": "libacl1_2.2.53-10_amd64", + "name": "libacl1", + "sha256": "aa18d721be8aea50fbdb32cd9a319cb18a3f111ea6ad17399aa4ba9324c8e26a", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_amd64.deb", + "version": "2.2.53-10" }, - "ca-certificates_20210119_arm64": { - "arch": "arm64", + { + "arch": "amd64", + "dependencies": [ + "tar_1.34-p-dfsg-1-p-deb11u1_amd64", + "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", + "liblzma5_5.2.5-2.1~deb11u1_amd64", + "libbz2-1.0_1.0.8-4_amd64" + ], + "key": "dpkg_1.20.13_amd64", + "name": "dpkg", + "sha256": "eb2b7ba3a3c4e905a380045a2d1cd219d2d45755aba5966d6c804b79400beb05", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/d/dpkg/dpkg_1.20.13_amd64.deb", + "version": "1.20.13" + }, + { + "arch": "amd64", "dependencies": [], - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" + "key": "tar_1.34-p-dfsg-1-p-deb11u1_amd64", + "name": "tar", + "sha256": "41c9c31f67a76b3532036f09ceac1f40a9224f1680395d120a8b24eae60dd54a", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tar/tar_1.34+dfsg-1+deb11u1_amd64.deb", + "version": "1.34+dfsg-1+deb11u1" }, - "ca-certificates_20210119_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" + "key": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_amd64", + "name": "zlib1g", + "sha256": "03d2ab2174af76df6f517b854b77460fbdafc3dac0dca979317da67538159a3e", + "url": "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" }, - "ca-certificates_20210119_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" + "key": "liblzma5_5.2.5-2.1~deb11u1_amd64", + "name": "liblzma5", + "sha256": "1c79a02415ca5ee7234ac60502fb33ee94fa70b02d1c329a6a14178f8329c435", + "url": "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" }, - "ca-certificates_20210119_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "ca-certificates", - "sha256": "b2d488ad4d8d8adb3ba319fc9cb2cf9909fc42cb82ad239a26c570a2e749c389", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/ca-certificates/ca-certificates_20210119_all.deb" + "key": "libbz2-1.0_1.0.8-4_amd64", + "name": "libbz2-1.0", + "sha256": "16e27c3ebd97981e70db3733f899963362748f178a62644df69d1f247e741379", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/bzip2/libbz2-1.0_1.0.8-4_amd64.deb", + "version": "1.0.8-4" }, - "libc-bin_2.31-13-p-deb11u8_amd64": { + { + "arch": "amd64", + "dependencies": [ + "libsystemd0_247.3-7-p-deb11u4_amd64", + "libzstd1_1.4.8-p-dfsg-2.1_amd64", + "liblz4-1_1.9.3-2_amd64", + "libgcrypt20_1.8.7-6_amd64", + "libgpg-error0_1.38-2_amd64", + "libstdc-p--p-6_10.2.1-6_amd64", + "libseccomp2_2.5.1-1-p-deb11u1_amd64", + "libgnutls30_3.7.1-5-p-deb11u4_amd64", + "libunistring2_0.9.10-4_amd64", + "libtasn1-6_4.16.0-2-p-deb11u1_amd64", + "libp11-kit0_0.23.22-1_amd64", + "libffi7_3.3-6_amd64", + "libnettle8_3.7.3-1_amd64", + "libidn2-0_2.3.0-5_amd64", + "libhogweed6_3.7.3-1_amd64", + "debian-archive-keyring_2021.1.1-p-deb11u1_amd64", + "libapt-pkg6.0_2.2.4_amd64", + "libxxhash0_0.8.0-2_amd64", + "libudev1_247.3-7-p-deb11u4_amd64", + "adduser_3.118-p-deb11u1_amd64", + "passwd_1-4.8.1-1_amd64", + "libpam-modules_1.4.0-9-p-deb11u1_amd64", + "libpam-modules-bin_1.4.0-9-p-deb11u1_amd64", + "libpam0g_1.4.0-9-p-deb11u1_amd64", + "libaudit1_1-3.0-2_amd64", + "libcap-ng0_0.7.9-2.2-p-b1_amd64", + "libaudit-common_1-3.0-2_amd64", + "libtirpc3_1.3.1-1-p-deb11u1_amd64", + "libtirpc-common_1.3.1-1-p-deb11u1_amd64", + "libgssapi-krb5-2_1.18.3-6-p-deb11u4_amd64", + "libkrb5support0_1.18.3-6-p-deb11u4_amd64", + "libkrb5-3_1.18.3-6-p-deb11u4_amd64", + "libssl1.1_1.1.1w-0-p-deb11u1_amd64", + "libkeyutils1_1.6.1-2_amd64", + "libk5crypto3_1.18.3-6-p-deb11u4_amd64", + "libcom-err2_1.46.2-2_amd64", + "libnsl2_1.3.0-2_amd64", + "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", + "libsemanage1_3.1-1-p-b2_amd64", + "libsepol1_3.1-1_amd64", + "libsemanage-common_3.1-1_amd64" + ], + "key": "apt_2.2.4_amd64", + "name": "apt", + "sha256": "75f07c4965ff0813f26623a1164e162538f5e94defba6961347527ed71bc4f3d", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/apt_2.2.4_amd64.deb", + "version": "2.2.4" + }, + { "arch": "amd64", "dependencies": [], - "name": "libc-bin", - "sha256": "2f36e55d145d94286655cc6e5bc7665c730d81ee1ffdaf0772104875a3100e85", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc-bin_2.31-13+deb11u8_amd64.deb" + "key": "libsystemd0_247.3-7-p-deb11u4_amd64", + "name": "libsystemd0", + "sha256": "e6f3e65e388196a399c1a36564c38ad987337350358732056227db1b6e708878", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libsystemd0_247.3-7+deb11u4_amd64.deb", + "version": "247.3-7+deb11u4" }, - "libc-bin_2.31-13-p-deb11u8_arm64": { - "arch": "arm64", + { + "arch": "amd64", "dependencies": [], - "name": "libc-bin", - "sha256": "1592a58f6ed88ccb7bd5718d68041cda40ee66be6e7fb28218203476363ffa4d", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc-bin_2.31-13+deb11u8_arm64.deb" + "key": "libzstd1_1.4.8-p-dfsg-2.1_amd64", + "name": "libzstd1", + "sha256": "5dcadfbb743bfa1c1c773bff91c018f835e8e8c821d423d3836f3ab84773507b", + "url": "https://snapshot-cloudflare.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" }, - "libc-bin_2.31-13-p-deb11u8_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "libc-bin", - "sha256": "fb31e92e4fc51d0ab23055013d6ab75bd9888703552cab5db88cbd7c88d3a6d7", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc-bin_2.31-13+deb11u8_armhf.deb" + "key": "liblz4-1_1.9.3-2_amd64", + "name": "liblz4-1", + "sha256": "79ac6e9ca19c483f2e8effcc3401d723dd9dbb3a4ae324714de802adb21a8117", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/l/lz4/liblz4-1_1.9.3-2_amd64.deb", + "version": "1.9.3-2" }, - "libc-bin_2.31-13-p-deb11u8_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "libc-bin", - "sha256": "9cf55c4b75c589520bf5f84730ab68594bf86782826bc146026761b35ef74c4d", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc-bin_2.31-13+deb11u8_ppc64el.deb" + "key": "libgcrypt20_1.8.7-6_amd64", + "name": "libgcrypt20", + "sha256": "7a2e0eef8e0c37f03f3a5fcf7102a2e3dc70ba987f696ab71949f9abf36f35ef", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgcrypt20/libgcrypt20_1.8.7-6_amd64.deb", + "version": "1.8.7-6" }, - "libc-bin_2.31-13-p-deb11u8_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "libc-bin", - "sha256": "1a78f265e3c8e76e0df30c18b3d57fa6e47f184e50fdfdb6c619c501845ecaa9", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc-bin_2.31-13+deb11u8_s390x.deb" + "key": "libgpg-error0_1.38-2_amd64", + "name": "libgpg-error0", + "sha256": "16a507fb20cc58b5a524a0dc254a9cb1df02e1ce758a2d8abde0bc4a3c9b7c26", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libg/libgpg-error/libgpg-error0_1.38-2_amd64.deb", + "version": "1.38-2" }, - "libc6_2.31-13-p-deb11u8_amd64": { + { "arch": "amd64", "dependencies": [], - "name": "libc6", - "sha256": "d55d9c9769336f9b8516c20bd8364ce90746fb860ae3dda242f421e711af3d1a", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_amd64.deb" + "key": "libstdc-p--p-6_10.2.1-6_amd64", + "name": "libstdc++6", + "sha256": "5c155c58935870bf3b4bfe769116841c0d286a74f59eccfd5645693ac23f06b1", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_amd64.deb", + "version": "10.2.1-6" }, - "libc6_2.31-13-p-deb11u8_arm64": { - "arch": "arm64", + { + "arch": "amd64", "dependencies": [], - "name": "libc6", - "sha256": "6eb629090615ebda5dcac2365a7358c035add00b89c2724c2e9e13ccd5bd9f7c", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_arm64.deb" + "key": "libseccomp2_2.5.1-1-p-deb11u1_amd64", + "name": "libseccomp2", + "sha256": "2617fc8b99dca0fa8ed466ee0f5fe087aa4e8413b88ca45d717290f4a0551e36", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_amd64.deb", + "version": "2.5.1-1+deb11u1" }, - "libc6_2.31-13-p-deb11u8_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "libc6", - "sha256": "af087837756e1d1bca50010e6a62d7df7c1148334553eb86a3feacc68e3a3404", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_armhf.deb" + "key": "libgnutls30_3.7.1-5-p-deb11u4_amd64", + "name": "libgnutls30", + "sha256": "b2fa128881a16c2196caddb551d3577baa296a7bc5d38109a978e8e69fdb5c94", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_amd64.deb", + "version": "3.7.1-5+deb11u4" }, - "libc6_2.31-13-p-deb11u8_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "libc6", - "sha256": "f8436975e2b8292103bcdba797c63c375b8b4232ac5caa82edefd8b6744cff09", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_ppc64el.deb" + "key": "libunistring2_0.9.10-4_amd64", + "name": "libunistring2", + "sha256": "654433ad02d3a8b05c1683c6c29a224500bf343039c34dcec4e5e9515345e3d4", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_amd64.deb", + "version": "0.9.10-4" }, - "libc6_2.31-13-p-deb11u8_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "libc6", - "sha256": "af8ce661227814991ee9b06157e772ea46fa3b2e4e61b21f391b7afcd7e50504", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/glibc/libc6_2.31-13+deb11u8_s390x.deb" + "key": "libtasn1-6_4.16.0-2-p-deb11u1_amd64", + "name": "libtasn1-6", + "sha256": "6ebb579337cdc9d6201237a66578425a7a221db622524354e27c0c1bcb6dd7ca", + "url": "https://snapshot-cloudflare.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" }, - "libgcc-s1_10.2.1-6_amd64": { + { "arch": "amd64", "dependencies": [], - "name": "libgcc-s1", - "sha256": "e478f2709d8474165bb664de42e16950c391f30eaa55bc9b3573281d83a29daf", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_amd64.deb" + "key": "libp11-kit0_0.23.22-1_amd64", + "name": "libp11-kit0", + "sha256": "bfef5f31ee1c730e56e16bb62cc5ff8372185106c75bf1ed1756c96703019457", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_amd64.deb", + "version": "0.23.22-1" }, - "libgcc-s1_10.2.1-6_arm64": { - "arch": "arm64", + { + "arch": "amd64", "dependencies": [], - "name": "libgcc-s1", - "sha256": "e2fcdb378d3c1ad1bcb64d4fb6b37aab44011152beca12a4944f435a2582df1f", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_arm64.deb" + "key": "libffi7_3.3-6_amd64", + "name": "libffi7", + "sha256": "30ca89bfddae5fa6e0a2a044f22b6e50cd17c4bc6bc850c579819aeab7101f0f", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_amd64.deb", + "version": "3.3-6" }, - "libgcc-s1_10.2.1-6_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "libgcc-s1", - "sha256": "4cfff89c7f492090c5988298f9f9419d3464d294c43883800a2ed55676581d26", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_armhf.deb" + "key": "libnettle8_3.7.3-1_amd64", + "name": "libnettle8", + "sha256": "e4f8ec31ed14518b241eb7b423ad5ed3f4a4e8ac50aae72c9fd475c569582764", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_amd64.deb", + "version": "3.7.3-1" }, - "libgcc-s1_10.2.1-6_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "libgcc-s1", - "sha256": "8b612f798430a6dd8b8b5e8f712b7ea92329201c6a438a9d176e9e285f1c14d5", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_ppc64el.deb" + "key": "libidn2-0_2.3.0-5_amd64", + "name": "libidn2-0", + "sha256": "cb80cd769171537bafbb4a16c12ec427065795946b3415781bc9792e92d60b59", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_amd64.deb", + "version": "2.3.0-5" }, - "libgcc-s1_10.2.1-6_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "libgcc-s1", - "sha256": "129b6403af3832426f470a30a3f01a71725eb38b7b7a93de4480f56ae5393e22", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgcc-s1_10.2.1-6_s390x.deb" + "key": "libhogweed6_3.7.3-1_amd64", + "name": "libhogweed6", + "sha256": "6aab2e892cdb2dfba45707601bc6c3b19aa228f70ae5841017f14c3b0ca3d22f", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_amd64.deb", + "version": "3.7.3-1" }, - "libgomp1_10.2.1-6_amd64": { + { "arch": "amd64", "dependencies": [], - "name": "libgomp1", - "sha256": "4530c95aefa48e33fd8cf4acbe5c4b559dbe7bdf4c56469986c83a203982cef1", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_amd64.deb" + "key": "debian-archive-keyring_2021.1.1-p-deb11u1_amd64", + "name": "debian-archive-keyring", + "sha256": "28ca7749ab7978f3c571732c3aa1c56e3ad1d5db3c915293763d4f6cb8fcce89", + "url": "https://snapshot-cloudflare.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" }, - "libgomp1_10.2.1-6_arm64": { - "arch": "arm64", + { + "arch": "amd64", "dependencies": [], - "name": "libgomp1", - "sha256": "813af2e0b8ba0a7cea18c988cd843412ef6d0415700fc860d62816750e741670", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_arm64.deb" + "key": "libapt-pkg6.0_2.2.4_amd64", + "name": "libapt-pkg6.0", + "sha256": "4ae47bedf773ad1342e5aae8fa6275f864cfc87a45f4472775f5a9cdd60abbbf", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_amd64.deb", + "version": "2.2.4" }, - "libgomp1_10.2.1-6_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "libgomp1", - "sha256": "c046673580eef1ef3b2778c37c8baccbb5510195e8008f789b8309b38345abc0", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_armhf.deb" + "key": "libxxhash0_0.8.0-2_amd64", + "name": "libxxhash0", + "sha256": "3fb82550a71d27d05672472508548576dfb34486847bc860d3066cda5aaf186f", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_amd64.deb", + "version": "0.8.0-2" }, - "libgomp1_10.2.1-6_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", + "dependencies": [], + "key": "libudev1_247.3-7-p-deb11u4_amd64", + "name": "libudev1", + "sha256": "9274ca1aa37fcdf5895dad1de0895162351099ef8dff8a62f2f4c9eb181a8fce", + "url": "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": "adduser_3.118-p-deb11u1_amd64", + "name": "adduser", + "sha256": "1478a610fd50e190882ff41e16c57b628a508bcf5b5ac5313affb49d20818e0a", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/audit/libaudit1_3.0-2_amd64.deb", + "version": "1:3.0-2" + }, + { + "arch": "amd64", "dependencies": [], - "name": "libgomp1", - "sha256": "f4b1f093072bf65694a98432d108e5c62756c147f5e92e657021428dc602b9f4", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_ppc64el.deb" + "key": "libcap-ng0_0.7.9-2.2-p-b1_amd64", + "name": "libcap-ng0", + "sha256": "d34e29769b8ef23e9b9920814afb7905b8ee749db0814e6a8d937ccc4f309830", + "url": "https://snapshot-cloudflare.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" }, - "libgomp1_10.2.1-6_s390x": { - "arch": "s390x", + { + "arch": "amd64", + "dependencies": [], + "key": "libaudit-common_1-3.0-2_amd64", + "name": "libaudit-common", + "sha256": "0d52f4826a57aea13cea1a85bfae354024c7b2f7b95e39cd1ce225e4db27d0f6", + "url": "https://snapshot-cloudflare.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", + "url": "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", + "url": "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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": [], - "name": "libgomp1", - "sha256": "d836fcc5ba63095ed15efefee912c83902c7213f40b6aece73455c9348d5e462", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libgomp1_10.2.1-6_s390x.deb" + "key": "libkrb5-3_1.18.3-6-p-deb11u4_amd64", + "name": "libkrb5-3", + "sha256": "b785fa324cf27e6bf7f97fc0279470e6ce8a8cc54f8ccc6c9b24c8111ba5c952", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libkrb5-3_1.18.3-6+deb11u4_amd64.deb", + "version": "1.18.3-6+deb11u4" }, - "libssl1.1_1.1.1w-0-p-deb11u1_amd64": { + { "arch": "amd64", "dependencies": [], + "key": "libssl1.1_1.1.1w-0-p-deb11u1_amd64", "name": "libssl1.1", "sha256": "aadf8b4b197335645b230c2839b4517aa444fd2e8f434e5438c48a18857988f7", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_amd64.deb" + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_amd64.deb", + "version": "1.1.1w-0+deb11u1" }, - "libssl1.1_1.1.1w-0-p-deb11u1_arm64": { - "arch": "arm64", + { + "arch": "amd64", "dependencies": [], - "name": "libssl1.1", - "sha256": "fe7a7d313c87e46e62e614a07137e4a476a79fc9e5aab7b23e8235211280fee3", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_arm64.deb" + "key": "libkeyutils1_1.6.1-2_amd64", + "name": "libkeyutils1", + "sha256": "f01060b434d8cad3c58d5811d2082389f11b3db8152657d6c22c1d298953f2a5", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/keyutils/libkeyutils1_1.6.1-2_amd64.deb", + "version": "1.6.1-2" }, - "libssl1.1_1.1.1w-0-p-deb11u1_armhf": { - "arch": "armhf", + { + "arch": "amd64", "dependencies": [], - "name": "libssl1.1", - "sha256": "42130c140f972d938d4b4a5ab9638675e6d1223fcff3042bbcc1829e3646eb00", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_armhf.deb" + "key": "libk5crypto3_1.18.3-6-p-deb11u4_amd64", + "name": "libk5crypto3", + "sha256": "f635062bcbfe2eef5a83fcba7d1a8ae343fc7c779cae88b11cae90fd6845a744", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/k/krb5/libk5crypto3_1.18.3-6+deb11u4_amd64.deb", + "version": "1.18.3-6+deb11u4" }, - "libssl1.1_1.1.1w-0-p-deb11u1_ppc64el": { - "arch": "ppc64el", + { + "arch": "amd64", "dependencies": [], - "name": "libssl1.1", - "sha256": "a2f2744f068ba3c3edf7d77f53ea68f4215a727c83dee5ef869f159d2c0f199e", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_ppc64el.deb" + "key": "libcom-err2_1.46.2-2_amd64", + "name": "libcom-err2", + "sha256": "d478f132871f4ab8352d39becf936d0ad74db905398bf98465d8fe3da6fb1126", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/e/e2fsprogs/libcom-err2_1.46.2-2_amd64.deb", + "version": "1.46.2-2" }, - "libssl1.1_1.1.1w-0-p-deb11u1_s390x": { - "arch": "s390x", + { + "arch": "amd64", "dependencies": [], - "name": "libssl1.1", - "sha256": "b957b92959d956899608b21741b95cf50ed2098adf1e4f488ccf67e7cb158e68", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_s390x.deb" + "key": "libnsl2_1.3.0-2_amd64", + "name": "libnsl2", + "sha256": "c0d83437fdb016cb289436f49f28a36be44b3e8f1f2498c7e3a095f709c0d6f8", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libn/libnsl/libnsl2_1.3.0-2_amd64.deb", + "version": "1.3.0-2" }, - "libstdc-p--p-6_10.2.1-6_amd64": { + { "arch": "amd64", "dependencies": [], - "name": "libstdc++6", - "sha256": "5c155c58935870bf3b4bfe769116841c0d286a74f59eccfd5645693ac23f06b1", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_amd64.deb" + "key": "libdb5.3_5.3.28-p-dfsg1-0.8_amd64", + "name": "libdb5.3", + "sha256": "00b9e63e287f45300d4a4f59b6b88e25918443c932ae3e5845d5761ae193c530", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb", + "version": "3.1-1" + }, + { + "arch": "amd64", + "dependencies": [ + "libperl5.32_5.32.1-4-p-deb11u3_amd64", + "perl-modules-5.32_5.32.1-4-p-deb11u3_amd64", + "perl-base_5.32.1-4-p-deb11u3_amd64", + "libgdbm6_1.19-2_amd64", + "libgdbm-compat4_1.19-2_amd64" + ], + "key": "perl_5.32.1-4-p-deb11u3_amd64", + "name": "perl", + "sha256": "d5f710c7db9fcd6d9d6f119cd0dea64a4f765867447dd97b24ab44be1de7c60f", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "perl-base_5.32.1-4-p-deb11u3_amd64", + "name": "perl-base", + "sha256": "94c6299552866aadc58acb8ec5111a74b17bcb453f6e2f45ea5f7c4f42580d13", + "url": "https://snapshot-cloudflare.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": "libgdbm6_1.19-2_amd64", + "name": "libgdbm6", + "sha256": "e54cfe4d8b8f209bb7df31a404ce040f7c2f9b1045114a927a7e1061cdf90727", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_amd64.deb", + "version": "1.19-2" + }, + { + "arch": "arm64", + "dependencies": [], + "key": "ncurses-base_6.2-p-20201114-2-p-deb11u2_arm64", + "name": "ncurses-base", + "sha256": "a55a5f94299448279da6a6c2031a9816dc768cd300668ff82ecfc6480bbfc83d", + "url": "https://snapshot-cloudflare.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": [ + "libc6_2.31-13-p-deb11u8_arm64", + "libcrypt1_1-4.4.18-4_arm64", + "libgcc-s1_10.2.1-6_arm64", + "gcc-10-base_10.2.1-6_arm64", + "libtinfo6_6.2-p-20201114-2-p-deb11u2_arm64" + ], + "key": "libncurses6_6.2-p-20201114-2-p-deb11u2_arm64", + "name": "libncurses6", + "sha256": "039b71b8839538a92988003e13c29e7cf1149cdc6a77d3de882f1d386a5f3a5c", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/ncurses/libncurses6_6.2+20201114-2+deb11u2_arm64.deb", + "version": "6.2+20201114-2+deb11u2" }, - "libstdc-p--p-6_10.2.1-6_arm64": { + { "arch": "arm64", "dependencies": [], + "key": "libc6_2.31-13-p-deb11u8_arm64", + "name": "libc6", + "sha256": "6eb629090615ebda5dcac2365a7358c035add00b89c2724c2e9e13ccd5bd9f7c", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "tzdata_2024a-0-p-deb11u1_arm64", + "name": "tzdata", + "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb", + "version": "2024a-0+deb11u1" + }, + { + "arch": "arm64", + "dependencies": [ + "debianutils_4.11.2_arm64", + "base-files_11.1-p-deb11u9_arm64" + ], + "key": "bash_5.1-2-p-deb11u1_arm64", + "name": "bash", + "sha256": "d7c7af5d86f43a885069408a89788f67f248e8124c682bb73936f33874e0611b", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/b/base-files/base-files_11.1+deb11u9_arm64.deb", + "version": "11.1+deb11u9" + }, + { + "arch": "arm64", + "dependencies": [ + "libselinux1_3.1-3_arm64", + "libpcre2-8-0_10.36-2-p-deb11u1_arm64", + "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", + "libattr1_1-2.4.48-6_arm64", + "libacl1_2.2.53-10_arm64" + ], + "key": "coreutils_8.32-4_arm64", + "name": "coreutils", + "sha256": "6210c84d6ff84b867dc430f661f22f536e1704c27bdb79de38e26f75b853d9c0", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/c/coreutils/coreutils_8.32-4_arm64.deb", + "version": "8.32-4" + }, + { + "arch": "arm64", + "dependencies": [], + "key": "libselinux1_3.1-3_arm64", + "name": "libselinux1", + "sha256": "da98279a47dabaa46a83514142f5c691c6a71fa7e582661a3a3db6887ad3e9d1", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "libgmp10_2-6.2.1-p-dfsg-1-p-deb11u1_arm64", + "name": "libgmp10", + "sha256": "d52619b6ff8829aa5424dfe3189dd05f22118211e69273e9576030584ffcce80", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "libacl1_2.2.53-10_arm64", + "name": "libacl1", + "sha256": "f164c48192cb47746101de6c59afa3f97777c8fc821e5a30bb890df1f4cb4cfd", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/acl/libacl1_2.2.53-10_arm64.deb", + "version": "2.2.53-10" + }, + { + "arch": "arm64", + "dependencies": [ + "tar_1.34-p-dfsg-1-p-deb11u1_arm64", + "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", + "liblzma5_5.2.5-2.1~deb11u1_arm64", + "libbz2-1.0_1.0.8-4_arm64" + ], + "key": "dpkg_1.20.13_arm64", + "name": "dpkg", + "sha256": "87b0bce7361d94cc15caf27709fa8a70de44f9dd742cf0d69d25796a03d24853", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "zlib1g_1-1.2.11.dfsg-2-p-deb11u2_arm64", + "name": "zlib1g", + "sha256": "e3963985d1a020d67ffd4180e6f9c4b5c600b515f0c9d8fda513d7a0e48e63a1", + "url": "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", + "url": "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", + "url": "https://snapshot-cloudflare.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": [ + "libsystemd0_247.3-7-p-deb11u4_arm64", + "libzstd1_1.4.8-p-dfsg-2.1_arm64", + "liblz4-1_1.9.3-2_arm64", + "libgcrypt20_1.8.7-6_arm64", + "libgpg-error0_1.38-2_arm64", + "libstdc-p--p-6_10.2.1-6_arm64", + "libseccomp2_2.5.1-1-p-deb11u1_arm64", + "libgnutls30_3.7.1-5-p-deb11u4_arm64", + "libunistring2_0.9.10-4_arm64", + "libtasn1-6_4.16.0-2-p-deb11u1_arm64", + "libp11-kit0_0.23.22-1_arm64", + "libffi7_3.3-6_arm64", + "libnettle8_3.7.3-1_arm64", + "libidn2-0_2.3.0-5_arm64", + "libhogweed6_3.7.3-1_arm64", + "debian-archive-keyring_2021.1.1-p-deb11u1_arm64", + "libapt-pkg6.0_2.2.4_arm64", + "libxxhash0_0.8.0-2_arm64", + "libudev1_247.3-7-p-deb11u4_arm64", + "adduser_3.118-p-deb11u1_arm64", + "passwd_1-4.8.1-1_arm64", + "libpam-modules_1.4.0-9-p-deb11u1_arm64", + "libpam-modules-bin_1.4.0-9-p-deb11u1_arm64", + "libpam0g_1.4.0-9-p-deb11u1_arm64", + "libaudit1_1-3.0-2_arm64", + "libcap-ng0_0.7.9-2.2-p-b1_arm64", + "libaudit-common_1-3.0-2_arm64", + "libtirpc3_1.3.1-1-p-deb11u1_arm64", + "libtirpc-common_1.3.1-1-p-deb11u1_arm64", + "libgssapi-krb5-2_1.18.3-6-p-deb11u4_arm64", + "libkrb5support0_1.18.3-6-p-deb11u4_arm64", + "libkrb5-3_1.18.3-6-p-deb11u4_arm64", + "libssl1.1_1.1.1w-0-p-deb11u1_arm64", + "libkeyutils1_1.6.1-2_arm64", + "libk5crypto3_1.18.3-6-p-deb11u4_arm64", + "libcom-err2_1.46.2-2_arm64", + "libnsl2_1.3.0-2_arm64", + "libdb5.3_5.3.28-p-dfsg1-0.8_arm64", + "libsemanage1_3.1-1-p-b2_arm64", + "libsepol1_3.1-1_arm64", + "libsemanage-common_3.1-1_arm64" + ], + "key": "apt_2.2.4_arm64", + "name": "apt", + "sha256": "39cbe42f3e64c6359b445d6fed7385273881e507b8be1d3b653ec9fb7d4c917c", + "url": "https://snapshot-cloudflare.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", + "url": "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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_arm64.deb" + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_arm64.deb", + "version": "10.2.1-6" }, - "libstdc-p--p-6_10.2.1-6_armhf": { - "arch": "armhf", + { + "arch": "arm64", "dependencies": [], - "name": "libstdc++6", - "sha256": "879258df2ac36d9733df014c5a5443944e1a5c4ba9a7eebe5dd28547b4ebb541", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_armhf.deb" + "key": "libseccomp2_2.5.1-1-p-deb11u1_arm64", + "name": "libseccomp2", + "sha256": "5b8983c2e330790dbe04ae990f166d7939a3e14b75556a8489309ae704fbeb50", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libseccomp/libseccomp2_2.5.1-1+deb11u1_arm64.deb", + "version": "2.5.1-1+deb11u1" }, - "libstdc-p--p-6_10.2.1-6_ppc64el": { - "arch": "ppc64el", + { + "arch": "arm64", "dependencies": [], - "name": "libstdc++6", - "sha256": "cda71acea3aba81ccb555f7b2355a6a3944b0f09049945a351d8e7682058daa9", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_ppc64el.deb" + "key": "libgnutls30_3.7.1-5-p-deb11u4_arm64", + "name": "libgnutls30", + "sha256": "7153ec6ee985eebba710dcb6e425bb881c91ee5987a4517518f3f44a9bb5fc1a", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gnutls28/libgnutls30_3.7.1-5+deb11u4_arm64.deb", + "version": "3.7.1-5+deb11u4" }, - "libstdc-p--p-6_10.2.1-6_s390x": { - "arch": "s390x", + { + "arch": "arm64", "dependencies": [], - "name": "libstdc++6", - "sha256": "d632c1fc45ab0ef8bc9c8cbbc9436dd82340bf0c1e44bd8b791662057ef05505", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gcc-10/libstdc++6_10.2.1-6_s390x.deb" + "key": "libunistring2_0.9.10-4_arm64", + "name": "libunistring2", + "sha256": "53ff395ea4d8cf17c52155a452a0dc15af0ee2fa5cb3b0085b9c7335de8d5f7f", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libu/libunistring/libunistring2_0.9.10-4_arm64.deb", + "version": "0.9.10-4" }, - "netbase_6.3_amd64": { - "arch": "amd64", + { + "arch": "arm64", "dependencies": [], - "name": "netbase", - "sha256": "f444889ad3441758e3a5092418e062da2b0c6a811fdb0c262a6b70cb2518dbde", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/netbase/netbase_6.3_all.deb" + "key": "libtasn1-6_4.16.0-2-p-deb11u1_arm64", + "name": "libtasn1-6", + "sha256": "f469147bbd3969055c51fc661c9aa0d56d48eccd070d233f1424b0d8b3f29295", + "url": "https://snapshot-cloudflare.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" }, - "netbase_6.3_arm64": { + { "arch": "arm64", "dependencies": [], - "name": "netbase", - "sha256": "f444889ad3441758e3a5092418e062da2b0c6a811fdb0c262a6b70cb2518dbde", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/netbase/netbase_6.3_all.deb" + "key": "libp11-kit0_0.23.22-1_arm64", + "name": "libp11-kit0", + "sha256": "ac6e8eda3277708069bc6f03aff06dc319855d64ede9fca219938e52f92ee09c", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/p11-kit/libp11-kit0_0.23.22-1_arm64.deb", + "version": "0.23.22-1" }, - "netbase_6.3_armhf": { - "arch": "armhf", + { + "arch": "arm64", "dependencies": [], - "name": "netbase", - "sha256": "f444889ad3441758e3a5092418e062da2b0c6a811fdb0c262a6b70cb2518dbde", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/netbase/netbase_6.3_all.deb" + "key": "libffi7_3.3-6_arm64", + "name": "libffi7", + "sha256": "eb748e33ae4ed46f5a4c14b7a2a09792569f2029ede319d0979c373829ba1532", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libf/libffi/libffi7_3.3-6_arm64.deb", + "version": "3.3-6" }, - "netbase_6.3_ppc64el": { - "arch": "ppc64el", + { + "arch": "arm64", "dependencies": [], - "name": "netbase", - "sha256": "f444889ad3441758e3a5092418e062da2b0c6a811fdb0c262a6b70cb2518dbde", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/netbase/netbase_6.3_all.deb" + "key": "libnettle8_3.7.3-1_arm64", + "name": "libnettle8", + "sha256": "5061c931f95dc7277d95fc58bce7c17b1a95c6aa9a9aac781784f3b3dc909047", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libnettle8_3.7.3-1_arm64.deb", + "version": "3.7.3-1" }, - "netbase_6.3_s390x": { - "arch": "s390x", + { + "arch": "arm64", "dependencies": [], - "name": "netbase", - "sha256": "f444889ad3441758e3a5092418e062da2b0c6a811fdb0c262a6b70cb2518dbde", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/netbase/netbase_6.3_all.deb" + "key": "libidn2-0_2.3.0-5_arm64", + "name": "libidn2-0", + "sha256": "0d2e6d39bf65f16861f284be567c1a6c5d4dc6b54dcfdf9dba631546ff4e6796", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libi/libidn2/libidn2-0_2.3.0-5_arm64.deb", + "version": "2.3.0-5" }, - "openssl_1.1.1w-0-p-deb11u1_amd64": { - "arch": "amd64", + { + "arch": "arm64", "dependencies": [], - "name": "openssl", - "sha256": "04873d74cbe86bad3a9901f6e57f1150040eba9891b443c5c975a72a97238e35", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_amd64.deb" + "key": "libhogweed6_3.7.3-1_arm64", + "name": "libhogweed6", + "sha256": "3e9eea5e474dd98a7de9e4c1ecfbfd6f6efb1d40bf51d6473de9713cf41d2191", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/n/nettle/libhogweed6_3.7.3-1_arm64.deb", + "version": "3.7.3-1" }, - "openssl_1.1.1w-0-p-deb11u1_arm64": { + { "arch": "arm64", "dependencies": [], - "name": "openssl", - "sha256": "d9159af073e95641e7eda440fa1d7623873b8c0034c9826a353f890bed107f3c", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_arm64.deb" + "key": "debian-archive-keyring_2021.1.1-p-deb11u1_arm64", + "name": "debian-archive-keyring", + "sha256": "28ca7749ab7978f3c571732c3aa1c56e3ad1d5db3c915293763d4f6cb8fcce89", + "url": "https://snapshot-cloudflare.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" }, - "openssl_1.1.1w-0-p-deb11u1_armhf": { - "arch": "armhf", + { + "arch": "arm64", "dependencies": [], - "name": "openssl", - "sha256": "4cad3a65f247788956d32d5b12da16b1779fd6eec455aa52d953c9251c6ab949", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_armhf.deb" + "key": "libapt-pkg6.0_2.2.4_arm64", + "name": "libapt-pkg6.0", + "sha256": "7cb6015ea5c185ef93706989fb730377406878c72f6943b6ecdd956697f1abe6", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/apt/libapt-pkg6.0_2.2.4_arm64.deb", + "version": "2.2.4" }, - "openssl_1.1.1w-0-p-deb11u1_ppc64el": { - "arch": "ppc64el", + { + "arch": "arm64", "dependencies": [], - "name": "openssl", - "sha256": "9c1fe0a214a8467e931b2004daf0d9147cbf532a5e009980e7aee22e59db0359", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_ppc64el.deb" + "key": "libxxhash0_0.8.0-2_arm64", + "name": "libxxhash0", + "sha256": "a31effcbd7a248b64dd480330557f41ea796a010b2c2e7ac91ed10f94e605065", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/x/xxhash/libxxhash0_0.8.0-2_arm64.deb", + "version": "0.8.0-2" }, - "openssl_1.1.1w-0-p-deb11u1_s390x": { - "arch": "s390x", + { + "arch": "arm64", "dependencies": [], - "name": "openssl", - "sha256": "3320cc9eea439c623016fc2e023c5fa3b2685f940e2a4a226bf4c75789f27e56", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/o/openssl/openssl_1.1.1w-0+deb11u1_s390x.deb" + "key": "libudev1_247.3-7-p-deb11u4_arm64", + "name": "libudev1", + "sha256": "d53ca63927b51ad6f9a85ee1e4ce74d20ef45651179fd70f3c8d72607071e393", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/systemd/libudev1_247.3-7+deb11u4_arm64.deb", + "version": "247.3-7+deb11u4" }, - "tzdata_2024a-0-p-deb11u1_amd64": { - "arch": "amd64", + { + "arch": "arm64", "dependencies": [], - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" + "key": "adduser_3.118-p-deb11u1_arm64", + "name": "adduser", + "sha256": "1478a610fd50e190882ff41e16c57b628a508bcf5b5ac5313affb49d20818e0a", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/a/adduser/adduser_3.118+deb11u1_all.deb", + "version": "3.118+deb11u1" }, - "tzdata_2024a-0-p-deb11u1_arm64": { + { "arch": "arm64", "dependencies": [], - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" + "key": "passwd_1-4.8.1-1_arm64", + "name": "passwd", + "sha256": "5a675c9d23f176ea195678a949e144b23c7a8b268b03e0df8919a2cfc198e585", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/s/shadow/passwd_4.8.1-1_arm64.deb", + "version": "1:4.8.1-1" }, - "tzdata_2024a-0-p-deb11u1_armhf": { - "arch": "armhf", + { + "arch": "arm64", "dependencies": [], - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" + "key": "libpam-modules_1.4.0-9-p-deb11u1_arm64", + "name": "libpam-modules", + "sha256": "7f46ae216fdc6c69b0120d430936f40f3c5f37249296042324aeb584d5566a3c", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/p/pam/libpam-modules_1.4.0-9+deb11u1_arm64.deb", + "version": "1.4.0-9+deb11u1" }, - "tzdata_2024a-0-p-deb11u1_ppc64el": { - "arch": "ppc64el", + { + "arch": "arm64", "dependencies": [], - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" + "key": "libpam-modules-bin_1.4.0-9-p-deb11u1_arm64", + "name": "libpam-modules-bin", + "sha256": "bc20fa16c91a239de350ffcc019fbae5ce7c47c21235b332ff9d67638804866e", + "url": "https://snapshot-cloudflare.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" }, - "tzdata_2024a-0-p-deb11u1_s390x": { - "arch": "s390x", + { + "arch": "arm64", "dependencies": [], - "name": "tzdata", - "sha256": "13befffb7ee127f569af92d736e30c86c199bbd58f9c3cca0d071ed63e04d003", - "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/t/tzdata/tzdata_2024a-0+deb11u1_all.deb" + "key": "libpam0g_1.4.0-9-p-deb11u1_arm64", + "name": "libpam0g", + "sha256": "4905e523ce38e80b79f13f0227fca519f6833eb116dd9c58cbbecb39c0e01e3d", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "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", + "url": "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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/libs/libsemanage/libsemanage-common_3.1-1_all.deb", + "version": "3.1-1" + }, + { + "arch": "arm64", + "dependencies": [ + "libperl5.32_5.32.1-4-p-deb11u3_arm64", + "perl-modules-5.32_5.32.1-4-p-deb11u3_arm64", + "perl-base_5.32.1-4-p-deb11u3_arm64", + "libgdbm6_1.19-2_arm64", + "libgdbm-compat4_1.19-2_arm64" + ], + "key": "perl_5.32.1-4-p-deb11u3_arm64", + "name": "perl", + "sha256": "6ed36a59241bbeec132eebec770567a4d23884f71dc922ac6770862cac1f3d9a", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.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": "perl-base_5.32.1-4-p-deb11u3_arm64", + "name": "perl-base", + "sha256": "53e09d9594692c462f33d4e9394bff60f95fe74b70402772dc7396a5829b76e5", + "url": "https://snapshot-cloudflare.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": "libgdbm6_1.19-2_arm64", + "name": "libgdbm6", + "sha256": "97a88c2698bd836d04e51ad70c76826850857869b51e90b5343621ba30bbf525", + "url": "https://snapshot-cloudflare.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", + "url": "https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z/pool/main/g/gdbm/libgdbm-compat4_1.19-2_arm64.deb", + "version": "1.19-2" } - }, + ], "version": 1 } diff --git a/examples/apt/bullseye.yaml b/examples/apt/bullseye.yaml index 6a96330..b67e516 100644 --- a/examples/apt/bullseye.yaml +++ b/examples/apt/bullseye.yaml @@ -1,31 +1,33 @@ -# Packages for bullseye +# Packages for examples/apt. +# +# 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 url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: bookworm-updates main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: bookworm-security main + - 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 archs: - "amd64" - "arm64" - - "armhf" - - "s390x" - - "ppc64el" packages: - - "base-files" - - "ca-certificates" - - "libc6" - - "libc-bin" - - "libssl1.1" - - "netbase" - - "openssl" + - "ncurses-base" + - "libncurses6" - "tzdata" - # c++ - - "libgcc-s1" - - "libgomp1" - - "libstdc++6" + - "bash" + - "coreutils" # for commands like `ls` + # for apt list --installed + - "dpkg" + - "apt" + - "perl" diff --git a/examples/apt/test.yaml b/examples/apt/test.yaml new file mode 100644 index 0000000..73a4fc3 --- /dev/null +++ b/examples/apt/test.yaml @@ -0,0 +1,23 @@ +schemaVersion: "2.0.0" + +commandTests: + - name: "echo hello" + command: "/bin/bash" + args: ["-c", "echo hello world!"] + expectedOutput: ["hello world!"] + - name: "apt list --installed" + command: "apt" + args: ["list", "--installed"] + expectedOutput: + - Listing\.\.\. + - apt/now 2\.2\.4 arm64 \[installed,local\] + - bash/now 5\.1-2\+deb11u1 arm64 \[installed,local\] + - coreutils/now 8\.32-4 arm64 \[installed,local\] + - dpkg/now 1\.20\.13 arm64 \[installed,local\] + - libncurses6/now 6\.2\+20201114-2\+deb11u2 arm64 \[installed,local\] + - ncurses-base/now 6\.2\+20201114-2\+deb11u2 all \[installed,local\] + - perl/now 5\.32\.1-4\+deb11u3 arm64 \[installed,local\] + - tzdata/now 2024a-0\+deb11u1 all \[installed,local\] + - name: "whoami" + command: "whoami" + expectedOutput: [r00t] diff --git a/examples/apt/trixie.lock.json b/examples/apt/trixie.lock.json deleted file mode 100755 index 796ef91..0000000 --- a/examples/apt/trixie.lock.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "packages": {}, - "version": 1 -} diff --git a/examples/apt/trixie.yaml b/examples/apt/trixie.yaml deleted file mode 100644 index 2a5ee22..0000000 --- a/examples/apt/trixie.yaml +++ /dev/null @@ -1,15 +0,0 @@ -# Packages for trixie -version: 1 - -sources: - - channel: trixie main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: trixie-updates main - url: https://snapshot-cloudflare.debian.org/archive/debian/20240210T223313Z - - channel: trixie-security main - url: https://snapshot-cloudflare.debian.org/archive/debian-security/20240210T223313Z - -archs: - - amd64 - -packages: [] diff --git a/examples/statusd/BUILD.bazel b/examples/statusd/BUILD.bazel new file mode 100644 index 0000000..c389d5b --- /dev/null +++ b/examples/statusd/BUILD.bazel @@ -0,0 +1,19 @@ +# buildifier: disable=bzl-visibility +load("//apt:defs.bzl", "dpkg_statusd") +load("//distroless/tests:asserts.bzl", "assert_tar_listing") + +dpkg_statusd( + name = "statusd", + package_name = "ca-certificates", + control = "@example-bullseye-ca-certificates//:control.tar.xz", +) + +assert_tar_listing( + name = "test_statusd", + actual = "statusd", + expected = """\ +#mtree +./var/lib/dpkg/status.d/ca-certificates/control time=1611051064.0 mode=644 gid=0 uid=0 type=file size=793 sha1digest=214a8bc9b7e7ce33fbd2e08b0b01aa5e2b717495 +./var/lib/dpkg/status.d/ca-certificates/md5sums time=1611051064.0 mode=644 gid=0 uid=0 type=file size=14644 sha1digest=80ae4d6a7dbfeefd6e16ccab344671c6f7426422 +""", +)