From 15f37d3f4362b64f8b597e562b84d93831000b92 Mon Sep 17 00:00:00 2001 From: Packit Service Date: Mar 19 2021 04:24:11 +0000 Subject: osbuild-composer-28.1 base --- diff --git a/NEWS.md b/NEWS.md index f6af8f1..63ad12c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,35 @@ # OSBuild Composer - Operating System Image Composition Services +## CHANGES WITH 28.1: + +* OSBuild Composer can now generate Manifests that conform to the new OSBuild + schema. Two new image types are added that take advantage of the new schema: + + * `rhel-edge-container`: Creates an OCI container with an embedded + `rhel-edge-commit`. Running the container starts a web server that + serves the commit. + + * `rhel-edge-installer`: Creates a boot ISO image that embeds a + `rhel-edge-commit`. The commit is pulled from a URL during the compose + of the boot ISO. + + Requesting a `rhel-edge-installer` requires specifying a URL, otherwise the + request will fail. Blueprint customizations have no effect on the boot ISO + and also cause the request to fail if any are specified. + +* RHEL 8.4: By marking the kernel we install as the `saved_entry`, we make + sure that installing additional/subsequent kernels do not unintentienally + change the default kernel to be booted into. + +* RHEL 8.4: The default language is now correctly set to en_US.UTF-8 instead + of en_US. + +Contributions from: Achilleas Koutsou, Aleksandar Todorov, Brian C. Lane, + Christian Kellner, David Rheinsberg, Ondřej Budai, + Tom Gundersen, Xiaofeng Wang + +— Liberec, 2021-03-17 + ## CHANGES WITH 28: * OSBuild Composer can now build CentOS Stream 8 images! diff --git a/README.md b/README.md index 1eb7630..03da623 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ provided infrastructure and services. The requirements for this project are: - * `osbuild >= 24` + * `osbuild >= 26` * `systemd >= 244` At build-time, the following software is required: diff --git a/Schutzfile b/Schutzfile index 2509798..85b0223 100644 --- a/Schutzfile +++ b/Schutzfile @@ -20,5 +20,19 @@ ] } } + }, + "rhel-8.4": { + "dependencies": { + "osbuild": { + "commit": "5de2d3f96bd4841738846d5e4f1e0e4ed01e7a2a" + } + } + }, + "centos-8": { + "dependencies": { + "osbuild": { + "commit": "e4e527b5b7cdf8bb6e48a6ec3ace7d9d9b155bc0" + } + } } } diff --git a/cmd/osbuild-composer-cli-tests/main_test.go b/cmd/osbuild-composer-cli-tests/main_test.go index 315c8ee..d35a027 100644 --- a/cmd/osbuild-composer-cli-tests/main_test.go +++ b/cmd/osbuild-composer-cli-tests/main_test.go @@ -5,10 +5,12 @@ package main import ( "bytes" "encoding/json" + "fmt" "io/ioutil" "log" "os" "os/exec" + "strings" "time" "github.com/BurntSushi/toml" @@ -287,9 +289,12 @@ func deleteBlueprint(t *testing.T, bp *blueprint.Blueprint) { } func runComposer(t *testing.T, command ...string) []byte { + fmt.Printf("Running composer-cli %s\n", strings.Join(command, " ")) cmd := exec.Command("composer-cli", command...) stdout, err := cmd.StdoutPipe() require.Nilf(t, err, "Could not create command: %v", err) + stderr, err := cmd.StderrPipe() + require.Nilf(t, err, "Could not create command: %v", err) err = cmd.Start() require.Nilf(t, err, "Could not start command: %v", err) @@ -297,8 +302,11 @@ func runComposer(t *testing.T, command ...string) []byte { contents, err := ioutil.ReadAll(stdout) require.NoError(t, err, "Could not read stdout from command") + errcontents, err := ioutil.ReadAll(stderr) + require.NoError(t, err, "Could not read stderr from command") + err = cmd.Wait() - require.NoErrorf(t, err, "Command failed: %v", err) + require.NoErrorf(t, err, "Command failed (%v): %v", err, string(errcontents)) return contents } diff --git a/cmd/osbuild-dnf-json-tests/main_test.go b/cmd/osbuild-dnf-json-tests/main_test.go index f2f3459..46b1af9 100644 --- a/cmd/osbuild-dnf-json-tests/main_test.go +++ b/cmd/osbuild-dnf-json-tests/main_test.go @@ -80,12 +80,12 @@ func TestCrossArchDepsolve(t *testing.T) { imgType, err := arch.GetImageType(imgTypeStr) require.NoError(t, err) - buildPackages := imgType.BuildPackages() - _, _, err = rpm.Depsolve(buildPackages, []string{}, repos[archStr], distroStruct.ModulePlatformID(), archStr) + packages := imgType.PackageSets(blueprint.Blueprint{}) + + _, _, err = rpm.Depsolve(packages["build-packages"], repos[archStr], distroStruct.ModulePlatformID(), archStr) assert.NoError(t, err) - basePackagesInclude, basePackagesExclude := imgType.Packages(blueprint.Blueprint{}) - _, _, err = rpm.Depsolve(basePackagesInclude, basePackagesExclude, repos[archStr], distroStruct.ModulePlatformID(), archStr) + _, _, err = rpm.Depsolve(packages["packages"], repos[archStr], distroStruct.ModulePlatformID(), archStr) assert.NoError(t, err) }) } diff --git a/cmd/osbuild-image-tests/constants/constants.go b/cmd/osbuild-image-tests/constants/constants.go index 0e54bbf..91f8ed0 100644 --- a/cmd/osbuild-image-tests/constants/constants.go +++ b/cmd/osbuild-image-tests/constants/constants.go @@ -4,14 +4,18 @@ package constants import "os/exec" -func GetOsbuildCommand(store, outputDirectory string) *exec.Cmd { - return exec.Command( +func GetOsbuildCommand(store, outputDirectory string, exports []string) *exec.Cmd { + cmd := exec.Command( "osbuild", "--store", store, "--output-directory", outputDirectory, "--json", "-", ) + for _, export := range exports { + cmd.Args = append(cmd.Args, "--export", export) + } + return cmd } func GetImageInfoCommand(imagePath string) *exec.Cmd { diff --git a/cmd/osbuild-image-tests/main_test.go b/cmd/osbuild-image-tests/main_test.go index 020d0c6..a115a08 100644 --- a/cmd/osbuild-image-tests/main_test.go +++ b/cmd/osbuild-image-tests/main_test.go @@ -14,6 +14,7 @@ import ( "os" "os/exec" "path" + "path/filepath" "strings" "testing" "time" @@ -50,8 +51,8 @@ var disableLocalBoot = flag.Bool("disable-local-boot", false, "when this flag is var failLocalBoot = flag.Bool("fail-local-boot", true, "when this flag is on (default), local boot will fail. Usually indicates missing cloud credentials") // runOsbuild runs osbuild with the specified manifest and output-directory. -func runOsbuild(manifest []byte, store, outputDirectory string) error { - cmd := constants.GetOsbuildCommand(store, outputDirectory) +func runOsbuild(manifest []byte, store, outputDirectory string, exports []string) error { + cmd := constants.GetOsbuildCommand(store, outputDirectory, exports) cmd.Stdin = bytes.NewReader(manifest) var outBuffer bytes.Buffer @@ -466,12 +467,16 @@ func runTestcase(t *testing.T, testcase testcaseStruct, store string) { require.NoError(t, err, "error removing temporary output directory") }() - err = runOsbuild(testcase.Manifest, store, outputDirectory) + // NOTE(akoutsou) 1to2t: new v2 manifests name their last pipeline + // "assembler" for compatibility with v1 + exports := []string{"assembler"} + err = runOsbuild(testcase.Manifest, store, outputDirectory, exports) require.NoError(t, err) - imagePath := fmt.Sprintf("%s/%s", outputDirectory, testcase.ComposeRequest.Filename) - - testImage(t, testcase, imagePath) + for _, export := range exports { + imagePath := filepath.Join(outputDirectory, export, testcase.ComposeRequest.Filename) + testImage(t, testcase, imagePath) + } } // getAllCases returns paths to all testcases in the testcase directory diff --git a/cmd/osbuild-pipeline/main.go b/cmd/osbuild-pipeline/main.go index 0d98e35..00866e0 100644 --- a/cmd/osbuild-pipeline/main.go +++ b/cmd/osbuild-pipeline/main.go @@ -35,12 +35,6 @@ type composeRequest struct { Repositories []repository `json:"repositories"` } -type rpmMD struct { - BuildPackages []rpmmd.PackageSpec `json:"build-packages"` - Packages []rpmmd.PackageSpec `json:"packages"` - Checksums map[string]string `json:"checksums"` -} - func main() { var rpmmdArg bool flag.BoolVar(&rpmmdArg, "rpmmd", false, "output rpmmd struct instead of pipeline manifest") @@ -117,33 +111,27 @@ func main() { } } - packages, excludePkgs := imageType.Packages(composeRequest.Blueprint) + packageSets := imageType.PackageSets(composeRequest.Blueprint) home, err := os.UserHomeDir() if err != nil { panic("os.UserHomeDir(): " + err.Error()) } - rpmmd := rpmmd.NewRPMMD(path.Join(home, ".cache/osbuild-composer/rpmmd"), "/usr/libexec/osbuild-composer/dnf-json") - packageSpecs, checksums, err := rpmmd.Depsolve(packages, excludePkgs, repos, d.ModulePlatformID(), arch.Name()) - if err != nil { - panic("Could not depsolve: " + err.Error()) - } + rpm_md := rpmmd.NewRPMMD(path.Join(home, ".cache/osbuild-composer/rpmmd"), "/usr/libexec/osbuild-composer/dnf-json") - buildPkgs := imageType.BuildPackages() - buildPackageSpecs, _, err := rpmmd.Depsolve(buildPkgs, nil, repos, d.ModulePlatformID(), arch.Name()) - if err != nil { - panic("Could not depsolve build packages: " + err.Error()) + packageSpecSets := make(map[string][]rpmmd.PackageSpec) + for name, packages := range packageSets { + packageSpecs, _, err := rpm_md.Depsolve(packages, repos, d.ModulePlatformID(), arch.Name()) + if err != nil { + panic("Could not depsolve: " + err.Error()) + } + packageSpecSets[name] = packageSpecs } var bytes []byte if rpmmdArg { - rpmMDInfo := rpmMD{ - BuildPackages: buildPackageSpecs, - Packages: packageSpecs, - Checksums: checksums, - } - bytes, err = json.Marshal(rpmMDInfo) + bytes, err = json.Marshal(packageSpecSets) if err != nil { panic(err) } @@ -151,10 +139,12 @@ func main() { manifest, err := imageType.Manifest(composeRequest.Blueprint.Customizations, distro.ImageOptions{ Size: imageType.Size(0), + OSTree: distro.OSTreeImageOptions{ + Ref: imageType.OSTreeRef(), // use default OSTreeRef for image type + }, }, repos, - packageSpecs, - buildPackageSpecs, + packageSpecSets, seedArg) if err != nil { panic(err.Error()) diff --git a/cmd/osbuild-store-dump/main.go b/cmd/osbuild-store-dump/main.go index a1c381f..290ffb3 100644 --- a/cmd/osbuild-store-dump/main.go +++ b/cmd/osbuild-store-dump/main.go @@ -16,17 +16,17 @@ import ( "github.com/osbuild/osbuild-composer/internal/target" ) -func getManifest(bp blueprint.Blueprint, t distro.ImageType, a distro.Arch, d distro.Distro, rpmmd rpmmd.RPMMD, repos []rpmmd.RepoConfig) distro.Manifest { - packages, excludePackages := t.Packages(bp) - pkgs, _, err := rpmmd.Depsolve(packages, excludePackages, repos, d.ModulePlatformID(), a.Name()) - if err != nil { - panic(err) - } - buildPkgs, _, err := rpmmd.Depsolve(t.BuildPackages(), nil, repos, d.ModulePlatformID(), a.Name()) - if err != nil { - panic(err) - } - manifest, err := t.Manifest(bp.Customizations, distro.ImageOptions{}, repos, pkgs, buildPkgs, 0) +func getManifest(bp blueprint.Blueprint, t distro.ImageType, a distro.Arch, d distro.Distro, rpm_md rpmmd.RPMMD, repos []rpmmd.RepoConfig) distro.Manifest { + packageSets := t.PackageSets(bp) + pkgSpecSets := make(map[string][]rpmmd.PackageSpec) + for name, packages := range packageSets { + pkgs, _, err := rpm_md.Depsolve(packages, repos, d.ModulePlatformID(), a.Name()) + if err != nil { + panic(err) + } + pkgSpecSets[name] = pkgs + } + manifest, err := t.Manifest(bp.Customizations, distro.ImageOptions{}, repos, pkgSpecSets, 0) if err != nil { panic(err) } diff --git a/cmd/osbuild-worker/jobimpl-osbuild-koji.go b/cmd/osbuild-worker/jobimpl-osbuild-koji.go index 545546b..e23ee46 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild-koji.go +++ b/cmd/osbuild-worker/jobimpl-osbuild-koji.go @@ -85,8 +85,9 @@ func (impl *OSBuildKojiJobImpl) Run(job worker.Job) error { return err } + exports := []string{"assembler"} // NOTE: Koji API doesn't support new image types yet if initArgs.KojiError == "" { - result.OSBuildOutput, err = RunOSBuild(args.Manifest, impl.Store, outputDirectory, os.Stderr) + result.OSBuildOutput, err = RunOSBuild(args.Manifest, impl.Store, outputDirectory, exports, os.Stderr) if err != nil { return err } diff --git a/cmd/osbuild-worker/jobimpl-osbuild.go b/cmd/osbuild-worker/jobimpl-osbuild.go index c6f0e1e..49ed78d 100644 --- a/cmd/osbuild-worker/jobimpl-osbuild.go +++ b/cmd/osbuild-worker/jobimpl-osbuild.go @@ -14,7 +14,7 @@ import ( "github.com/google/uuid" "github.com/osbuild/osbuild-composer/internal/common" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/target" "github.com/osbuild/osbuild-composer/internal/upload/awsupload" "github.com/osbuild/osbuild-composer/internal/upload/azure" @@ -80,9 +80,19 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { return err } + exports := args.Exports + if len(exports) == 0 { + // job did not define exports, likely coming from an older version of composer + // fall back to default "assembler" + exports = []string{"assembler"} + } else if len(exports) > 1 { + // this worker only supports returning one (1) export + return fmt.Errorf("at most one build artifact can be exported") + } + start_time := time.Now() - osbuildOutput, err := RunOSBuild(args.Manifest, impl.Store, outputDirectory, os.Stderr) + osbuildOutput, err := RunOSBuild(args.Manifest, impl.Store, outputDirectory, exports, os.Stderr) if err != nil { return err } @@ -91,9 +101,13 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { streamOptimizedPath := "" + // NOTE: Currently OSBuild supports multiple exports, but this isn't used + // by any of the image types and it can't be specified during the request. + // Use the first (and presumably only) export for the imagePath. + exportPath := exports[0] if osbuildOutput.Success && args.ImageName != "" { var f *os.File - imagePath := path.Join(outputDirectory, args.ImageName) + imagePath := path.Join(outputDirectory, exportPath, args.ImageName) if args.StreamOptimized { f, err = vmware.OpenAsStreamOptimizedVmdk(imagePath) if err != nil { @@ -121,7 +135,7 @@ func (impl *OSBuildJobImpl) Run(job worker.Job) error { continue } var f *os.File - imagePath := path.Join(outputDirectory, options.Filename) + imagePath := path.Join(outputDirectory, exportPath, options.Filename) if options.StreamOptimized { f, err = vmware.OpenAsStreamOptimizedVmdk(imagePath) if err != nil { diff --git a/cmd/osbuild-worker/main_test.go b/cmd/osbuild-worker/main_test.go index de21571..3d7ee15 100644 --- a/cmd/osbuild-worker/main_test.go +++ b/cmd/osbuild-worker/main_test.go @@ -2,7 +2,7 @@ package main import ( "encoding/json" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/upload/koji" "github.com/stretchr/testify/require" "testing" diff --git a/cmd/osbuild-worker/osbuild.go b/cmd/osbuild-worker/osbuild.go index eb64beb..3e61e32 100644 --- a/cmd/osbuild-worker/osbuild.go +++ b/cmd/osbuild-worker/osbuild.go @@ -8,7 +8,7 @@ import ( "os/exec" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" ) // Run an instance of osbuild, returning a parsed osbuild.Result. @@ -16,13 +16,17 @@ import ( // Note that osbuild returns non-zero when the pipeline fails. This function // does not return an error in this case. Instead, the failure is communicated // with its corresponding logs through osbuild.Result. -func RunOSBuild(manifest distro.Manifest, store, outputDirectory string, errorWriter io.Writer) (*osbuild.Result, error) { +func RunOSBuild(manifest distro.Manifest, store, outputDirectory string, exports []string, errorWriter io.Writer) (*osbuild.Result, error) { cmd := exec.Command( "osbuild", "--store", store, "--output-directory", outputDirectory, "--json", "-", ) + + for _, export := range exports { + cmd.Args = append(cmd.Args, "--export", export) + } cmd.Stderr = errorWriter stdin, err := cmd.StdinPipe() diff --git a/docs/news/28.1/osbuild-schema-2.md b/docs/news/28.1/osbuild-schema-2.md new file mode 100644 index 0000000..d885a8f --- /dev/null +++ b/docs/news/28.1/osbuild-schema-2.md @@ -0,0 +1,18 @@ +# Support new OSBuild pipelines and new RHEL for Edge image types + +OSBuild Composer can now generate Manifests that conform to the new OSBuild +schema. Two new image types are added that take advantage of the new schema: + +- `rhel-edge-container`: Creates an OCI container with an embedded + `rhel-edge-commit`. Running the container starts a web server that serves + the commit. + +- `rhel-edge-installer`: Creates a boot ISO image that embeds a + `rhel-edge-commit`. The commit is pulled from a URL during the compose of + the boot ISO. + +Requesting a `rhel-edge-installer` requires specifying a URL, otherwise the +request will fail. Blueprint customizations have no effect on the boot ISO and +also cause the request to fail if any are specified. + +Relevant PR: https://github.com/osbuild/osbuild-composer/pull/1244 diff --git a/docs/news/28.1/rhel84-grub2-saved-entry.md b/docs/news/28.1/rhel84-grub2-saved-entry.md new file mode 100644 index 0000000..ed3f52b --- /dev/null +++ b/docs/news/28.1/rhel84-grub2-saved-entry.md @@ -0,0 +1,5 @@ +# RHEL8.4: Fix grub2 kernel selection + +By marking the kernel we install as the `saved_entry`, we make sure that installing additional/subsequent kernels do not unintentienally change the default kernel to be booted into. + +Relevant PR: https://github.com/osbuild/osbuild-composer/pull/1241 diff --git a/internal/blueprint/blueprint.go b/internal/blueprint/blueprint.go index bb4d60e..c30a16a 100644 --- a/internal/blueprint/blueprint.go +++ b/internal/blueprint/blueprint.go @@ -104,13 +104,10 @@ func (b *Blueprint) GetPackages() []string { packages = append(packages, "@"+group.Name) } - if kc := b.Customizations.GetKernel(); kc != nil && kc.Name != "" { - kpkg := Package{Name: b.Customizations.Kernel.Name} - packages = append(packages, kpkg.ToNameVersion()) - } else { // no Kernel specified; add default - kpkg := Package{Name: "kernel"} - packages = append(packages, kpkg.ToNameVersion()) - } + kc := b.Customizations.GetKernel() + kpkg := Package{Name: kc.Name} + packages = append(packages, kpkg.ToNameVersion()) + return packages } diff --git a/internal/blueprint/customizations.go b/internal/blueprint/customizations.go index f6867d7..ad88c51 100644 --- a/internal/blueprint/customizations.go +++ b/internal/blueprint/customizations.go @@ -155,11 +155,21 @@ func (c *Customizations) GetGroups() []GroupCustomization { } func (c *Customizations) GetKernel() *KernelCustomization { - if c == nil { - return nil + var name string + var append string + if c != nil && c.Kernel != nil { + name = c.Kernel.Name + append = c.Kernel.Append } - return c.Kernel + if name == "" { + name = "kernel" + } + + return &KernelCustomization{ + Name: name, + Append: append, + } } func (c *Customizations) GetFirewall() *FirewallCustomization { diff --git a/internal/blueprint/customizations_test.go b/internal/blueprint/customizations_test.go index 1ebe21c..8415dc4 100644 --- a/internal/blueprint/customizations_test.go +++ b/internal/blueprint/customizations_test.go @@ -1,8 +1,9 @@ package blueprint import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestGetHostname(t *testing.T) { @@ -22,6 +23,7 @@ func TestGetKernel(t *testing.T) { expectedKernel := KernelCustomization{ Append: "--test", + Name: "kernel", } TestCustomizations := Customizations{ @@ -214,7 +216,7 @@ func TestNoCustomizationsInBlueprint(t *testing.T) { assert.Nil(t, TestBP.Customizations.GetHostname()) assert.Nil(t, TestBP.Customizations.GetUsers()) assert.Nil(t, TestBP.Customizations.GetGroups()) - assert.Nil(t, TestBP.Customizations.GetKernel()) + assert.Equal(t, &KernelCustomization{Name: "kernel"}, TestBP.Customizations.GetKernel()) assert.Nil(t, TestBP.Customizations.GetFirewall()) assert.Nil(t, TestBP.Customizations.GetServices()) diff --git a/internal/boot/openstacktest/openstack.go b/internal/boot/openstacktest/openstack.go index 8fdd7de..4a5e90b 100644 --- a/internal/boot/openstacktest/openstack.go +++ b/internal/boot/openstacktest/openstack.go @@ -8,12 +8,12 @@ import ( "github.com/gophercloud/gophercloud" "github.com/gophercloud/gophercloud/openstack" - "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" - "github.com/gophercloud/gophercloud/openstack/imageservice/v2/imagedata" "github.com/gophercloud/gophercloud/openstack/compute/v2/servers" + "github.com/gophercloud/gophercloud/openstack/imageservice/v2/imagedata" + "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" ) -const WaitTimeout = 600 // in seconds +const WaitTimeout = 30 * 60 // 30 minutes in seconds func UploadImageToOpenStack(p *gophercloud.ProviderClient, imagePath string, imageName string) (*images.Image, error) { client, err := openstack.NewImageServiceV2(p, gophercloud.EndpointOpts{ @@ -25,8 +25,8 @@ func UploadImageToOpenStack(p *gophercloud.ProviderClient, imagePath string, ima // create a new image which gives us the ID image, err := images.Create(client, images.CreateOpts{ - Name: imageName, - DiskFormat: "qcow2", + Name: imageName, + DiskFormat: "qcow2", ContainerFormat: "bare", }).Extract() if err != nil { @@ -84,10 +84,10 @@ func WithBootedImageInOpenStack(p *gophercloud.ProviderClient, imageID, userData server, err := servers.Create(client, servers.CreateOpts{ Name: "osbuild-composer-vm-for-" + imageID, FlavorRef: "77b8cf27-be16-40d9-95b1-81db4522be1e", // ci.m1.medium.ephemeral - Networks: []servers.Network{ // provider_net_cci_2 + Networks: []servers.Network{ // provider_net_cci_2 servers.Network{UUID: "74e8faa7-87ba-41b2-a000-438013194814"}, }, - ImageRef: imageID, + ImageRef: imageID, UserData: []byte(userData), }).Extract() if err != nil { @@ -95,7 +95,7 @@ func WithBootedImageInOpenStack(p *gophercloud.ProviderClient, imageID, userData } // cleanup - defer func(){ + defer func() { err := servers.ForceDelete(client, server.ID).ExtractErr() if err != nil { fmt.Printf("Force deleting instance %s failed: %v", server.ID, err) diff --git a/internal/cloudapi/server.go b/internal/cloudapi/server.go index a79865b..a6ec1eb 100644 --- a/internal/cloudapi/server.go +++ b/internal/cloudapi/server.go @@ -132,17 +132,15 @@ func (server *Server) Compose(w http.ResponseWriter, r *http.Request) { } } - packageSpecs, excludePackageSpecs := imageType.Packages(bp) - packages, _, err := server.rpmMetadata.Depsolve(packageSpecs, excludePackageSpecs, repositories, distribution.ModulePlatformID(), arch.Name()) - if err != nil { - http.Error(w, fmt.Sprintf("Failed to depsolve base packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err), http.StatusInternalServerError) - return - } - buildPackageSpecs := imageType.BuildPackages() - buildPackages, _, err := server.rpmMetadata.Depsolve(buildPackageSpecs, nil, repositories, distribution.ModulePlatformID(), arch.Name()) - if err != nil { - http.Error(w, fmt.Sprintf("Failed to depsolve build packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err), http.StatusInternalServerError) - return + packageSets := imageType.PackageSets(bp) + pkgSpecSets := make(map[string][]rpmmd.PackageSpec) + for name, packages := range packageSets { + pkgs, _, err := server.rpmMetadata.Depsolve(packages, repositories, distribution.ModulePlatformID(), arch.Name()) + if err != nil { + http.Error(w, fmt.Sprintf("Failed to depsolve base packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err), http.StatusInternalServerError) + return + } + pkgSpecSets[name] = pkgs } imageOptions := distro.ImageOptions{Size: imageType.Size(0)} @@ -156,7 +154,7 @@ func (server *Server) Compose(w http.ResponseWriter, r *http.Request) { } } - manifest, err := imageType.Manifest(nil, imageOptions, repositories, packages, buildPackages, manifestSeed) + manifest, err := imageType.Manifest(nil, imageOptions, repositories, pkgSpecSets, manifestSeed) if err != nil { http.Error(w, fmt.Sprintf("Failed to get manifest for for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err), http.StatusBadRequest) return diff --git a/internal/disk/disk.go b/internal/disk/disk.go index 4ab2484..8bacfd9 100644 --- a/internal/disk/disk.go +++ b/internal/disk/disk.go @@ -7,7 +7,7 @@ package disk import ( "sort" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" ) type PartitionTable struct { diff --git a/internal/distro/distro.go b/internal/distro/distro.go index 3946ac9..93bb7c3 100644 --- a/internal/distro/distro.go +++ b/internal/distro/distro.go @@ -72,17 +72,19 @@ type ImageType interface { // is 0 the default value for the format will be returned. Size(size uint64) uint64 - // Returns the default packages to include and exclude when making the image - // type. - Packages(bp blueprint.Blueprint) ([]string, []string) + // Returns the sets of packages to include and exclude when building the image. + // Indexed by a string label. How each set is labeled and used depends on the + // image type. + PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet - // Returns the build packages for the output type. - BuildPackages() []string + // Returns the names of the stages that will produce the build output. + Exports() []string // Returns an osbuild manifest, containing the sources and pipeline necessary // to build an image, given output format with all packages and customizations - // specified in the given blueprint. - Manifest(b *blueprint.Customizations, options ImageOptions, repos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, seed int64) (Manifest, error) + // specified in the given blueprint. The packageSpecSets must be labelled in + // the same way as the originating PackageSets. + Manifest(b *blueprint.Customizations, options ImageOptions, repos []rpmmd.RepoConfig, packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (Manifest, error) } // The ImageOptions specify options for a specific image build @@ -96,6 +98,7 @@ type ImageOptions struct { type OSTreeImageOptions struct { Ref string Parent string + URL string } // The SubscriptionImageOptions specify subscription-specific image options diff --git a/internal/distro/distro_test_common/distro_test_common.go b/internal/distro/distro_test_common/distro_test_common.go index 5dc9328..4121cc2 100644 --- a/internal/distro/distro_test_common/distro_test_common.go +++ b/internal/distro/distro_test_common/distro_test_common.go @@ -38,14 +38,10 @@ func TestDistro_Manifest(t *testing.T, pipelinePath string, prefix string, distr Repositories []repository `json:"repositories"` Blueprint *blueprint.Blueprint `json:"blueprint"` } - type rpmMD struct { - BuildPackages []rpmmd.PackageSpec `json:"build-packages"` - Packages []rpmmd.PackageSpec `json:"packages"` - } var tt struct { - ComposeRequest *composeRequest `json:"compose-request"` - RpmMD *rpmMD `json:"rpmmd"` - Manifest distro.Manifest `json:"manifest,omitempty"` + ComposeRequest *composeRequest `json:"compose-request"` + PackageSets map[string][]rpmmd.PackageSpec `json:"rpmmd"` + Manifest distro.Manifest `json:"manifest,omitempty"` } file, err := ioutil.ReadFile(fileName) assert.NoErrorf(err, "Could not read test-case '%s': %v", fileName, err) @@ -93,8 +89,7 @@ func TestDistro_Manifest(t *testing.T, pipelinePath string, prefix string, distr }, }, repos, - tt.RpmMD.Packages, - tt.RpmMD.BuildPackages, + tt.PackageSets, RandomTestSeed) if (err == nil && tt.Manifest == nil) || (err != nil && tt.Manifest != nil) { @@ -116,7 +111,8 @@ func TestDistro_Manifest(t *testing.T, pipelinePath string, prefix string, distr } func isOSTree(imgType distro.ImageType) bool { - for _, pkg := range imgType.BuildPackages() { + packageSets := imgType.PackageSets(blueprint.Blueprint{}) + for _, pkg := range packageSets["build-packages"].Include { if pkg == "rpm-ostree" { return true } @@ -128,7 +124,7 @@ var knownKernels = []string{"kernel", "kernel-debug", "kernel-rt"} // Returns the number of known kernels in the package list func kernelCount(imgType distro.ImageType) int { - pkgs, _ := imgType.Packages(blueprint.Blueprint{}) + pkgs := imgType.PackageSets(blueprint.Blueprint{})["packages"].Include n := 0 for _, pkg := range pkgs { for _, kernel := range knownKernels { diff --git a/internal/distro/fedora32/distro.go b/internal/distro/fedora32/distro.go index 22b642c..2352f6b 100644 --- a/internal/distro/fedora32/distro.go +++ b/internal/distro/fedora32/distro.go @@ -7,7 +7,7 @@ import ( "sort" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/google/uuid" @@ -187,20 +187,36 @@ func (t *imageType) BuildPackages() []string { return packages } +func (t *imageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + includePackages, excludePackages := t.Packages(bp) + return map[string]rpmmd.PackageSet{ + "packages": { + Include: includePackages, + Exclude: excludePackages, + }, + "build-packages": { + Include: t.BuildPackages(), + }, + } +} + +func (t *imageType) Exports() []string { + return []string{"assembler"} +} + func (t *imageType) Manifest(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, - packageSpecs, - buildPackageSpecs []rpmmd.PackageSpec, + packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { - pipeline, err := t.pipeline(c, options, repos, packageSpecs, buildPackageSpecs) + pipeline, err := t.pipeline(c, options, repos, packageSpecSets["packages"], packageSpecSets["build-packages"]) if err != nil { return distro.Manifest{}, err } return json.Marshal( osbuild.Manifest{ - Sources: *sources(append(packageSpecs, buildPackageSpecs...)), + Sources: *sources(append(packageSpecSets["packages"], packageSpecSets["build-packages"]...)), Pipeline: *pipeline, }, ) @@ -434,7 +450,7 @@ func (t *imageType) fsTabStageOptions(uefi bool) *osbuild.FSTabStageOptions { func (t *imageType) grub2StageOptions(kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool) *osbuild.GRUB2StageOptions { id := uuid.MustParse("76a22bf4-f153-4541-b6c7-0332c0dfaeac") - if kernel != nil { + if kernel != nil && kernel.Append != "" { kernelOptions += " " + kernel.Append } diff --git a/internal/distro/fedora32/distro_test.go b/internal/distro/fedora32/distro_test.go index 9052747..36e4aef 100644 --- a/internal/distro/fedora32/distro_test.go +++ b/internal/distro/fedora32/distro_test.go @@ -121,13 +121,15 @@ func TestImageType_BuildPackages(t *testing.T) { t.Errorf("d.GetArch(%v) returned err = %v; expected nil", archLabel, err) continue } + buildPkgs := itStruct.PackageSets(blueprint.Blueprint{})["build-packages"] + assert.NotNil(t, buildPkgs) if itLabel == "fedora-iot-commit" { // For now we only include rpm-ostree when building fedora-iot-commit image types, this we may want // to reconsider. The only reason to specia-case it is that it might pull in a lot of dependencies // for a niche usecase. - assert.ElementsMatch(t, append(buildPackages[archLabel], "rpm-ostree"), itStruct.BuildPackages()) + assert.ElementsMatch(t, append(buildPackages[archLabel], "rpm-ostree"), buildPkgs.Include) } else { - assert.ElementsMatch(t, buildPackages[archLabel], itStruct.BuildPackages()) + assert.ElementsMatch(t, buildPackages[archLabel], buildPkgs.Include) } } } @@ -280,15 +282,16 @@ func TestImageType_BasePackages(t *testing.T) { for _, pkgMap := range pkgMaps { imgType, err := arch.GetImageType(pkgMap.name) assert.NoError(t, err) - basePackages, excludedPackages := imgType.Packages(blueprint.Blueprint{}) + packages := imgType.PackageSets(blueprint.Blueprint{})["packages"] + assert.NotNil(t, packages) assert.Equalf( t, append(pkgMap.basePackages, pkgMap.bootloaderPackages...), - basePackages, + packages.Include, "image type: %s", pkgMap.name, ) - assert.Equalf(t, pkgMap.excludedPackages, excludedPackages, "image type: %s", pkgMap.name) + assert.Equalf(t, pkgMap.excludedPackages, packages.Exclude, "image type: %s", pkgMap.name) } } @@ -314,7 +317,7 @@ func TestDistro_ManifestError(t *testing.T) { arch, _ := f32distro.GetArch(archName) for _, imgTypeName := range arch.ListImageTypes() { imgType, _ := arch.GetImageType(imgTypeName) - _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, nil, 0) + _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "fedora-iot-commit" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") } else { diff --git a/internal/distro/fedora33/distro.go b/internal/distro/fedora33/distro.go index f7cd66e..bd4b983 100644 --- a/internal/distro/fedora33/distro.go +++ b/internal/distro/fedora33/distro.go @@ -7,7 +7,7 @@ import ( "sort" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/google/uuid" @@ -187,20 +187,36 @@ func (t *imageType) BuildPackages() []string { return packages } +func (t *imageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + includePackages, excludePackages := t.Packages(bp) + return map[string]rpmmd.PackageSet{ + "packages": { + Include: includePackages, + Exclude: excludePackages, + }, + "build-packages": { + Include: t.BuildPackages(), + }, + } +} + +func (t *imageType) Exports() []string { + return []string{"assembler"} +} + func (t *imageType) Manifest(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, - packageSpecs, - buildPackageSpecs []rpmmd.PackageSpec, + packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { - pipeline, err := t.pipeline(c, options, repos, packageSpecs, buildPackageSpecs) + pipeline, err := t.pipeline(c, options, repos, packageSpecSets["packages"], packageSpecSets["build-packages"]) if err != nil { return distro.Manifest{}, err } return json.Marshal( osbuild.Manifest{ - Sources: *sources(append(packageSpecs, buildPackageSpecs...)), + Sources: *sources(append(packageSpecSets["packages"], packageSpecSets["build-packages"]...)), Pipeline: *pipeline, }, ) @@ -446,7 +462,7 @@ func (t *imageType) fsTabStageOptions(uefi bool) *osbuild.FSTabStageOptions { func (t *imageType) grub2StageOptions(kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool) *osbuild.GRUB2StageOptions { id := uuid.MustParse("76a22bf4-f153-4541-b6c7-0332c0dfaeac") - if kernel != nil { + if kernel != nil && kernel.Append != "" { kernelOptions += " " + kernel.Append } diff --git a/internal/distro/fedora33/distro_test.go b/internal/distro/fedora33/distro_test.go index 3405ff9..e9ae5e2 100644 --- a/internal/distro/fedora33/distro_test.go +++ b/internal/distro/fedora33/distro_test.go @@ -121,13 +121,15 @@ func TestImageType_BuildPackages(t *testing.T) { t.Errorf("d.GetArch(%v) returned err = %v; expected nil", archLabel, err) continue } + buildPkgs := itStruct.PackageSets(blueprint.Blueprint{})["build-packages"] + assert.NotNil(t, buildPkgs) if itLabel == "fedora-iot-commit" { // For now we only include rpm-ostree when building fedora-iot-commit image types, this we may want // to reconsider. The only reason to specia-case it is that it might pull in a lot of dependencies // for a niche usecase. - assert.ElementsMatch(t, append(buildPackages[archLabel], "rpm-ostree"), itStruct.BuildPackages()) + assert.ElementsMatch(t, append(buildPackages[archLabel], "rpm-ostree"), buildPkgs.Include) } else { - assert.ElementsMatch(t, buildPackages[archLabel], itStruct.BuildPackages()) + assert.ElementsMatch(t, buildPackages[archLabel], buildPkgs.Include) } } } @@ -286,15 +288,16 @@ func TestImageType_BasePackages(t *testing.T) { for _, pkgMap := range pkgMaps { imgType, err := arch.GetImageType(pkgMap.name) assert.NoError(t, err) - basePackages, excludedPackages := imgType.Packages(blueprint.Blueprint{}) + packages := imgType.PackageSets(blueprint.Blueprint{})["packages"] + assert.NotNil(t, packages) assert.Equalf( t, append(pkgMap.basePackages, pkgMap.bootloaderPackages...), - basePackages, + packages.Include, "image type: %s", pkgMap.name, ) - assert.Equalf(t, pkgMap.excludedPackages, excludedPackages, "image type: %s", pkgMap.name) + assert.Equalf(t, pkgMap.excludedPackages, packages.Exclude, "image type: %s", pkgMap.name) } } @@ -320,7 +323,7 @@ func TestDistro_ManifestError(t *testing.T) { arch, _ := f33distro.GetArch(archName) for _, imgTypeName := range arch.ListImageTypes() { imgType, _ := arch.GetImageType(imgTypeName) - _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, nil, 0) + _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "fedora-iot-commit" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") } else { diff --git a/internal/distro/fedoratest/distro.go b/internal/distro/fedoratest/distro.go index 293852e..1d5594a 100644 --- a/internal/distro/fedoratest/distro.go +++ b/internal/distro/fedoratest/distro.go @@ -6,7 +6,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/rpmmd" ) @@ -95,11 +95,18 @@ func (t *imageType) BuildPackages() []string { return nil } +func (t *imageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + return nil +} + +func (t *imageType) Exports() []string { + return []string{"assembler"} +} + func (t *imageType) Manifest(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, - packageSpecs, - buildPackageSpecs []rpmmd.PackageSpec, + packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { return json.Marshal( diff --git a/internal/distro/rhel8/distro.go b/internal/distro/rhel8/distro.go index b019c51..02e391d 100644 --- a/internal/distro/rhel8/distro.go +++ b/internal/distro/rhel8/distro.go @@ -7,7 +7,7 @@ import ( "sort" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/google/uuid" @@ -188,20 +188,36 @@ func (t *imageType) BuildPackages() []string { return packages } +func (t *imageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + includePackages, excludePackages := t.Packages(bp) + return map[string]rpmmd.PackageSet{ + "packages": { + Include: includePackages, + Exclude: excludePackages, + }, + "build-packages": { + Include: t.BuildPackages(), + }, + } +} + +func (t *imageType) Exports() []string { + return []string{"assembler"} +} + func (t *imageType) Manifest(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, - packageSpecs, - buildPackageSpecs []rpmmd.PackageSpec, + packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { - pipeline, err := t.pipeline(c, options, repos, packageSpecs, buildPackageSpecs) + pipeline, err := t.pipeline(c, options, repos, packageSpecSets["packages"], packageSpecSets["build-packages"]) if err != nil { return distro.Manifest{}, err } return json.Marshal( osbuild.Manifest{ - Sources: *sources(append(packageSpecs, buildPackageSpecs...)), + Sources: *sources(append(packageSpecSets["packages"], packageSpecSets["build-packages"]...)), Pipeline: *pipeline, }, ) @@ -475,7 +491,7 @@ func (t *imageType) fsTabStageOptions(uefi bool) *osbuild.FSTabStageOptions { func (t *imageType) grub2StageOptions(kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool) *osbuild.GRUB2StageOptions { id := uuid.MustParse("0bd700f8-090f-4556-b797-b340297ea1bd") - if kernel != nil { + if kernel != nil && kernel.Append != "" { kernelOptions += " " + kernel.Append } diff --git a/internal/distro/rhel8/distro_test.go b/internal/distro/rhel8/distro_test.go index 5221e31..6305d07 100644 --- a/internal/distro/rhel8/distro_test.go +++ b/internal/distro/rhel8/distro_test.go @@ -126,7 +126,9 @@ func TestImageType_BuildPackages(t *testing.T) { if assert.NoErrorf(t, err, "d.GetArch(%v) returned err = %v; expected nil", archLabel, err) { continue } - assert.ElementsMatch(t, buildPackages[archLabel], itStruct.BuildPackages()) + buildPkgs := itStruct.PackageSets(blueprint.Blueprint{})["build-packages"] + assert.NotNil(t, buildPkgs) + assert.ElementsMatch(t, buildPackages[archLabel], buildPkgs.Include) } } } @@ -339,15 +341,16 @@ func TestImageType_BasePackages(t *testing.T) { for _, pkgMap := range pkgMaps { imgType, err := arch.GetImageType(pkgMap.name) assert.NoError(t, err) - basePackages, excludedPackages := imgType.Packages(blueprint.Blueprint{}) + packages := imgType.PackageSets(blueprint.Blueprint{})["packages"] + assert.NotNil(t, packages) assert.Equalf( t, append(pkgMap.basePackages, pkgMap.bootloaderPackages...), - basePackages, + packages.Include, "image type: %s", pkgMap.name, ) - assert.Equalf(t, pkgMap.excludedPackages, excludedPackages, "image type: %s", pkgMap.name) + assert.Equalf(t, pkgMap.excludedPackages, packages.Exclude, "image type: %s", pkgMap.name) } } @@ -372,7 +375,7 @@ func TestDistro_ManifestError(t *testing.T) { arch, _ := r8distro.GetArch(archName) for _, imgTypeName := range arch.ListImageTypes() { imgType, _ := arch.GetImageType(imgTypeName) - _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, nil, 0) + _, err := imgType.Manifest(bp.Customizations, distro.ImageOptions{}, nil, nil, 0) if imgTypeName == "rhel-edge-commit" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") } else { diff --git a/internal/distro/rhel84/distro.go b/internal/distro/rhel84/distro.go index 0f706f2..120089e 100644 --- a/internal/distro/rhel84/distro.go +++ b/internal/distro/rhel84/distro.go @@ -10,7 +10,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/disk" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/google/uuid" @@ -26,7 +26,7 @@ const ostreeRef = "rhel/8/%s/edge" type distribution struct { arches map[string]architecture - imageTypes map[string]imageType + imageTypes map[string]distro.ImageType buildPackages []string isCentos bool } @@ -38,7 +38,7 @@ type architecture struct { buildPackages []string legacy string uefi bool - imageTypes map[string]imageType + imageTypes map[string]distro.ImageType } type imageType struct { @@ -121,16 +121,15 @@ func (a *architecture) GetImageType(imageType string) (distro.ImageType, error) return nil, errors.New("invalid image type: " + imageType) } - return &t, nil + return t, nil } func (a *architecture) addImageTypes(imageTypes ...imageType) { if a.imageTypes == nil { - a.imageTypes = map[string]imageType{} + a.imageTypes = map[string]distro.ImageType{} } - for _, it := range imageTypes { - a.imageTypes[it.name] = imageType{ + a.imageTypes[it.name] = &imageType{ arch: a, name: it.name, filename: it.filename, @@ -150,6 +149,29 @@ func (a *architecture) addImageTypes(imageTypes ...imageType) { } } +// For the secondary implementation of image type. +// Temporary; for supporting the new Manifest schema, until everything is +// ported. +func (a *architecture) addS2ImageTypes(imageTypes ...imageTypeS2) { + for _, it := range imageTypes { + a.imageTypes[it.name] = &imageTypeS2{ + arch: a, + name: it.name, + filename: it.filename, + mimeType: it.mimeType, + packageSets: it.packageSets, + enabledServices: it.enabledServices, + disabledServices: it.disabledServices, + defaultTarget: it.defaultTarget, + kernelOptions: it.kernelOptions, + bootable: it.bootable, + rpmOstree: it.rpmOstree, + defaultSize: it.defaultSize, + bootISO: it.bootISO, + } + } +} + func (t *imageType) Name() string { return t.name } @@ -207,22 +229,38 @@ func (t *imageType) BuildPackages() []string { return packages } +func (t *imageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + includePackages, excludePackages := t.Packages(bp) + return map[string]rpmmd.PackageSet{ + "packages": { + Include: includePackages, + Exclude: excludePackages, + }, + "build-packages": { + Include: t.BuildPackages(), + }, + } +} + +func (t *imageType) Exports() []string { + return []string{"assembler"} +} + func (t *imageType) Manifest(c *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, - packageSpecs, - buildPackageSpecs []rpmmd.PackageSpec, + packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { source := rand.NewSource(seed) rng := rand.New(source) - pipeline, err := t.pipeline(c, options, repos, packageSpecs, buildPackageSpecs, rng) + pipeline, err := t.pipeline(c, options, repos, packageSpecSets["packages"], packageSpecSets["build-packages"], rng) if err != nil { return distro.Manifest{}, err } return json.Marshal( osbuild.Manifest{ - Sources: *sources(append(packageSpecs, buildPackageSpecs...)), + Sources: *sources(append(packageSpecSets["packages"], packageSpecSets["build-packages"]...)), Pipeline: *pipeline, }, ) @@ -303,7 +341,7 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp if t.bootable { if t.arch.Name() != "s390x" { - p.AddStage(osbuild.NewGRUB2Stage(t.grub2StageOptions(pt, t.kernelOptions, c.GetKernel(), t.arch.uefi, t.arch.legacy))) + p.AddStage(osbuild.NewGRUB2Stage(t.grub2StageOptions(pt, t.kernelOptions, c.GetKernel(), packageSpecs, t.arch.uefi, t.arch.legacy))) } } @@ -313,7 +351,7 @@ func (t *imageType) pipeline(c *blueprint.Customizations, options distro.ImageOp if language != nil { p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language})) } else { - p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US"})) + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"})) } if keyboard != nil { @@ -523,7 +561,7 @@ func (t *imageType) systemdStageOptions(enabledServices, disabledServices []stri } } -func (t *imageType) grub2StageOptions(pt *disk.PartitionTable, kernelOptions string, kernel *blueprint.KernelCustomization, uefi bool, legacy string) *osbuild.GRUB2StageOptions { +func (t *imageType) grub2StageOptions(pt *disk.PartitionTable, kernelOptions string, kernel *blueprint.KernelCustomization, packages []rpmmd.PackageSpec, uefi bool, legacy string) *osbuild.GRUB2StageOptions { if pt == nil { panic("partition table must be defined for grub2 stage, this is a programming error") } @@ -532,13 +570,12 @@ func (t *imageType) grub2StageOptions(pt *disk.PartitionTable, kernelOptions str panic("root partition must be defined for grub2 stage, this is a programming error") } - id := uuid.MustParse(rootPartition.Filesystem.UUID) - - if kernel != nil { - kernelOptions += " " + kernel.Append + stageOptions := osbuild.GRUB2StageOptions{ + RootFilesystemUUID: uuid.MustParse(rootPartition.Filesystem.UUID), + KernelOptions: kernelOptions, + Legacy: legacy, } - var uefiOptions *osbuild.GRUB2UEFI if uefi { var vendor string if t.arch.distro.isCentos { @@ -546,21 +583,28 @@ func (t *imageType) grub2StageOptions(pt *disk.PartitionTable, kernelOptions str } else { vendor = "redhat" } - uefiOptions = &osbuild.GRUB2UEFI{ + stageOptions.UEFI = &osbuild.GRUB2UEFI{ Vendor: vendor, } } if !uefi { - legacy = t.arch.legacy + stageOptions.Legacy = t.arch.legacy } - return &osbuild.GRUB2StageOptions{ - RootFilesystemUUID: id, - KernelOptions: kernelOptions, - Legacy: legacy, - UEFI: uefiOptions, + if kernel != nil { + if kernel.Append != "" { + stageOptions.KernelOptions += " " + kernel.Append + } + for _, pkg := range packages { + if pkg.Name == kernel.Name { + stageOptions.SavedEntry = "ffffffffffffffffffffffffffffffff-" + pkg.Version + "-" + pkg.Release + "." + pkg.Arch + break + } + } } + + return &stageOptions } func (t *imageType) selinuxStageOptions() *osbuild.SELinuxStageOptions { @@ -1163,7 +1207,7 @@ func newDistro(isCentos bool) distro.Distro { } r := distribution{ - imageTypes: map[string]imageType{}, + imageTypes: map[string]distro.ImageType{}, buildPackages: []string{ "dnf", "dosfstools", @@ -1196,6 +1240,260 @@ func newDistro(isCentos bool) distro.Distro { legacy: "i386-pc", uefi: true, } + + edgeOCIImgTypeX86_64 := imageTypeS2{ + name: "rhel-edge-container", + filename: "rhel84-container.tar", + mimeType: "application/x-tar", + packageSets: map[string]rpmmd.PackageSet{ + "packages": { + Include: edgeImgTypeX86_64.packages, + Exclude: edgeImgTypeX86_64.excludedPackages, + }, + "container": {Include: []string{"httpd"}}, + }, + enabledServices: edgeImgTypeX86_64.enabledServices, + rpmOstree: true, + bootISO: false, + } + + edgeBuildPkgs := []string{ + "dnf", + "dosfstools", + "e2fsprogs", + "grub2-pc", + "policycoreutils", + "python36", + "python3-iniparse", + "qemu-img", + "rpm-ostree", + "systemd", + "tar", + "xfsprogs", + "xz", + "selinux-policy-targeted", + "genisoimage", + "isomd5sum", + "xorriso", + "syslinux", + "lorax-templates-generic", + "lorax-templates-rhel", + "syslinux-nonlinux", + "squashfs-tools", + "grub2-pc-modules", + "grub2-tools", + "grub2-efi-x64", + "shim-x64", + "efibootmgr", + "grub2-tools-minimal", + "grub2-tools-extra", + "grub2-tools-efi", + "grub2-efi-x64", + "grub2-efi-x64-cdboot", + "shim-ia32", + "grub2-efi-ia32-cdboot", + } + + edgeInstallerPkgs := []string{ + "anaconda", + "anaconda-widgets", + "kdump-anaconda-addon", + "anaconda-install-env-deps", + "oscap-anaconda-addon", + "redhat-release-eula", + "dnf", + "rpm-ostree", + "ostree", + "ostree", + "pigz", + "kernel", + "kernel-modules", + "kernel-modules-extra", + "grubby", + "iwl100-firmware", + "iwl1000-firmware", + "iwl105-firmware", + "iwl135-firmware", + "iwl2000-firmware", + "iwl2030-firmware", + "iwl3160-firmware", + "iwl3945-firmware", + "iwl4965-firmware", + "iwl5000-firmware", + "iwl5150-firmware", + "iwl6000-firmware", + "iwl6000g2a-firmware", + "iwl6000g2b-firmware", + "iwl6050-firmware", + "iwl7260-firmware", + "libertas-sd8686-firmware", + "libertas-sd8787-firmware", + "libertas-usb8388-firmware", + "libertas-usb8388-olpc-firmware", + "linux-firmware", + "alsa-firmware", + "alsa-tools-firmware", + "glibc-all-langpacks", + "grub2-tools-efi", + "efibootmgr", + "shim-x64", + "grub2-efi-x64-cdboot", + "shim-ia32", + "grub2-efi-ia32-cdboot", + "biosdevname", + "memtest86+", + "syslinux", + "grub2-tools", + "grub2-tools-minimal", + "grub2-tools-extra", + "plymouth", + "anaconda-dracut", + "dracut-network", + "dracut-config-generic", + "initscripts", + "cryptsetup", + "rpcbind", + "kbd", + "kbd-misc", + "tar", + "xz", + "curl", + "bzip2", + "systemd", + "systemd", + "rsyslog", + "xorg-x11-drivers", + "xorg-x11-server-Xorg", + "xorg-x11-server-utils", + "xorg-x11-xauth", + "dbus-x11", + "metacity", + "metacity", + "gsettings-desktop-schemas", + "gsettings-desktop-schemas", + "nm-connection-editor", + "librsvg2", + "librsvg2", + "xfsprogs", + "xfsprogs", + "gfs2-utils", + "system-storage-manager", + "device-mapper-persistent-data", + "xfsdump", + "udisks2", + "udisks2-iscsi", + "hostname", + "libblockdev-lvm-dbus", + "libblockdev-lvm-dbus", + "volume_key", + "nss-tools", + "selinux-policy-targeted", + "audit", + "ethtool", + "openssh-server", + "nfs-utils", + "openssh-clients", + "tigervnc-server-minimal", + "tigervnc-server-module", + "net-tools", + "nmap-ncat", + "prefixdevname", + "pciutils", + "usbutils", + "ipmitool", + "mt-st", + "smartmontools", + "hdparm", + "libibverbs", + "libibverbs", + "rdma-core", + "rdma-core", + "rng-tools", + "dmidecode", + "bitmap-fangsongti-fonts", + "dejavu-sans-fonts", + "dejavu-sans-mono-fonts", + "kacst-farsi-fonts", + "kacst-qurn-fonts", + "lklug-fonts", + "lohit-assamese-fonts", + "lohit-bengali-fonts", + "lohit-devanagari-fonts", + "lohit-gujarati-fonts", + "lohit-gurmukhi-fonts", + "lohit-kannada-fonts", + "lohit-odia-fonts", + "lohit-tamil-fonts", + "lohit-telugu-fonts", + "madan-fonts", + "smc-meera-fonts", + "thai-scalable-waree-fonts", + "sil-abyssinica-fonts", + "xorg-x11-fonts-misc", + "aajohan-comfortaa-fonts", + "abattis-cantarell-fonts", + "sil-scheherazade-fonts", + "jomolhari-fonts", + "khmeros-base-fonts", + "sil-padauk-fonts", + "google-noto-sans-cjk-ttc-fonts", + "gdb-gdbserver", + "libreport-plugin-bugzilla", + "libreport-plugin-reportuploader", + "libreport-rhel-anaconda-bugzilla", + "python3-pyatspi", + "vim-minimal", + "strace", + "lsof", + "dump", + "xz", + "less", + "rsync", + "bind-utils", + "ftp", + "mtr", + "wget", + "spice-vdagent", + "gdisk", + "hexedit", + "sg3_utils", + "perl-interpreter", + } + edgeInstImgTypeX86_64 := imageTypeS2{ + name: "rhel-edge-installer", + filename: "rhel84-boot.iso", + mimeType: "application/x-iso9660-image", + packageSets: map[string]rpmmd.PackageSet{ + "build": { + Include: edgeBuildPkgs, + }, + "packages": { + Include: edgeImgTypeX86_64.packages, + Exclude: edgeImgTypeX86_64.excludedPackages, + }, + "installer": {Include: edgeInstallerPkgs}, + }, + enabledServices: edgeImgTypeX86_64.enabledServices, + rpmOstree: true, + bootISO: true, + } + + edgeOCIImgTypeAarch64 := imageTypeS2{ + name: "rhel-edge-container", + filename: "rhel84-container.tar", + mimeType: "application/x-tar", + packageSets: map[string]rpmmd.PackageSet{ + "packages": { + Include: edgeImgTypeAarch64.packages, + Exclude: edgeImgTypeAarch64.excludedPackages, + }, + "container": {Include: []string{"httpd"}}, + }, + enabledServices: edgeImgTypeAarch64.enabledServices, + rpmOstree: true, + bootISO: false, + } + x8664.addImageTypes( amiImgType, qcow2ImageType, @@ -1207,6 +1505,7 @@ func newDistro(isCentos bool) distro.Distro { if !isCentos { x8664.addImageTypes(edgeImgTypeX86_64) + x8664.addS2ImageTypes(edgeOCIImgTypeX86_64, edgeInstImgTypeX86_64) } aarch64 := architecture{ @@ -1230,6 +1529,7 @@ func newDistro(isCentos bool) distro.Distro { if !isCentos { aarch64.addImageTypes(edgeImgTypeAarch64) + aarch64.addS2ImageTypes(edgeOCIImgTypeAarch64) } ppc64le := architecture{ diff --git a/internal/distro/rhel84/distro_test.go b/internal/distro/rhel84/distro_test.go index 05188d9..7ae154b 100644 --- a/internal/distro/rhel84/distro_test.go +++ b/internal/distro/rhel84/distro_test.go @@ -153,7 +153,9 @@ func TestImageType_BuildPackages(t *testing.T) { if assert.NoErrorf(t, err, "d.GetArch(%v) returned err = %v; expected nil", archLabel, err) { continue } - assert.ElementsMatch(t, buildPackages[archLabel], itStruct.BuildPackages()) + buildPkgs := itStruct.PackageSets(blueprint.Blueprint{})["build-packages"] + assert.NotNil(t, buildPkgs) + assert.ElementsMatch(t, buildPackages[archLabel], buildPkgs.Include) } } }) @@ -393,7 +395,8 @@ func TestImageType_BasePackages(t *testing.T) { for _, pkgMap := range pkgMaps { imgType, err := arch.GetImageType(pkgMap.name) assert.NoError(t, err) - basePackages, excludedPackages := imgType.Packages(blueprint.Blueprint{}) + packages := imgType.PackageSets(blueprint.Blueprint{})["packages"] + assert.NotNil(t, packages) expectedPackages := append(pkgMap.basePackages, pkgMap.bootloaderPackages...) if dist.name == "rhel" { expectedPackages = append(expectedPackages, pkgMap.rhelOnlyBasePackages...) @@ -401,11 +404,11 @@ func TestImageType_BasePackages(t *testing.T) { assert.ElementsMatchf( t, expectedPackages, - basePackages, + packages.Include, "image type: %s", pkgMap.name, ) - assert.Equalf(t, pkgMap.excludedPackages, excludedPackages, "image type: %s", pkgMap.name) + assert.Equalf(t, pkgMap.excludedPackages, packages.Exclude, "image type: %s", pkgMap.name) } }) } @@ -442,9 +445,11 @@ func TestDistro_ManifestError(t *testing.T) { imgOpts := distro.ImageOptions{ Size: imgType.Size(0), } - _, err := imgType.Manifest(bp.Customizations, imgOpts, nil, nil, nil, 0) - if imgTypeName == "rhel-edge-commit" { + _, err := imgType.Manifest(bp.Customizations, imgOpts, nil, nil, 0) + if imgTypeName == "rhel-edge-commit" || imgTypeName == "rhel-edge-container" { assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") + } else if imgTypeName == "rhel-edge-installer" { + assert.EqualError(t, err, "boot ISO image type \"rhel-edge-installer\" requires specifying a URL from which to retrieve the OSTree commit") } else { assert.NoError(t, err) } @@ -468,7 +473,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { "vhd", "vmdk", }, - rhelAdditionalImageTypes: []string{"rhel-edge-commit"}, + rhelAdditionalImageTypes: []string{"rhel-edge-commit", "rhel-edge-container", "rhel-edge-installer"}, }, { arch: "aarch64", @@ -478,7 +483,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { "openstack", "tar", }, - rhelAdditionalImageTypes: []string{"rhel-edge-commit"}, + rhelAdditionalImageTypes: []string{"rhel-edge-commit", "rhel-edge-container"}, }, { arch: "ppc64le", diff --git a/internal/distro/rhel84/distro_v2.go b/internal/distro/rhel84/distro_v2.go new file mode 100644 index 0000000..943fbbc --- /dev/null +++ b/internal/distro/rhel84/distro_v2.go @@ -0,0 +1,769 @@ +package rhel84 + +import ( + "encoding/json" + "fmt" + "math/rand" + "path/filepath" + + "github.com/osbuild/osbuild-composer/internal/crypt" + "github.com/osbuild/osbuild-composer/internal/distro" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild2" + + "github.com/osbuild/osbuild-composer/internal/blueprint" + "github.com/osbuild/osbuild-composer/internal/rpmmd" +) + +type imageTypeS2 struct { + arch *architecture + name string + filename string + mimeType string + packageSets map[string]rpmmd.PackageSet + enabledServices []string + disabledServices []string + defaultTarget string + kernelOptions string + bootable bool + bootISO bool + rpmOstree bool + defaultSize uint64 +} + +func (t *imageTypeS2) Arch() distro.Arch { + return t.arch +} + +func (t *imageTypeS2) Name() string { + return t.name +} + +func (t *imageTypeS2) Filename() string { + return t.filename +} + +func (t *imageTypeS2) MIMEType() string { + return t.mimeType +} + +func (t *imageTypeS2) OSTreeRef() string { + if t.rpmOstree { + return fmt.Sprintf(ostreeRef, t.arch.name) + } + return "" +} + +func (t *imageTypeS2) Size(size uint64) uint64 { + const MegaByte = 1024 * 1024 + // Microsoft Azure requires vhd images to be rounded up to the nearest MB + if t.name == "vhd" && size%MegaByte != 0 { + size = (size/MegaByte + 1) * MegaByte + } + if size == 0 { + size = t.defaultSize + } + return size +} + +func (t *imageTypeS2) Packages(bp blueprint.Blueprint) ([]string, []string) { + packages := append(t.packageSets["packages"].Include, bp.GetPackages()...) + timezone, _ := bp.Customizations.GetTimezoneSettings() + if timezone != nil { + packages = append(packages, "chrony") + } + return packages, t.packageSets["packages"].Exclude +} + +func (t *imageTypeS2) BuildPackages() []string { + buildPackages := append(t.arch.distro.buildPackages, t.arch.buildPackages...) + if t.rpmOstree { + buildPackages = append(buildPackages, "rpm-ostree") + } + if t.bootISO { + buildPackages = append(buildPackages, t.packageSets["build"].Include...) + } + return buildPackages +} + +func (t *imageTypeS2) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + sets := map[string]rpmmd.PackageSet{ + "build-packages": { + Include: t.BuildPackages(), + }, + } + for name, pkgSet := range t.packageSets { + if name == "packages" { + // treat base packages separately to combine with blueprint + packages := new(rpmmd.PackageSet) + packages.Include, packages.Exclude = t.Packages(bp) + sets[name] = *packages + continue + } + sets[name] = pkgSet + } + return sets +} + +func (t *imageTypeS2) Exports() []string { + return []string{"assembler"} +} + +func (t *imageTypeS2) Manifest(c *blueprint.Customizations, + options distro.ImageOptions, + repos []rpmmd.RepoConfig, + packageSpecSets map[string][]rpmmd.PackageSpec, + seed int64) (distro.Manifest, error) { + source := rand.NewSource(seed) + rng := rand.New(source) + pipelines, err := t.pipelines(c, options, repos, packageSpecSets, rng) + if err != nil { + return distro.Manifest{}, err + } + + // flatten spec sets for sources + allPackageSpecs := make([]rpmmd.PackageSpec, 0) + for _, specs := range packageSpecSets { + allPackageSpecs = append(allPackageSpecs, specs...) + } + + var commits []ostreeCommit + if options.OSTree.Parent != "" && options.OSTree.URL != "" { + commit := ostreeCommit{Checksum: options.OSTree.Parent, URL: options.OSTree.URL} + commits = []ostreeCommit{commit} + } + return json.Marshal( + osbuild.Manifest{ + Version: "2", + Pipelines: pipelines, + Sources: t.sources(allPackageSpecs, commits), + }, + ) +} + +// local type for ostree sommit metadata used to define commit sources +type ostreeCommit struct { + Checksum string + URL string +} + +func (t *imageTypeS2) sources(packages []rpmmd.PackageSpec, ostreeCommits []ostreeCommit) osbuild.Sources { + sources := osbuild.Sources{} + curl := &osbuild.CurlSource{ + Items: make(map[string]osbuild.CurlSourceItem), + } + for _, pkg := range packages { + item := new(osbuild.URLWithSecrets) + item.URL = pkg.RemoteLocation + if pkg.Secrets == "org.osbuild.rhsm" { + item.Secrets = &osbuild.URLSecrets{ + Name: "org.osbuild.rhsm", + } + } + curl.Items[pkg.Checksum] = item + } + if len(curl.Items) > 0 { + sources["org.osbuild.curl"] = curl + } + + ostree := &osbuild.OSTreeSource{ + Items: make(map[string]osbuild.OSTreeSourceItem), + } + for _, commit := range ostreeCommits { + item := new(osbuild.OSTreeSourceItem) + item.Remote.URL = commit.URL + ostree.Items[commit.Checksum] = *item + } + if len(ostree.Items) > 0 { + sources["org.osbuild.ostree"] = ostree + } + return sources +} + +func (t *imageTypeS2) pipelines(customizations *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSetSpecs map[string][]rpmmd.PackageSpec, rng *rand.Rand) ([]osbuild.Pipeline, error) { + + if t.bootISO { + if options.OSTree.Parent == "" { + return nil, fmt.Errorf("boot ISO image type %q requires specifying a URL from which to retrieve the OSTree commit", t.name) + } + if customizations != nil { + return nil, fmt.Errorf("boot ISO image type %q does not support blueprint customizations", t.name) + } + } + + if kernelOpts := customizations.GetKernel(); kernelOpts.Append != "" && t.rpmOstree { + return nil, fmt.Errorf("kernel boot parameter customizations are not supported for ostree types") + } + + pipelines := make([]osbuild.Pipeline, 0) + + pipelines = append(pipelines, *t.buildPipeline(repos, packageSetSpecs["build-packages"])) + + if t.bootISO { + var kernelPkg rpmmd.PackageSpec + for _, pkg := range packageSetSpecs["installer"] { + if pkg.Name == "kernel" { + kernelPkg = pkg + break + } + } + // TODO: panic if not found + kernelVer := fmt.Sprintf("%s-%s.%s", kernelPkg.Version, kernelPkg.Release, kernelPkg.Arch) + pipelines = append(pipelines, *t.anacondaTreePipeline(repos, packageSetSpecs["installer"], options, kernelVer)) + pipelines = append(pipelines, *t.bootISOTreePipeline(kernelVer)) + pipelines = append(pipelines, *t.bootISOPipeline()) + } else { + treePipeline, err := t.ostreeTreePipeline(repos, packageSetSpecs["packages"], customizations) + if err != nil { + return nil, err + } + pipelines = append(pipelines, *treePipeline) + pipelines = append(pipelines, *t.ostreeCommitPipeline(options)) + pipelines = append(pipelines, *t.containerTreePipeline(repos, packageSetSpecs["container"], options, customizations)) + pipelines = append(pipelines, *t.containerPipeline()) + } + + return pipelines, nil +} + +func (t *imageTypeS2) buildPipeline(repos []rpmmd.RepoConfig, buildPackageSpecs []rpmmd.PackageSpec) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "build" + p.Runner = "org.osbuild.rhel84" + p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(buildPackageSpecs))) + p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) + return p +} + +func (t *imageTypeS2) ostreeTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, c *blueprint.Customizations) (*osbuild.Pipeline, error) { + p := new(osbuild.Pipeline) + p.Name = "ostree-tree" + p.Build = "name:build" + p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) + language, keyboard := c.GetPrimaryLocale() + if language != nil { + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language})) + } else { + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"})) + } + if keyboard != nil { + p.AddStage(osbuild.NewKeymapStage(&osbuild.KeymapStageOptions{Keymap: *keyboard})) + } + if hostname := c.GetHostname(); hostname != nil { + p.AddStage(osbuild.NewHostnameStage(&osbuild.HostnameStageOptions{Hostname: *hostname})) + } + + timezone, ntpServers := c.GetTimezoneSettings() + if timezone != nil { + p.AddStage(osbuild.NewTimezoneStage(&osbuild.TimezoneStageOptions{Zone: *timezone})) + } else { + p.AddStage(osbuild.NewTimezoneStage(&osbuild.TimezoneStageOptions{Zone: "America/New_York"})) + } + + if len(ntpServers) > 0 { + p.AddStage(osbuild.NewChronyStage(&osbuild.ChronyStageOptions{Timeservers: ntpServers})) + } + + if groups := c.GetGroups(); len(groups) > 0 { + p.AddStage(osbuild.NewGroupsStage(t.groupStageOptions(groups))) + } + + if users := c.GetUsers(); len(users) > 0 { + options, err := t.userStageOptions(users) + if err != nil { + return nil, err + } + p.AddStage(osbuild.NewUsersStage(options)) + p.AddStage(osbuild.NewFirstBootStage(t.usersFirstBootOptions(options))) + } + + if services := c.GetServices(); services != nil || t.enabledServices != nil || t.disabledServices != nil || t.defaultTarget != "" { + p.AddStage(osbuild.NewSystemdStage(t.systemdStageOptions(t.enabledServices, t.disabledServices, services, t.defaultTarget))) + } + + if firewall := c.GetFirewall(); firewall != nil { + p.AddStage(osbuild.NewFirewallStage(t.firewallStageOptions(firewall))) + } + + if !t.bootISO { + p.AddStage(osbuild.NewSELinuxStage(t.selinuxStageOptions())) + } + + // These are the current defaults for the sysconfig stage. This can be changed to be image type exclusive if different configs are needed. + p.AddStage(osbuild.NewSysconfigStage(&osbuild.SysconfigStageOptions{ + Kernel: osbuild.SysconfigKernelOptions{ + UpdateDefault: true, + DefaultKernel: "kernel", + }, + Network: osbuild.SysconfigNetworkOptions{ + Networking: true, + NoZeroConf: true, + }, + })) + + p.AddStage(osbuild.NewOSTreePrepTreeStage(&osbuild.OSTreePrepTreeStageOptions{ + EtcGroupMembers: []string{ + // NOTE: We may want to make this configurable. + "wheel", "docker", + }, + })) + return p, nil +} + +func (t *imageTypeS2) ostreeCommitPipeline(options distro.ImageOptions) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "ostree-commit" + p.Build = "name:build" + p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: "/repo"})) + + commitStageInput := new(osbuild.OSTreeCommitStageInput) + commitStageInput.Type = "org.osbuild.tree" + commitStageInput.Origin = "org.osbuild.pipeline" + commitStageInput.References = osbuild.OSTreeCommitStageReferences{"name:ostree-tree"} + + p.AddStage(osbuild.NewOSTreeCommitStage( + &osbuild.OSTreeCommitStageOptions{ + Ref: t.OSTreeRef(), + OSVersion: "8.4", // NOTE: Set on image type? + Parent: options.OSTree.Parent, + }, + &osbuild.OSTreeCommitStageInputs{Tree: commitStageInput}), + ) + return p +} + +func (t *imageTypeS2) containerTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, c *blueprint.Customizations) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "container-tree" + p.Build = "name:build" + p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) + language, _ := c.GetPrimaryLocale() + if language != nil { + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: *language})) + } else { + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US"})) + } + p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: "/var/www/html/repo"})) + + p.AddStage(osbuild.NewOSTreePullStage( + &osbuild.OSTreePullStageOptions{Repo: "/var/www/html/repo"}, + t.ostreePullStageInputs("org.osbuild.pipeline", "name:ostree-commit", t.OSTreeRef()), + )) + return p +} + +func (t *imageTypeS2) containerPipeline() *osbuild.Pipeline { + p := new(osbuild.Pipeline) + // NOTE(akoutsou) 1to2t: final pipeline should always be named "assembler" + p.Name = "assembler" + p.Build = "name:build" + options := &osbuild.OCIArchiveStageOptions{ + Architecture: t.arch.Name(), + Filename: t.Filename(), + Config: &osbuild.OCIArchiveConfig{ + Cmd: []string{"httpd", "-D", "FOREGROUND"}, + ExposedPorts: []string{"80"}, + }, + } + baseInput := new(osbuild.OCIArchiveStageInput) + baseInput.Type = "org.osbuild.tree" + baseInput.Origin = "org.osbuild.pipeline" + baseInput.References = []string{"name:container-tree"} + inputs := &osbuild.OCIArchiveStageInputs{Base: baseInput} + p.AddStage(osbuild.NewOCIArchiveStage(options, inputs)) + return p +} + +func (t *imageTypeS2) anacondaTreePipeline(repos []rpmmd.RepoConfig, packages []rpmmd.PackageSpec, options distro.ImageOptions, kernelVer string) *osbuild.Pipeline { + ostreeRepoPath := "/ostree/repo" + p := new(osbuild.Pipeline) + p.Name = "anaconda-tree" + p.Build = "name:build" + p.AddStage(osbuild.NewRPMStage(t.rpmStageOptions(repos), t.rpmStageInputs(packages))) + p.AddStage(osbuild.NewOSTreeInitStage(&osbuild.OSTreeInitStageOptions{Path: ostreeRepoPath})) + p.AddStage(osbuild.NewOSTreePullStage( + &osbuild.OSTreePullStageOptions{Repo: ostreeRepoPath}, + t.ostreePullStageInputs("org.osbuild.source", options.OSTree.Parent, options.OSTree.Ref), + )) + p.AddStage(osbuild.NewBuildstampStage(t.buildStampStageOptions())) + p.AddStage(osbuild.NewLocaleStage(&osbuild.LocaleStageOptions{Language: "en_US.UTF-8"})) + + rootPassword := "" + rootUser := osbuild.UsersStageOptionsUser{ + Password: &rootPassword, + } + + installUID := 0 + installGID := 0 + installHome := "/root" + installShell := "/usr/libexec/anaconda/run-anaconda" + installPassword := "" + installUser := osbuild.UsersStageOptionsUser{ + UID: &installUID, + GID: &installGID, + Home: &installHome, + Shell: &installShell, + Password: &installPassword, + } + usersStageOptions := &osbuild.UsersStageOptions{ + Users: map[string]osbuild.UsersStageOptionsUser{ + "root": rootUser, + "install": installUser, + }, + } + + p.AddStage(osbuild.NewUsersStage(usersStageOptions)) + p.AddStage(osbuild.NewAnacondaStage(t.anacondaStageOptions())) + p.AddStage(osbuild.NewLoraxScriptStage(t.loraxScriptStageOptions())) + p.AddStage(osbuild.NewDracutStage(t.dracutStageOptions(kernelVer))) + p.AddStage(osbuild.NewKickstartStage(t.kickstartStageOptions(fmt.Sprintf("file://%s", ostreeRepoPath)))) + + return p +} + +func (t *imageTypeS2) bootISOTreePipeline(kernelVer string) *osbuild.Pipeline { + p := new(osbuild.Pipeline) + p.Name = "bootiso-tree" + p.Build = "name:build" + + p.AddStage(osbuild.NewBootISOMonoStage(t.bootISOMonoStageOptions(kernelVer), t.bootISOMonoStageInputs())) + p.AddStage(osbuild.NewDiscinfoStage(t.discinfoStageOptions())) + + return p +} +func (t *imageTypeS2) bootISOPipeline() *osbuild.Pipeline { + p := new(osbuild.Pipeline) + // NOTE(akoutsou) 1to2t: final pipeline should always be named "assembler" + p.Name = "assembler" + p.Build = "name:build" + + p.AddStage(osbuild.NewXorrisofsStage(t.xorrisofsStageOptions(), t.xorrisofsStageInputs())) + p.AddStage(osbuild.NewImplantisomd5Stage(&osbuild.Implantisomd5StageOptions{Filename: t.Filename()})) + + return p +} + +func (t *imageTypeS2) rpmStageInputs(specs []rpmmd.PackageSpec) *osbuild.RPMStageInputs { + stageInput := new(osbuild.RPMStageInput) + stageInput.Type = "org.osbuild.files" + stageInput.Origin = "org.osbuild.source" + stageInput.References = pkgRefs(specs) + return &osbuild.RPMStageInputs{Packages: stageInput} +} + +func pkgRefs(specs []rpmmd.PackageSpec) osbuild.RPMStageReferences { + refs := make([]string, len(specs)) + for idx, pkg := range specs { + refs[idx] = pkg.Checksum + } + return refs +} + +func (t *imageTypeS2) ostreePullStageInputs(origin, source, commitRef string) *osbuild.OSTreePullStageInputs { + pullStageInput := new(osbuild.OSTreePullStageInput) + pullStageInput.Type = "org.osbuild.ostree" + pullStageInput.Origin = origin + + inputRefs := make(map[string]osbuild.OSTreePullStageReference) + inputRefs[source] = osbuild.OSTreePullStageReference{Ref: commitRef} + pullStageInput.References = inputRefs + return &osbuild.OSTreePullStageInputs{Commits: pullStageInput} +} + +func (t *imageTypeS2) rpmStageOptions(repos []rpmmd.RepoConfig) *osbuild.RPMStageOptions { + var gpgKeys []string + for _, repo := range repos { + if repo.GPGKey == "" { + continue + } + gpgKeys = append(gpgKeys, repo.GPGKey) + } + + return &osbuild.RPMStageOptions{ + GPGKeys: gpgKeys, + Exclude: &osbuild.Exclude{ + // NOTE: Make configurable? + Docs: true, + }, + } +} + +func (t *imageTypeS2) selinuxStageOptions() *osbuild.SELinuxStageOptions { + + options := &osbuild.SELinuxStageOptions{ + FileContexts: "etc/selinux/targeted/contexts/files/file_contexts", + } + if t.bootISO { + options.Labels = map[string]string{ + "/usr/bin/cp": "system_u:object_r:install_exec_t:s0", + "/usr/bin/tar": "system_u:object_r:install_exec_t:s0", + } + } + return options +} + +func (t *imageTypeS2) userStageOptions(users []blueprint.UserCustomization) (*osbuild.UsersStageOptions, error) { + options := osbuild.UsersStageOptions{ + Users: make(map[string]osbuild.UsersStageOptionsUser), + } + + for _, c := range users { + if c.Password != nil && !crypt.PasswordIsCrypted(*c.Password) { + cryptedPassword, err := crypt.CryptSHA512(*c.Password) + if err != nil { + return nil, err + } + + c.Password = &cryptedPassword + } + + user := osbuild.UsersStageOptionsUser{ + Groups: c.Groups, + Description: c.Description, + Home: c.Home, + Shell: c.Shell, + Password: c.Password, + Key: c.Key, + } + + user.UID = c.UID + user.GID = c.GID + + options.Users[c.Name] = user + } + + return &options, nil +} + +func (t *imageTypeS2) usersFirstBootOptions(usersStageOptions *osbuild.UsersStageOptions) *osbuild.FirstBootStageOptions { + cmds := make([]string, 0, 3*len(usersStageOptions.Users)+1) + // workaround for creating authorized_keys file for user + varhome := filepath.Join("/var", "home") + for name, user := range usersStageOptions.Users { + if user.Key != nil { + sshdir := filepath.Join(varhome, name, ".ssh") + cmds = append(cmds, fmt.Sprintf("mkdir -p %s", sshdir)) + cmds = append(cmds, fmt.Sprintf("sh -c 'echo %q >> %q'", *user.Key, filepath.Join(sshdir, "authorized_keys"))) + cmds = append(cmds, fmt.Sprintf("chown %s:%s -Rc %s", name, name, sshdir)) + } + } + cmds = append(cmds, fmt.Sprintf("restorecon -rvF %s", varhome)) + options := &osbuild.FirstBootStageOptions{ + Commands: cmds, + WaitForNetwork: false, + } + + return options +} + +func (t *imageTypeS2) groupStageOptions(groups []blueprint.GroupCustomization) *osbuild.GroupsStageOptions { + options := osbuild.GroupsStageOptions{ + Groups: map[string]osbuild.GroupsStageOptionsGroup{}, + } + + for _, group := range groups { + groupData := osbuild.GroupsStageOptionsGroup{ + Name: group.Name, + } + groupData.GID = group.GID + + options.Groups[group.Name] = groupData + } + + return &options +} + +func (t *imageTypeS2) firewallStageOptions(firewall *blueprint.FirewallCustomization) *osbuild.FirewallStageOptions { + options := osbuild.FirewallStageOptions{ + Ports: firewall.Ports, + } + + if firewall.Services != nil { + options.EnabledServices = firewall.Services.Enabled + options.DisabledServices = firewall.Services.Disabled + } + + return &options +} + +func (t *imageTypeS2) systemdStageOptions(enabledServices, disabledServices []string, s *blueprint.ServicesCustomization, target string) *osbuild.SystemdStageOptions { + if s != nil { + enabledServices = append(enabledServices, s.Enabled...) + disabledServices = append(disabledServices, s.Disabled...) + } + return &osbuild.SystemdStageOptions{ + EnabledServices: enabledServices, + DisabledServices: disabledServices, + DefaultTarget: target, + } +} + +func (t *imageTypeS2) buildStampStageOptions() *osbuild.BuildstampStageOptions { + return &osbuild.BuildstampStageOptions{ + Arch: t.Arch().Name(), + Product: "Red Hat Enterprise Linux", + Version: "8.4", + Variant: "edge", + Final: true, + } +} + +func (t *imageTypeS2) anacondaStageOptions() *osbuild.AnacondaStageOptions { + return &osbuild.AnacondaStageOptions{ + KickstartModules: []string{ + "org.fedoraproject.Anaconda.Modules.Network", + "org.fedoraproject.Anaconda.Modules.Payloads", + "org.fedoraproject.Anaconda.Modules.Storage", + }, + } +} + +func (t *imageTypeS2) loraxScriptStageOptions() *osbuild.LoraxScriptStageOptions { + return &osbuild.LoraxScriptStageOptions{ + Path: "99-generic/runtime-postinstall.tmpl", + BaseArch: t.Arch().Name(), + } +} + +func (t *imageTypeS2) dracutStageOptions(kernelVer string) *osbuild.DracutStageOptions { + kernel := []string{kernelVer} + modules := []string{ + "bash", + "systemd", + "fips", + "systemd-initrd", + "modsign", + "nss-softokn", + "rdma", + "rngd", + "i18n", + "convertfs", + "network-manager", + "network", + "ifcfg", + "url-lib", + "drm", + "plymouth", + "prefixdevname", + "prefixdevname-tools", + "anaconda", + "crypt", + "dm", + "dmsquash-live", + "kernel-modules", + "kernel-modules-extra", + "kernel-network-modules", + "livenet", + "lvm", + "mdraid", + "multipath", + "qemu", + "qemu-net", + "fcoe", + "fcoe-uefi", + "iscsi", + "lunmask", + "nfs", + "resume", + "rootfs-block", + "terminfo", + "udev-rules", + "biosdevname", + "dracut-systemd", + "pollcdrom", + "usrmount", + "base", + "fs-lib", + "img-lib", + "shutdown", + "uefi-lib", + } + return &osbuild.DracutStageOptions{ + Kernel: kernel, + Modules: modules, + Install: []string{"/.buildstamp"}, + } +} + +func (t *imageTypeS2) kickstartStageOptions(ostreeURL string) *osbuild.KickstartStageOptions { + return &osbuild.KickstartStageOptions{ + Path: "/usr/share/anaconda/interactive-defaults.ks", + OSTree: osbuild.OSTreeOptions{ + OSName: "rhel", + URL: ostreeURL, + Ref: t.OSTreeRef(), + GPG: false, + }, + } +} + +func (t *imageTypeS2) bootISOMonoStageOptions(kernelVer string) *osbuild.BootISOMonoStageOptions { + return &osbuild.BootISOMonoStageOptions{ + Product: osbuild.Product{ + Name: "Red Hat Enterprise Linux", + Version: "8.4", + }, + ISOLabel: fmt.Sprintf("RHEL-8-4-0-BaseOS-%s", t.Arch().Name()), + Kernel: kernelVer, + EFI: osbuild.EFI{ + Architectures: []string{ + "IA32", + "X64", + }, + Vendor: "redhat", + }, + ISOLinux: osbuild.ISOLinux{ + Enabled: true, + Debug: false, + }, + Templates: "80-rhel", + RootFS: osbuild.RootFS{ + Size: 4096, + Compression: osbuild.FSCompression{ + Method: "xz", + Options: osbuild.FSCompressionOptions{ + // TODO: based on image arch + BCJ: "x86", + }, + }, + }, + } +} + +func (t *imageTypeS2) bootISOMonoStageInputs() *osbuild.BootISOMonoStageInputs { + rootfsInput := new(osbuild.BootISOMonoStageInput) + rootfsInput.Type = "org.osbuild.tree" + rootfsInput.Origin = "org.osbuild.pipeline" + rootfsInput.References = osbuild.BootISOMonoStageReferences{"name:anaconda-tree"} + return &osbuild.BootISOMonoStageInputs{ + RootFS: rootfsInput, + } +} + +func (t *imageTypeS2) discinfoStageOptions() *osbuild.DiscinfoStageOptions { + return &osbuild.DiscinfoStageOptions{ + BaseArch: t.Arch().Name(), + Release: "202010217.n.0", + } +} + +func (t *imageTypeS2) xorrisofsStageOptions() *osbuild.XorrisofsStageOptions { + return &osbuild.XorrisofsStageOptions{ + Filename: t.Filename(), + VolID: fmt.Sprintf("RHEL-8-4-0-BaseOS-%s", t.Arch().Name()), + SysID: "LINUX", + Boot: osbuild.XorrisofsBoot{ + Image: "isolinux/isolinux.bin", + Catalog: "isolinux/boot.cat", + }, + EFI: "images/efiboot.img", + IsohybridMBR: "/usr/share/syslinux/isohdpfx.bin", + } +} + +func (t *imageTypeS2) xorrisofsStageInputs() *osbuild.XorrisofsStageInputs { + input := new(osbuild.XorrisofsStageInput) + input.Type = "org.osbuild.tree" + input.Origin = "org.osbuild.pipeline" + input.References = osbuild.XorrisofsStageReferences{"name:bootiso-tree"} + return &osbuild.XorrisofsStageInputs{Tree: input} +} diff --git a/internal/distro/test_distro/distro.go b/internal/distro/test_distro/distro.go index 3221aa5..3ed0055 100644 --- a/internal/distro/test_distro/distro.go +++ b/internal/distro/test_distro/distro.go @@ -6,7 +6,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/blueprint" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/rpmmd" ) @@ -79,7 +79,14 @@ func (t *TestImageType) BuildPackages() []string { return nil } -func (t *TestImageType) Manifest(b *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSpecs, buildPackageSpecs []rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { +func (t *TestImageType) PackageSets(bp blueprint.Blueprint) map[string]rpmmd.PackageSet { + return nil +} +func (t *TestImageType) Exports() []string { + return []string{"assembler"} +} + +func (t *TestImageType) Manifest(b *blueprint.Customizations, options distro.ImageOptions, repos []rpmmd.RepoConfig, packageSpecSets map[string][]rpmmd.PackageSpec, seed int64) (distro.Manifest, error) { return json.Marshal( osbuild.Manifest{ Sources: osbuild.Sources{}, diff --git a/internal/kojiapi/server.go b/internal/kojiapi/server.go index a7b2c50..1c4a5f2 100644 --- a/internal/kojiapi/server.go +++ b/internal/kojiapi/server.go @@ -118,18 +118,18 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error { if err != nil { panic("Could not initialize empty blueprint.") } - packageSpecs, excludePackageSpecs := imageType.Packages(*bp) - packages, _, err := h.server.rpmMetadata.Depsolve(packageSpecs, excludePackageSpecs, repositories, d.ModulePlatformID(), arch.Name()) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to depsolve base base packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err)) - } - buildPackageSpecs := imageType.BuildPackages() - buildPackages, _, err := h.server.rpmMetadata.Depsolve(buildPackageSpecs, nil, repositories, d.ModulePlatformID(), arch.Name()) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to depsolve build packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err)) + + packageSets := imageType.PackageSets(*bp) + packageSpecSets := make(map[string][]rpmmd.PackageSpec) + for name, packages := range packageSets { + packageSpecs, _, err := h.server.rpmMetadata.Depsolve(packages, repositories, d.ModulePlatformID(), arch.Name()) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Failed to depsolve base base packages for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err)) + } + packageSpecSets[name] = packageSpecs } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, repositories, packages, buildPackages, manifestSeed) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, repositories, packageSpecSets, manifestSeed) if err != nil { return echo.NewHTTPError(http.StatusBadGateway, fmt.Sprintf("Failed to get manifest for for %s/%s/%s: %s", ir.ImageType, ir.Architecture, request.Distribution, err)) } diff --git a/internal/kojiapi/server_test.go b/internal/kojiapi/server_test.go index bfeae4e..e2b10f0 100644 --- a/internal/kojiapi/server_test.go +++ b/internal/kojiapi/server_test.go @@ -18,7 +18,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/kojiapi/api" distro_mock "github.com/osbuild/osbuild-composer/internal/mocks/distro" rpmmd_mock "github.com/osbuild/osbuild-composer/internal/mocks/rpmmd" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/test" "github.com/osbuild/osbuild-composer/internal/worker" "github.com/stretchr/testify/require" diff --git a/internal/mocks/rpmmd/rpmmd_mock.go b/internal/mocks/rpmmd/rpmmd_mock.go index 49049f7..dd42be0 100644 --- a/internal/mocks/rpmmd/rpmmd_mock.go +++ b/internal/mocks/rpmmd/rpmmd_mock.go @@ -36,6 +36,6 @@ func (r *rpmmdMock) FetchMetadata(repos []rpmmd.RepoConfig, modulePlatformID str return r.Fixture.fetchPackageList.ret, r.Fixture.fetchPackageList.checksums, r.Fixture.fetchPackageList.err } -func (r *rpmmdMock) Depsolve(specs, excludeSpecs []string, repos []rpmmd.RepoConfig, modulePlatformID, arch string) ([]rpmmd.PackageSpec, map[string]string, error) { +func (r *rpmmdMock) Depsolve(packageSet rpmmd.PackageSet, repos []rpmmd.RepoConfig, modulePlatformID, arch string) ([]rpmmd.PackageSpec, map[string]string, error) { return r.Fixture.depsolve.ret, r.Fixture.fetchPackageList.checksums, r.Fixture.depsolve.err } diff --git a/internal/osbuild1/assembler.go b/internal/osbuild1/assembler.go new file mode 100644 index 0000000..f6a6fa3 --- /dev/null +++ b/internal/osbuild1/assembler.go @@ -0,0 +1,55 @@ +package osbuild1 + +import ( + "encoding/json" + "errors" +) + +// An Assembler turns a filesystem tree into a target image. +type Assembler struct { + Name string `json:"name"` + Options AssemblerOptions `json:"options"` +} + +// AssemblerOptions specify the operations of a given assembler-type. +type AssemblerOptions interface { + isAssemblerOptions() +} + +type rawAssembler struct { + Name string `json:"name"` + Options json.RawMessage `json:"options"` +} + +// UnmarshalJSON unmarshals JSON into an Assembler object. Each type of +// assembler has a custom unmarshaller for its options, selected based on the +// stage name. +func (assembler *Assembler) UnmarshalJSON(data []byte) error { + var rawAssembler rawAssembler + err := json.Unmarshal(data, &rawAssembler) + if err != nil { + return err + } + var options AssemblerOptions + switch rawAssembler.Name { + case "org.osbuild.ostree.commit": + options = new(OSTreeCommitAssemblerOptions) + case "org.osbuild.qemu": + options = new(QEMUAssemblerOptions) + case "org.osbuild.rawfs": + options = new(RawFSAssemblerOptions) + case "org.osbuild.tar": + options = new(TarAssemblerOptions) + default: + return errors.New("unexpected assembler name") + } + err = json.Unmarshal(rawAssembler.Options, options) + if err != nil { + return err + } + + assembler.Name = rawAssembler.Name + assembler.Options = options + + return nil +} diff --git a/internal/osbuild1/assembler_test.go b/internal/osbuild1/assembler_test.go new file mode 100644 index 0000000..2f4b582 --- /dev/null +++ b/internal/osbuild1/assembler_test.go @@ -0,0 +1,171 @@ +package osbuild1 + +import ( + "encoding/json" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestAssembler_UnmarshalJSON(t *testing.T) { + tests := []struct { + name string + assembler Assembler + data []byte + errorExpected bool + }{ + { + // invalid JSON - note the missing brace at the end of the string + name: "invalid json", + data: []byte(`{"name":"org.osbuild.tar","options":{"filename":""}`), + errorExpected: true, + }, + { + // valid JSON, but with an unknown assembler (org.osbuild.foo) + name: "unknown assembler", + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}}`), + errorExpected: true, + }, + { + name: "missing options", + data: []byte(`{"name":"org.osbuild.rawfs"`), + errorExpected: true, + }, + { + name: "missing name", + data: []byte(`{"options":{"bar":null}}`), + errorExpected: true, + }, + { + name: "qemu assembler empty", + assembler: Assembler{ + Name: "org.osbuild.qemu", + Options: &QEMUAssemblerOptions{}, + }, + data: []byte(`{"name":"org.osbuild.qemu","options":{"format":"","filename":"","size":0,"ptuuid":"","pttype":"","partitions":null}}`), + }, + { + name: "qemu assembler full", + assembler: Assembler{ + Name: "org.osbuild.qemu", + Options: &QEMUAssemblerOptions{ + Format: "qcow2", + Filename: "disk.qcow2", + Size: 2147483648, + PTUUID: "0x14fc63d2", + PTType: "mbr", + Partitions: []QEMUPartition{QEMUPartition{ + Start: 2048, + Bootable: true, + Filesystem: &QEMUFilesystem{ + Type: "ext4", + UUID: "76a22bf4-f153-4541-b6c7-0332c0dfaeac", + Label: "root", + Mountpoint: "/", + }, + }}, + }, + }, + data: []byte(`{"name":"org.osbuild.qemu","options":{"format":"qcow2","filename":"disk.qcow2","size":2147483648,"ptuuid":"0x14fc63d2","pttype":"mbr","partitions":[{"start":2048,"bootable":true,"filesystem":{"type":"ext4","uuid":"76a22bf4-f153-4541-b6c7-0332c0dfaeac","label":"root","mountpoint":"/"}}]}}`), + }, + { + name: "tar assembler empty", + assembler: Assembler{ + Name: "org.osbuild.tar", + Options: &TarAssemblerOptions{}, + }, + data: []byte(`{"name":"org.osbuild.tar","options":{"filename":""}}`), + }, + { + name: "tar assembler full", + assembler: Assembler{ + Name: "org.osbuild.tar", + Options: &TarAssemblerOptions{ + Filename: "root.tar.xz", + Compression: "xz", + }, + }, + data: []byte(`{"name":"org.osbuild.tar","options":{"filename":"root.tar.xz","compression":"xz"}}`), + }, + { + name: "rawfs assembler empty", + assembler: Assembler{ + Name: "org.osbuild.rawfs", + Options: &RawFSAssemblerOptions{}, + }, + data: []byte(`{"name":"org.osbuild.rawfs","options":{"filename":"","root_fs_uuid":"00000000-0000-0000-0000-000000000000","size":0}}`), + }, + { + name: "rawfs assembler full", + assembler: Assembler{ + Name: "org.osbuild.rawfs", + Options: &RawFSAssemblerOptions{ + Filename: "filesystem.img", + RootFilesystemUUID: uuid.MustParse("76a22bf4-f153-4541-b6c7-0332c0dfaeac"), + Size: 2147483648, + }, + }, + data: []byte(`{"name":"org.osbuild.rawfs","options":{"filename":"filesystem.img","root_fs_uuid":"76a22bf4-f153-4541-b6c7-0332c0dfaeac","size":2147483648}}`), + }, + { + name: "ostree commit assembler", + assembler: Assembler{ + Name: "org.osbuild.ostree.commit", + Options: &OSTreeCommitAssemblerOptions{ + Ref: "foo", + Tar: OSTreeCommitAssemblerTarOptions{ + Filename: "foo.tar", + }, + }, + }, + data: []byte(`{"name":"org.osbuild.ostree.commit","options":{"ref":"foo","tar":{"filename":"foo.tar"}}}`), + }, + } + + assert := assert.New(t) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assembler := &tt.assembler + var gotAssembler Assembler + err := gotAssembler.UnmarshalJSON(tt.data) + if tt.errorExpected { + assert.NotNil(err) + return + } else { + assert.Nil(err) + } + gotBytes, err := json.Marshal(assembler) + assert.Nilf(err, "Could not marshal assembler: %v", err) + assert.Equal(tt.data, gotBytes) + assert.Equal(&gotAssembler, assembler) + }) + } +} + +func TestNewQEMUAssembler(t *testing.T) { + options := &QEMUAssemblerOptions{} + expectedAssembler := &Assembler{ + Name: "org.osbuild.qemu", + Options: &QEMUAssemblerOptions{}, + } + assert.Equal(t, expectedAssembler, NewQEMUAssembler(options)) +} + +func TestNewTarAssembler(t *testing.T) { + options := &TarAssemblerOptions{} + expectedAssembler := &Assembler{ + Name: "org.osbuild.tar", + Options: &TarAssemblerOptions{}, + } + assert.Equal(t, expectedAssembler, NewTarAssembler(options)) +} + +func TestNewRawFSAssembler(t *testing.T) { + options := &RawFSAssemblerOptions{} + expectedAssembler := &Assembler{ + Name: "org.osbuild.rawfs", + Options: &RawFSAssemblerOptions{}, + } + assert.Equal(t, expectedAssembler, NewRawFSAssembler(options)) +} diff --git a/internal/osbuild1/chrony_stage.go b/internal/osbuild1/chrony_stage.go new file mode 100644 index 0000000..a07ffa5 --- /dev/null +++ b/internal/osbuild1/chrony_stage.go @@ -0,0 +1,14 @@ +package osbuild1 + +type ChronyStageOptions struct { + Timeservers []string `json:"timeservers"` +} + +func (ChronyStageOptions) isStageOptions() {} + +func NewChronyStage(options *ChronyStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.chrony", + Options: options, + } +} diff --git a/internal/osbuild1/chrony_stage_test.go b/internal/osbuild1/chrony_stage_test.go new file mode 100644 index 0000000..a62a3b9 --- /dev/null +++ b/internal/osbuild1/chrony_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewChronyStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.chrony", + Options: &ChronyStageOptions{}, + } + actualStage := NewChronyStage(&ChronyStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/files_source.go b/internal/osbuild1/files_source.go new file mode 100644 index 0000000..2cd4393 --- /dev/null +++ b/internal/osbuild1/files_source.go @@ -0,0 +1,16 @@ +package osbuild1 + +type Secret struct { + Name string `json:"name,omitempty"` +} +type FileSource struct { + URL string `json:"url"` + Secrets *Secret `json:"secrets,omitempty"` +} + +// The FilesSourceOptions specifies a custom script to run in the image +type FilesSource struct { + URLs map[string]FileSource `json:"urls"` +} + +func (FilesSource) isSource() {} diff --git a/internal/osbuild1/firewall_stage.go b/internal/osbuild1/firewall_stage.go new file mode 100644 index 0000000..259c598 --- /dev/null +++ b/internal/osbuild1/firewall_stage.go @@ -0,0 +1,16 @@ +package osbuild1 + +type FirewallStageOptions struct { + Ports []string `json:"ports,omitempty"` + EnabledServices []string `json:"enabled_services,omitempty"` + DisabledServices []string `json:"disabled_services,omitempty"` +} + +func (FirewallStageOptions) isStageOptions() {} + +func NewFirewallStage(options *FirewallStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.firewall", + Options: options, + } +} diff --git a/internal/osbuild1/firewall_stage_test.go b/internal/osbuild1/firewall_stage_test.go new file mode 100644 index 0000000..6bb5878 --- /dev/null +++ b/internal/osbuild1/firewall_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFirewallStage(t *testing.T) { + expectedFirewall := &Stage{ + Name: "org.osbuild.firewall", + Options: &FirewallStageOptions{}, + } + actualFirewall := NewFirewallStage(&FirewallStageOptions{}) + assert.Equal(t, expectedFirewall, actualFirewall) +} diff --git a/internal/osbuild1/first_boot_stage.go b/internal/osbuild1/first_boot_stage.go new file mode 100644 index 0000000..b5269c2 --- /dev/null +++ b/internal/osbuild1/first_boot_stage.go @@ -0,0 +1,15 @@ +package osbuild1 + +type FirstBootStageOptions struct { + Commands []string `json:"commands"` + WaitForNetwork bool `json:"wait_for_network,omitempty"` +} + +func (FirstBootStageOptions) isStageOptions() {} + +func NewFirstBootStage(options *FirstBootStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.first-boot", + Options: options, + } +} diff --git a/internal/osbuild1/first_boot_stage_test.go b/internal/osbuild1/first_boot_stage_test.go new file mode 100644 index 0000000..a85a330 --- /dev/null +++ b/internal/osbuild1/first_boot_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFirstBootStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.first-boot", + Options: &FirstBootStageOptions{}, + } + actualStage := NewFirstBootStage(&FirstBootStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/fix_bls_stage.go b/internal/osbuild1/fix_bls_stage.go new file mode 100644 index 0000000..ab87364 --- /dev/null +++ b/internal/osbuild1/fix_bls_stage.go @@ -0,0 +1,21 @@ +package osbuild1 + +// A FixBLSStageOptions struct is empty, as the stage takes no options. +// +// The FixBLSStage fixes the paths in the Boot Loader Specification +// snippets installed into /boot. grub2's kernel install script will +// try to guess the correct path to the kernel and bootloader, and adjust +// the boot loader scripts accordingly. When run under OSBuild this does +// not work correctly, so this stage essentially reverts the "fixup". +type FixBLSStageOptions struct { +} + +func (FixBLSStageOptions) isStageOptions() {} + +// NewFixBLSStage creates a new FixBLSStage. +func NewFixBLSStage() *Stage { + return &Stage{ + Name: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + } +} diff --git a/internal/osbuild1/fix_bls_stage_test.go b/internal/osbuild1/fix_bls_stage_test.go new file mode 100644 index 0000000..6efd07a --- /dev/null +++ b/internal/osbuild1/fix_bls_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFixBLSStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + } + actualStage := NewFixBLSStage() + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/fstab_stage.go b/internal/osbuild1/fstab_stage.go new file mode 100644 index 0000000..5c1176c --- /dev/null +++ b/internal/osbuild1/fstab_stage.go @@ -0,0 +1,44 @@ +package osbuild1 + +// The FSTabStageOptions describe the content of the /etc/fstab file. +// +// The structure of the options follows the format of /etc/fstab, except +// that filesystem must be identified by their UUID and ommitted fields +// are set to their defaults (if possible). +type FSTabStageOptions struct { + FileSystems []*FSTabEntry `json:"filesystems"` +} + +func (FSTabStageOptions) isStageOptions() {} + +// NewFSTabStage creates a now FSTabStage object +func NewFSTabStage(options *FSTabStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.fstab", + Options: options, + } +} + +// An FSTabEntry represents one line in /etc/fstab. With the one exception +// that the the spec field must be represented as an UUID. +type FSTabEntry struct { + UUID string `json:"uuid,omitempty"` + Label string `json:"label,omitempty"` + VFSType string `json:"vfs_type"` + Path string `json:"path,omitempty"` + Options string `json:"options,omitempty"` + Freq uint64 `json:"freq,omitempty"` + PassNo uint64 `json:"passno,omitempty"` +} + +// AddFilesystem adds one entry to and FSTabStageOptions object. +func (options *FSTabStageOptions) AddFilesystem(id string, vfsType string, path string, opts string, freq uint64, passNo uint64) { + options.FileSystems = append(options.FileSystems, &FSTabEntry{ + UUID: id, + VFSType: vfsType, + Path: path, + Options: opts, + Freq: freq, + PassNo: passNo, + }) +} diff --git a/internal/osbuild1/fstab_stage_test.go b/internal/osbuild1/fstab_stage_test.go new file mode 100644 index 0000000..1c286ef --- /dev/null +++ b/internal/osbuild1/fstab_stage_test.go @@ -0,0 +1,52 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFSTabStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.fstab", + Options: &FSTabStageOptions{}, + } + actualStage := NewFSTabStage(&FSTabStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} + +func TestAddFilesystem(t *testing.T) { + options := &FSTabStageOptions{} + filesystems := []*FSTabEntry{ + { + UUID: "76a22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "ext4", + Path: "/", + Options: "defaults", + Freq: 1, + PassNo: 1, + }, + { + UUID: "bba22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "xfs", + Path: "/home", + Options: "defaults", + Freq: 1, + PassNo: 2, + }, + { + UUID: "cca22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "xfs", + Path: "/var", + Options: "defaults", + Freq: 1, + PassNo: 1, + }, + } + + for i, fs := range filesystems { + options.AddFilesystem(fs.UUID, fs.VFSType, fs.Path, fs.Options, fs.Freq, fs.PassNo) + assert.Equal(t, options.FileSystems[i], fs) + } + assert.Equal(t, len(filesystems), len(options.FileSystems)) +} diff --git a/internal/osbuild1/groups_stage.go b/internal/osbuild1/groups_stage.go new file mode 100644 index 0000000..3575a73 --- /dev/null +++ b/internal/osbuild1/groups_stage.go @@ -0,0 +1,19 @@ +package osbuild1 + +type GroupsStageOptions struct { + Groups map[string]GroupsStageOptionsGroup `json:"groups"` +} + +func (GroupsStageOptions) isStageOptions() {} + +type GroupsStageOptionsGroup struct { + Name string `json:"name"` + GID *int `json:"gid,omitempty"` +} + +func NewGroupsStage(options *GroupsStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.groups", + Options: options, + } +} diff --git a/internal/osbuild1/groups_stage_test.go b/internal/osbuild1/groups_stage_test.go new file mode 100644 index 0000000..6b71f4b --- /dev/null +++ b/internal/osbuild1/groups_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewGroupsStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.groups", + Options: &GroupsStageOptions{}, + } + actualStage := NewGroupsStage(&GroupsStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/grub2_stage.go b/internal/osbuild1/grub2_stage.go new file mode 100644 index 0000000..3662d57 --- /dev/null +++ b/internal/osbuild1/grub2_stage.go @@ -0,0 +1,34 @@ +package osbuild1 + +import "github.com/google/uuid" + +// The GRUB2StageOptions describes the bootloader configuration. +// +// The stage is responsible for installing all bootloader files in +// /boot as well as config files in /etc necessary for regenerating +// the configuration in /boot. +// +// Note that it is the role of an assembler to install any necessary +// bootloaders that are stored in the image outside of any filesystem. +type GRUB2StageOptions struct { + RootFilesystemUUID uuid.UUID `json:"root_fs_uuid"` + BootFilesystemUUID *uuid.UUID `json:"boot_fs_uuid,omitempty"` + KernelOptions string `json:"kernel_opts,omitempty"` + Legacy string `json:"legacy,omitempty"` + UEFI *GRUB2UEFI `json:"uefi,omitempty"` + SavedEntry string `json:"saved_entry,omitempty"` +} + +type GRUB2UEFI struct { + Vendor string `json:"vendor"` +} + +func (GRUB2StageOptions) isStageOptions() {} + +// NewGRUB2Stage creates a new GRUB2 stage object. +func NewGRUB2Stage(options *GRUB2StageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.grub2", + Options: options, + } +} diff --git a/internal/osbuild1/grub2_stage_test.go b/internal/osbuild1/grub2_stage_test.go new file mode 100644 index 0000000..dc4022a --- /dev/null +++ b/internal/osbuild1/grub2_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewGRUB2Stage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.grub2", + Options: &GRUB2StageOptions{}, + } + actualStage := NewGRUB2Stage(&GRUB2StageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/hostname_stage.go b/internal/osbuild1/hostname_stage.go new file mode 100644 index 0000000..4c835f3 --- /dev/null +++ b/internal/osbuild1/hostname_stage.go @@ -0,0 +1,14 @@ +package osbuild1 + +type HostnameStageOptions struct { + Hostname string `json:"hostname"` +} + +func (HostnameStageOptions) isStageOptions() {} + +func NewHostnameStage(options *HostnameStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.hostname", + Options: options, + } +} diff --git a/internal/osbuild1/hostname_stage_test.go b/internal/osbuild1/hostname_stage_test.go new file mode 100644 index 0000000..c8a05aa --- /dev/null +++ b/internal/osbuild1/hostname_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewHostnameStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.hostname", + Options: &HostnameStageOptions{}, + } + actualStage := NewHostnameStage(&HostnameStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/kernel_cmdline_stage.go b/internal/osbuild1/kernel_cmdline_stage.go new file mode 100644 index 0000000..d63d576 --- /dev/null +++ b/internal/osbuild1/kernel_cmdline_stage.go @@ -0,0 +1,19 @@ +package osbuild1 + +// KernelCmdlineStageOptions describe how to create kernel-cmdline stage +// +// Configures the kernel boot parameters, also known as the kernel command line. +type KernelCmdlineStageOptions struct { + RootFsUUID string `json:"root_fs_uuid,omitempty"` + KernelOpts string `json:"kernel_opts,omitempty"` +} + +func (KernelCmdlineStageOptions) isStageOptions() {} + +// NewKernelCmdlineStage creates a new kernel-cmdline Stage object. +func NewKernelCmdlineStage(options *KernelCmdlineStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.kernel-cmdline", + Options: options, + } +} diff --git a/internal/osbuild1/kernel_cmdline_stage_test.go b/internal/osbuild1/kernel_cmdline_stage_test.go new file mode 100644 index 0000000..705bd7d --- /dev/null +++ b/internal/osbuild1/kernel_cmdline_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewKernelCmdlineStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.kernel-cmdline", + Options: &KernelCmdlineStageOptions{}, + } + actualStage := NewKernelCmdlineStage(&KernelCmdlineStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/keymap_stage.go b/internal/osbuild1/keymap_stage.go new file mode 100644 index 0000000..7c213f0 --- /dev/null +++ b/internal/osbuild1/keymap_stage.go @@ -0,0 +1,14 @@ +package osbuild1 + +type KeymapStageOptions struct { + Keymap string `json:"keymap"` +} + +func (KeymapStageOptions) isStageOptions() {} + +func NewKeymapStage(options *KeymapStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.keymap", + Options: options, + } +} diff --git a/internal/osbuild1/keymap_stage_test.go b/internal/osbuild1/keymap_stage_test.go new file mode 100644 index 0000000..4ee0444 --- /dev/null +++ b/internal/osbuild1/keymap_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewKeymapStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.keymap", + Options: &KeymapStageOptions{}, + } + actualStage := NewKeymapStage(&KeymapStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/locale_stage.go b/internal/osbuild1/locale_stage.go new file mode 100644 index 0000000..f136006 --- /dev/null +++ b/internal/osbuild1/locale_stage.go @@ -0,0 +1,19 @@ +package osbuild1 + +// The LocaleStageOptions describes the image's locale. +// +// A locale is typically specified as language_[territory], where language +// is specified in ISO 639 and territory in ISO 3166. +type LocaleStageOptions struct { + Language string `json:"language"` +} + +func (LocaleStageOptions) isStageOptions() {} + +// NewLocaleStage creates a new Locale Stage object. +func NewLocaleStage(options *LocaleStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.locale", + Options: options, + } +} diff --git a/internal/osbuild1/locale_stage_test.go b/internal/osbuild1/locale_stage_test.go new file mode 100644 index 0000000..79b7c85 --- /dev/null +++ b/internal/osbuild1/locale_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewLocaleStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.locale", + Options: &LocaleStageOptions{}, + } + actualStage := NewLocaleStage(&LocaleStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/osbuild.go b/internal/osbuild1/osbuild.go new file mode 100644 index 0000000..b9b1978 --- /dev/null +++ b/internal/osbuild1/osbuild.go @@ -0,0 +1,47 @@ +// Package osbuild provides primitives for representing and (un)marshalling +// OSBuild (schema v1) types. +package osbuild1 + +// A Manifest represents an OSBuild source and pipeline manifest +type Manifest struct { + Sources Sources `json:"sources"` + Pipeline Pipeline `json:"pipeline"` +} + +// A Pipeline represents an OSBuild pipeline +type Pipeline struct { + // The build environment which can run this pipeline + Build *Build `json:"build,omitempty"` + // Sequence of stages that produce the filesystem tree, which is the + // payload of the produced image. + Stages []*Stage `json:"stages,omitempty"` + // Assembler that assembles the filesystem tree into the target image. + Assembler *Assembler `json:"assembler,omitempty"` +} + +type Build struct { + // Pipeline describes how to create the build root + Pipeline *Pipeline `json:"pipeline"` + // The runner to use in this build root + Runner string `json:"runner"` +} + +// SetBuild sets the pipeline and runner for generating the build environment +// for a pipeline. +func (p *Pipeline) SetBuild(pipeline *Pipeline, runner string) { + p.Build = &Build{ + Pipeline: pipeline, + Runner: runner, + } +} + +// AddStage appends a stage to the list of stages of a pipeline. The stages +// will be executed in the order they are appended. +func (p *Pipeline) AddStage(stage *Stage) { + p.Stages = append(p.Stages, stage) +} + +// SetAssembler sets the assembler for a pipeline. +func (p *Pipeline) SetAssembler(assembler *Assembler) { + p.Assembler = assembler +} diff --git a/internal/osbuild1/osbuild_test.go b/internal/osbuild1/osbuild_test.go new file mode 100644 index 0000000..0145464 --- /dev/null +++ b/internal/osbuild1/osbuild_test.go @@ -0,0 +1,59 @@ +// Package osbuild provides primitives for representing and (un)marshalling +// OSBuild types. +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPipeline_SetBuild(t *testing.T) { + expectedPipeline := &Pipeline{ + Build: &Build{ + Pipeline: &Pipeline{}, + Runner: "org.osbuild.fedora32", + }, + } + actualPipeline := &Pipeline{} + actualPipeline.SetBuild(&Pipeline{}, "org.osbuild.fedora32") + assert.Equal(t, expectedPipeline, actualPipeline) +} + +func TestPipeline_AddStage(t *testing.T) { + expectedPipeline := &Pipeline{ + Build: &Build{ + Pipeline: &Pipeline{}, + Runner: "org.osbuild.fedora32", + }, + Stages: []*Stage{ + { + Name: "org.osbuild.rpm", + }, + }, + } + actualPipeline := &Pipeline{ + Build: &Build{ + Pipeline: &Pipeline{}, + Runner: "org.osbuild.fedora32", + }, + } + actualPipeline.AddStage(&Stage{ + Name: "org.osbuild.rpm", + }) + assert.Equal(t, expectedPipeline, actualPipeline) + assert.Equal(t, 1, len(actualPipeline.Stages)) +} + +func TestPipeline_SetAssembler(t *testing.T) { + expectedPipeline := &Pipeline{ + Assembler: &Assembler{ + Name: "org.osbuild.testassembler", + }, + } + actualPipeline := &Pipeline{} + actualPipeline.SetAssembler(&Assembler{ + Name: "org.osbuild.testassembler", + }) + assert.Equal(t, expectedPipeline, actualPipeline) +} diff --git a/internal/osbuild1/ostree_commit_assembler.go b/internal/osbuild1/ostree_commit_assembler.go new file mode 100644 index 0000000..b9e18d3 --- /dev/null +++ b/internal/osbuild1/ostree_commit_assembler.go @@ -0,0 +1,23 @@ +package osbuild1 + +// OSTreeCommitAssemblerOptions desrcibe how to assemble a tree into an OSTree commit. +type OSTreeCommitAssemblerOptions struct { + Ref string `json:"ref"` + Parent string `json:"parent,omitempty"` + Tar OSTreeCommitAssemblerTarOptions `json:"tar"` +} + +// OSTreeCommitAssemblerTarOptions desrcibes the output tarball +type OSTreeCommitAssemblerTarOptions struct { + Filename string `json:"filename"` +} + +func (OSTreeCommitAssemblerOptions) isAssemblerOptions() {} + +// NewOSTreeCommitAssembler creates a new OSTree Commit Assembler object. +func NewOSTreeCommitAssembler(options *OSTreeCommitAssemblerOptions) *Assembler { + return &Assembler{ + Name: "org.osbuild.ostree.commit", + Options: options, + } +} diff --git a/internal/osbuild1/qemu_assembler.go b/internal/osbuild1/qemu_assembler.go new file mode 100644 index 0000000..b0a200d --- /dev/null +++ b/internal/osbuild1/qemu_assembler.go @@ -0,0 +1,48 @@ +package osbuild1 + +// QEMUAssemblerOptions desrcibe how to assemble a tree into an image using qemu. +// +// The assembler creates an image of the given size, adds a GRUB2 bootloader +// and if necessary and a partition table to it with the given PTUUID +// containing the indicated partitions. Finally, the image is converted into +// the target format and stored with the given filename. +type QEMUAssemblerOptions struct { + Bootloader *QEMUBootloader `json:"bootloader,omitempty"` + Format string `json:"format"` + Filename string `json:"filename"` + Size uint64 `json:"size"` + PTUUID string `json:"ptuuid"` + PTType string `json:"pttype"` + Partitions []QEMUPartition `json:"partitions"` +} + +type QEMUPartition struct { + Start uint64 `json:"start"` + Size uint64 `json:"size,omitempty"` + Type string `json:"type,omitempty"` + Bootable bool `json:"bootable,omitempty"` + UUID string `json:"uuid,omitempty"` + Filesystem *QEMUFilesystem `json:"filesystem,omitempty"` +} + +type QEMUFilesystem struct { + Type string `json:"type"` + UUID string `json:"uuid"` + Label string `json:"label,omitempty"` + Mountpoint string `json:"mountpoint"` +} + +type QEMUBootloader struct { + Type string `json:"type,omitempty"` + Platform string `json:"platform,omitempty"` +} + +func (QEMUAssemblerOptions) isAssemblerOptions() {} + +// NewQEMUAssembler creates a new QEMU Assembler object. +func NewQEMUAssembler(options *QEMUAssemblerOptions) *Assembler { + return &Assembler{ + Name: "org.osbuild.qemu", + Options: options, + } +} diff --git a/internal/osbuild1/rawfs_assembler.go b/internal/osbuild1/rawfs_assembler.go new file mode 100644 index 0000000..af7832c --- /dev/null +++ b/internal/osbuild1/rawfs_assembler.go @@ -0,0 +1,22 @@ +package osbuild1 + +import "github.com/google/uuid" + +// RawFSAssemblerOptions desrcibe how to assemble a tree into a raw filesystem +// image. +type RawFSAssemblerOptions struct { + Filename string `json:"filename"` + RootFilesystemUUID uuid.UUID `json:"root_fs_uuid"` + Size uint64 `json:"size"` + FilesystemType string `json:"fs_type,omitempty"` +} + +func (RawFSAssemblerOptions) isAssemblerOptions() {} + +// NewRawFSAssembler creates a new RawFS Assembler object. +func NewRawFSAssembler(options *RawFSAssemblerOptions) *Assembler { + return &Assembler{ + Name: "org.osbuild.rawfs", + Options: options, + } +} diff --git a/internal/osbuild1/result.go b/internal/osbuild1/result.go new file mode 100644 index 0000000..e8e8eda --- /dev/null +++ b/internal/osbuild1/result.go @@ -0,0 +1,179 @@ +package osbuild1 + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + + "github.com/osbuild/osbuild-composer/internal/osbuild2" +) + +type rawAssemblerResult struct { + Name string `json:"name"` + Options json.RawMessage `json:"options"` + Success bool `json:"success"` + Output string `json:"output"` +} + +type StageResult struct { + Name string `json:"name"` + Options json.RawMessage `json:"options"` + Success bool `json:"success"` + Output string `json:"output"` + Metadata StageMetadata `json:"metadata"` +} + +// StageMetadata specify the metadata of a given stage-type. +type StageMetadata interface { + isStageMetadata() +} + +type rawStageResult struct { + Name string `json:"name"` + Options json.RawMessage `json:"options"` + Success bool `json:"success"` + Output string `json:"output"` + Metadata json.RawMessage `json:"metadata"` +} + +type buildResult struct { + Stages []StageResult `json:"stages"` + TreeID string `json:"tree_id"` + Success bool `json:"success"` +} + +type Result struct { + TreeID string `json:"tree_id"` + OutputID string `json:"output_id"` + Build *buildResult `json:"build"` + Stages []StageResult `json:"stages"` + Assembler *rawAssemblerResult `json:"assembler"` + Success bool `json:"success"` +} + +func (result *StageResult) UnmarshalJSON(data []byte) error { + var rawStageResult rawStageResult + err := json.Unmarshal(data, &rawStageResult) + if err != nil { + return err + } + var metadata StageMetadata + switch rawStageResult.Name { + case "org.osbuild.rpm": + metadata = new(RPMStageMetadata) + err = json.Unmarshal(rawStageResult.Metadata, metadata) + if err != nil { + return err + } + default: + metadata = nil + } + + result.Name = rawStageResult.Name + result.Options = rawStageResult.Options + result.Success = rawStageResult.Success + result.Output = rawStageResult.Output + result.Metadata = metadata + + return nil +} + +func (cr *Result) Write(writer io.Writer) error { + if cr.Build == nil && len(cr.Stages) == 0 && cr.Assembler == nil { + fmt.Fprintf(writer, "The compose result is empty.\n") + } + + if cr.Build != nil { + fmt.Fprintf(writer, "Build pipeline:\n") + + for _, stage := range cr.Build.Stages { + fmt.Fprintf(writer, "Stage %s\n", stage.Name) + enc := json.NewEncoder(writer) + enc.SetIndent("", " ") + err := enc.Encode(stage.Options) + if err != nil { + return err + } + fmt.Fprintf(writer, "\nOutput:\n%s\n", stage.Output) + } + } + + if len(cr.Stages) > 0 { + fmt.Fprintf(writer, "Stages:\n") + for _, stage := range cr.Stages { + fmt.Fprintf(writer, "Stage: %s\n", stage.Name) + enc := json.NewEncoder(writer) + enc.SetIndent("", " ") + err := enc.Encode(stage.Options) + if err != nil { + return err + } + fmt.Fprintf(writer, "\nOutput:\n%s\n", stage.Output) + } + } + + if cr.Assembler != nil { + fmt.Fprintf(writer, "Assembler %s:\n", cr.Assembler.Name) + enc := json.NewEncoder(writer) + enc.SetIndent("", " ") + err := enc.Encode(cr.Assembler.Options) + if err != nil { + return err + } + fmt.Fprintf(writer, "\nOutput:\n%s\n", cr.Assembler.Output) + } + + return nil +} + +func (cr *Result) UnmarshalJSON(data []byte) error { + // NOTE(akoutsou) 1to2t: result format depends on the osbuild version; this + // unmarshaller tries to read both old and new versions + type resultAlias Result + crv1 := new(resultAlias) + + dec := json.NewDecoder(bytes.NewReader(data)) + dec.DisallowUnknownFields() + if err := dec.Decode(&crv1); err == nil { + *cr = Result(*crv1) + return nil + } + + // try osbuild2 result object + crv2 := new(osbuild2.Result) + + // NOTE: Using plain (non-strict) Unmarshal here. The format of the new + // osbuild output schema is not yet fixed and is likely to change, so + // disallowing unknown fields will likely cause failures in the near future. + if err := json.Unmarshal(data, &crv2); err != nil { + return err + } + cr.fromV2(crv2) + return nil +} + +// Convert new OSBuild v2 format result into a v1 by copying the most useful +// values: +// - Compose success status +// - Output of Stages (Log) as flattened list of v1 StageResults +func (cr *Result) fromV2(crv2 *osbuild2.Result) { + cr.Success = crv2.Success + // Empty build and assembler results for new types of jobs + cr.Build = new(buildResult) + cr.Assembler = new(rawAssemblerResult) + + // convert all stages logs from all pipelines into v1 StageResult objects + for pname, stages := range crv2.Log { + for idx, stage := range stages { + stageResult := StageResult{ + // Create uniquely identifiable name for the stage: + // :- + Name: fmt.Sprintf("%s:%d-%s", pname, idx, stage.Type), + Success: stage.Success, + Output: stage.Output, + } + cr.Stages = append(cr.Stages, stageResult) + } + } +} diff --git a/internal/osbuild1/result_test.go b/internal/osbuild1/result_test.go new file mode 100644 index 0000000..872ba07 --- /dev/null +++ b/internal/osbuild1/result_test.go @@ -0,0 +1,163 @@ +package osbuild1 + +import ( + "bytes" + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestUnmarshal(t *testing.T) { + resultRaw := `{ + "success": true, + "build": { + "success": true, + "stages": [ + { + "name": "org.osbuild.rpm", + "id": "9eb0a6f6fd6e2995e107f5bcc6aa3b19643b02ec133bdc8a8ac614860b1bbf2d", + "success": true, + "output": "Building...", + "metadata": { + "packages": [ + { + "name": "libgcc", + "version": "10.0.1", + "release": "0.11.fc32", + "epoch": null, + "arch": "x86_64", + "sigmd5": "84fc907a5047aeebaf8da1642925a417", + "sigpgp": null, + "siggpg": "883f0305005f2310139ec3e4c0f7e257e611023e11009f639c5fe64abaa76224dab3a9f70c2714a84c63bd009d1cc184fb4b428dfcd7c3556f4a5f860cc0187740" + }, + { + "name": "whois-nls", + "version": "5.5.6", + "release": "1.fc32", + "epoch": null, + "arch": "noarch", + "sigmd5": "f868cd02046630c8ce3a9c48820e2437", + "sigpgp": "89023304000108001d162104963a2beb02009608fe67ea4249fd77499570ff3105025f5a272b000a091049fd77499570ff31ccdb0ffe38b95a55ebf3c021526b3cd4f2358c7e23f7767d1f5ce4b7cccef7b33653c6a96a23022313a818fbaf7abeb41837910f0d3ac15664e02838d5939d38ff459aa0076e248728a032d3ae09ddfaec955f941601081a2e3f9bbd49586fd65c1bc1b31685aeb0405687d1791471eab7359ccf00d5584ddef680e99ebc8a4846316391b9baa68ac8ed8ad696ee16fd625d847f8edd92517df3ea6920a46b77b4f119715a0f619f38835d25e0bd0eb5cfad08cd9c796eace6a2b28f4d3dee552e6068255d9748dc2a1906c951e0ba8aed9922ab24e1f659413a06083f8a0bfea56cfff14bddef23bced449f36bcd369da72f90ddf0512e7b0801ba5a0c8eaa8eb0582c630815e992192042cfb0a7c7239f76219197c2fdf18b6553260c105280806d4f037d7b04bdf3da9fd7e9a207db5c71f7e548f4288928f047c989c4cb9cbb8088eec7bd2fa5c252e693f51a3cfc660f666af6a255a5ca0fd2216d5ccd66cbd9c11afa61067d7f615ec8d0dc0c879b5fe633d8c9443f97285da597e4da8a3993af36f0be06acfa9b8058ec70bbc78b876e4c6c5d2108fb05c15a74ba48a3d7ded697cbc1748c228d77d1e0794a41fd5240fa67c3ed745fe47555a47c3d6163d8ce95fd6c2d0d6fa48f8e5b411e571e442109b1cb200d9a8117ee08bfe645f96aca34f7b7559622bbab75143dcad59f126ae0d319e6668ebba417e725638c4febf2e", + "siggpg": null + } + ] + } + } + ] + } + }` + + var result Result + err := json.Unmarshal([]byte(resultRaw), &result) + assert.NoError(t, err) + + assert.Equal(t, result.Build.Stages[0].Name, "org.osbuild.rpm") + metadata, ok := result.Build.Stages[0].Metadata.(*RPMStageMetadata) + assert.True(t, ok) + package1 := metadata.Packages[0] + assert.Equal(t, package1.Name, "libgcc") + assert.Nil(t, package1.Epoch) + assert.Equal(t, package1.Version, "10.0.1") + assert.Equal(t, package1.Release, "0.11.fc32") + assert.Equal(t, package1.Arch, "x86_64") + assert.Equal(t, package1.SigMD5, "84fc907a5047aeebaf8da1642925a417") + assert.Empty(t, package1.SigPGP) + assert.Equal(t, package1.SigGPG, "883f0305005f2310139ec3e4c0f7e257e611023e11009f639c5fe64abaa76224dab3a9f70c2714a84c63bd009d1cc184fb4b428dfcd7c3556f4a5f860cc0187740") + + package2 := metadata.Packages[1] + assert.Equal(t, package2.SigPGP, "89023304000108001d162104963a2beb02009608fe67ea4249fd77499570ff3105025f5a272b000a091049fd77499570ff31ccdb0ffe38b95a55ebf3c021526b3cd4f2358c7e23f7767d1f5ce4b7cccef7b33653c6a96a23022313a818fbaf7abeb41837910f0d3ac15664e02838d5939d38ff459aa0076e248728a032d3ae09ddfaec955f941601081a2e3f9bbd49586fd65c1bc1b31685aeb0405687d1791471eab7359ccf00d5584ddef680e99ebc8a4846316391b9baa68ac8ed8ad696ee16fd625d847f8edd92517df3ea6920a46b77b4f119715a0f619f38835d25e0bd0eb5cfad08cd9c796eace6a2b28f4d3dee552e6068255d9748dc2a1906c951e0ba8aed9922ab24e1f659413a06083f8a0bfea56cfff14bddef23bced449f36bcd369da72f90ddf0512e7b0801ba5a0c8eaa8eb0582c630815e992192042cfb0a7c7239f76219197c2fdf18b6553260c105280806d4f037d7b04bdf3da9fd7e9a207db5c71f7e548f4288928f047c989c4cb9cbb8088eec7bd2fa5c252e693f51a3cfc660f666af6a255a5ca0fd2216d5ccd66cbd9c11afa61067d7f615ec8d0dc0c879b5fe633d8c9443f97285da597e4da8a3993af36f0be06acfa9b8058ec70bbc78b876e4c6c5d2108fb05c15a74ba48a3d7ded697cbc1748c228d77d1e0794a41fd5240fa67c3ed745fe47555a47c3d6163d8ce95fd6c2d0d6fa48f8e5b411e571e442109b1cb200d9a8117ee08bfe645f96aca34f7b7559622bbab75143dcad59f126ae0d319e6668ebba417e725638c4febf2e") + assert.Empty(t, package2.SigGPG) +} + +func TestWriteFull(t *testing.T) { + + const testOptions = `{"msg": "test"}` + + dnfStage := StageResult{ + Name: "org.osbuild.rpm", + Options: []byte(testOptions), + Success: true, + Output: "Finished", + Metadata: RPMStageMetadata{ + Packages: []RPMPackageMetadata{ + { + Name: "foobar", + Epoch: nil, + Version: "1", + Release: "1", + Arch: "noarch", + SigMD5: "deadbeef", + }, + }, + }, + } + + testStage := StageResult{ + Name: "org.osbuild.test", + Options: []byte(testOptions), + Success: true, + Output: "Finished", + } + + testBuild := buildResult{ + Stages: []StageResult{testStage}, + TreeID: "treeID", + Success: true, + } + + testAssembler := rawAssemblerResult{ + Name: "testAssembler", + Options: []byte(testOptions), + Success: true, + Output: "Done", + } + + testComposeResult := Result{ + TreeID: "TreeID", + OutputID: "OutputID", + Build: &testBuild, + Stages: []StageResult{dnfStage}, + Assembler: &testAssembler, + Success: true, + } + + var b bytes.Buffer + assert.NoError(t, testComposeResult.Write(&b)) + expectedMessage := + `Build pipeline: +Stage org.osbuild.test +{ + "msg": "test" +} + +Output: +Finished +Stages: +Stage: org.osbuild.rpm +{ + "msg": "test" +} + +Output: +Finished +Assembler testAssembler: +{ + "msg": "test" +} + +Output: +Done +` + assert.Equal(t, expectedMessage, b.String()) +} + +func TestWriteEmpty(t *testing.T) { + + testComposeResult := Result{} + + var b bytes.Buffer + assert.NoError(t, testComposeResult.Write(&b)) + assert.Equal(t, "The compose result is empty.\n", b.String()) + +} diff --git a/internal/osbuild1/rhsm_stage.go b/internal/osbuild1/rhsm_stage.go new file mode 100644 index 0000000..a0bb40f --- /dev/null +++ b/internal/osbuild1/rhsm_stage.go @@ -0,0 +1,34 @@ +package osbuild1 + +// RHSMStageOptions describes configuration of the RHSM stage. +// +// The RHSM stage allows configuration of Red Hat Subscription Manager (RHSM) +// related components. Currently it allows only configuration of the enablement +// state of DNF plugins used by the Subscription Manager. +type RHSMStageOptions struct { + DnfPlugins *RHSMStageOptionsDnfPlugins `json:"dnf-plugins,omitempty"` +} + +func (RHSMStageOptions) isStageOptions() {} + +// RHSMStageOptionsDnfPlugins describes configuration of all RHSM DNF plugins +type RHSMStageOptionsDnfPlugins struct { + ProductID *RHSMStageOptionsDnfPlugin `json:"product-id,omitempty"` + SubscriptionManager *RHSMStageOptionsDnfPlugin `json:"subscription-manager,omitempty"` +} + +// RHSMStageOptionsDnfPlugin describes configuration of a specific RHSM DNF +// plugin +// +// Only the enablement state of a DNF plugin can be currenlty set. +type RHSMStageOptionsDnfPlugin struct { + Enabled bool `json:"enabled"` +} + +// NewRHSMStage creates a new RHSM stage +func NewRHSMStage(options *RHSMStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.rhsm", + Options: options, + } +} diff --git a/internal/osbuild1/rhsm_stage_test.go b/internal/osbuild1/rhsm_stage_test.go new file mode 100644 index 0000000..b63bd60 --- /dev/null +++ b/internal/osbuild1/rhsm_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewRhsmStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.rhsm", + Options: &RHSMStageOptions{}, + } + actualStage := NewRHSMStage(&RHSMStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/rpm_ostree_stage.go b/internal/osbuild1/rpm_ostree_stage.go new file mode 100644 index 0000000..f439841 --- /dev/null +++ b/internal/osbuild1/rpm_ostree_stage.go @@ -0,0 +1,16 @@ +package osbuild1 + +// The RPM-OSTree stage describes how to transform the imgae into an OSTree. +type RPMOSTreeStageOptions struct { + EtcGroupMembers []string `json:"etc_group_members,omitempty"` +} + +func (RPMOSTreeStageOptions) isStageOptions() {} + +// NewLocaleStage creates a new Locale Stage object. +func NewRPMOSTreeStage(options *RPMOSTreeStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.rpm-ostree", + Options: options, + } +} diff --git a/internal/osbuild1/rpm_stage.go b/internal/osbuild1/rpm_stage.go new file mode 100644 index 0000000..f52c9d8 --- /dev/null +++ b/internal/osbuild1/rpm_stage.go @@ -0,0 +1,49 @@ +package osbuild1 + +// The RPMStageOptions describe the operations of the RPM stage. +// +// The RPM stage installs a given set of packages, identified by their +// content hash. This ensures that given a set of RPM stage options, +// the output is be reproducible, if the underlying tools are. +type RPMStageOptions struct { + GPGKeys []string `json:"gpgkeys,omitempty"` + Packages []RPMPackage `json:"packages"` +} + +// RPMPackage represents one RPM, as referenced by its content hash +// (checksum). The files source must indicate where to fetch the given +// RPM. If CheckGPG is `true` the RPM must be signed with one of the +// GPGKeys given in the RPMStageOptions. +type RPMPackage struct { + Checksum string `json:"checksum"` + CheckGPG bool `json:"check_gpg,omitempty"` +} + +func (RPMStageOptions) isStageOptions() {} + +// NewRPMStage creates a new RPM stage. +func NewRPMStage(options *RPMStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.rpm", + Options: options, + } +} + +// RPMStageMetadata gives the set of packages installed by the RPM stage +type RPMStageMetadata struct { + Packages []RPMPackageMetadata `json:"packages"` +} + +// RPMPackageMetadata contains the metadata extracted from one RPM header +type RPMPackageMetadata struct { + Name string `json:"name"` + Version string `json:"version"` + Release string `json:"release"` + Epoch *string `json:"epoch"` + Arch string `json:"arch"` + SigMD5 string `json:"sigmd5"` + SigPGP string `json:"sigpgp"` + SigGPG string `json:"siggpg"` +} + +func (RPMStageMetadata) isStageMetadata() {} diff --git a/internal/osbuild1/rpm_stage_test.go b/internal/osbuild1/rpm_stage_test.go new file mode 100644 index 0000000..196b9b4 --- /dev/null +++ b/internal/osbuild1/rpm_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewRPMStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.rpm", + Options: &RPMStageOptions{}, + } + actualStage := NewRPMStage(&RPMStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/script_stage.go b/internal/osbuild1/script_stage.go new file mode 100644 index 0000000..30274ca --- /dev/null +++ b/internal/osbuild1/script_stage.go @@ -0,0 +1,24 @@ +package osbuild1 + +// The ScriptStageOptions specifies a custom script to run in the image +type ScriptStageOptions struct { + Script string `json:"script"` +} + +func (ScriptStageOptions) isStageOptions() {} + +// NewScriptStageOptions creates a new script stage options object, with +// the mandatory fields set. +func NewScriptStageOptions(script string) *ScriptStageOptions { + return &ScriptStageOptions{ + Script: script, + } +} + +// NewScriptStage creates a new Script Stage object. +func NewScriptStage(options *ScriptStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.script", + Options: options, + } +} diff --git a/internal/osbuild1/script_stage_test.go b/internal/osbuild1/script_stage_test.go new file mode 100644 index 0000000..0470ec3 --- /dev/null +++ b/internal/osbuild1/script_stage_test.go @@ -0,0 +1,24 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewScriptStageOptions(t *testing.T) { + expectedOptions := &ScriptStageOptions{ + Script: "/root/test.sh", + } + actualOptions := NewScriptStageOptions("/root/test.sh") + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewScriptStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.script", + Options: &ScriptStageOptions{}, + } + actualStage := NewScriptStage(&ScriptStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/selinux_stage.go b/internal/osbuild1/selinux_stage.go new file mode 100644 index 0000000..c231eb9 --- /dev/null +++ b/internal/osbuild1/selinux_stage.go @@ -0,0 +1,28 @@ +package osbuild1 + +// The SELinuxStageOptions describe how to apply selinux labels. +// +// A file contexts configuration file is sepcified that describes +// the filesystem labels to apply to the image. +type SELinuxStageOptions struct { + FileContexts string `json:"file_contexts"` + Labels map[string]string `json:"labels,omitempty"` +} + +func (SELinuxStageOptions) isStageOptions() {} + +// NewSELinuxStageOptions creates a new SELinuxStaeOptions object, with +// the mandatory fields set. +func NewSELinuxStageOptions(fileContexts string) *SELinuxStageOptions { + return &SELinuxStageOptions{ + FileContexts: fileContexts, + } +} + +// NewSELinuxStage creates a new SELinux Stage object. +func NewSELinuxStage(options *SELinuxStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.selinux", + Options: options, + } +} diff --git a/internal/osbuild1/selinux_stage_test.go b/internal/osbuild1/selinux_stage_test.go new file mode 100644 index 0000000..1bea8ad --- /dev/null +++ b/internal/osbuild1/selinux_stage_test.go @@ -0,0 +1,24 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSELinuxStageOptions(t *testing.T) { + expectedOptions := &SELinuxStageOptions{ + FileContexts: "etc/selinux/targeted/contexts/files/file_contexts", + } + actualOptions := NewSELinuxStageOptions("etc/selinux/targeted/contexts/files/file_contexts") + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewSELinuxStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.selinux", + Options: &SELinuxStageOptions{}, + } + actualStage := NewSELinuxStage(&SELinuxStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/source.go b/internal/osbuild1/source.go new file mode 100644 index 0000000..0dcc38a --- /dev/null +++ b/internal/osbuild1/source.go @@ -0,0 +1,43 @@ +package osbuild1 + +import ( + "encoding/json" + "errors" +) + +// A Sources map contains all the sources made available to an osbuild run +type Sources map[string]Source + +// Source specifies the operations of a given source-type. +type Source interface { + isSource() +} + +type rawSources map[string]json.RawMessage + +// UnmarshalJSON unmarshals JSON into a Source object. Each type of source has +// a custom unmarshaller for its options, selected based on the source name. +func (sources *Sources) UnmarshalJSON(data []byte) error { + var rawSources rawSources + err := json.Unmarshal(data, &rawSources) + if err != nil { + return err + } + *sources = make(map[string]Source) + for name, rawSource := range rawSources { + var source Source + switch name { + case "org.osbuild.files": + source = new(FilesSource) + default: + return errors.New("unexpected source name: " + name) + } + err = json.Unmarshal(rawSource, source) + if err != nil { + return err + } + (*sources)[name] = source + } + + return nil +} diff --git a/internal/osbuild1/source_test.go b/internal/osbuild1/source_test.go new file mode 100644 index 0000000..105128a --- /dev/null +++ b/internal/osbuild1/source_test.go @@ -0,0 +1,100 @@ +package osbuild1 + +import ( + "bytes" + "encoding/json" + "reflect" + "testing" +) + +func TestSource_UnmarshalJSON(t *testing.T) { + type fields struct { + Name string + Source Source + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "invalid json", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}`), + }, + wantErr: true, + }, + { + name: "unknown source", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "missing options", + args: args{ + data: []byte(`{"name":"org.osbuild.files"}`), + }, + wantErr: true, + }, + { + name: "missing name", + args: args{ + data: []byte(`{"foo":null,"options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "files-empty", + fields: fields{ + Name: "org.osbuild.files", + Source: &FilesSource{URLs: map[string]FileSource{}}, + }, + args: args{ + data: []byte(`{"org.osbuild.files":{"urls":{}}}`), + }, + }, + { + name: "files", + fields: fields{ + Name: "org.osbuild.files", + Source: &FilesSource{URLs: map[string]FileSource{ + "checksum1": FileSource{URL: "url1"}, + "checksum2": FileSource{URL: "url2"}, + }}, + }, + args: args{ + data: []byte(`{"org.osbuild.files":{"urls":{"checksum1":{"url":"url1"},"checksum2":{"url":"url2"}}}}`), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sources := &Sources{ + tt.fields.Name: tt.fields.Source, + } + var gotSources Sources + if err := gotSources.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { + t.Errorf("Sources.UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantErr { + return + } + gotBytes, err := json.Marshal(sources) + if err != nil { + t.Errorf("Could not marshal source: %v", err) + } + if !bytes.Equal(gotBytes, tt.args.data) { + t.Errorf("Expected '%v', got '%v'", string(tt.args.data), string(gotBytes)) + } + if !reflect.DeepEqual(&gotSources, sources) { + t.Errorf("got '%v', expected '%v'", &gotSources, sources) + } + }) + } +} diff --git a/internal/osbuild1/stage.go b/internal/osbuild1/stage.go new file mode 100644 index 0000000..624ae99 --- /dev/null +++ b/internal/osbuild1/stage.go @@ -0,0 +1,89 @@ +package osbuild1 + +import ( + "encoding/json" + "fmt" +) + +// A Stage transforms a filesystem tree. +type Stage struct { + // Well-known name in reverse domain-name notation, uniquely identifying + // the stage type. + Name string `json:"name"` + // Stage-type specific options fully determining the operations of the + // stage. + Options StageOptions `json:"options"` +} + +// StageOptions specify the operations of a given stage-type. +type StageOptions interface { + isStageOptions() +} + +type rawStage struct { + Name string `json:"name"` + Options json.RawMessage `json:"options"` +} + +// UnmarshalJSON unmarshals JSON into a Stage object. Each type of stage has +// a custom unmarshaller for its options, selected based on the stage name. +func (stage *Stage) UnmarshalJSON(data []byte) error { + var rawStage rawStage + err := json.Unmarshal(data, &rawStage) + if err != nil { + return err + } + var options StageOptions + switch rawStage.Name { + case "org.osbuild.fix-bls": + // TODO: verify that we can unmarshall this also if "options" is omitted + options = new(FixBLSStageOptions) + case "org.osbuild.fstab": + options = new(FSTabStageOptions) + case "org.osbuild.grub2": + options = new(GRUB2StageOptions) + case "org.osbuild.locale": + options = new(LocaleStageOptions) + case "org.osbuild.selinux": + options = new(SELinuxStageOptions) + case "org.osbuild.hostname": + options = new(HostnameStageOptions) + case "org.osbuild.users": + options = new(UsersStageOptions) + case "org.osbuild.groups": + options = new(GroupsStageOptions) + case "org.osbuild.timezone": + options = new(TimezoneStageOptions) + case "org.osbuild.chrony": + options = new(ChronyStageOptions) + case "org.osbuild.keymap": + options = new(KeymapStageOptions) + case "org.osbuild.firewall": + options = new(FirewallStageOptions) + case "org.osbuild.rhsm": + options = new(RHSMStageOptions) + case "org.osbuild.rpm": + options = new(RPMStageOptions) + case "org.osbuild.rpm-ostree": + options = new(RPMOSTreeStageOptions) + case "org.osbuild.systemd": + options = new(SystemdStageOptions) + case "org.osbuild.script": + options = new(ScriptStageOptions) + case "org.osbuild.sysconfig": + options = new(SysconfigStageOptions) + case "org.osbuild.kernel-cmdline": + options = new(KernelCmdlineStageOptions) + default: + return fmt.Errorf("unexpected stage name: %s", rawStage.Name) + } + err = json.Unmarshal(rawStage.Options, options) + if err != nil { + return err + } + + stage.Name = rawStage.Name + stage.Options = options + + return nil +} diff --git a/internal/osbuild1/stage_test.go b/internal/osbuild1/stage_test.go new file mode 100644 index 0000000..b254554 --- /dev/null +++ b/internal/osbuild1/stage_test.go @@ -0,0 +1,337 @@ +package osbuild1 + +import ( + "bytes" + "encoding/json" + "reflect" + "testing" + + "github.com/google/uuid" +) + +func TestStage_UnmarshalJSON(t *testing.T) { + nullUUID := uuid.MustParse("00000000-0000-0000-0000-000000000000") + type fields struct { + Name string + Options StageOptions + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "invalid json", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}`), + }, + wantErr: true, + }, + { + name: "unknown stage", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "missing options", + args: args{ + data: []byte(`{"name":"org.osbuild.locale"}`), + }, + wantErr: true, + }, + { + name: "missing name", + args: args{ + data: []byte(`{"foo":null,"options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "chrony", + fields: fields{ + Name: "org.osbuild.chrony", + Options: &ChronyStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.chrony","options":{"timeservers":null}}`), + }, + }, + { + name: "firewall", + fields: fields{ + Name: "org.osbuild.firewall", + Options: &FirewallStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.firewall","options":{}}`), + }, + }, + { + name: "fix-bls", + fields: fields{ + Name: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.fix-bls","options":{}}`), + }, + }, + { + name: "fstab", + fields: fields{ + Name: "org.osbuild.fstab", + Options: &FSTabStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.fstab","options":{"filesystems":null}}`), + }, + }, + { + name: "groups", + fields: fields{ + Name: "org.osbuild.groups", + Options: &GroupsStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.groups","options":{"groups":null}}`), + }, + }, + { + name: "grub2", + fields: fields{ + Name: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), + }, + }, + { + name: "grub2-uefi", + fields: fields{ + Name: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + UEFI: &GRUB2UEFI{ + Vendor: "vendor", + }, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","uefi":{"vendor":"vendor"}}}`), + }, + }, + { + name: "grub2-separate-boot", + fields: fields{ + Name: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + BootFilesystemUUID: &nullUUID, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","boot_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), + }, + }, + { + name: "hostname", + fields: fields{ + Name: "org.osbuild.hostname", + Options: &HostnameStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.hostname","options":{"hostname":""}}`), + }, + }, + { + name: "keymap", + fields: fields{ + Name: "org.osbuild.keymap", + Options: &KeymapStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.keymap","options":{"keymap":""}}`), + }, + }, + { + name: "locale", + fields: fields{ + Name: "org.osbuild.locale", + Options: &LocaleStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.locale","options":{"language":""}}`), + }, + }, + { + name: "rhsm-empty", + fields: fields{ + Name: "org.osbuild.rhsm", + Options: &RHSMStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.rhsm","options":{}}`), + }, + }, + { + name: "rhsm", + fields: fields{ + Name: "org.osbuild.rhsm", + Options: &RHSMStageOptions{ + DnfPlugins: &RHSMStageOptionsDnfPlugins{ + ProductID: &RHSMStageOptionsDnfPlugin{ + Enabled: false, + }, + SubscriptionManager: &RHSMStageOptionsDnfPlugin{ + Enabled: false, + }, + }, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.rhsm","options":{"dnf-plugins":{"product-id":{"enabled":false},"subscription-manager":{"enabled":false}}}}`), + }, + }, + { + name: "rpm-empty", + fields: fields{ + Name: "org.osbuild.rpm", + Options: &RPMStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.rpm","options":{"packages":null}}`), + }, + }, + { + name: "rpm", + fields: fields{ + Name: "org.osbuild.rpm", + Options: &RPMStageOptions{ + GPGKeys: []string{"key1", "key2"}, + Packages: []RPMPackage{ + { + Checksum: "checksum1", + }, + { + Checksum: "checksum2", + CheckGPG: true, + }, + }, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.rpm","options":{"gpgkeys":["key1","key2"],"packages":[{"checksum":"checksum1"},{"checksum":"checksum2","check_gpg":true}]}}`), + }, + }, + { + name: "rpm-ostree", + fields: fields{ + Name: "org.osbuild.rpm-ostree", + Options: &RPMOSTreeStageOptions{ + EtcGroupMembers: []string{ + "wheel", + }, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.rpm-ostree","options":{"etc_group_members":["wheel"]}}`), + }, + }, + { + name: "script", + fields: fields{ + Name: "org.osbuild.script", + Options: &ScriptStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.script","options":{"script":""}}`), + }, + }, + { + name: "selinux", + fields: fields{ + Name: "org.osbuild.selinux", + Options: &SELinuxStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.selinux","options":{"file_contexts":""}}`), + }, + }, + { + name: "systemd", + fields: fields{ + Name: "org.osbuild.systemd", + Options: &SystemdStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.systemd","options":{}}`), + }, + }, + { + name: "systemd-enabled", + fields: fields{ + Name: "org.osbuild.systemd", + Options: &SystemdStageOptions{ + EnabledServices: []string{"foo.service"}, + }, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.systemd","options":{"enabled_services":["foo.service"]}}`), + }, + }, + { + name: "timezone", + fields: fields{ + Name: "org.osbuild.timezone", + Options: &TimezoneStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.timezone","options":{"zone":""}}`), + }, + }, + { + name: "users", + fields: fields{ + Name: "org.osbuild.users", + Options: &UsersStageOptions{}, + }, + args: args{ + data: []byte(`{"name":"org.osbuild.users","options":{"users":null}}`), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stage := &Stage{ + Name: tt.fields.Name, + Options: tt.fields.Options, + } + var gotStage Stage + if err := gotStage.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { + t.Errorf("Stage.UnmarshalJSON() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.wantErr { + return + } + gotBytes, err := json.Marshal(stage) + if err != nil { + t.Errorf("Could not marshal stage: %v", err) + } + if !bytes.Equal(gotBytes, tt.args.data) { + t.Errorf("Expected `%v`, got `%v`", string(tt.args.data), string(gotBytes)) + } + if !reflect.DeepEqual(&gotStage, stage) { + t.Errorf("got {%v, %v}, expected {%v, %v}", gotStage.Name, gotStage.Options, stage.Name, stage.Options) + } + }) + } +} diff --git a/internal/osbuild1/sysconfig_stage.go b/internal/osbuild1/sysconfig_stage.go new file mode 100644 index 0000000..f427b82 --- /dev/null +++ b/internal/osbuild1/sysconfig_stage.go @@ -0,0 +1,25 @@ +package osbuild1 + +type SysconfigStageOptions struct { + Kernel SysconfigKernelOptions `json:"kernel,omitempty"` + Network SysconfigNetworkOptions `json:"network,omitempty"` +} + +type SysconfigNetworkOptions struct { + Networking bool `json:"networking,omitempty"` + NoZeroConf bool `json:"no_zero_conf,omitempty"` +} + +type SysconfigKernelOptions struct { + UpdateDefault bool `json:"update_default,omitempty"` + DefaultKernel string `json:"default_kernel,omitempty"` +} + +func (SysconfigStageOptions) isStageOptions() {} + +func NewSysconfigStage(options *SysconfigStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.sysconfig", + Options: options, + } +} diff --git a/internal/osbuild1/sysconfig_stage_test.go b/internal/osbuild1/sysconfig_stage_test.go new file mode 100644 index 0000000..7ef0c84 --- /dev/null +++ b/internal/osbuild1/sysconfig_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSysconfigStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.sysconfig", + Options: &SysconfigStageOptions{}, + } + actualStage := NewSysconfigStage(&SysconfigStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/systemd_stage.go b/internal/osbuild1/systemd_stage.go new file mode 100644 index 0000000..8b29a65 --- /dev/null +++ b/internal/osbuild1/systemd_stage.go @@ -0,0 +1,16 @@ +package osbuild1 + +type SystemdStageOptions struct { + EnabledServices []string `json:"enabled_services,omitempty"` + DisabledServices []string `json:"disabled_services,omitempty"` + DefaultTarget string `json:"default_target,omitempty"` +} + +func (SystemdStageOptions) isStageOptions() {} + +func NewSystemdStage(options *SystemdStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.systemd", + Options: options, + } +} diff --git a/internal/osbuild1/systemd_stage_test.go b/internal/osbuild1/systemd_stage_test.go new file mode 100644 index 0000000..f414aed --- /dev/null +++ b/internal/osbuild1/systemd_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSystemdStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.systemd", + Options: &SystemdStageOptions{}, + } + actualStage := NewSystemdStage(&SystemdStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/tar_assembler.go b/internal/osbuild1/tar_assembler.go new file mode 100644 index 0000000..a6f8a42 --- /dev/null +++ b/internal/osbuild1/tar_assembler.go @@ -0,0 +1,20 @@ +package osbuild1 + +// TarAssemblerOptions desrcibe how to assemble a tree into a tar ball. +// +// The assembler tars and optionally compresses the tree using the provided +// compression type, and stores the output with the given filename. +type TarAssemblerOptions struct { + Filename string `json:"filename"` + Compression string `json:"compression,omitempty"` +} + +func (TarAssemblerOptions) isAssemblerOptions() {} + +// NewTarAssembler creates a new Tar Assembler object. +func NewTarAssembler(options *TarAssemblerOptions) *Assembler { + return &Assembler{ + Name: "org.osbuild.tar", + Options: options, + } +} diff --git a/internal/osbuild1/timezone_stage.go b/internal/osbuild1/timezone_stage.go new file mode 100644 index 0000000..ba7c528 --- /dev/null +++ b/internal/osbuild1/timezone_stage.go @@ -0,0 +1,14 @@ +package osbuild1 + +type TimezoneStageOptions struct { + Zone string `json:"zone"` +} + +func (TimezoneStageOptions) isStageOptions() {} + +func NewTimezoneStage(options *TimezoneStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.timezone", + Options: options, + } +} diff --git a/internal/osbuild1/timezone_stage_test.go b/internal/osbuild1/timezone_stage_test.go new file mode 100644 index 0000000..23b6650 --- /dev/null +++ b/internal/osbuild1/timezone_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewTimezoneStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.timezone", + Options: &TimezoneStageOptions{}, + } + actualStage := NewTimezoneStage(&TimezoneStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/users_stage.go b/internal/osbuild1/users_stage.go new file mode 100644 index 0000000..dff8c02 --- /dev/null +++ b/internal/osbuild1/users_stage.go @@ -0,0 +1,25 @@ +package osbuild1 + +type UsersStageOptions struct { + Users map[string]UsersStageOptionsUser `json:"users"` +} + +func (UsersStageOptions) isStageOptions() {} + +type UsersStageOptionsUser struct { + UID *int `json:"uid,omitempty"` + GID *int `json:"gid,omitempty"` + Groups []string `json:"groups,omitempty"` + Description *string `json:"description,omitempty"` + Home *string `json:"home,omitempty"` + Shell *string `json:"shell,omitempty"` + Password *string `json:"password,omitempty"` + Key *string `json:"key,omitempty"` +} + +func NewUsersStage(options *UsersStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.users", + Options: options, + } +} diff --git a/internal/osbuild1/users_stage_test.go b/internal/osbuild1/users_stage_test.go new file mode 100644 index 0000000..5d64251 --- /dev/null +++ b/internal/osbuild1/users_stage_test.go @@ -0,0 +1,16 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewUsersStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.users", + Options: &UsersStageOptions{}, + } + actualStage := NewUsersStage(&UsersStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild1/zipl_stage.go b/internal/osbuild1/zipl_stage.go new file mode 100644 index 0000000..e7cc2bf --- /dev/null +++ b/internal/osbuild1/zipl_stage.go @@ -0,0 +1,25 @@ +package osbuild1 + +// The ZiplStageOptions describe how to create zipl stage +// +// The only configuration option available is a boot timeout and it is optional +type ZiplStageOptions struct { + Timeout int `json:"timeout,omitempty"` +} + +func (ZiplStageOptions) isStageOptions() {} + +// NewZiplStageOptions creates a new ZiplStageOptions object with no timeout +func NewZiplStageOptions() *ZiplStageOptions { + return &ZiplStageOptions{ + Timeout: 0, + } +} + +// NewZiplStage creates a new zipl Stage object. +func NewZiplStage(options *ZiplStageOptions) *Stage { + return &Stage{ + Name: "org.osbuild.zipl", + Options: options, + } +} diff --git a/internal/osbuild1/zipl_stage_test.go b/internal/osbuild1/zipl_stage_test.go new file mode 100644 index 0000000..959a88d --- /dev/null +++ b/internal/osbuild1/zipl_stage_test.go @@ -0,0 +1,24 @@ +package osbuild1 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewZiplStageOptions(t *testing.T) { + expectedOptions := &ZiplStageOptions{ + Timeout: 0, + } + actualOptions := NewZiplStageOptions() + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewZiplStage(t *testing.T) { + expectedStage := &Stage{ + Name: "org.osbuild.zipl", + Options: &ZiplStageOptions{}, + } + actualStage := NewZiplStage(&ZiplStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/anaconda_stage.go b/internal/osbuild2/anaconda_stage.go new file mode 100644 index 0000000..dbddf49 --- /dev/null +++ b/internal/osbuild2/anaconda_stage.go @@ -0,0 +1,16 @@ +package osbuild2 + +type AnacondaStageOptions struct { + // Kickstart modules to enable + KickstartModules []string `json:"kickstart-modules"` +} + +func (AnacondaStageOptions) isStageOptions() {} + +// Configure basic aspects of the Anaconda installer +func NewAnacondaStage(options *AnacondaStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.anaconda", + Options: options, + } +} diff --git a/internal/osbuild2/bootiso_stage.go b/internal/osbuild2/bootiso_stage.go new file mode 100644 index 0000000..410fdf3 --- /dev/null +++ b/internal/osbuild2/bootiso_stage.go @@ -0,0 +1,75 @@ +package osbuild2 + +type BootISOMonoStageOptions struct { + Product Product `json:"product"` + + Kernel string `json:"kernel"` + + ISOLabel string `json:"isolabel"` + + EFI EFI `json:"efi,omitempty"` + + ISOLinux ISOLinux `json:"isolinux,omitempty"` + + // Additional kernel boot options + KernelOpts string `json:"kernel_opts,omitempty"` + + Templates string `json:"templates,omitempty"` + + RootFS RootFS `json:"rootfs,omitempty"` +} + +type EFI struct { + Architectures []string `json:"architectures"` + Vendor string `json:"vendor"` +} + +type ISOLinux struct { + Enabled bool `json:"enabled"` + Debug bool `json:"debug,omitempty"` +} + +type RootFS struct { + Compression FSCompression `json:"compression"` + + // Size in MiB + Size int `json:"size"` +} + +type FSCompression struct { + Method string `json:"method"` + Options FSCompressionOptions `json:"options,omitempty"` +} + +type FSCompressionOptions struct { + BCJ string `json:"bcj"` +} + +func (BootISOMonoStageOptions) isStageOptions() {} + +type BootISOMonoStageInputs struct { + RootFS *BootISOMonoStageInput `json:"rootfs"` + Kernel *BootISOMonoStageInput `json:"kernel,omitempty"` +} + +func (BootISOMonoStageInputs) isStageInputs() {} + +type BootISOMonoStageInput struct { + inputCommon + References BootISOMonoStageReferences `json:"references"` +} + +func (BootISOMonoStageInput) isStageInput() {} + +type BootISOMonoStageReferences []string + +func (BootISOMonoStageReferences) isReferences() {} + +// Assemble a file system tree for a bootable ISO +func NewBootISOMonoStage(options *BootISOMonoStageOptions, inputs *BootISOMonoStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.bootiso.mono", + Options: options, + Inputs: inputs, + } +} diff --git a/internal/osbuild2/buildstamp_stage.go b/internal/osbuild2/buildstamp_stage.go new file mode 100644 index 0000000..e31e7ab --- /dev/null +++ b/internal/osbuild2/buildstamp_stage.go @@ -0,0 +1,30 @@ +package osbuild2 + +type BuildstampStageOptions struct { + // Build architecture + Arch string `json:"arch"` + + // The product name + Product string `json:"product"` + + // The version + Version string `json:"version"` + + Final bool `json:"final"` + + // The variant of the product + Variant string `json:"variant"` + + // The bugurl of the product + BugURL string `json:"bugurl"` +} + +func (BuildstampStageOptions) isStageOptions() {} + +// Creates a buildstamp file describing the system (required by anaconda) +func NewBuildstampStage(options *BuildstampStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.buildstamp", + Options: options, + } +} diff --git a/internal/osbuild2/chrony_stage.go b/internal/osbuild2/chrony_stage.go new file mode 100644 index 0000000..4233d02 --- /dev/null +++ b/internal/osbuild2/chrony_stage.go @@ -0,0 +1,14 @@ +package osbuild2 + +type ChronyStageOptions struct { + Timeservers []string `json:"timeservers"` +} + +func (ChronyStageOptions) isStageOptions() {} + +func NewChronyStage(options *ChronyStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.chrony", + Options: options, + } +} diff --git a/internal/osbuild2/chrony_stage_test.go b/internal/osbuild2/chrony_stage_test.go new file mode 100644 index 0000000..afb8ef8 --- /dev/null +++ b/internal/osbuild2/chrony_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewChronyStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.chrony", + Options: &ChronyStageOptions{}, + } + actualStage := NewChronyStage(&ChronyStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/curl_source.go b/internal/osbuild2/curl_source.go new file mode 100644 index 0000000..1c9ad35 --- /dev/null +++ b/internal/osbuild2/curl_source.go @@ -0,0 +1,66 @@ +package osbuild2 + +import ( + "bytes" + "encoding/json" +) + +type CurlSource struct { + Items map[string]CurlSourceItem `json:"items"` +} + +func (CurlSource) isSource() {} + +// CurlSourceItem can be either a URL string or a URL paired with a secrets +// provider +type CurlSourceItem interface { + isCurlSourceItem() +} + +type URL string + +func (URL) isCurlSourceItem() {} + +type URLWithSecrets struct { + URL string `json:"url"` + Secrets *URLSecrets `json:"secrets,omitempty"` +} + +func (URLWithSecrets) isCurlSourceItem() {} + +type URLSecrets struct { + Name string `json:"name"` +} + +// Unmarshal method for CurlSource for handling the CurlSourceItem interface: +// Tries each of the implementations until it finds the one that works. +func (cs *CurlSource) UnmarshalJSON(data []byte) (err error) { + cs.Items = make(map[string]CurlSourceItem) + type csSimple struct { + Items map[string]URL `json:"items"` + } + simple := new(csSimple) + b := bytes.NewReader(data) + dec := json.NewDecoder(b) + dec.DisallowUnknownFields() + if err = dec.Decode(simple); err == nil { + for k, v := range simple.Items { + cs.Items[k] = v + } + return + } + + type csWithSecrets struct { + Items map[string]URLWithSecrets `json:"items"` + } + withSecrets := new(csWithSecrets) + b.Reset(data) + if err = dec.Decode(withSecrets); err == nil { + for k, v := range withSecrets.Items { + cs.Items[k] = v + } + return + } + + return +} diff --git a/internal/osbuild2/discinfo_stage.go b/internal/osbuild2/discinfo_stage.go new file mode 100644 index 0000000..d62df28 --- /dev/null +++ b/internal/osbuild2/discinfo_stage.go @@ -0,0 +1,19 @@ +package osbuild2 + +type DiscinfoStageOptions struct { + // Build architecture + BaseArch string `json:"basearch"` + + // The product name + Release string `json:"release"` +} + +func (DiscinfoStageOptions) isStageOptions() {} + +// Creates a .discinfo file describing a disk +func NewDiscinfoStage(options *DiscinfoStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.discinfo", + Options: options, + } +} diff --git a/internal/osbuild2/dracut_stage.go b/internal/osbuild2/dracut_stage.go new file mode 100644 index 0000000..d2f18ec --- /dev/null +++ b/internal/osbuild2/dracut_stage.go @@ -0,0 +1,56 @@ +package osbuild2 + +type DracutStageOptions struct { + // List of target kernel versions + Kernel []string `json:"kernel"` + + // Compression method for the initramfs + Compress string `json:"compress,omitempty"` + + // Exact list of dracut modules to use + Modules []string `json:"modules,omitempty"` + + // Additional dracut modules to include + AddModules []string `json:"add_modules,omitempty"` + + // Dracut modules to not include + OmitModules []string `json:"omit_modules,omitempty"` + + // Kernel modules to exclusively include + Drivers []string `json:"drivers,omitempty"` + + // Add a specific kernel module + AddDrivers []string `json:"add_drivers,omitempty"` + + // Add driver and ensure that they are tried to be loaded + ForceDrivers []string `json:"force_drivers,omitempty"` + + // Kernel filesystem modules to exclusively include + Filesystems []string `json:"filesystems,omitempty"` + + // Add custom files to the initramfs + // What (keys) to include where (values) + Include map[string]string `json:"include,omitempty"` + + // Install the specified files + Install []string `json:"install,omitempty"` + + // Combine early microcode with the initramfs + EarlyMicrocode bool `json:"early_microcode,omitempty"` + + // Create reproducible images + Reproducible bool `json:"reproducible,omitempty"` + + // Extra arguments to directly pass to dracut + Extra []string `json:"extra,omitempty"` +} + +func (DracutStageOptions) isStageOptions() {} + +// Dracut stage (re-)creates the initial RAM file-system +func NewDracutStage(options *DracutStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.dracut", + Options: options, + } +} diff --git a/internal/osbuild2/dracut_stage_test.go b/internal/osbuild2/dracut_stage_test.go new file mode 100644 index 0000000..dc5ac0b --- /dev/null +++ b/internal/osbuild2/dracut_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewDracutStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.dracut", + Options: &DracutStageOptions{}, + } + actualStage := NewDracutStage(&DracutStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/files_input.go b/internal/osbuild2/files_input.go new file mode 100644 index 0000000..5145872 --- /dev/null +++ b/internal/osbuild2/files_input.go @@ -0,0 +1,18 @@ +package osbuild2 + +// Inputs for individual files + +// Provides all the files, named via their content hash, specified +// via `references` in a new directory. +type FilesInput struct { + inputCommon +} + +func (FilesInput) isInput() {} + +func NewFilesInput() *FilesInput { + input := new(FilesInput) + input.Type = "org.osbuild.files" + input.Origin = "org.osbuild.source" + return input +} diff --git a/internal/osbuild2/firewall_stage.go b/internal/osbuild2/firewall_stage.go new file mode 100644 index 0000000..fdd0001 --- /dev/null +++ b/internal/osbuild2/firewall_stage.go @@ -0,0 +1,16 @@ +package osbuild2 + +type FirewallStageOptions struct { + Ports []string `json:"ports,omitempty"` + EnabledServices []string `json:"enabled_services,omitempty"` + DisabledServices []string `json:"disabled_services,omitempty"` +} + +func (FirewallStageOptions) isStageOptions() {} + +func NewFirewallStage(options *FirewallStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.firewall", + Options: options, + } +} diff --git a/internal/osbuild2/firewall_stage_test.go b/internal/osbuild2/firewall_stage_test.go new file mode 100644 index 0000000..24d2c0d --- /dev/null +++ b/internal/osbuild2/firewall_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFirewallStage(t *testing.T) { + expectedFirewall := &Stage{ + Type: "org.osbuild.firewall", + Options: &FirewallStageOptions{}, + } + actualFirewall := NewFirewallStage(&FirewallStageOptions{}) + assert.Equal(t, expectedFirewall, actualFirewall) +} diff --git a/internal/osbuild2/first_boot_stage.go b/internal/osbuild2/first_boot_stage.go new file mode 100644 index 0000000..000427c --- /dev/null +++ b/internal/osbuild2/first_boot_stage.go @@ -0,0 +1,15 @@ +package osbuild2 + +type FirstBootStageOptions struct { + Commands []string `json:"commands"` + WaitForNetwork bool `json:"wait_for_network,omitempty"` +} + +func (FirstBootStageOptions) isStageOptions() {} + +func NewFirstBootStage(options *FirstBootStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.first-boot", + Options: options, + } +} diff --git a/internal/osbuild2/first_boot_stage_test.go b/internal/osbuild2/first_boot_stage_test.go new file mode 100644 index 0000000..c1df518 --- /dev/null +++ b/internal/osbuild2/first_boot_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFirstBootStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.first-boot", + Options: &FirstBootStageOptions{}, + } + actualStage := NewFirstBootStage(&FirstBootStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/fix_bls_stage.go b/internal/osbuild2/fix_bls_stage.go new file mode 100644 index 0000000..568ec49 --- /dev/null +++ b/internal/osbuild2/fix_bls_stage.go @@ -0,0 +1,21 @@ +package osbuild2 + +// A FixBLSStageOptions struct is empty, as the stage takes no options. +// +// The FixBLSStage fixes the paths in the Boot Loader Specification +// snippets installed into /boot. grub2's kernel install script will +// try to guess the correct path to the kernel and bootloader, and adjust +// the boot loader scripts accordingly. When run under OSBuild this does +// not work correctly, so this stage essentially reverts the "fixup". +type FixBLSStageOptions struct { +} + +func (FixBLSStageOptions) isStageOptions() {} + +// NewFixBLSStage creates a new FixBLSStage. +func NewFixBLSStage() *Stage { + return &Stage{ + Type: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + } +} diff --git a/internal/osbuild2/fix_bls_stage_test.go b/internal/osbuild2/fix_bls_stage_test.go new file mode 100644 index 0000000..550ea28 --- /dev/null +++ b/internal/osbuild2/fix_bls_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFixBLSStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + } + actualStage := NewFixBLSStage() + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/fstab_stage.go b/internal/osbuild2/fstab_stage.go new file mode 100644 index 0000000..be02d40 --- /dev/null +++ b/internal/osbuild2/fstab_stage.go @@ -0,0 +1,44 @@ +package osbuild2 + +// The FSTabStageOptions describe the content of the /etc/fstab file. +// +// The structure of the options follows the format of /etc/fstab, except +// that filesystem must be identified by their UUID and ommitted fields +// are set to their defaults (if possible). +type FSTabStageOptions struct { + FileSystems []*FSTabEntry `json:"filesystems"` +} + +func (FSTabStageOptions) isStageOptions() {} + +// NewFSTabStage creates a now FSTabStage object +func NewFSTabStage(options *FSTabStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.fstab", + Options: options, + } +} + +// An FSTabEntry represents one line in /etc/fstab. With the one exception +// that the the spec field must be represented as an UUID. +type FSTabEntry struct { + UUID string `json:"uuid,omitempty"` + Label string `json:"label,omitempty"` + VFSType string `json:"vfs_type"` + Path string `json:"path,omitempty"` + Options string `json:"options,omitempty"` + Freq uint64 `json:"freq,omitempty"` + PassNo uint64 `json:"passno,omitempty"` +} + +// AddFilesystem adds one entry to and FSTabStageOptions object. +func (options *FSTabStageOptions) AddFilesystem(id string, vfsType string, path string, opts string, freq uint64, passNo uint64) { + options.FileSystems = append(options.FileSystems, &FSTabEntry{ + UUID: id, + VFSType: vfsType, + Path: path, + Options: opts, + Freq: freq, + PassNo: passNo, + }) +} diff --git a/internal/osbuild2/fstab_stage_test.go b/internal/osbuild2/fstab_stage_test.go new file mode 100644 index 0000000..4bc4277 --- /dev/null +++ b/internal/osbuild2/fstab_stage_test.go @@ -0,0 +1,52 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewFSTabStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.fstab", + Options: &FSTabStageOptions{}, + } + actualStage := NewFSTabStage(&FSTabStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} + +func TestAddFilesystem(t *testing.T) { + options := &FSTabStageOptions{} + filesystems := []*FSTabEntry{ + { + UUID: "76a22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "ext4", + Path: "/", + Options: "defaults", + Freq: 1, + PassNo: 1, + }, + { + UUID: "bba22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "xfs", + Path: "/home", + Options: "defaults", + Freq: 1, + PassNo: 2, + }, + { + UUID: "cca22bf4-f153-4541-b6c7-0332c0dfaeac", + VFSType: "xfs", + Path: "/var", + Options: "defaults", + Freq: 1, + PassNo: 1, + }, + } + + for i, fs := range filesystems { + options.AddFilesystem(fs.UUID, fs.VFSType, fs.Path, fs.Options, fs.Freq, fs.PassNo) + assert.Equal(t, options.FileSystems[i], fs) + } + assert.Equal(t, len(filesystems), len(options.FileSystems)) +} diff --git a/internal/osbuild2/groups_stage.go b/internal/osbuild2/groups_stage.go new file mode 100644 index 0000000..d003954 --- /dev/null +++ b/internal/osbuild2/groups_stage.go @@ -0,0 +1,19 @@ +package osbuild2 + +type GroupsStageOptions struct { + Groups map[string]GroupsStageOptionsGroup `json:"groups"` +} + +func (GroupsStageOptions) isStageOptions() {} + +type GroupsStageOptionsGroup struct { + Name string `json:"name"` + GID *int `json:"gid,omitempty"` +} + +func NewGroupsStage(options *GroupsStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.groups", + Options: options, + } +} diff --git a/internal/osbuild2/groups_stage_test.go b/internal/osbuild2/groups_stage_test.go new file mode 100644 index 0000000..db5d499 --- /dev/null +++ b/internal/osbuild2/groups_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewGroupsStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.groups", + Options: &GroupsStageOptions{}, + } + actualStage := NewGroupsStage(&GroupsStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/grub2_stage.go b/internal/osbuild2/grub2_stage.go new file mode 100644 index 0000000..7ed0a0a --- /dev/null +++ b/internal/osbuild2/grub2_stage.go @@ -0,0 +1,34 @@ +package osbuild2 + +import "github.com/google/uuid" + +// The GRUB2StageOptions describes the bootloader configuration. +// +// The stage is responsible for installing all bootloader files in +// /boot as well as config files in /etc necessary for regenerating +// the configuration in /boot. +// +// Note that it is the role of an assembler to install any necessary +// bootloaders that are stored in the image outside of any filesystem. +type GRUB2StageOptions struct { + RootFilesystemUUID uuid.UUID `json:"root_fs_uuid"` + BootFilesystemUUID *uuid.UUID `json:"boot_fs_uuid,omitempty"` + KernelOptions string `json:"kernel_opts,omitempty"` + Legacy string `json:"legacy,omitempty"` + UEFI *GRUB2UEFI `json:"uefi,omitempty"` + SavedEntry string `json:"saved_entry,omitempty"` +} + +type GRUB2UEFI struct { + Vendor string `json:"vendor"` +} + +func (GRUB2StageOptions) isStageOptions() {} + +// NewGRUB2Stage creates a new GRUB2 stage object. +func NewGRUB2Stage(options *GRUB2StageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.grub2", + Options: options, + } +} diff --git a/internal/osbuild2/grub2_stage_test.go b/internal/osbuild2/grub2_stage_test.go new file mode 100644 index 0000000..54d30fd --- /dev/null +++ b/internal/osbuild2/grub2_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewGRUB2Stage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.grub2", + Options: &GRUB2StageOptions{}, + } + actualStage := NewGRUB2Stage(&GRUB2StageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/hostname_stage.go b/internal/osbuild2/hostname_stage.go new file mode 100644 index 0000000..8ffcb57 --- /dev/null +++ b/internal/osbuild2/hostname_stage.go @@ -0,0 +1,14 @@ +package osbuild2 + +type HostnameStageOptions struct { + Hostname string `json:"hostname"` +} + +func (HostnameStageOptions) isStageOptions() {} + +func NewHostnameStage(options *HostnameStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.hostname", + Options: options, + } +} diff --git a/internal/osbuild2/hostname_stage_test.go b/internal/osbuild2/hostname_stage_test.go new file mode 100644 index 0000000..d2c6175 --- /dev/null +++ b/internal/osbuild2/hostname_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewHostnameStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.hostname", + Options: &HostnameStageOptions{}, + } + actualStage := NewHostnameStage(&HostnameStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/implantisomd5_stage.go b/internal/osbuild2/implantisomd5_stage.go new file mode 100644 index 0000000..a64f305 --- /dev/null +++ b/internal/osbuild2/implantisomd5_stage.go @@ -0,0 +1,16 @@ +package osbuild2 + +type Implantisomd5StageOptions struct { + // Path in the ISO where the md5 checksum will be implanted + Filename string `json:"filename"` +} + +func (Implantisomd5StageOptions) isStageOptions() {} + +// Implant an MD5 checksum in an ISO9660 image +func NewImplantisomd5Stage(options *Implantisomd5StageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.implantisomd5", + Options: options, + } +} diff --git a/internal/osbuild2/kernel_cmdline_stage.go b/internal/osbuild2/kernel_cmdline_stage.go new file mode 100644 index 0000000..c756244 --- /dev/null +++ b/internal/osbuild2/kernel_cmdline_stage.go @@ -0,0 +1,19 @@ +package osbuild2 + +// KernelCmdlineStageOptions describe how to create kernel-cmdline stage +// +// Configures the kernel boot parameters, also known as the kernel command line. +type KernelCmdlineStageOptions struct { + RootFsUUID string `json:"root_fs_uuid,omitempty"` + KernelOpts string `json:"kernel_opts,omitempty"` +} + +func (KernelCmdlineStageOptions) isStageOptions() {} + +// NewKernelCmdlineStage creates a new kernel-cmdline Stage object. +func NewKernelCmdlineStage(options *KernelCmdlineStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.kernel-cmdline", + Options: options, + } +} diff --git a/internal/osbuild2/kernel_cmdline_stage_test.go b/internal/osbuild2/kernel_cmdline_stage_test.go new file mode 100644 index 0000000..efc91ce --- /dev/null +++ b/internal/osbuild2/kernel_cmdline_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewKernelCmdlineStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.kernel-cmdline", + Options: &KernelCmdlineStageOptions{}, + } + actualStage := NewKernelCmdlineStage(&KernelCmdlineStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/keymap_stage.go b/internal/osbuild2/keymap_stage.go new file mode 100644 index 0000000..571d19e --- /dev/null +++ b/internal/osbuild2/keymap_stage.go @@ -0,0 +1,14 @@ +package osbuild2 + +type KeymapStageOptions struct { + Keymap string `json:"keymap"` +} + +func (KeymapStageOptions) isStageOptions() {} + +func NewKeymapStage(options *KeymapStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.keymap", + Options: options, + } +} diff --git a/internal/osbuild2/keymap_stage_test.go b/internal/osbuild2/keymap_stage_test.go new file mode 100644 index 0000000..abb9d7b --- /dev/null +++ b/internal/osbuild2/keymap_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewKeymapStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.keymap", + Options: &KeymapStageOptions{}, + } + actualStage := NewKeymapStage(&KeymapStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/kickstart_stage.go b/internal/osbuild2/kickstart_stage.go new file mode 100644 index 0000000..06d1e6c --- /dev/null +++ b/internal/osbuild2/kickstart_stage.go @@ -0,0 +1,31 @@ +package osbuild2 + +type KickstartStageOptions struct { + // Where to place the kickstart file + Path string `json:"path"` + + OSTree OSTreeOptions `json:"ostree,omitempty"` + + LiveIMG *LiveIMG `json:"liveimg,omitempty"` +} + +type LiveIMG struct { + URL string `json:"url"` +} + +type OSTreeOptions struct { + OSName string `json:"osname"` + URL string `json:"url"` + Ref string `json:"ref"` + GPG bool `json:"gpg"` +} + +func (KickstartStageOptions) isStageOptions() {} + +// Creates an Anaconda kickstart file +func NewKickstartStage(options *KickstartStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.kickstart", + Options: options, + } +} diff --git a/internal/osbuild2/locale_stage.go b/internal/osbuild2/locale_stage.go new file mode 100644 index 0000000..68d8bd0 --- /dev/null +++ b/internal/osbuild2/locale_stage.go @@ -0,0 +1,19 @@ +package osbuild2 + +// The LocaleStageOptions describes the image's locale. +// +// A locale is typically specified as language_[territory], where language +// is specified in ISO 639 and territory in ISO 3166. +type LocaleStageOptions struct { + Language string `json:"language"` +} + +func (LocaleStageOptions) isStageOptions() {} + +// NewLocaleStage creates a new Locale Stage object. +func NewLocaleStage(options *LocaleStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.locale", + Options: options, + } +} diff --git a/internal/osbuild2/locale_stage_test.go b/internal/osbuild2/locale_stage_test.go new file mode 100644 index 0000000..37dc825 --- /dev/null +++ b/internal/osbuild2/locale_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewLocaleStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.locale", + Options: &LocaleStageOptions{}, + } + actualStage := NewLocaleStage(&LocaleStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/lorax_script_stage.go b/internal/osbuild2/lorax_script_stage.go new file mode 100644 index 0000000..ff6cbb5 --- /dev/null +++ b/internal/osbuild2/lorax_script_stage.go @@ -0,0 +1,28 @@ +package osbuild2 + +type LoraxScriptStageOptions struct { + // Where to put the script + Path string `json:"path"` + + // The basic architecture parameter to supply to the template + BaseArch string `json:"basearch,omitempty"` + + Product Product `json:"product,omitempty"` + + LibDir string `json:"libdir,omitempty"` +} + +type Product struct { + Name string `json:"name"` + Version string `json:"version"` +} + +func (LoraxScriptStageOptions) isStageOptions() {} + +// Run a Lorax template script on the tree +func NewLoraxScriptStage(options *LoraxScriptStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.lorax-script", + Options: options, + } +} diff --git a/internal/osbuild2/oci_archive_stage.go b/internal/osbuild2/oci_archive_stage.go new file mode 100644 index 0000000..aefe592 --- /dev/null +++ b/internal/osbuild2/oci_archive_stage.go @@ -0,0 +1,139 @@ +package osbuild2 + +import ( + "bytes" + "encoding/json" + "fmt" + "regexp" + "sort" +) + +type OCIArchiveStageOptions struct { + // The CPU architecture of the image + Architecture string `json:"architecture"` + + // Resulting image filename + Filename string `json:"filename"` + + // The execution parameters + Config *OCIArchiveConfig `json:"config,omitempty"` +} + +type OCIArchiveConfig struct { + Cmd []string `json:"Cmd,omitempty"` + Env []string `json:"Env,omitempty"` + ExposedPorts []string `json:"ExposedPorts,omitempty"` + User string `json:"User,omitempty"` + Labels map[string]string `json:"Labels,omitempty"` + StopSignal string `json:"StopSignal,omitempty"` + Volumes []string `json:"Volumes,omitempty"` + WorkingDir string `json:"WorkingDir,omitempty"` +} + +func (OCIArchiveStageOptions) isStageOptions() {} + +type OCIArchiveStageInputs struct { + // Base layer for the container + Base *OCIArchiveStageInput `json:"base"` + // Additional layers in ascending order + Layers []OCIArchiveStageInput `json:",omitempty"` +} + +func (OCIArchiveStageInputs) isStageInputs() {} + +type OCIArchiveStageInput struct { + inputCommon + References OCIArchiveStageReferences `json:"references"` +} + +func (OCIArchiveStageInput) isStageInput() {} + +type OCIArchiveStageReferences []string + +func (OCIArchiveStageReferences) isReferences() {} + +// A new OCIArchiveStage to to assemble an OCI image archive +func NewOCIArchiveStage(options *OCIArchiveStageOptions, inputs *OCIArchiveStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.oci-archive", + Options: options, + Inputs: inputs, + } +} + +// Custom marshaller for OCIArchiveStageInputs, needed to generate keys of the +// form "layer.N", (where N = 1, 2, ...) for the Layers property +func (inputs *OCIArchiveStageInputs) MarshalJSON() ([]byte, error) { + if inputs == nil { + return json.Marshal(inputs) + } + + layers := inputs.Layers + inputsMap := make(map[string]OCIArchiveStageInput, len(layers)+1) + if inputs.Base != nil { + inputsMap["base"] = *inputs.Base + } + + for idx, input := range layers { + key := fmt.Sprintf("layer.%d", idx+1) + inputsMap[key] = input + } + + return json.Marshal(inputsMap) +} + +// Get the sorted keys that match the pattern "layer.N" (for N > 0) +func layerKeys(layers map[string]OCIArchiveStageInput) ([]string, error) { + keys := make([]string, 0, len(layers)) + for key := range layers { + re := regexp.MustCompile(`layer\.[1-9]\d*`) + if key == "base" { + continue + } + if !re.MatchString(key) { + return nil, fmt.Errorf("invalid key: %q", key) + } + keys = append(keys, key) + } + sort.Strings(keys) + return keys, nil +} + +// Custom unmarshaller for OCIArchiveStageInputs, needed to handle keys of the +// form "layer.N", (where N = 1, 2, ...) for the Layers property +func (inputs *OCIArchiveStageInputs) UnmarshalJSON(data []byte) error { + if len(data) == 0 { + return nil + } + + if inputs == nil { + inputs = new(OCIArchiveStageInputs) + } + + inputsMap := make(map[string]OCIArchiveStageInput) + + dec := json.NewDecoder(bytes.NewReader(data)) + dec.DisallowUnknownFields() + + if err := dec.Decode(&inputsMap); err != nil { + return err + } + + // "base" layer is required + base, ok := inputsMap["base"] + if !ok { + return fmt.Errorf("missing required key \"base\"") + } + + inputs.Base = &base + keys, err := layerKeys(inputsMap) + if err != nil { + return err + } + inputs.Layers = make([]OCIArchiveStageInput, len(inputsMap)-1) + for idx, key := range keys { + inputs.Layers[idx] = inputsMap[key] + } + + return nil +} diff --git a/internal/osbuild2/oci_archive_stage_test.go b/internal/osbuild2/oci_archive_stage_test.go new file mode 100644 index 0000000..a73dd85 --- /dev/null +++ b/internal/osbuild2/oci_archive_stage_test.go @@ -0,0 +1,105 @@ +package osbuild2 + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestOCIArchiveStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.oci-archive", + Options: &OCIArchiveStageOptions{}, + Inputs: &OCIArchiveStageInputs{}, + } + actualStage := NewOCIArchiveStage(&OCIArchiveStageOptions{}, &OCIArchiveStageInputs{}) + assert.Equal(t, expectedStage, actualStage) +} + +func TestOCIArchiveInputs(t *testing.T) { + exp := `{ + "base": { + "type": "org.osbuild.oci-archive", + "origin":"org.osbuild.pipeline", + "references": ["name:container-tree"] + }, + "layer.1": { + "type": "org.osbuild.tree", + "origin": "org.osbuild.pipeline", + "references": ["name:container-ostree"] + }, + "layer.2": { + "type": "org.osbuild.tree", + "origin": "org.osbuild.pipeline", + "references": ["name:container-ostree2"] + } + }` + inputs := new(OCIArchiveStageInputs) + base := &OCIArchiveStageInput{ + References: []string{ + "name:container-tree", + }, + } + base.Type = "org.osbuild.oci-archive" + base.Origin = "org.osbuild.pipeline" + + layer1 := OCIArchiveStageInput{ + References: []string{ + "name:container-ostree", + }, + } + layer1.Type = "org.osbuild.tree" + layer1.Origin = "org.osbuild.pipeline" + layer2 := OCIArchiveStageInput{ + References: []string{ + "name:container-ostree2", + }, + } + layer2.Type = "org.osbuild.tree" + layer2.Origin = "org.osbuild.pipeline" + + inputs.Base = base + inputs.Layers = []OCIArchiveStageInput{layer1, layer2} + + data, err := json.Marshal(inputs) + assert.NoError(t, err) + assert.JSONEq(t, exp, string(data)) + + inputsRead := new(OCIArchiveStageInputs) + err = json.Unmarshal([]byte(exp), inputsRead) + assert.NoError(t, err) + assert.Equal(t, inputs, inputsRead) +} + +func TestOCIArchiveInputsErrors(t *testing.T) { + noBase := `{ + "layer.10": { + "type": "org.osbuild.tree", + "origin": "org.osbuild.pipeline", + "references": ["name:container-ostree"] + }, + "layer.2": { + "type": "org.osbuild.tree", + "origin": "org.osbuild.pipeline", + "references": ["name:container-ostree2"] + } + }` + + inputsRead := new(OCIArchiveStageInputs) + assert.Error(t, json.Unmarshal([]byte(noBase), inputsRead)) + + invalidKey := `{ + "base": { + "type": "org.osbuild.oci-archive", + "origin":"org.osbuild.pipeline", + "references": ["name:container-tree"] + }, + "not-a-layer": { + "type": "org.osbuild.tree", + "origin": "org.osbuild.pipeline", + "references": ["name:container-ostree2"] + } + }` + assert.Error(t, json.Unmarshal([]byte(invalidKey), inputsRead)) +} diff --git a/internal/osbuild2/osbuild.go b/internal/osbuild2/osbuild.go new file mode 100644 index 0000000..fab0d31 --- /dev/null +++ b/internal/osbuild2/osbuild.go @@ -0,0 +1,35 @@ +// Package osbuild provides primitives for representing and (un)marshalling +// OSBuild (schema v1) types. +package osbuild2 + +// A Manifest represents an OSBuild source and pipeline manifest +type Manifest struct { + Version string `json:"version"` + Pipelines []Pipeline `json:"pipelines"` + Sources Sources `json:"sources"` +} + +// A Pipeline represents an OSBuild pipeline +type Pipeline struct { + Name string `json:"name,omitempty"` + // The build environment which can run this pipeline + Build string `json:"build,omitempty"` + + Runner string `json:"runner,omitempty"` + + // Sequence of stages that produce the filesystem tree, which is the + // payload of the produced image. + Stages []*Stage `json:"stages,omitempty"` +} + +// SetBuild sets the pipeline and runner for generating the build environment +// for a pipeline. +func (p *Pipeline) SetBuild(build string) { + p.Build = build +} + +// AddStage appends a stage to the list of stages of a pipeline. The stages +// will be executed in the order they are appended. +func (p *Pipeline) AddStage(stage *Stage) { + p.Stages = append(p.Stages, stage) +} diff --git a/internal/osbuild2/osbuild_test.go b/internal/osbuild2/osbuild_test.go new file mode 100644 index 0000000..1249145 --- /dev/null +++ b/internal/osbuild2/osbuild_test.go @@ -0,0 +1,28 @@ +// Package osbuild provides primitives for representing and (un)marshalling +// OSBuild types. +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPipeline_AddStage(t *testing.T) { + expectedPipeline := &Pipeline{ + Build: "name:build", + Stages: []*Stage{ + { + Type: "org.osbuild.rpm", + }, + }, + } + actualPipeline := &Pipeline{ + Build: "name:build", + } + actualPipeline.AddStage(&Stage{ + Type: "org.osbuild.rpm", + }) + assert.Equal(t, expectedPipeline, actualPipeline) + assert.Equal(t, 1, len(actualPipeline.Stages)) +} diff --git a/internal/osbuild2/ostree_commit_stage.go b/internal/osbuild2/ostree_commit_stage.go new file mode 100644 index 0000000..2aa161b --- /dev/null +++ b/internal/osbuild2/ostree_commit_stage.go @@ -0,0 +1,41 @@ +package osbuild2 + +type OSTreeCommitStageOptions struct { + // OStree ref to create for the commit + Ref string `json:"ref"` + + // Set the version of the OS as commit metadata + OSVersion string `json:"os_version,omitempty"` + + // Commit ID of the parent commit + Parent string `json:"parent,omitempty"` +} + +func (OSTreeCommitStageOptions) isStageOptions() {} + +type OSTreeCommitStageInput struct { + inputCommon + References OSTreeCommitStageReferences `json:"references"` +} + +func (OSTreeCommitStageInput) isStageInput() {} + +type OSTreeCommitStageInputs struct { + Tree *OSTreeCommitStageInput `json:"tree"` +} + +func (OSTreeCommitStageInputs) isStageInputs() {} + +type OSTreeCommitStageReferences []string + +func (OSTreeCommitStageReferences) isReferences() {} + +// The OSTreeCommitStage (org.osbuild.ostree.commit) describes how to assemble +// a tree into an OSTree commit. +func NewOSTreeCommitStage(options *OSTreeCommitStageOptions, inputs *OSTreeCommitStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.ostree.commit", + Options: options, + Inputs: inputs, + } +} diff --git a/internal/osbuild2/ostree_init_stage.go b/internal/osbuild2/ostree_init_stage.go new file mode 100644 index 0000000..b7f0d60 --- /dev/null +++ b/internal/osbuild2/ostree_init_stage.go @@ -0,0 +1,29 @@ +package osbuild2 + +type InitMode string + +const ( + ModeBare InitMode = "bare" + ModeBareUser InitMode = "bare-user" + ModeBareUserOnly InitMode = "bare-user-only" + ModeArchvie InitMode = "archive" +) + +// Options for the org.osbuild.ostree.init stage. +type OSTreeInitStageOptions struct { + // The Mode in which to initialise the repo + Mode InitMode `json:"mode,omitempty"` + + // Location in which to create the repo + Path string `json:"path,omitempty"` +} + +func (OSTreeInitStageOptions) isStageOptions() {} + +// A new org.osbuild.ostree.init stage to create an OSTree repository +func NewOSTreeInitStage(options *OSTreeInitStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.ostree.init", + Options: options, + } +} diff --git a/internal/osbuild2/ostree_input.go b/internal/osbuild2/ostree_input.go new file mode 100644 index 0000000..6fcf9e7 --- /dev/null +++ b/internal/osbuild2/ostree_input.go @@ -0,0 +1,15 @@ +package osbuild2 + +// Inputs for ostree commits +type OSTreeInput struct { + inputCommon +} + +func (OSTreeInput) isInput() {} + +func NewOSTreeInput() *OSTreeInput { + input := new(OSTreeInput) + input.Type = "org.osbuild.ostree" + input.Origin = "org.osbuild.source" + return input +} diff --git a/internal/osbuild2/ostree_preptree_stage.go b/internal/osbuild2/ostree_preptree_stage.go new file mode 100644 index 0000000..6e0ba91 --- /dev/null +++ b/internal/osbuild2/ostree_preptree_stage.go @@ -0,0 +1,16 @@ +package osbuild2 + +type OSTreePrepTreeStageOptions struct { + EtcGroupMembers []string `json:"etc_group_members,omitempty"` +} + +func (OSTreePrepTreeStageOptions) isStageOptions() {} + +// The OSTree PrepTree (org.osbuild.ostree.preptree) stage transforms the +// tree to an ostree layout. +func NewOSTreePrepTreeStage(options *OSTreePrepTreeStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.ostree.preptree", + Options: options, + } +} diff --git a/internal/osbuild2/ostree_pull_stage.go b/internal/osbuild2/ostree_pull_stage.go new file mode 100644 index 0000000..7550c4f --- /dev/null +++ b/internal/osbuild2/ostree_pull_stage.go @@ -0,0 +1,39 @@ +package osbuild2 + +// Options for the org.osbuild.ostree.pull stage. +type OSTreePullStageOptions struct { + // Location of the ostree repo + Repo string `json:"repo"` +} + +func (OSTreePullStageOptions) isStageOptions() {} + +type OSTreePullStageInput struct { + inputCommon + References OSTreePullStageReferences `json:"references"` +} + +func (OSTreePullStageInput) isStageInput() {} + +type OSTreePullStageInputs struct { + Commits *OSTreePullStageInput `json:"commits"` +} + +func (OSTreePullStageInputs) isStageInputs() {} + +type OSTreePullStageReferences map[string]OSTreePullStageReference + +func (OSTreePullStageReferences) isReferences() {} + +type OSTreePullStageReference struct { + Ref string `json:"ref"` +} + +// A new org.osbuild.ostree.pull stage to pull OSTree commits into an existing repo +func NewOSTreePullStage(options *OSTreePullStageOptions, inputs *OSTreePullStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.ostree.pull", + Inputs: inputs, + Options: options, + } +} diff --git a/internal/osbuild2/ostree_source.go b/internal/osbuild2/ostree_source.go new file mode 100644 index 0000000..b64afaa --- /dev/null +++ b/internal/osbuild2/ostree_source.go @@ -0,0 +1,19 @@ +package osbuild2 + +// The commits to fetch indexed their checksum +type OSTreeSource struct { + Items map[string]OSTreeSourceItem `json:"items"` +} + +func (OSTreeSource) isSource() {} + +type OSTreeSourceItem struct { + Remote OSTreeRemote `json:"remote"` +} + +type OSTreeRemote struct { + // URL of the repository. + URL string `json:"url"` + // GPG keys to verify the commits + GPGKeys []string `json:"secrets,omitempty"` +} diff --git a/internal/osbuild2/result.go b/internal/osbuild2/result.go new file mode 100644 index 0000000..ba95055 --- /dev/null +++ b/internal/osbuild2/result.go @@ -0,0 +1,22 @@ +package osbuild2 + +import ( + "encoding/json" +) + +type PipelineResult []StageResult + +type StageResult struct { + ID string `json:"id"` + Type string `json:"type"` + Output string `json:"output"` + Success bool `json:"success,omitempty"` + Error string `json:"string,omitempty"` +} + +type Result struct { + Type string `json:"type"` + Success bool `json:"success"` + Error json.RawMessage `json:"error"` + Log map[string]PipelineResult `json:"log"` +} diff --git a/internal/osbuild2/result_test.go b/internal/osbuild2/result_test.go new file mode 100644 index 0000000..d0a4546 --- /dev/null +++ b/internal/osbuild2/result_test.go @@ -0,0 +1 @@ +package osbuild2 diff --git a/internal/osbuild2/rhsm_stage.go b/internal/osbuild2/rhsm_stage.go new file mode 100644 index 0000000..3d072c8 --- /dev/null +++ b/internal/osbuild2/rhsm_stage.go @@ -0,0 +1,34 @@ +package osbuild2 + +// RHSMStageOptions describes configuration of the RHSM stage. +// +// The RHSM stage allows configuration of Red Hat Subscription Manager (RHSM) +// related components. Currently it allows only configuration of the enablement +// state of DNF plugins used by the Subscription Manager. +type RHSMStageOptions struct { + DnfPlugins *RHSMStageOptionsDnfPlugins `json:"dnf-plugins,omitempty"` +} + +func (RHSMStageOptions) isStageOptions() {} + +// RHSMStageOptionsDnfPlugins describes configuration of all RHSM DNF plugins +type RHSMStageOptionsDnfPlugins struct { + ProductID *RHSMStageOptionsDnfPlugin `json:"product-id,omitempty"` + SubscriptionManager *RHSMStageOptionsDnfPlugin `json:"subscription-manager,omitempty"` +} + +// RHSMStageOptionsDnfPlugin describes configuration of a specific RHSM DNF +// plugin +// +// Only the enablement state of a DNF plugin can be currenlty set. +type RHSMStageOptionsDnfPlugin struct { + Enabled bool `json:"enabled"` +} + +// NewRHSMStage creates a new RHSM stage +func NewRHSMStage(options *RHSMStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.rhsm", + Options: options, + } +} diff --git a/internal/osbuild2/rhsm_stage_test.go b/internal/osbuild2/rhsm_stage_test.go new file mode 100644 index 0000000..68867c7 --- /dev/null +++ b/internal/osbuild2/rhsm_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewRhsmStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.rhsm", + Options: &RHSMStageOptions{}, + } + actualStage := NewRHSMStage(&RHSMStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/rpm_stage.go b/internal/osbuild2/rpm_stage.go new file mode 100644 index 0000000..eb2a36e --- /dev/null +++ b/internal/osbuild2/rpm_stage.go @@ -0,0 +1,53 @@ +package osbuild2 + +type RPMStageOptions struct { + // Array of GPG key contents to import + GPGKeys []string `json:"gpgkeys,omitempty"` + + // Prevent dracut from running + DisableDracut bool `json:"disable_dracut,omitempty"` + + Exclude *Exclude `json:"exclude,omitempty"` +} + +type Exclude struct { + // Do not install documentation. + Docs bool `json:"docs,omitempty"` +} + +// RPMPackage represents one RPM, as referenced by its content hash +// (checksum). The files source must indicate where to fetch the given +// RPM. If CheckGPG is `true` the RPM must be signed with one of the +// GPGKeys given in the RPMStageOptions. +type RPMPackage struct { + Checksum string `json:"checksum"` + CheckGPG bool `json:"check_gpg,omitempty"` +} + +func (RPMStageOptions) isStageOptions() {} + +type RPMStageInputs struct { + Packages *RPMStageInput `json:"packages"` +} + +func (RPMStageInputs) isStageInputs() {} + +type RPMStageInput struct { + inputCommon + References RPMStageReferences `json:"references"` +} + +func (RPMStageInput) isStageInput() {} + +type RPMStageReferences []string + +func (RPMStageReferences) isReferences() {} + +// NewRPMStage creates a new RPM stage. +func NewRPMStage(options *RPMStageOptions, inputs *RPMStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.rpm", + Inputs: inputs, + Options: options, + } +} diff --git a/internal/osbuild2/rpm_stage_test.go b/internal/osbuild2/rpm_stage_test.go new file mode 100644 index 0000000..fbc73f1 --- /dev/null +++ b/internal/osbuild2/rpm_stage_test.go @@ -0,0 +1,17 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewRPMStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.rpm", + Options: &RPMStageOptions{}, + Inputs: &RPMStageInputs{}, + } + actualStage := NewRPMStage(&RPMStageOptions{}, &RPMStageInputs{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/script_stage.go b/internal/osbuild2/script_stage.go new file mode 100644 index 0000000..a4ff09e --- /dev/null +++ b/internal/osbuild2/script_stage.go @@ -0,0 +1,24 @@ +package osbuild2 + +// The ScriptStageOptions specifies a custom script to run in the image +type ScriptStageOptions struct { + Script string `json:"script"` +} + +func (ScriptStageOptions) isStageOptions() {} + +// NewScriptStageOptions creates a new script stage options object, with +// the mandatory fields set. +func NewScriptStageOptions(script string) *ScriptStageOptions { + return &ScriptStageOptions{ + Script: script, + } +} + +// NewScriptStage creates a new Script Stage object. +func NewScriptStage(options *ScriptStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.script", + Options: options, + } +} diff --git a/internal/osbuild2/script_stage_test.go b/internal/osbuild2/script_stage_test.go new file mode 100644 index 0000000..380a54a --- /dev/null +++ b/internal/osbuild2/script_stage_test.go @@ -0,0 +1,24 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewScriptStageOptions(t *testing.T) { + expectedOptions := &ScriptStageOptions{ + Script: "/root/test.sh", + } + actualOptions := NewScriptStageOptions("/root/test.sh") + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewScriptStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.script", + Options: &ScriptStageOptions{}, + } + actualStage := NewScriptStage(&ScriptStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/selinux_stage.go b/internal/osbuild2/selinux_stage.go new file mode 100644 index 0000000..37377d8 --- /dev/null +++ b/internal/osbuild2/selinux_stage.go @@ -0,0 +1,28 @@ +package osbuild2 + +// The SELinuxStageOptions describe how to apply selinux labels. +// +// A file contexts configuration file is sepcified that describes +// the filesystem labels to apply to the image. +type SELinuxStageOptions struct { + FileContexts string `json:"file_contexts"` + Labels map[string]string `json:"labels,omitempty"` +} + +func (SELinuxStageOptions) isStageOptions() {} + +// NewSELinuxStageOptions creates a new SELinuxStaeOptions object, with +// the mandatory fields set. +func NewSELinuxStageOptions(fileContexts string) *SELinuxStageOptions { + return &SELinuxStageOptions{ + FileContexts: fileContexts, + } +} + +// NewSELinuxStage creates a new SELinux Stage object. +func NewSELinuxStage(options *SELinuxStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.selinux", + Options: options, + } +} diff --git a/internal/osbuild2/selinux_stage_test.go b/internal/osbuild2/selinux_stage_test.go new file mode 100644 index 0000000..7c62095 --- /dev/null +++ b/internal/osbuild2/selinux_stage_test.go @@ -0,0 +1,24 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSELinuxStageOptions(t *testing.T) { + expectedOptions := &SELinuxStageOptions{ + FileContexts: "etc/selinux/targeted/contexts/files/file_contexts", + } + actualOptions := NewSELinuxStageOptions("etc/selinux/targeted/contexts/files/file_contexts") + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewSELinuxStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.selinux", + Options: &SELinuxStageOptions{}, + } + actualStage := NewSELinuxStage(&SELinuxStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/source.go b/internal/osbuild2/source.go new file mode 100644 index 0000000..61568bf --- /dev/null +++ b/internal/osbuild2/source.go @@ -0,0 +1,49 @@ +package osbuild2 + +import ( + "encoding/json" + "errors" +) + +// A Sources map contains all the sources made available to an osbuild run +type Sources map[string]Source + +// Source specifies the operations of a given source-type. +type Source interface { + isSource() +} + +type SourceOptions interface { + isSourceOptions() +} + +type rawSources map[string]json.RawMessage + +// UnmarshalJSON unmarshals JSON into a Source object. Each type of source has +// a custom unmarshaller for its options, selected based on the source name. +func (sources *Sources) UnmarshalJSON(data []byte) error { + var rawSources rawSources + err := json.Unmarshal(data, &rawSources) + if err != nil { + return err + } + *sources = make(map[string]Source) + for name, rawSource := range rawSources { + var source Source + switch name { + case "org.osbuild.curl": + source = new(CurlSource) + case "org.osbuild.ostree": + source = new(OSTreeSource) + default: + return errors.New("unexpected source name: " + name) + } + err = json.Unmarshal(rawSource, source) + if err != nil { + return err + } + (*sources)[name] = source + } + + return nil +} diff --git a/internal/osbuild2/source_test.go b/internal/osbuild2/source_test.go new file mode 100644 index 0000000..525fe4e --- /dev/null +++ b/internal/osbuild2/source_test.go @@ -0,0 +1,115 @@ +package osbuild2 + +import ( + "bytes" + "encoding/json" + "reflect" + "testing" +) + +func TestSource_UnmarshalJSON(t *testing.T) { + type fields struct { + Type string + Source Source + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "invalid json", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}`), + }, + wantErr: true, + }, + { + name: "unknown source", + args: args{ + data: []byte(`{"name":"org.osbuild.foo","options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "missing options", + args: args{ + data: []byte(`{"name":"org.osbuild.curl"}`), + }, + wantErr: true, + }, + { + name: "missing name", + args: args{ + data: []byte(`{"foo":null,"options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "curl-empty", + fields: fields{ + Type: "org.osbuild.curl", + Source: &CurlSource{Items: map[string]CurlSourceItem{}}, + }, + args: args{ + data: []byte(`{"org.osbuild.curl":{"items":{}}}`), + }, + }, + { + name: "curl-with-secrets", + fields: fields{ + Type: "org.osbuild.curl", + Source: &CurlSource{ + Items: map[string]CurlSourceItem{ + "checksum1": URLWithSecrets{URL: "url1", Secrets: &URLSecrets{Name: "org.osbuild.rhsm"}}, + "checksum2": URLWithSecrets{URL: "url2", Secrets: &URLSecrets{Name: "whatever"}}, + }}, + }, + args: args{ + data: []byte(`{"org.osbuild.curl":{"items":{"checksum1":{"url":"url1","secrets":{"name":"org.osbuild.rhsm"}},"checksum2":{"url":"url2","secrets":{"name":"whatever"}}}}}`), + }, + }, + { + name: "curl-url-only", + fields: fields{ + Type: "org.osbuild.curl", + Source: &CurlSource{ + Items: map[string]CurlSourceItem{ + "checksum1": URL("url1"), + "checksum2": URL("url2"), + }}, + }, + args: args{ + data: []byte(`{"org.osbuild.curl":{"items":{"checksum1":"url1","checksum2":"url2"}}}`), + }, + }, + } + for idx, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sources := &Sources{ + tt.fields.Type: tt.fields.Source, + } + var gotSources Sources + if err := gotSources.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { + t.Errorf("Sources.UnmarshalJSON() error = %v, wantErr %v [idx: %d]", err, tt.wantErr, idx) + } + if tt.wantErr { + return + } + gotBytes, err := json.Marshal(sources) + if err != nil { + t.Errorf("Could not marshal source: %v [idx: %d]", err, idx) + } + if !bytes.Equal(gotBytes, tt.args.data) { + t.Errorf("Expected '%v', got '%v' [idx: %d]", string(tt.args.data), string(gotBytes), idx) + } + if !reflect.DeepEqual(&gotSources, sources) { + t.Errorf("got '%v', expected '%v' [idx:%d]", &gotSources, sources, idx) + } + }) + } +} diff --git a/internal/osbuild2/stage.go b/internal/osbuild2/stage.go new file mode 100644 index 0000000..37dce4e --- /dev/null +++ b/internal/osbuild2/stage.go @@ -0,0 +1,137 @@ +package osbuild2 + +import ( + "encoding/json" + "fmt" +) + +// Single stage of a pipeline executing one step +type Stage struct { + // Well-known name in reverse domain-name notation, uniquely identifying + // the stage type. + Type string `json:"type"` + // Stage-type specific options fully determining the operations of the + + Inputs Inputs `json:"inputs,omitempty"` + Options StageOptions `json:"options,omitempty"` +} + +// Collection of Inputs for a Stage +type Inputs interface { + isStageInputs() +} + +// Single Input for a Stage +type Input interface { + isInput() +} + +// Fields shared between all Input types (should be embedded in each instance) +type inputCommon struct { + Type string `json:"type"` + // Origin should be either 'org.osbuild.source' or 'org.osbuild.pipeline' + Origin string `json:"origin"` + + // References References `json:"references"` +} + +type StageInput interface { + isStageInput() +} + +type References interface { + isReferences() +} + +// StageOptions specify the operations of a given stage-type. +type StageOptions interface { + isStageOptions() +} + +type InputOptions interface { +} + +type rawStage struct { + Type string `json:"type"` + Options json.RawMessage `json:"options"` + Inputs json.RawMessage `json:"inputs"` +} + +// UnmarshalJSON unmarshals JSON into a Stage object. Each type of stage has +// a custom unmarshaller for its options, selected based on the stage name. +func (stage *Stage) UnmarshalJSON(data []byte) error { + var rawStage rawStage + if err := json.Unmarshal(data, &rawStage); err != nil { + return err + } + var options StageOptions + var inputs Inputs + switch rawStage.Type { + case "org.osbuild.fix-bls": + options = new(FixBLSStageOptions) + case "org.osbuild.fstab": + options = new(FSTabStageOptions) + case "org.osbuild.grub2": + options = new(GRUB2StageOptions) + case "org.osbuild.locale": + options = new(LocaleStageOptions) + case "org.osbuild.selinux": + options = new(SELinuxStageOptions) + case "org.osbuild.hostname": + options = new(HostnameStageOptions) + case "org.osbuild.users": + options = new(UsersStageOptions) + case "org.osbuild.groups": + options = new(GroupsStageOptions) + case "org.osbuild.timezone": + options = new(TimezoneStageOptions) + case "org.osbuild.chrony": + options = new(ChronyStageOptions) + case "org.osbuild.keymap": + options = new(KeymapStageOptions) + case "org.osbuild.firewall": + options = new(FirewallStageOptions) + case "org.osbuild.rhsm": + options = new(RHSMStageOptions) + case "org.osbuild.systemd": + options = new(SystemdStageOptions) + case "org.osbuild.script": + options = new(ScriptStageOptions) + case "org.osbuild.sysconfig": + options = new(SysconfigStageOptions) + case "org.osbuild.kernel-cmdline": + options = new(KernelCmdlineStageOptions) + case "org.osbuild.rpm": + options = new(RPMStageOptions) + inputs = new(RPMStageInputs) + case "org.osbuild.oci-archive": + options = new(OCIArchiveStageOptions) + inputs = new(OCIArchiveStageInputs) + case "org.osbuild.ostree.commit": + options = new(OSTreeCommitStageOptions) + inputs = new(OSTreeCommitStageInputs) + case "org.osbuild.ostree.pull": + options = new(OSTreePullStageOptions) + inputs = new(OSTreePullStageInputs) + case "org.osbuild.ostree.init": + options = new(OSTreeInitStageOptions) + case "org.osbuild.ostree.preptree": + options = new(OSTreePrepTreeStageOptions) + default: + return fmt.Errorf("unexpected stage type: %s", rawStage.Type) + } + if err := json.Unmarshal(rawStage.Options, options); err != nil { + return err + } + if inputs != nil && rawStage.Inputs != nil { + if err := json.Unmarshal(rawStage.Inputs, inputs); err != nil { + return err + } + } + + stage.Type = rawStage.Type + stage.Options = options + stage.Inputs = inputs + + return nil +} diff --git a/internal/osbuild2/stage_test.go b/internal/osbuild2/stage_test.go new file mode 100644 index 0000000..59b792c --- /dev/null +++ b/internal/osbuild2/stage_test.go @@ -0,0 +1,383 @@ +package osbuild2 + +import ( + "bytes" + "encoding/json" + "reflect" + "testing" + + "github.com/google/uuid" +) + +func TestStage_UnmarshalJSON(t *testing.T) { + nullUUID := uuid.MustParse("00000000-0000-0000-0000-000000000000") + type fields struct { + Type string + Options StageOptions + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "invalid json", + args: args{ + data: []byte(`{"type":"org.osbuild.foo","options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "unknown stage", + args: args{ + data: []byte(`{"type":"org.osbuild.foo","options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "missing options", + args: args{ + data: []byte(`{"type":"org.osbuild.locale"}`), + }, + wantErr: true, + }, + { + name: "missing name", + args: args{ + data: []byte(`{"foo":null,"options":{"bar":null}}`), + }, + wantErr: true, + }, + { + name: "chrony", + fields: fields{ + Type: "org.osbuild.chrony", + Options: &ChronyStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.chrony","options":{"timeservers":null}}`), + }, + }, + { + name: "firewall", + fields: fields{ + Type: "org.osbuild.firewall", + Options: &FirewallStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.firewall","options":{}}`), + }, + }, + { + name: "fix-bls", + fields: fields{ + Type: "org.osbuild.fix-bls", + Options: &FixBLSStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.fix-bls","options":{}}`), + }, + }, + { + name: "fstab", + fields: fields{ + Type: "org.osbuild.fstab", + Options: &FSTabStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.fstab","options":{"filesystems":null}}`), + }, + }, + { + name: "groups", + fields: fields{ + Type: "org.osbuild.groups", + Options: &GroupsStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.groups","options":{"groups":null}}`), + }, + }, + { + name: "grub2", + fields: fields{ + Type: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), + }, + }, + { + name: "grub2-uefi", + fields: fields{ + Type: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + UEFI: &GRUB2UEFI{ + Vendor: "vendor", + }, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","uefi":{"vendor":"vendor"}}}`), + }, + }, + { + name: "grub2-separate-boot", + fields: fields{ + Type: "org.osbuild.grub2", + Options: &GRUB2StageOptions{ + RootFilesystemUUID: nullUUID, + BootFilesystemUUID: &nullUUID, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.grub2","options":{"root_fs_uuid":"00000000-0000-0000-0000-000000000000","boot_fs_uuid":"00000000-0000-0000-0000-000000000000"}}`), + }, + }, + { + name: "hostname", + fields: fields{ + Type: "org.osbuild.hostname", + Options: &HostnameStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.hostname","options":{"hostname":""}}`), + }, + }, + { + name: "keymap", + fields: fields{ + Type: "org.osbuild.keymap", + Options: &KeymapStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.keymap","options":{"keymap":""}}`), + }, + }, + { + name: "locale", + fields: fields{ + Type: "org.osbuild.locale", + Options: &LocaleStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.locale","options":{"language":""}}`), + }, + }, + { + name: "rhsm-empty", + fields: fields{ + Type: "org.osbuild.rhsm", + Options: &RHSMStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.rhsm","options":{}}`), + }, + }, + { + name: "rhsm", + fields: fields{ + Type: "org.osbuild.rhsm", + Options: &RHSMStageOptions{ + DnfPlugins: &RHSMStageOptionsDnfPlugins{ + ProductID: &RHSMStageOptionsDnfPlugin{ + Enabled: false, + }, + SubscriptionManager: &RHSMStageOptionsDnfPlugin{ + Enabled: false, + }, + }, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.rhsm","options":{"dnf-plugins":{"product-id":{"enabled":false},"subscription-manager":{"enabled":false}}}}`), + }, + }, + { + name: "script", + fields: fields{ + Type: "org.osbuild.script", + Options: &ScriptStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.script","options":{"script":""}}`), + }, + }, + { + name: "selinux", + fields: fields{ + Type: "org.osbuild.selinux", + Options: &SELinuxStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.selinux","options":{"file_contexts":""}}`), + }, + }, + { + name: "systemd", + fields: fields{ + Type: "org.osbuild.systemd", + Options: &SystemdStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.systemd","options":{}}`), + }, + }, + { + name: "systemd-enabled", + fields: fields{ + Type: "org.osbuild.systemd", + Options: &SystemdStageOptions{ + EnabledServices: []string{"foo.service"}, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.systemd","options":{"enabled_services":["foo.service"]}}`), + }, + }, + { + name: "timezone", + fields: fields{ + Type: "org.osbuild.timezone", + Options: &TimezoneStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.timezone","options":{"zone":""}}`), + }, + }, + { + name: "users", + fields: fields{ + Type: "org.osbuild.users", + Options: &UsersStageOptions{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.users","options":{"users":null}}`), + }, + }, + } + for idx, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stage := &Stage{ + Type: tt.fields.Type, + Options: tt.fields.Options, + } + var gotStage Stage + if err := gotStage.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { + t.Errorf("Stage.UnmarshalJSON() error = %v, wantErr %v [idx: %d]", err, tt.wantErr, idx) + } + if tt.wantErr { + return + } + gotBytes, err := json.Marshal(stage) + if err != nil { + t.Errorf("Could not marshal stage: %v", err) + } + if !bytes.Equal(gotBytes, tt.args.data) { + t.Errorf("Expected `%v`, got `%v` [idx: %d]", string(tt.args.data), string(gotBytes), idx) + } + if !reflect.DeepEqual(&gotStage, stage) { + t.Errorf("got {%v, %v}, expected {%v, %v} [%d]", gotStage.Type, gotStage.Options, stage.Type, stage.Options, idx) + } + }) + } +} + +// Test new stages that have Inputs (osbuild v2 schema) +func TestStageV2_UnmarshalJSON(t *testing.T) { + type fields struct { + Type string + Options StageOptions + Inputs Inputs + } + type args struct { + data []byte + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + { + name: "rpm-empty", + fields: fields{ + Type: "org.osbuild.rpm", + Options: &RPMStageOptions{}, + Inputs: &RPMStageInputs{}, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.rpm","inputs":{"packages":null},"options":{}}`), + }, + }, + { + name: "rpm", + fields: fields{ + Type: "org.osbuild.rpm", + Inputs: &RPMStageInputs{ + Packages: &RPMStageInput{ + References: RPMStageReferences{ + "checksum1", + "checksum2", + }, + }, + }, + Options: &RPMStageOptions{ + GPGKeys: []string{"key1", "key2"}, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.rpm","inputs":{"packages":{"type":"","origin":"","references":["checksum1","checksum2"]}},"options":{"gpgkeys":["key1","key2"]}}`), + }, + }, + { + name: "ostree-preptree", + fields: fields{ + Type: "org.osbuild.ostree.preptree", + Options: &OSTreePrepTreeStageOptions{ + EtcGroupMembers: []string{ + "wheel", + }, + }, + }, + args: args{ + data: []byte(`{"type":"org.osbuild.ostree.preptree","options":{"etc_group_members":["wheel"]}}`), + }, + }, + } + for idx, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + stage := &Stage{ + Type: tt.fields.Type, + Options: tt.fields.Options, + Inputs: tt.fields.Inputs, + } + var gotStage Stage + if err := gotStage.UnmarshalJSON(tt.args.data); (err != nil) != tt.wantErr { + println("data: ", string(tt.args.data)) + t.Errorf("Stage.UnmarshalJSON() error = %v, wantErr %v [idx: %d]", err, tt.wantErr, idx) + } + if tt.wantErr { + return + } + gotBytes, err := json.Marshal(stage) + if err != nil { + t.Errorf("Could not marshal stage: %v", err) + } + if !bytes.Equal(gotBytes, tt.args.data) { + t.Errorf("Expected `%v`, got `%v` [idx: %d]", string(tt.args.data), string(gotBytes), idx) + } + if !reflect.DeepEqual(&gotStage, stage) { + t.Errorf("got {%v, %v, %v}, expected {%v, %v, %v} [%d]", gotStage.Type, gotStage.Options, gotStage.Inputs, stage.Type, stage.Options, stage.Inputs, idx) + } + }) + } +} diff --git a/internal/osbuild2/sysconfig_stage.go b/internal/osbuild2/sysconfig_stage.go new file mode 100644 index 0000000..b133aa0 --- /dev/null +++ b/internal/osbuild2/sysconfig_stage.go @@ -0,0 +1,25 @@ +package osbuild2 + +type SysconfigStageOptions struct { + Kernel SysconfigKernelOptions `json:"kernel,omitempty"` + Network SysconfigNetworkOptions `json:"network,omitempty"` +} + +type SysconfigNetworkOptions struct { + Networking bool `json:"networking,omitempty"` + NoZeroConf bool `json:"no_zero_conf,omitempty"` +} + +type SysconfigKernelOptions struct { + UpdateDefault bool `json:"update_default,omitempty"` + DefaultKernel string `json:"default_kernel,omitempty"` +} + +func (SysconfigStageOptions) isStageOptions() {} + +func NewSysconfigStage(options *SysconfigStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.sysconfig", + Options: options, + } +} diff --git a/internal/osbuild2/sysconfig_stage_test.go b/internal/osbuild2/sysconfig_stage_test.go new file mode 100644 index 0000000..1f41cfd --- /dev/null +++ b/internal/osbuild2/sysconfig_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSysconfigStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.sysconfig", + Options: &SysconfigStageOptions{}, + } + actualStage := NewSysconfigStage(&SysconfigStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/systemd_stage.go b/internal/osbuild2/systemd_stage.go new file mode 100644 index 0000000..ca0b80a --- /dev/null +++ b/internal/osbuild2/systemd_stage.go @@ -0,0 +1,16 @@ +package osbuild2 + +type SystemdStageOptions struct { + EnabledServices []string `json:"enabled_services,omitempty"` + DisabledServices []string `json:"disabled_services,omitempty"` + DefaultTarget string `json:"default_target,omitempty"` +} + +func (SystemdStageOptions) isStageOptions() {} + +func NewSystemdStage(options *SystemdStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.systemd", + Options: options, + } +} diff --git a/internal/osbuild2/systemd_stage_test.go b/internal/osbuild2/systemd_stage_test.go new file mode 100644 index 0000000..559e66b --- /dev/null +++ b/internal/osbuild2/systemd_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSystemdStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.systemd", + Options: &SystemdStageOptions{}, + } + actualStage := NewSystemdStage(&SystemdStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/tar_stage.go b/internal/osbuild2/tar_stage.go new file mode 100644 index 0000000..f8c8796 --- /dev/null +++ b/internal/osbuild2/tar_stage.go @@ -0,0 +1,26 @@ +package osbuild2 + +type TarStageOptions struct { + // Filename for tar archive + Filename string `json:"filename"` + + // Enable support for POSIX ACLs + ACLs bool `json:"acls,omitempty"` + + // Enable support for SELinux contexts + SELinux bool `json:"selinux,omitempty"` + + // Enable support for extended attributes + Xattrs bool `json:"xattrs,omitempty"` +} + +func (TarStageOptions) isStageOptions() {} + +// Assembles a tree into a tar archive. Compression is determined by the suffix +// (i.e., --auto-compress is used). +func NewTarAssembler(options *TarStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.tar", + Options: options, + } +} diff --git a/internal/osbuild2/timezone_stage.go b/internal/osbuild2/timezone_stage.go new file mode 100644 index 0000000..cdf01e6 --- /dev/null +++ b/internal/osbuild2/timezone_stage.go @@ -0,0 +1,14 @@ +package osbuild2 + +type TimezoneStageOptions struct { + Zone string `json:"zone"` +} + +func (TimezoneStageOptions) isStageOptions() {} + +func NewTimezoneStage(options *TimezoneStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.timezone", + Options: options, + } +} diff --git a/internal/osbuild2/timezone_stage_test.go b/internal/osbuild2/timezone_stage_test.go new file mode 100644 index 0000000..d7ee9fb --- /dev/null +++ b/internal/osbuild2/timezone_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewTimezoneStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.timezone", + Options: &TimezoneStageOptions{}, + } + actualStage := NewTimezoneStage(&TimezoneStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/tree_input.go b/internal/osbuild2/tree_input.go new file mode 100644 index 0000000..d0be622 --- /dev/null +++ b/internal/osbuild2/tree_input.go @@ -0,0 +1,15 @@ +package osbuild2 + +// Tree inputs +type TreeInput struct { + inputCommon +} + +func (TreeInput) isInput() {} + +func NewTreeInput() *TreeInput { + input := new(TreeInput) + input.Type = "org.osbuild.tree" + input.Origin = "org.osbuild.pipeline" + return input +} diff --git a/internal/osbuild2/users_stage.go b/internal/osbuild2/users_stage.go new file mode 100644 index 0000000..18ac35f --- /dev/null +++ b/internal/osbuild2/users_stage.go @@ -0,0 +1,25 @@ +package osbuild2 + +type UsersStageOptions struct { + Users map[string]UsersStageOptionsUser `json:"users"` +} + +func (UsersStageOptions) isStageOptions() {} + +type UsersStageOptionsUser struct { + UID *int `json:"uid,omitempty"` + GID *int `json:"gid,omitempty"` + Groups []string `json:"groups,omitempty"` + Description *string `json:"description,omitempty"` + Home *string `json:"home,omitempty"` + Shell *string `json:"shell,omitempty"` + Password *string `json:"password,omitempty"` + Key *string `json:"key,omitempty"` +} + +func NewUsersStage(options *UsersStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.users", + Options: options, + } +} diff --git a/internal/osbuild2/users_stage_test.go b/internal/osbuild2/users_stage_test.go new file mode 100644 index 0000000..6610a3e --- /dev/null +++ b/internal/osbuild2/users_stage_test.go @@ -0,0 +1,16 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewUsersStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.users", + Options: &UsersStageOptions{}, + } + actualStage := NewUsersStage(&UsersStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/osbuild2/xorrisofs_stage.go b/internal/osbuild2/xorrisofs_stage.go new file mode 100644 index 0000000..0a7698c --- /dev/null +++ b/internal/osbuild2/xorrisofs_stage.go @@ -0,0 +1,57 @@ +package osbuild2 + +type XorrisofsStageOptions struct { + // Filename of the ISO to create + Filename string `json:"filename"` + + // Volume ID to set + VolID string `json:"volid"` + + // System ID to set + SysID string `json:"sysid,omitempty"` + + Boot XorrisofsBoot `json:"boot,omitempty"` + + EFI string `json:"efi,omitempty"` + + // Install the argument (buildroot) as ISOLINUX isohybrid MBR + IsohybridMBR string `json:"isohybridmbr,omitempty"` + + // The ISO 9660 version (limits data size and filenames; min: 1, max: 4) + ISOLevel int `json:"isolevel,omitempty"` +} + +type XorrisofsBoot struct { + // Path to the boot image (on the ISO) + Image string `json:"image"` + // Path to the boot catalog file (on the ISO) + Catalog string `json:"catalog"` +} + +func (XorrisofsStageOptions) isStageOptions() {} + +type XorrisofsStageInputs struct { + Tree *XorrisofsStageInput `json:"tree"` +} + +func (XorrisofsStageInputs) isStageInputs() {} + +type XorrisofsStageInput struct { + inputCommon + References XorrisofsStageReferences `json:"references"` +} + +func (XorrisofsStageInput) isStageInput() {} + +type XorrisofsStageReferences []string + +func (XorrisofsStageReferences) isReferences() {} + +// Assembles a Rock Ridge enhanced ISO 9660 filesystem (iso) +func NewXorrisofsStage(options *XorrisofsStageOptions, inputs *XorrisofsStageInputs) *Stage { + return &Stage{ + Type: "org.osbuild.xorrisofs", + Options: options, + Inputs: inputs, + } +} diff --git a/internal/osbuild2/zipl_stage.go b/internal/osbuild2/zipl_stage.go new file mode 100644 index 0000000..dd44800 --- /dev/null +++ b/internal/osbuild2/zipl_stage.go @@ -0,0 +1,25 @@ +package osbuild2 + +// The ZiplStageOptions describe how to create zipl stage +// +// The only configuration option available is a boot timeout and it is optional +type ZiplStageOptions struct { + Timeout int `json:"timeout,omitempty"` +} + +func (ZiplStageOptions) isStageOptions() {} + +// NewZiplStageOptions creates a new ZiplStageOptions object with no timeout +func NewZiplStageOptions() *ZiplStageOptions { + return &ZiplStageOptions{ + Timeout: 0, + } +} + +// NewZiplStage creates a new zipl Stage object. +func NewZiplStage(options *ZiplStageOptions) *Stage { + return &Stage{ + Type: "org.osbuild.zipl", + Options: options, + } +} diff --git a/internal/osbuild2/zipl_stage_test.go b/internal/osbuild2/zipl_stage_test.go new file mode 100644 index 0000000..97b4413 --- /dev/null +++ b/internal/osbuild2/zipl_stage_test.go @@ -0,0 +1,24 @@ +package osbuild2 + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewZiplStageOptions(t *testing.T) { + expectedOptions := &ZiplStageOptions{ + Timeout: 0, + } + actualOptions := NewZiplStageOptions() + assert.Equal(t, expectedOptions, actualOptions) +} + +func TestNewZiplStage(t *testing.T) { + expectedStage := &Stage{ + Type: "org.osbuild.zipl", + Options: &ZiplStageOptions{}, + } + actualStage := NewZiplStage(&ZiplStageOptions{}) + assert.Equal(t, expectedStage, actualStage) +} diff --git a/internal/rpmmd/repository.go b/internal/rpmmd/repository.go index a8a895c..b048fb4 100644 --- a/internal/rpmmd/repository.go +++ b/internal/rpmmd/repository.go @@ -96,6 +96,13 @@ func (pkg Package) ToPackageInfo() PackageInfo { } } +// The inputs to depsolve, a set of packages to include and a set of +// packages to exclude. +type PackageSet struct { + Include []string + Exclude []string +} + // TODO: the public API of this package should not be reused for serialization. type PackageSpec struct { Name string `json:"name"` @@ -159,7 +166,7 @@ type RPMMD interface { // Depsolve takes a list of required content (specs), explicitly unwanted content (excludeSpecs), list // or repositories, and platform ID for modularity. It returns a list of all packages (with solved // dependencies) that will be installed into the system. - Depsolve(specs, excludeSpecs []string, repos []RepoConfig, modulePlatformID, arch string) ([]PackageSpec, map[string]string, error) + Depsolve(packageSet PackageSet, repos []RepoConfig, modulePlatformID, arch string) ([]PackageSpec, map[string]string, error) } type DNFError struct { @@ -377,7 +384,7 @@ func (r *rpmmdImpl) FetchMetadata(repos []RepoConfig, modulePlatformID string, a return reply.Packages, checksums, err } -func (r *rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, modulePlatformID, arch string) ([]PackageSpec, map[string]string, error) { +func (r *rpmmdImpl) Depsolve(packageSet PackageSet, repos []RepoConfig, modulePlatformID, arch string) ([]PackageSpec, map[string]string, error) { var dnfRepoConfigs []dnfRepoConfig for i, repo := range repos { @@ -395,7 +402,7 @@ func (r *rpmmdImpl) Depsolve(specs, excludeSpecs []string, repos []RepoConfig, m CacheDir string `json:"cachedir"` ModulePlatformID string `json:"module_platform_id"` Arch string `json:"arch"` - }{specs, excludeSpecs, dnfRepoConfigs, r.CacheDir, modulePlatformID, arch} + }{packageSet.Include, packageSet.Exclude, dnfRepoConfigs, r.CacheDir, modulePlatformID, arch} var reply struct { Checksums map[string]string `json:"checksums"` Dependencies []dnfPackageSpec `json:"dependencies"` @@ -479,6 +486,6 @@ func (packages PackageList) ToPackageInfos() []PackageInfo { } func (pkg *PackageInfo) FillDependencies(rpmmd RPMMD, repos []RepoConfig, modulePlatformID string, arch string) (err error) { - pkg.Dependencies, _, err = rpmmd.Depsolve([]string{pkg.Name}, nil, repos, modulePlatformID, arch) + pkg.Dependencies, _, err = rpmmd.Depsolve(PackageSet{Include: []string{pkg.Name}}, repos, modulePlatformID, arch) return } diff --git a/internal/store/fixtures.go b/internal/store/fixtures.go index f72e8a5..759d9f2 100644 --- a/internal/store/fixtures.go +++ b/internal/store/fixtures.go @@ -57,7 +57,7 @@ func FixtureBase() *Store { if err != nil { panic("invalid image type qcow2 for x86_64 @ fedoratest") } - manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, nil, 0) + manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, 0) if err != nil { panic("could not create manifest") } @@ -160,7 +160,7 @@ func FixtureFinished() *Store { if err != nil { panic("invalid image type qcow2 for x86_64 @ fedoratest") } - manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, nil, 0) + manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, 0) if err != nil { panic("could not create manifest") } diff --git a/internal/store/json.go b/internal/store/json.go index 8f5cbc4..8bfa6c3 100644 --- a/internal/store/json.go +++ b/internal/store/json.go @@ -326,19 +326,21 @@ func (store *Store) toStoreV0() *storeV0 { } var imageTypeCompatMapping = map[string]string{ - "vhd": "Azure", - "ami": "AWS", - "liveiso": "LiveISO", - "openstack": "OpenStack", - "qcow2": "qcow2", - "vmdk": "VMWare", - "ext4-filesystem": "Raw-filesystem", - "partitioned-disk": "Partitioned-disk", - "tar": "Tar", - "fedora-iot-commit": "fedora-iot-commit", - "rhel-edge-commit": "rhel-edge-commit", - "test_type": "test_type", // used only in json_test.go - "test_type_invalid": "test_type_invalid", // used only in json_test.go + "vhd": "Azure", + "ami": "AWS", + "liveiso": "LiveISO", + "openstack": "OpenStack", + "qcow2": "qcow2", + "vmdk": "VMWare", + "ext4-filesystem": "Raw-filesystem", + "partitioned-disk": "Partitioned-disk", + "tar": "Tar", + "fedora-iot-commit": "fedora-iot-commit", + "rhel-edge-commit": "rhel-edge-commit", + "rhel-edge-container": "rhen-edge-container", + "rhel-edge-installer": "rhen-edge-installer", + "test_type": "test_type", // used only in json_test.go + "test_type_invalid": "test_type_invalid", // used only in json_test.go } func imageTypeToCompatString(imgType distro.ImageType) string { diff --git a/internal/store/store_test.go b/internal/store/store_test.go index 9a58441..7d13050 100644 --- a/internal/store/store_test.go +++ b/internal/store/store_test.go @@ -13,7 +13,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/common" "github.com/osbuild/osbuild-composer/internal/distro" "github.com/osbuild/osbuild-composer/internal/distro/test_distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/target" ) @@ -51,7 +51,7 @@ func (suite *storeTest) SetupSuite() { suite.myDistro = test_distro.New() suite.myArch, _ = suite.myDistro.GetArch("test_arch") suite.myImageType, _ = suite.myArch.GetImageType("test_type") - suite.myManifest, _ = suite.myImageType.Manifest(&suite.myCustomizations, suite.myImageOptions, suite.myRepoConfig, nil, suite.myPackageSpec, 0) + suite.myManifest, _ = suite.myImageType.Manifest(&suite.myCustomizations, suite.myImageOptions, suite.myRepoConfig, nil, 0) suite.mySourceConfig = SourceConfig{ Name: "testSourceConfig", } diff --git a/internal/weldr/api.go b/internal/weldr/api.go index dd17dfc..4ff555f 100644 --- a/internal/weldr/api.go +++ b/internal/weldr/api.go @@ -32,7 +32,7 @@ import ( "github.com/osbuild/osbuild-composer/internal/common" "github.com/osbuild/osbuild-composer/internal/distro" "github.com/osbuild/osbuild-composer/internal/jobqueue" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/rpmmd" "github.com/osbuild/osbuild-composer/internal/store" "github.com/osbuild/osbuild-composer/internal/target" @@ -256,6 +256,7 @@ func (api *API) getComposeStatus(compose store.Compose) *composeStatus { if err != nil { panic(err) } + return &composeStatus{ State: composeStateFromJobStatus(jobStatus, &result), Queued: jobStatus.Queued, @@ -1038,7 +1039,7 @@ func (api *API) projectsDepsolveHandler(writer http.ResponseWriter, request *htt projects = projects[1:] names := strings.Split(projects, ",") - packages, _, err := api.rpmmd.Depsolve(names, nil, api.repos, api.distro.ModulePlatformID(), api.arch.Name()) + packages, _, err := api.rpmmd.Depsolve(rpmmd.PackageSet{Include: names}, api.repos, api.distro.ModulePlatformID(), api.arch.Name()) if err != nil { errors := responseError{ @@ -1233,7 +1234,7 @@ func (api *API) blueprintsDepsolveHandler(writer http.ResponseWriter, request *h continue } - dependencies, _, err := api.depsolveBlueprint(blueprint, nil) + dependencies, err := api.depsolveBlueprint(blueprint) if err != nil { blueprintsErrors = append(blueprintsErrors, responseError{ @@ -1322,7 +1323,7 @@ func (api *API) blueprintsFreezeHandler(writer http.ResponseWriter, request *htt } // Make a copy of the blueprint since we will be replacing the version globs blueprint := bp.DeepCopy() - dependencies, _, err := api.depsolveBlueprint(&blueprint, nil) + dependencies, err := api.depsolveBlueprint(&blueprint) if err != nil { rerr := responseError{ ID: "BlueprintsError", @@ -1829,6 +1830,19 @@ func ostreeResolveRef(location, ref string) (string, error) { return parent, nil } +func (api *API) depsolveBlueprintForImageType(bp *blueprint.Blueprint, imageType distro.ImageType) (map[string][]rpmmd.PackageSpec, error) { + packageSets := imageType.PackageSets(*bp) + packageSpecSets := make(map[string][]rpmmd.PackageSpec) + for name, packageSet := range packageSets { + packageSpecs, _, err := api.rpmmd.Depsolve(packageSet, api.allRepositories(), api.distro.ModulePlatformID(), api.arch.Name()) + if err != nil { + return nil, err + } + packageSpecSets[name] = packageSpecs + } + return packageSpecSets, nil +} + // Schedule new compose by first translating the appropriate blueprint into a pipeline and then // pushing it into the channel for waiting builds. func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request, params httprouter.Params) { @@ -1915,6 +1929,18 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request return } + // Check for test parameter + q, err := url.ParseQuery(request.URL.RawQuery) + if err != nil { + errors := responseError{ + ID: "InvalidChars", + Msg: fmt.Sprintf("invalid query string: %v", err), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return + } + testMode := q.Get("test") + // Fetch parent ostree commit from ref + url if commit is not // provided. The parameter name "parent" is perhaps slightly misleading // as it represent whatever commit sha the image type requires, not @@ -1928,19 +1954,26 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request statusResponseError(writer, http.StatusBadRequest, errors) return } - parent, err := ostreeResolveRef(cr.OSTree.URL, cr.OSTree.Ref) - if err != nil { - errors := responseError{ - ID: "OSTreeCommitError", - Msg: err.Error(), + var parent string + if testMode == "1" || testMode == "2" { + // Fake a parent commit for test requests + parent = "02604b2da6e954bd34b8b82a835e5a77d2b60ffa" + } else { + // Resolve the URL and get the parent commit + parent, err = ostreeResolveRef(cr.OSTree.URL, cr.OSTree.Ref) + if err != nil { + errors := responseError{ + ID: "OSTreeCommitError", + Msg: err.Error(), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return } - statusResponseError(writer, http.StatusBadRequest, errors) - return } cr.OSTree.Parent = parent } - packages, buildPackages, err := api.depsolveBlueprint(bp, imageType) + packageSets, err := api.depsolveBlueprintForImageType(bp, imageType) if err != nil { errors := responseError{ ID: "DepsolveError", @@ -1950,17 +1983,6 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request return } - // Check for test parameter - q, err := url.ParseQuery(request.URL.RawQuery) - if err != nil { - errors := responseError{ - ID: "InvalidChars", - Msg: fmt.Sprintf("invalid query string: %v", err), - } - statusResponseError(writer, http.StatusBadRequest, errors) - return - } - size := imageType.Size(cr.Size) bigSeed, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)) @@ -1975,11 +1997,11 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request OSTree: distro.OSTreeImageOptions{ Ref: cr.OSTree.Ref, Parent: cr.OSTree.Parent, + URL: cr.OSTree.URL, }, }, api.allRepositories(), - packages, - buildPackages, + packageSets, seed) if err != nil { errors := responseError{ @@ -1990,7 +2012,6 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request return } - testMode := q.Get("test") if testMode == "1" { // Create a failed compose err = api.store.PushTestCompose(composeID, manifest, imageType, bp, size, targets, false) @@ -2005,6 +2026,7 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request Targets: targets, ImageName: imageType.Filename(), StreamOptimized: imageType.Name() == "vmdk", // https://github.com/osbuild/osbuild/issues/528 + Exports: imageType.Exports(), }) if err == nil { err = api.store.PushCompose(composeID, manifest, imageType, bp, size, targets, jobId) @@ -2731,32 +2753,13 @@ func (api *API) allRepositories() []rpmmd.RepoConfig { return repos } -func (api *API) depsolveBlueprint(bp *blueprint.Blueprint, imageType distro.ImageType) ([]rpmmd.PackageSpec, []rpmmd.PackageSpec, error) { - repos := api.allRepositories() - - specs := bp.GetPackages() - excludeSpecs := []string{} - if imageType != nil { - // When the output type is known, include the base packages in the depsolve - // transaction. - specs, excludeSpecs = imageType.Packages(*bp) - } - - packages, _, err := api.rpmmd.Depsolve(specs, excludeSpecs, repos, api.distro.ModulePlatformID(), api.arch.Name()) +func (api *API) depsolveBlueprint(bp *blueprint.Blueprint) ([]rpmmd.PackageSpec, error) { + packages, _, err := api.rpmmd.Depsolve(rpmmd.PackageSet{Include: bp.GetPackages()}, api.allRepositories(), api.distro.ModulePlatformID(), api.arch.Name()) if err != nil { - return nil, nil, err - } - - buildPackages := []rpmmd.PackageSpec{} - if imageType != nil { - buildSpecs := imageType.BuildPackages() - buildPackages, _, err = api.rpmmd.Depsolve(buildSpecs, nil, repos, api.distro.ModulePlatformID(), api.arch.Name()) - if err != nil { - return nil, nil, err - } + return nil, err } - return packages, buildPackages, err + return packages, err } func (api *API) uploadsScheduleHandler(writer http.ResponseWriter, request *http.Request, params httprouter.Params) { diff --git a/internal/weldr/api_test.go b/internal/weldr/api_test.go index 65eb760..5351226 100644 --- a/internal/weldr/api_test.go +++ b/internal/weldr/api_test.go @@ -578,7 +578,7 @@ func TestCompose(t *testing.T) { require.NoError(t, err) imgType, err := arch.GetImageType("qcow2") require.NoError(t, err) - manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, nil, 0) + manifest, err := imgType.Manifest(nil, distro.ImageOptions{}, nil, nil, 0) require.NoError(t, err) expectedComposeLocal := &store.Compose{ Blueprint: &blueprint.Blueprint{ @@ -625,6 +625,36 @@ func TestCompose(t *testing.T) { }, }, } + expectedComposeOSTreeRef := &store.Compose{ + Blueprint: &blueprint.Blueprint{ + Name: "test", + Version: "0.0.0", + Packages: []blueprint.Package{}, + Modules: []blueprint.Package{}, + Groups: []blueprint.Group{}, + Customizations: nil, + }, + ImageBuild: store.ImageBuild{ + QueueStatus: common.IBWaiting, + ImageType: imgType, + Manifest: manifest, + }, + } + expectedComposeOSTreeURL := &store.Compose{ + Blueprint: &blueprint.Blueprint{ + Name: "test", + Version: "0.0.0", + Packages: []blueprint.Package{}, + Modules: []blueprint.Package{}, + Groups: []blueprint.Group{}, + Customizations: nil, + }, + ImageBuild: store.ImageBuild{ + QueueStatus: common.IBFinished, + ImageType: imgType, + Manifest: manifest, + }, + } var cases = []struct { External bool @@ -639,6 +669,9 @@ func TestCompose(t *testing.T) { {true, "POST", "/api/v0/compose", `{"blueprint_name": "http-server","compose_type": "qcow2","branch": "master"}`, http.StatusBadRequest, `{"status":false,"errors":[{"id":"UnknownBlueprint","msg":"Unknown blueprint name: http-server"}]}`, nil, []string{"build_id"}}, {false, "POST", "/api/v0/compose", `{"blueprint_name": "test","compose_type": "qcow2","branch": "master"}`, http.StatusOK, `{"status": true}`, expectedComposeLocal, []string{"build_id"}}, {false, "POST", "/api/v1/compose", `{"blueprint_name": "test","compose_type":"qcow2","branch":"master","upload":{"image_name":"test_upload","provider":"aws","settings":{"region":"frankfurt","accessKeyID":"accesskey","secretAccessKey":"secretkey","bucket":"clay","key":"imagekey"}}}`, http.StatusOK, `{"status": true}`, expectedComposeLocalAndAws, []string{"build_id"}}, + {false, "POST", "/api/v1/compose", `{"blueprint_name": "test","compose_type":"qcow2","branch":"master","ostree":{"ref":"refid","parent":"parentid","url":""}}`, http.StatusOK, `{"status": true}`, expectedComposeOSTreeRef, []string{"build_id"}}, + {false, "POST", "/api/v1/compose?test=2", `{"blueprint_name": "test","compose_type":"qcow2","branch":"master","ostree":{"ref":"refid","parent":"","url":"http://ostree/"}}`, http.StatusOK, `{"status": true}`, expectedComposeOSTreeURL, []string{"build_id"}}, + {false, "POST", "/api/v1/compose", `{"blueprint_name": "test","compose_type":"qcow2","branch":"master","ostree":{"ref":"refid","parent":"","url":"invalid-url"}}`, http.StatusBadRequest, `{"status":false,"errors":[{"id":"OSTreeCommitError","msg":"Get \"/refs/heads/refid\": unsupported protocol scheme \"\""}]}`, nil, []string{"build_id"}}, } tempdir, err := ioutil.TempDir("", "weldr-tests-") diff --git a/internal/worker/json.go b/internal/worker/json.go index e3be40f..e9f75c5 100644 --- a/internal/worker/json.go +++ b/internal/worker/json.go @@ -5,7 +5,7 @@ import ( "github.com/google/uuid" "github.com/osbuild/osbuild-composer/internal/distro" - "github.com/osbuild/osbuild-composer/internal/osbuild" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1" "github.com/osbuild/osbuild-composer/internal/target" ) @@ -18,6 +18,7 @@ type OSBuildJob struct { Targets []*target.Target `json:"targets,omitempty"` ImageName string `json:"image_name,omitempty"` StreamOptimized bool `json:"stream_optimized,omitempty"` + Exports []string `json:"export_stages,omitempty"` } type OSBuildJobResult struct { diff --git a/internal/worker/server_test.go b/internal/worker/server_test.go index 59df3b6..9bf04c7 100644 --- a/internal/worker/server_test.go +++ b/internal/worker/server_test.go @@ -83,7 +83,7 @@ func TestCreate(t *testing.T) { if err != nil { t.Fatalf("error getting image type from arch") } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) if err != nil { t.Fatalf("error creating osbuild manifest") } @@ -111,7 +111,7 @@ func TestCancel(t *testing.T) { if err != nil { t.Fatalf("error getting image type from arch") } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) if err != nil { t.Fatalf("error creating osbuild manifest") } @@ -152,7 +152,7 @@ func TestUpdate(t *testing.T) { if err != nil { t.Fatalf("error getting image type from arch") } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) if err != nil { t.Fatalf("error creating osbuild manifest") } @@ -179,7 +179,7 @@ func TestArgs(t *testing.T) { require.NoError(t, err) imageType, err := arch.GetImageType("qcow2") require.NoError(t, err) - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) require.NoError(t, err) tempdir, err := ioutil.TempDir("", "worker-tests-") @@ -221,7 +221,7 @@ func TestUpload(t *testing.T) { if err != nil { t.Fatalf("error getting image type from arch") } - manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, nil, 0) + manifest, err := imageType.Manifest(nil, distro.ImageOptions{Size: imageType.Size(0)}, nil, nil, 0) if err != nil { t.Fatalf("error creating osbuild manifest") } diff --git a/osbuild-composer.spec b/osbuild-composer.spec index 619e68d..60b541f 100644 --- a/osbuild-composer.spec +++ b/osbuild-composer.spec @@ -4,7 +4,7 @@ %global goipath github.com/osbuild/osbuild-composer -Version: 28 +Version: 28.1 %gometa @@ -219,12 +219,6 @@ install -m 0644 -vp test/data/koji/* %{buildroot}%{_d install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/x509 install -m 0644 -vp test/data/x509/* %{buildroot}%{_datadir}/tests/osbuild-composer/x509/ -%if 0%{?rhel} -install -m 0755 -vd %{buildroot}%{_datadir}/tests/osbuild-composer/vendor -install -m 0644 -vp test/data/vendor/87-podman-bridge.conflist %{buildroot}%{_datadir}/tests/osbuild-composer/vendor/ -install -m 0755 -vp test/data/vendor/dnsname %{buildroot}%{_datadir}/tests/osbuild-composer/vendor/ -%endif - %endif %check @@ -273,8 +267,8 @@ The core osbuild-composer binary. This is suitable both for spawning in containe Summary: The worker for osbuild-composer Requires: systemd Requires: qemu-img -Requires: osbuild >= 24 -Requires: osbuild-ostree >= 24 +Requires: osbuild >= 26 +Requires: osbuild-ostree >= 26 # remove in F34 Obsoletes: golang-github-osbuild-composer-worker < %{version}-%{release} @@ -341,8 +335,8 @@ Requires: expect Requires: python3-lxml Requires: httpd Requires: openssl -%if 0%{?fedora} Requires: podman-plugins +%if 0%{?fedora} # koji and ansible are not in RHEL repositories. Depending on them breaks RHEL # gating (see OSCI-1541). The test script must enable EPEL and install those # packages manually. diff --git a/schutzbot/Jenkinsfile b/schutzbot/Jenkinsfile index 7c7ca7b..6c1acc5 100644 --- a/schutzbot/Jenkinsfile +++ b/schutzbot/Jenkinsfile @@ -1,4 +1,4 @@ -def cron_string = BRANCH_NAME == "main" ? "@daily" : "" +def cron_string = BRANCH_NAME == "rhel-8.4.0" ? "@daily" : "" pipeline { agent none @@ -52,86 +52,6 @@ pipeline { failFast true parallel { - - stage('F32') { - agent { label "f32cloudbase && x86_64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - stage('F33') { - agent { label "f33cloudbase && x86_64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - stage('F33 aarch64') { - agent { label "f33cloudbase && aarch64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - stage('F34') { - agent { label "f34cloudbase && x86_64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - stage('F34 aarch64') { - agent { label "f34cloudbase && aarch64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - stage('EL8') { - agent { label "rhel8cloudbase && x86_64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } stage('EL8.4') { agent { label "rhel84cloudbase && x86_64 && psi" } environment { @@ -146,24 +66,10 @@ pipeline { } } } - stage('CS8') { - agent { label "cs8cloudbase && x86_64 && aws" } - environment { - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - } - steps { - sh "schutzbot/ci_details.sh" - retry(3) { - sh "schutzbot/mockbuild.sh" - } - } - } - } } - stage("Prepare EL8 nightly 🤔") { + stage("Prepare EL8 internal 🤔") { agent { label "rhel8cloudbase && x86_64 && psi" } when { @@ -176,11 +82,11 @@ pipeline { AWS_CREDS = credentials('aws-credentials-osbuildci') } steps { - // don't build, use RPMs from the nightly trees - sh "schutzbot/prepare-rhel-nightly.sh" + // don't build, use RPMs from the internal trees + sh "schutzbot/prepare-rhel-internal.sh" stash ( - includes: 'rhel8nightly.repo', - name: 'rhel8nightly' + includes: 'rhel8internal.repo', + name: 'rhel8internal' ) stash ( includes: 'rhel-8.json', @@ -212,409 +118,6 @@ pipeline { stage("Testing 🍌") { parallel { - - stage('F32 Base') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && x86_64 && aws" } - environment { TEST_TYPE = "base" } - steps { - run_tests('base') - } - post { - always { - preserve_logs('fedora32-base') - } - } - } - stage('F32 Image') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && psi && x86_64" } - environment { - TEST_TYPE = "image" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AZURE_CREDS = credentials('azure') - OPENSTACK_CREDS = credentials("psi-openstack-creds") - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - DISTRO_CODE = "fedora32" - } - steps { - run_tests('image') - } - post { - always { - preserve_logs('fedora32-image') - sh ( - label: "Run cloud cleaner just in case something failed", - script: "schutzbot/run_cloud_cleaner.sh" - ) - } - } - } - stage('F32 Integration') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && x86_64 && aws" } - environment { - TEST_TYPE = "integration" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AWS_API_TEST_SHARE_ACCOUNT = credentials('aws-credentials-share-account') - } - steps { - run_tests('integration') - } - post { - always { - preserve_logs('fedora32-integration') - } - } - } - stage('F32 OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && psi && x86_64" } - steps { - run_tests('ostree') - } - post { - always { - preserve_logs('fedora32-ostree') - } - } - } - stage('F32 New OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && psi && x86_64" } - steps { - run_tests('ostree-ng') - } - post { - always { - preserve_logs('fedora32-ostree-ng') - } - } - } - stage('F32: koji-osbuild') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f32cloudbase && x86_64 && aws" } - steps { - run_project_tests('koji-osbuild', 'integration.sh') - } - post { - always { - preserve_logs('fedora32-revdep-koji-osbuild') - } - } - } - stage('F33 Base') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && x86_64 && aws" } - environment { TEST_TYPE = "base" } - steps { - run_tests('base') - } - post { - always { - preserve_logs('fedora33-base') - } - } - } - stage('F33 Image') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && psi && x86_64" } - environment { - TEST_TYPE = "image" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AZURE_CREDS = credentials('azure') - OPENSTACK_CREDS = credentials("psi-openstack-creds") - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - DISTRO_CODE = "fedora33" - } - steps { - run_tests('image') - } - post { - always { - preserve_logs('fedora33-image') - sh ( - label: "Run cloud cleaner just in case something failed", - script: "schutzbot/run_cloud_cleaner.sh" - ) - } - } - } - stage('F33 Integration') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && x86_64 && aws" } - environment { - TEST_TYPE = "integration" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AWS_API_TEST_SHARE_ACCOUNT = credentials('aws-credentials-share-account') - } - steps { - run_tests('integration') - } - post { - always { - preserve_logs('fedora33-integration') - } - } - } - stage('F33 OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && psi && x86_64" } - steps { - run_tests('ostree') - } - post { - always { - preserve_logs('fedora33-ostree') - } - } - } - stage('F33 New OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && psi && x86_64" } - steps { - run_tests('ostree-ng') - } - post { - always { - preserve_logs('fedora33-ostree-ng') - } - } - } - stage('F33 aarch64 Base') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && aarch64 && aws" } - environment { TEST_TYPE = "base" } - steps { - run_tests('base') - } - post { - always { - preserve_logs('fedora33-aarch64-base') - } - } - } - stage('F33 aarch64 Image') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "f33cloudbase && aarch64 && aws" } - environment { - TEST_TYPE = "image" - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AZURE_CREDS = credentials('azure') - OPENSTACK_CREDS = credentials("psi-openstack-creds") - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - DISTRO_CODE = "fedora33" - } - steps { - run_tests('image') - } - post { - always { - preserve_logs('fedora33-aarch64-image') - sh ( - label: "Run cloud cleaner just in case something failed", - script: "schutzbot/run_cloud_cleaner.sh" - ) - } - } - } - stage('EL8 Base') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && x86_64 && psi" } - environment { - TEST_TYPE = "base" - RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') - } - steps { - run_tests('base') - } - post { - always { - preserve_logs('rhel8-base') - } - } - } - stage('EL8 Image') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && psi && x86_64" } - environment { - TEST_TYPE = "image" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AZURE_CREDS = credentials('azure') - OPENSTACK_CREDS = credentials("psi-openstack-creds") - RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - DISTRO_CODE = "rhel8" - } - steps { - run_tests('image') - } - post { - always { - preserve_logs('rhel8-image') - sh ( - label: "Run cloud cleaner just in case something failed", - script: "schutzbot/run_cloud_cleaner.sh" - ) - } - } - } - stage('EL8 Integration') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && x86_64 && psi" } - environment { - TEST_TYPE = "integration" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') - AWS_API_TEST_SHARE_ACCOUNT = credentials('aws-credentials-share-account') - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - } - steps { - run_tests('integration') - } - post { - always { - preserve_logs('rhel8-integration') - } - } - } - stage('EL8 OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && psi && x86_64" } - steps { - run_tests('ostree') - } - post { - always { - preserve_logs('rhel8-ostree') - } - } - } - stage('EL8 New OSTree') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && psi && x86_64" } - steps { - run_tests('ostree-ng') - } - post { - always { - preserve_logs('rhel8-ostree-ng') - } - } - } - stage('EL8: koji-osbuild') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "rhel8cloudbase && psi && x86_64" } - steps { - run_project_tests('koji-osbuild', 'integration.sh') - } - post { - always { - preserve_logs('rhel8-revdep-koji-osbuild') - } - } - } stage('EL8.4 Base') { agent { label "rhel84cloudbase && x86_64 && psi" } environment { @@ -693,79 +196,6 @@ pipeline { } } } - stage('CS8 Base') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "cs8cloudbase && x86_64 && aws" } - environment { - TEST_TYPE = "base" - } - steps { - run_tests('base') - } - post { - always { - preserve_logs('cs8-base') - } - } - } - stage('CS8 Image') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "cs8cloudbase && psi && x86_64" } - environment { - TEST_TYPE = "image" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AZURE_CREDS = credentials('azure') - OPENSTACK_CREDS = credentials("psi-openstack-creds") - VCENTER_CREDS = credentials('vmware-vcenter-credentials') - DISTRO_CODE = "centos-stream8" - } - steps { - run_tests('image') - } - post { - always { - preserve_logs('cs8-image') - sh ( - label: "Run cloud cleaner just in case something failed", - script: "schutzbot/run_cloud_cleaner.sh" - ) - } - } - } - stage('CS8 Integration') { - when { - expression { - return env.BUILD_CAUSE != 'cron'; - } - } - - agent { label "cs8cloudbase && x86_64 && psi" } - environment { - TEST_TYPE = "integration" - AWS_CREDS = credentials('aws-credentials-osbuildci') - AWS_IMAGE_TEST_CREDS = credentials('aws-credentials-osbuild-image-test') - AWS_API_TEST_SHARE_ACCOUNT = credentials('aws-credentials-share-account') - } - steps { - run_tests('integration') - } - post { - always { - preserve_logs('cs8-integration') - } - } - } } } } @@ -794,7 +224,7 @@ CC: [@atodorov_kiwi](tg://user?id=1047018883) unstash 'compose_id' def composeId = readFile "${env.WORKSPACE}/COMPOSE_ID" - telegramSend """💣 CI failed for osbuild-composer ${composeId} ${env.BUILD_URL}, + telegramSend """💣 CI failed for osbuild-composer rhel-8.4.0 branch ${composeId} ${env.BUILD_URL}, CC: [@atodorov_kiwi](tg://user?id=1047018883) """ } else if (env.BRANCH_NAME == 'main') { @@ -811,9 +241,9 @@ CC: [@atodorov_kiwi](tg://user?id=1047018883) // need to copy/paste the same lines over and over above. void run_tests(test_type) { // unstash files but avoid failure if they don't exist - // b/c these files are available only for nightly builds + // b/c these files are available only for internal builds try { - unstash 'rhel8nightly' + unstash 'rhel8internal' unstash 'rhel8json' unstash 'rhel8betajson' } catch (err) { @@ -927,7 +357,7 @@ void preserve_logs(test_slug) { void detect_build_cause() { def buildCause = currentBuild.getBuildCauses().get(0) - if ( buildCause.shortDescription == 'Started by timer' && env.BRANCH_NAME == 'main') { + if ( buildCause.shortDescription == 'Started by timer' ) { return "cron" } diff --git a/schutzbot/deploy.sh b/schutzbot/deploy.sh index efd03ce..fd7e2af 100755 --- a/schutzbot/deploy.sh +++ b/schutzbot/deploy.sh @@ -86,9 +86,9 @@ if [[ "$PROJECT" != "osbuild-composer" ]]; then fi fi -if [ -f "rhel8nightly.repo" ]; then - greenprint "Preparing repos for nightly build testing" - sudo mv rhel8nightly.repo /etc/yum.repos.d/ +if [ -f "rhel8internal.repo" ]; then + greenprint "Preparing repos for internal build testing" + sudo mv rhel8internal.repo /etc/yum.repos.d/ sudo rm -f /etc/yum.repos.d/osbuild*.repo fi diff --git a/schutzbot/mockbuild.sh b/schutzbot/mockbuild.sh index 36330fb..2fa8d29 100755 --- a/schutzbot/mockbuild.sh +++ b/schutzbot/mockbuild.sh @@ -67,7 +67,7 @@ greenprint "🧬 Using mock config: ${MOCK_CONFIG}" greenprint "📦 SHA: ${COMMIT}" greenprint "📤 RPMS will be uploaded to: ${REPO_URL}" -# rhel 8.4 will run off of the nightly repos and does not have a redhat subscription +# rhel 8.4 will run off of the internal repos and does not have a redhat subscription if [[ $VERSION_ID == 8.4 ]]; then greenprint "📋 Updating RHEL 8 mock template for unsubscribed image" sudo sed -i '/# repos/q' /etc/mock/templates/rhel-8.tpl diff --git a/schutzbot/prepare-rhel-internal.sh b/schutzbot/prepare-rhel-internal.sh new file mode 100755 index 0000000..290eac7 --- /dev/null +++ b/schutzbot/prepare-rhel-internal.sh @@ -0,0 +1,118 @@ +#!/bin/bash +set -euo pipefail + +# Colorful output. +function greenprint { + echo -e "\033[1;32m${1}\033[0m" +} + +ARCH=$(uname -m) + +curl -L http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/latest-RHEL-8.4/COMPOSE_ID > COMPOSE_ID +COMPOSE_ID=$(cat COMPOSE_ID) + +# default to a nightly tree but respect values passed from ENV so we can test rel-eng +# composes as well +COMPOSE_URL="${COMPOSE_URL:-http://download.devel.redhat.com/rhel-8/nightly/RHEL-8/$COMPOSE_ID}" + +# in case COMPOSE_URL was defined from the outside refresh COMPOSE_ID file, +# used for telegram messages in case of success/failure +curl -L "$COMPOSE_URL/COMPOSE_ID" > COMPOSE_ID + +# Create a repository file for installing the osbuild-composer RPMs +greenprint "📜 Generating dnf repository file" +tee rhel8internal.repo << EOF +[rhel8-internal-baseos] +name=RHEL Internal BaseOS +baseurl=${COMPOSE_URL}/compose/BaseOS/${ARCH}/os +enabled=1 +gpgcheck=0 +# Default dnf repo priority is 99. Lower number means higher priority. +priority=1 + +[rhel8-internal-appstream] +name=RHEL Internal AppStream +baseurl=${COMPOSE_URL}/compose/AppStream/${ARCH}/os +enabled=1 +gpgcheck=0 +# osbuild-composer repo priority is 5 +priority=1 +EOF + + +# Create an osbuild-composer JSON file for content consumption +greenprint "📜 Generate osbuild-composer JSON source file" +tee rhel-8.json << EOF +{ + "${ARCH}": [ + { + "name": "baseos", + "baseurl": "${COMPOSE_URL}/compose/BaseOS/${ARCH}/os", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + }, + { + "name": "appstream", + "baseurl": "${COMPOSE_URL}/compose/AppStream/${ARCH}/os", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + } + ] +} +EOF + +cp rhel-8.json rhel-8-beta.json + + +greenprint "📦 Installing requirements" +sudo dnf -y install createrepo_c wget python3-pip + +# Install s3cmd if it is not present. +if ! s3cmd --version > /dev/null 2>&1; then + greenprint "📦 Installing s3cmd" + sudo pip3 -q install s3cmd +fi + +REPO_DIR_LATEST="repo/${JOB_NAME}/latest/internal" +mkdir -p "$REPO_DIR_LATEST" + +greenprint "Discover latest osbuild-composer NVR" +# Download only osbuild-composer-worker-*.rpm and use it in rpm --qf below +wget --quiet --recursive --no-parent --no-directories --accept "osbuild-composer-worker-*.rpm" \ + "${COMPOSE_URL}/compose/AppStream/${ARCH}/os/Packages/" + +# Download osbuild-composer-tests from Brew b/c it is not available in the distro +# version matches osbuild-composer from the internal tree +greenprint "Downloading osbuild-composer-tests from Brew" +TESTS_RPM_URL=$(rpm -qp ./osbuild-composer-worker-*.rpm --qf "http://download.devel.redhat.com/brewroot/vol/rhel-8/packages/osbuild-composer/%{version}/%{release}/%{arch}/osbuild-composer-tests-%{version}-%{release}.%{arch}.rpm") +wget --directory-prefix "$REPO_DIR_LATEST" "$TESTS_RPM_URL" + +greenprint "⛓ Creating dnf repository" +createrepo_c "${REPO_DIR_LATEST}" + +# Bucket in S3 where our artifacts are uploaded +REPO_BUCKET=osbuild-composer-repos + +# Remove the previous latest repo for this job. +# Don't fail if the path is missing. +s3cmd --recursive rm "s3://${REPO_BUCKET}/${REPO_DIR_LATEST}" || true + +# Upload repository to S3. +greenprint "☁ Uploading RPMs to S3" +s3cmd --acl-public sync . s3://${REPO_BUCKET}/ + +# Public URL for the S3 bucket with our artifacts. +MOCK_REPO_BASE_URL="http://osbuild-composer-repos.s3-website.us-east-2.amazonaws.com" + +# Full URL to the RPM repository after they are uploaded. +REPO_URL=${MOCK_REPO_BASE_URL}/${REPO_DIR_LATEST} + +# amend repository file. +greenprint "📜 Amend dnf repository file" +tee -a rhel8internal.repo << EOF +[osbuild-composer-tests] +name=Tests ${JOB_NAME} +baseurl=${REPO_URL} +enabled=1 +gpgcheck=0 +# osbuild-composer repo priority is 5 +priority=1 +EOF diff --git a/test/README.md b/test/README.md index 3535bac..a2c3744 100644 --- a/test/README.md +++ b/test/README.md @@ -239,16 +239,23 @@ identified and with the mutual understanding that PRs related to that RHBZ must include an automated test reproducer. -## Cron jobs for nightly builds testing +## Cron jobs for internal builds testing The Schutzbot Pipeline contains conditional sections that facilitate test execution -against nightly builds. This is achieved by running different preparation steps while +against internal builds. This is achieved by running different preparation steps while the testing stage remains the same. The main difference is that SUT is not compiled locally but installed directly from OS repositories! -### Replay nightly Pipeline manually +By default we test against latest nightly builds. If you wish to test against other +flavors (e.g. rel-eng) specify the `COMPOSE_URL` environment variable to point to +the respective URL (stopping before the `/compose/` path). See the image below or +`schutzbot/prepare-rhel-internal.sh` for more details. -If you wish to execute the nightly Pipeline by hand, often to verify changes made to it +!['Define COMPOSE_URL'](./define_compose_url.png) + +### Replay internal Pipeline manually + +If you wish to execute the internal Pipeline by hand, often to verify changes made to it then do the following: 1. Wait for `schutzbot-psi/pr-head` to report any status on the pull request. @@ -269,4 +276,4 @@ then do the following: !['Modify build cause'](./pipeline_replay_02.png) 5. Click the ***Run*** button - the newly started Pipeline will be forced to take the - nightly branches instead of the regular ones + internal branches instead of the regular ones diff --git a/test/cases/koji.sh b/test/cases/koji.sh index 6fc36bd..89e949a 100755 --- a/test/cases/koji.sh +++ b/test/cases/koji.sh @@ -24,12 +24,6 @@ else DISTRO_SELECTOR="${ID}-${VERSION_ID%.*}" fi -greenprint "Adding podman dnsname plugin" -if [[ $ID == rhel || $ID == centos ]]; then - sudo cp /usr/share/tests/osbuild-composer/vendor/87-podman-bridge.conflist /etc/cni/net.d/ - sudo cp /usr/share/tests/osbuild-composer/vendor/dnsname /usr/libexec/cni/ -fi - greenprint "Starting containers" sudo /usr/libexec/osbuild-composer-test/run-koji-container.sh start diff --git a/test/cases/ostree-ng.sh b/test/cases/ostree-ng.sh index 018abbf..b03425f 100755 --- a/test/cases/ostree-ng.sh +++ b/test/cases/ostree-ng.sh @@ -1,45 +1,15 @@ #!/bin/bash set -euo pipefail -OSBUILD_COMPOSER_TEST_DATA=/usr/share/tests/osbuild-composer/ -URL=http://192.168.100.1/repo/ +# Provision the software under tet. +/usr/libexec/osbuild-composer-test/provision.sh # Get OS data. source /etc/os-release ARCH=$(uname -m) -# Provision the software under tet. -/usr/libexec/osbuild-composer-test/provision.sh - -# Set os-variant and boot location used by virt-install. -case "${ID}-${VERSION_ID}" in - "fedora-32") - IMAGE_TYPE=fedora-iot-commit - OSTREE_REF="fedora/32/${ARCH}/iot" - OS_VARIANT="fedora32" - BOOT_LOCATION="https://mirrors.rit.edu/fedora/fedora/linux/releases/32/Everything/x86_64/os/";; - "fedora-33") - IMAGE_TYPE=fedora-iot-commit - OSTREE_REF="fedora/33/${ARCH}/iot" - OS_VARIANT="fedora33" - BOOT_LOCATION="https://mirrors.rit.edu/fedora/fedora/linux/releases/33/Everything/x86_64/os/";; - "rhel-8.3") - IMAGE_TYPE=rhel-edge-commit - OSTREE_REF="rhel/8/${ARCH}/edge" - OS_VARIANT="rhel8.3" - # When 8.3 was released, it wasn't available on all RH internal - # mirrors, therefore the Boston mirror is hardcoded. - BOOT_LOCATION="http://download.eng.bos.redhat.com/released/rhel-8/RHEL-8/8.3.0/BaseOS/x86_64/os/";; - "rhel-8.4") - IMAGE_TYPE=rhel-edge-commit - OSTREE_REF="rhel/8/${ARCH}/edge" - OS_VARIANT="rhel8-unknown" - BOOT_LOCATION="http://download.devel.redhat.com/nightly/rhel-8/RHEL-8/latest-RHEL-8.4/compose/BaseOS/x86_64/os/";; - *) - echo "unsupported distro: ${ID}-${VERSION_ID}" - exit 1;; -esac - +# Do not use httpd, but container +sudo systemctl disable --now httpd # Colorful output. function greenprint { @@ -79,23 +49,23 @@ fi # Allow anyone in the wheel group to talk to libvirt. greenprint "🚪 Allowing users in wheel group to talk to libvirt" -WHEEL_GROUP=wheel -if [[ $ID == rhel ]]; then - WHEEL_GROUP=adm -fi sudo tee /etc/polkit-1/rules.d/50-libvirt.rules > /dev/null << EOF polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage" && - subject.isInGroup("${WHEEL_GROUP}")) { + subject.isInGroup("adm")) { return polkit.Result.YES; } }); EOF # Set up variables. +OSBUILD_COMPOSER_TEST_DATA=/usr/share/tests/osbuild-composer/ +OSTREE_REF="rhel/8/${ARCH}/edge" +OS_VARIANT="rhel8-unknown" TEST_UUID=$(uuidgen) IMAGE_KEY="osbuild-composer-ostree-test-${TEST_UUID}" GUEST_ADDRESS=192.168.100.50 +URL=http://192.168.100.1/repo/ # Set up temporary files. TEMPDIR=$(mktemp -d) @@ -136,13 +106,8 @@ get_compose_metadata () { # Build ostree image. build_image() { - blueprint_file=$1 - blueprint_name=$2 - - # Prepare the blueprint for the compose. - greenprint "📋 Preparing blueprint" - sudo composer-cli blueprints push "$blueprint_file" - sudo composer-cli blueprints depsolve "$blueprint_name" + blueprint_name=$1 + image_type=$2 # Get worker unit file so we can watch the journal. WORKER_UNIT=$(sudo systemctl list-units | grep -o -E "osbuild.*worker.*\.service") @@ -151,19 +116,20 @@ build_image() { # Start the compose. greenprint "🚀 Starting compose" - if [[ $blueprint_name == upgrade ]]; then + if [ $# -eq 3 ]; then + repo_url=$3 sudo curl --silent --header "Content-Type: application/json" --unix-socket /run/weldr/api.socket http://localhost/api/v1/compose --data "{ \"blueprint_name\": \"$blueprint_name\", - \"compose_type\": \"$IMAGE_TYPE\", + \"compose_type\": \"$image_type\", \"ostree\": { - \"url\": \"$URL\", + \"url\": \"$repo_url\", \"ref\": \"$OSTREE_REF\" } }" | tee "$COMPOSE_START" else sudo curl --silent --header "Content-Type: application/json" --unix-socket /run/weldr/api.socket http://localhost/api/v1/compose --data "{ \"blueprint_name\": \"$blueprint_name\", - \"compose_type\": \"$IMAGE_TYPE\" + \"compose_type\": \"$image_type\" }" | tee "$COMPOSE_START" fi COMPOSE_ID=$(jq -r '.build_id' "$COMPOSE_START") @@ -219,19 +185,19 @@ clean_up () { fi # Remove qcow2 file. sudo rm -f "$LIBVIRT_IMAGE_PATH" - # Remove extracted upgrade image-tar. - sudo rm -rf "$UPGRADE_PATH" - # Remove "remote" repo. - sudo rm -rf "${HTTPD_PATH}"/{repo,compose.json} + + # Remove any status containers if exist + sudo podman ps -a -q --format "{{.ID}}" | sudo xargs --no-run-if-empty podman rm -f + # Remove all images + sudo podman rmi -f -a + # Remomve tmp dir. sudo rm -rf "$TEMPDIR" - # Stop httpd - sudo systemctl disable httpd --now } # Test result checking check_result () { - greenprint "Checking for test result" + greenprint "🎏 Checking for test result" if [[ $RESULTS == 1 ]]; then greenprint "💚 Success" else @@ -241,16 +207,16 @@ check_result () { fi } -################################################## +########################################################## ## -## ostree image/commit installation +## rhel-edge container image for building installer image ## -################################################## +########################################################## # Write a blueprint for ostree image. tee "$BLUEPRINT_FILE" > /dev/null << EOF -name = "ostree" -description = "A base ostree image" +name = "container" +description = "A base rhel-edge container image" version = "0.0.1" modules = [] groups = [] @@ -258,39 +224,117 @@ groups = [] [[packages]] name = "python36" version = "*" + +[customizations.kernel] +name = "kernel-rt" + +[[customizations.user]] +name = "admin" +description = "Administrator account" +password = "\$6\$GRmb7S0p8vsYmXzH\$o0E020S.9JQGaHkszoog4ha4AQVs3sk8q0DvLjSMxoxHBKnB2FBXGQ/OkwZQfW/76ktHd0NX5nls2LPxPuUdl." +key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC61wMCjOSHwbVb4VfVyl5sn497qW4PsdQ7Ty7aD6wDNZ/QjjULkDV/yW5WjDlDQ7UqFH0Sr7vywjqDizUAqK7zM5FsUKsUXWHWwg/ehKg8j9xKcMv11AkFoUoujtfAujnKODkk58XSA9whPr7qcw3vPrmog680pnMSzf9LC7J6kXfs6lkoKfBh9VnlxusCrw2yg0qI1fHAZBLPx7mW6+me71QZsS6sVz8v8KXyrXsKTdnF50FjzHcK9HXDBtSJS5wA3fkcRYymJe0o6WMWNdgSRVpoSiWaHHmFgdMUJaYoCfhXzyl7LtNb3Q+Sveg+tJK7JaRXBLMUllOlJ6ll5Hod root@localhost" +home = "/home/admin/" +groups = ["wheel"] EOF -# Build installation image. -build_image "$BLUEPRINT_FILE" ostree +greenprint "📄 container blueprint" +cat "$BLUEPRINT_FILE" + +# Prepare the blueprint for the compose. +greenprint "📋 Preparing container blueprint" +sudo composer-cli blueprints push "$BLUEPRINT_FILE" +sudo composer-cli blueprints depsolve container -# Start httpd to serve ostree repo. -greenprint "🚀 Starting httpd daemon" -sudo systemctl start httpd +# Build container image. +build_image container rhel-edge-container -# Download the image and extract tar into web server root folder. -greenprint "📥 Downloading and extracting the image" +# Download the image +greenprint "📥 Downloading the container image" sudo composer-cli compose image "${COMPOSE_ID}" > /dev/null -IMAGE_FILENAME="${COMPOSE_ID}-commit.tar" -HTTPD_PATH="/var/www/html" -sudo tar -xf "${IMAGE_FILENAME}" -C ${HTTPD_PATH} + +# Clear container running env +greenprint "🧹 Clearing container running env" +# Remove any status containers if exist +sudo podman ps -a -q --format "{{.ID}}" | sudo xargs --no-run-if-empty podman rm -f +# Remove all images +sudo podman rmi -f -a + +# Deal with rhel-edge container +greenprint "🗜 Extracting and running the image" +IMAGE_FILENAME="${COMPOSE_ID}-rhel84-container.tar" +sudo podman pull "oci-archive:${IMAGE_FILENAME}" +# Workaound for issue https://bugzilla.redhat.com/show_bug.cgi?id=1933774 +sudo restorecon -R /var/lib/containers/storage/overlay/ +sudo podman images +# Clear image file sudo rm -f "$IMAGE_FILENAME" +# Get image id to run image +EDGE_IMAGE_ID=$(sudo podman images --filter "dangling=true" --format "{{.ID}}") +sudo podman run -d --name rhel-edge --network host "${EDGE_IMAGE_ID}" +# Wait for container to be running +until [ "$(sudo podman inspect -f '{{.State.Running}}' rhel-edge)" == "true" ]; do + sleep 1; +done; # Clean compose and blueprints. -greenprint "Clean up osbuild-composer" +greenprint "🧽 Clean up container blueprint and compose" sudo composer-cli compose delete "${COMPOSE_ID}" > /dev/null -sudo composer-cli blueprints delete ostree > /dev/null +sudo composer-cli blueprints delete container > /dev/null + +######################################################## +## +## rhel-edge installer image building from container image +## +######################################################## + +# Write a blueprint for installer image. +tee "$BLUEPRINT_FILE" > /dev/null << EOF +name = "installer" +description = "A rhel-edge installer image" +version = "0.0.1" +modules = [] +groups = [] +EOF + +greenprint "📄 installer blueprint" +cat "$BLUEPRINT_FILE" + +# Prepare the blueprint for the compose. +greenprint "📋 Preparing installer blueprint" +sudo composer-cli blueprints push "$BLUEPRINT_FILE" +sudo composer-cli blueprints depsolve installer + +# Build installer image. +build_image installer rhel-edge-installer "$URL" + +# Download the image +greenprint "📥 Downloading the installer image" +sudo composer-cli compose image "${COMPOSE_ID}" > /dev/null +ISO_FILENAME="${COMPOSE_ID}-rhel84-boot.iso" +sudo mv "${ISO_FILENAME}" /var/lib/libvirt/images + +# Clean compose and blueprints. +greenprint "🧹 Clean up installer blueprint and compose" +sudo composer-cli compose delete "${COMPOSE_ID}" > /dev/null +sudo composer-cli blueprints delete installer > /dev/null + +######################################################## +## +## install rhel-edge image with installer(ISO) +## +######################################################## # Ensure SELinux is happy with our new images. greenprint "👿 Running restorecon on image directory" sudo restorecon -Rv /var/lib/libvirt/images/ # Create qcow2 file for virt install. -greenprint "Create qcow2 file for virt install" +greenprint "🖥 Create qcow2 file for virt install" LIBVIRT_IMAGE_PATH=/var/lib/libvirt/images/${IMAGE_KEY}.qcow2 sudo qemu-img create -f qcow2 "${LIBVIRT_IMAGE_PATH}" 20G # Write kickstart file for ostree image installation. -greenprint "Generate kickstart file" +greenprint "📑 Generate kickstart file" tee "$KS_FILE" > /dev/null << STOPHERE text lang en_US.UTF-8 @@ -298,9 +342,6 @@ keyboard us timezone --utc Etc/UTC selinux --enforcing -rootpw --lock --iscrypted locked -user --name=admin --groups=wheel --iscrypted --password=\$6\$1LgwKw9aOoAi/Zy9\$Pn3ErY1E8/yEanJ98evqKEW.DZp24HTuqXPJl6GYCm8uuobAmwxLv7rGCvTRZhxtcYdmC0.XnYRSR9Sh6de3p0 -sshkey --username=admin "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC61wMCjOSHwbVb4VfVyl5sn497qW4PsdQ7Ty7aD6wDNZ/QjjULkDV/yW5WjDlDQ7UqFH0Sr7vywjqDizUAqK7zM5FsUKsUXWHWwg/ehKg8j9xKcMv11AkFoUoujtfAujnKODkk58XSA9whPr7qcw3vPrmog680pnMSzf9LC7J6kXfs6lkoKfBh9VnlxusCrw2yg0qI1fHAZBLPx7mW6+me71QZsS6sVz8v8KXyrXsKTdnF50FjzHcK9HXDBtSJS5wA3fkcRYymJe0o6WMWNdgSRVpoSiWaHHmFgdMUJaYoCfhXzyl7LtNb3Q+Sveg+tJK7JaRXBLMUllOlJ6ll5Hod root@localhost" bootloader --timeout=1 --append="net.ifnames=0 modprobe.blacklist=vc4" @@ -309,7 +350,7 @@ network --bootproto=dhcp --device=link --activate --onboot=on zerombr clearpart --all --initlabel --disklabel=msdos autopart --nohome --noswap --type=plain -ostreesetup --nogpg --osname=${IMAGE_TYPE} --remote=${IMAGE_TYPE} --url=${URL} --ref=${OSTREE_REF} +ostreesetup --nogpg --osname=rhel-edge --remote=rhel-edge --url=file:///ostree/repo --ref=${OSTREE_REF} poweroff %post --log=/var/log/anaconda/post-install.log --erroronfail @@ -328,13 +369,6 @@ TYPE="Ethernet" PERSISTENT_DHCLIENT="yes" EOF -echo "Packages within this iot or edge image:" -echo "-----------------------------------------------------------------------" -rpm -qa | sort -echo "-----------------------------------------------------------------------" -# Note that running rpm recreates the rpm db files which aren't needed/wanted -rm -f /var/lib/rpm/__db* - echo "Zeroing out empty space." # This forces the filesystem to reclaim space from deleted files dd bs=1M if=/dev/zero of=/var/tmp/zeros || : @@ -345,9 +379,9 @@ echo "(Don't worry -- that out-of-space error was expected.)" STOPHERE # Install ostree image via anaconda. -greenprint "Install ostree image via anaconda" +greenprint "💿 Install ostree image via installer(ISO)" sudo virt-install --initrd-inject="${KS_FILE}" \ - --extra-args="ks=file:/ks.cfg console=ttyS0,115200" \ + --extra-args="inst.ks=file:/ks.cfg console=ttyS0,115200" \ --name="${IMAGE_KEY}"\ --disk path="${LIBVIRT_IMAGE_PATH}",format=qcow2 \ --ram 3072 \ @@ -355,14 +389,14 @@ sudo virt-install --initrd-inject="${KS_FILE}" \ --network network=integration,mac=34:49:22:B0:83:30 \ --os-type linux \ --os-variant ${OS_VARIANT} \ - --location ${BOOT_LOCATION} \ + --location "/var/lib/libvirt/images/${ISO_FILENAME}" \ --nographics \ --noautoconsole \ --wait=-1 \ --noreboot # Start VM. -greenprint "Start VM" +greenprint "📟 Start VM" sudo virsh start "${IMAGE_KEY}" # Check for ssh ready to go. @@ -381,14 +415,14 @@ check_result ################################################## ## -## ostree image/commit upgrade +## upgrade rhel-edge with new upgrade container ## ################################################## # Write a blueprint for ostree image. tee "$BLUEPRINT_FILE" > /dev/null << EOF name = "upgrade" -description = "An upgrade ostree image" +description = "An upgrade rhel-edge container image" version = "0.0.2" modules = [] groups = [] @@ -400,40 +434,74 @@ version = "*" [[packages]] name = "wget" version = "*" + +[customizations.kernel] +name = "kernel-rt" + +[[customizations.user]] +name = "admin" +description = "Administrator account" +password = "\$6\$GRmb7S0p8vsYmXzH\$o0E020S.9JQGaHkszoog4ha4AQVs3sk8q0DvLjSMxoxHBKnB2FBXGQ/OkwZQfW/76ktHd0NX5nls2LPxPuUdl." +key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC61wMCjOSHwbVb4VfVyl5sn497qW4PsdQ7Ty7aD6wDNZ/QjjULkDV/yW5WjDlDQ7UqFH0Sr7vywjqDizUAqK7zM5FsUKsUXWHWwg/ehKg8j9xKcMv11AkFoUoujtfAujnKODkk58XSA9whPr7qcw3vPrmog680pnMSzf9LC7J6kXfs6lkoKfBh9VnlxusCrw2yg0qI1fHAZBLPx7mW6+me71QZsS6sVz8v8KXyrXsKTdnF50FjzHcK9HXDBtSJS5wA3fkcRYymJe0o6WMWNdgSRVpoSiWaHHmFgdMUJaYoCfhXzyl7LtNb3Q+Sveg+tJK7JaRXBLMUllOlJ6ll5Hod root@localhost" +home = "/home/admin/" +groups = ["wheel"] EOF +greenprint "📄 upgrade blueprint" +cat "$BLUEPRINT_FILE" + +# Prepare the blueprint for the compose. +greenprint "📋 Preparing upgrade blueprint" +sudo composer-cli blueprints push "$BLUEPRINT_FILE" +sudo composer-cli blueprints depsolve upgrade + # Build upgrade image. -build_image "$BLUEPRINT_FILE" upgrade +build_image upgrade rhel-edge-container "$URL" -# Download the image and extract tar into web server root folder. -greenprint "📥 Downloading and extracting the image" +# Download the image +greenprint "📥 Downloading the upgrade image" sudo composer-cli compose image "${COMPOSE_ID}" > /dev/null -IMAGE_FILENAME="${COMPOSE_ID}-commit.tar" -UPGRADE_PATH="$(pwd)/upgrade" -mkdir -p "$UPGRADE_PATH" -sudo tar -xf "$IMAGE_FILENAME" -C "$UPGRADE_PATH" + +# Clear container running env +greenprint "🧹 Clearing container running env" +# Remove any status containers if exist +sudo podman ps -a -q --format "{{.ID}}" | sudo xargs --no-run-if-empty podman rm -f +# Remove all images +sudo podman rmi -f -a + +# Deal with rhel-edge container +greenprint "🗜 Extracting and running the image" +IMAGE_FILENAME="${COMPOSE_ID}-rhel84-container.tar" +sudo podman pull "oci-archive:${IMAGE_FILENAME}" +# Workaound for issue https://bugzilla.redhat.com/show_bug.cgi?id=1933774 +sudo restorecon -R /var/lib/containers/storage/overlay/ +sudo podman images +# Clear image file sudo rm -f "$IMAGE_FILENAME" +# Get image id to run image +EDGE_IMAGE_ID=$(sudo podman images --filter "dangling=true" --format "{{.ID}}") +sudo podman run -d --name rhel-edge --network host "${EDGE_IMAGE_ID}" +# Wait for container to be running +until [ "$(sudo podman inspect -f '{{.State.Running}}' rhel-edge)" == "true" ]; do + sleep 1; +done; + +# Get ostree commit value. +greenprint "🕹 Get ostree upgrade commit value" +UPGRADE_HASH=$(curl ${URL}refs/heads/rhel/8/x86_64/edge) # Clean compose and blueprints. -greenprint "Clean up osbuild-composer again" +greenprint "🧽 Clean up upgrade blueprint and compose" sudo composer-cli compose delete "${COMPOSE_ID}" > /dev/null sudo composer-cli blueprints delete upgrade > /dev/null -# Introduce new ostree commit into repo. -greenprint "Introduce new ostree commit into repo" -sudo ostree pull-local --repo "${HTTPD_PATH}/repo" "${UPGRADE_PATH}/repo" "$OSTREE_REF" -sudo ostree summary --update --repo "${HTTPD_PATH}/repo" - -# Ensure SELinux is happy with all objects files. -greenprint "👿 Running restorecon on web server root folder" -sudo restorecon -Rv "${HTTPD_PATH}/repo" > /dev/null - -# Get ostree commit value. -greenprint "Get ostree image commit value" -UPGRADE_HASH=$(jq -r '."ostree-commit"' < "${UPGRADE_PATH}"/compose.json) +# Config remote repository for upgrade +greenprint "🔗 Config remote repository for upgrade" +sudo ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" admin@${GUEST_ADDRESS} 'sudo ostree remote delete rhel-edge' +sudo ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" admin@${GUEST_ADDRESS} "sudo ostree remote add --no-gpg-verify --no-sign-verify rhel-edge ${URL}" # Upgrade image/commit. -greenprint "Upgrade ostree image/commit" +greenprint "🗳 Upgrade ostree image/commit" sudo ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" admin@${GUEST_ADDRESS} 'sudo rpm-ostree upgrade' sudo ssh "${SSH_OPTIONS[@]}" -i "${SSH_KEY}" admin@${GUEST_ADDRESS} 'nohup sudo systemctl reboot &>/dev/null & exit' @@ -468,7 +536,7 @@ ansible_ssh_common_args="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/ EOF # Test IoT/Edge OS -sudo ansible-playbook -v -i "${TEMPDIR}"/inventory -e image_type=${IMAGE_TYPE} -e ostree_commit="${UPGRADE_HASH}" /usr/share/tests/osbuild-composer/ansible/check_ostree.yaml || RESULTS=0 +sudo ansible-playbook -v -i "${TEMPDIR}"/inventory -e image_type=rhel-edge -e ostree_commit="${UPGRADE_HASH}" /usr/share/tests/osbuild-composer/ansible/check_ostree.yaml || RESULTS=0 check_result # Final success clean up diff --git a/test/data/ansible/check_ostree.yaml b/test/data/ansible/check_ostree.yaml index fc9cf92..01ec242 100644 --- a/test/data/ansible/check_ostree.yaml +++ b/test/data/ansible/check_ostree.yaml @@ -7,6 +7,28 @@ failed_counter: "0" tasks: + # default kernel or rt kernel + - name: check installed kernel + command: uname -r + register: result_kernel + + # case: check rt kernel installed (rt kernel only) + - name: check rt kernel installed + block: + - assert: + that: + - "'rt' in result_kernel.stdout" + fail_msg: "rt kernel not installed, ostree upgrade might be failed" + success_msg: "rt kernel installed in ostree upgrade" + always: + - set_fact: + total_counter: "{{ total_counter | int + 1 }}" + rescue: + - name: failed count + 1 + set_fact: + failed_counter: "{{ failed_counter | int + 1 }}" + when: "'rt' in result_kernel.stdout" + # case: check ostree commit correctly updated - name: get deployed ostree commit command: rpm-ostree status --json @@ -234,16 +256,16 @@ delegate_to: localhost - name: check dmesg error and fail log - shell: dmesg --notime | grep -i "error\|fail" + shell: dmesg --notime | grep -i "error\|fail" || true register: result_dmesg_error + # (RHEL)default kernel has error and fail log - name: no more error or failed log block: - assert: that: - - result_dmesg_error.stdout_lines | length == 2 - - "'pcieport 0000:00:01.6: Failed to check link status' in result_dmesg_error.stdout" - - "'Error: Driver \\'pcspkr\\' is already registered, aborting' in result_dmesg_error.stdout" + - result_dmesg_error.stdout_lines | length <= 2 + - "'pcieport 0000:00:01.6: Failed to check link status' in result_dmesg_error.stdout or 'Error: Driver \\'pcspkr\\' is already registered, aborting' in result_dmesg_error.stdout" fail_msg: "more or less error and failed log" success_msg: "everything works as expected" always: @@ -253,8 +275,29 @@ - name: failed count + 1 set_fact: failed_counter: "{{ failed_counter | int + 1 }}" - when: ansible_facts['distribution'] == "RedHat" + when: + - ansible_facts['distribution'] == "RedHat" + - "'rt' not in result_kernel.stdout" + + # (RHEL)rt kernel does not have any error or fail log + - name: no any error or fail log + block: + - assert: + that: + - result_dmesg_error.stdout == "" + fail_msg: "found error or fail log in rt kernel test" + success_msg: "no error or fail log found" + always: + - set_fact: + total_counter: "{{ total_counter | int + 1 }}" + rescue: + - name: failed count + 1 + set_fact: + failed_counter: "{{ failed_counter | int + 1 }}" + when: + - "'rt' in result_kernel.stdout" + # (Fedora)default kernel has error and fail log - name: no more error or failed log block: - assert: @@ -271,13 +314,16 @@ - name: failed count + 1 set_fact: failed_counter: "{{ failed_counter | int + 1 }}" - when: ansible_facts['distribution'] == "Fedora" + when: + - ansible_facts['distribution'] == "Fedora" + - "'rt' not in result_kernel.stdout" # case: check running container with podman - name: run ubi8 image - command: podman run ubi8-minimal:latest cat /etc/redhat-release + command: podman run registry.access.redhat.com/ubi8/ubi-minimal:latest cat /etc/redhat-release register: podman_result become: yes + ignore_errors: yes # due to https://bugzilla.redhat.com/show_bug.cgi?id=1903983 - name: run container test block: diff --git a/test/data/manifests/centos_8-x86_64-ami-boot.json b/test/data/manifests/centos_8-x86_64-ami-boot.json index fd91894..849d210 100644 --- a/test/data/manifests/centos_8-x86_64-ami-boot.json +++ b/test/data/manifests/centos_8-x86_64-ami-boot.json @@ -3858,13 +3858,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -10249,15 +10250,12 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ @@ -10917,4 +10915,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/centos_8-x86_64-openstack-boot.json b/test/data/manifests/centos_8-x86_64-openstack-boot.json index c389c6e..26c625d 100644 --- a/test/data/manifests/centos_8-x86_64-openstack-boot.json +++ b/test/data/manifests/centos_8-x86_64-openstack-boot.json @@ -4155,13 +4155,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -10950,15 +10951,12 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ @@ -11668,4 +11666,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/centos_8-x86_64-qcow2-boot.json b/test/data/manifests/centos_8-x86_64-qcow2-boot.json index d2304c4..8739535 100644 --- a/test/data/manifests/centos_8-x86_64-qcow2-boot.json +++ b/test/data/manifests/centos_8-x86_64-qcow2-boot.json @@ -4132,13 +4132,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -10926,15 +10927,12 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ @@ -11662,4 +11660,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/centos_8-x86_64-qcow2-customize.json b/test/data/manifests/centos_8-x86_64-qcow2-customize.json index d1afa8e..d056d2c 100644 --- a/test/data/manifests/centos_8-x86_64-qcow2-customize.json +++ b/test/data/manifests/centos_8-x86_64-qcow2-customize.json @@ -74,7 +74,7 @@ }, "locale": { "languages": [ - "en_US" + "el_CY.UTF-8" ], "keyboard": "dvorak" }, @@ -4184,13 +4184,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "el_CY.UTF-8" } }, { @@ -11031,15 +11032,12 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto debug" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto debug", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ diff --git a/test/data/manifests/centos_8-x86_64-tar-boot.json b/test/data/manifests/centos_8-x86_64-tar-boot.json index 189180e..57caf32 100644 --- a/test/data/manifests/centos_8-x86_64-tar-boot.json +++ b/test/data/manifests/centos_8-x86_64-tar-boot.json @@ -2371,7 +2371,7 @@ { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -6423,11 +6423,7 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "bootmenu": [], @@ -6737,4 +6733,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/centos_8-x86_64-vhd-boot.json b/test/data/manifests/centos_8-x86_64-vhd-boot.json index b15e346..183e3e9 100644 --- a/test/data/manifests/centos_8-x86_64-vhd-boot.json +++ b/test/data/manifests/centos_8-x86_64-vhd-boot.json @@ -4111,13 +4111,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -10866,15 +10867,12 @@ "checksum": "sha256:a2aeabb3962859069a78acc288bc3bffb35485428e162caafec8134f5ce6ca67", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro biosdevname=0 rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro biosdevname=0 rootdelay=300 console=ttyS0 earlyprintk=ttyS0 net.ifnames=0", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ @@ -11585,4 +11583,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/centos_8-x86_64-vmdk-boot.json b/test/data/manifests/centos_8-x86_64-vmdk-boot.json index cd2d62a..7e9c7fe 100644 --- a/test/data/manifests/centos_8-x86_64-vmdk-boot.json +++ b/test/data/manifests/centos_8-x86_64-vmdk-boot.json @@ -3949,13 +3949,14 @@ "legacy": "i386-pc", "uefi": { "vendor": "centos" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -10454,15 +10455,12 @@ "checksum": "sha256:9ed3ad948a0dada7710d4b8b2053d4716dc0754f5648a74f4d78b59b737529dc", "check_gpg": true } - ], - "checksums": { - "0": "sha256:06fa6273454f85c58ca743a0ef0202bed4cac267393049dc447839cdb39f4a54", - "1": "sha256:5b16e44261a7beffd5d7bf961fe269da407bd57abb1faac407c46a81969dfd63" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-277.el8.x86_64" }, "bootloader": "grub", "bootmenu": [ @@ -11146,4 +11144,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-aarch64-ami-boot.json b/test/data/manifests/fedora_32-aarch64-ami-boot.json index dd6c755..45b9bb0 100644 --- a/test/data/manifests/fedora_32-aarch64-ami-boot.json +++ b/test/data/manifests/fedora_32-aarch64-ami-boot.json @@ -8875,10 +8875,7 @@ "checksum": "sha256:df7184fef93e9f8f535d78349605595a812511db5e6dee26cbee15569a055422", "check_gpg": true } - ], - "checksums": { - "0": "sha256:f56d50d2c120f5fe150f53a3f72d2b8df93d0c4c51e9ae866dfa08f1d5517fb1" - } + ] }, "image-info": { "boot-environment": { @@ -9477,4 +9474,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-aarch64-openstack-boot.json b/test/data/manifests/fedora_32-aarch64-openstack-boot.json index 54ab8cc..5b4b71d 100644 --- a/test/data/manifests/fedora_32-aarch64-openstack-boot.json +++ b/test/data/manifests/fedora_32-aarch64-openstack-boot.json @@ -9225,10 +9225,7 @@ "checksum": "sha256:df7184fef93e9f8f535d78349605595a812511db5e6dee26cbee15569a055422", "check_gpg": true } - ], - "checksums": { - "0": "sha256:f56d50d2c120f5fe150f53a3f72d2b8df93d0c4c51e9ae866dfa08f1d5517fb1" - } + ] }, "image-info": { "boot-environment": { @@ -9849,4 +9846,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-aarch64-qcow2-boot.json b/test/data/manifests/fedora_32-aarch64-qcow2-boot.json index bc874f8..370c613 100644 --- a/test/data/manifests/fedora_32-aarch64-qcow2-boot.json +++ b/test/data/manifests/fedora_32-aarch64-qcow2-boot.json @@ -8732,10 +8732,7 @@ "checksum": "sha256:df7184fef93e9f8f535d78349605595a812511db5e6dee26cbee15569a055422", "check_gpg": true } - ], - "checksums": { - "0": "sha256:f56d50d2c120f5fe150f53a3f72d2b8df93d0c4c51e9ae866dfa08f1d5517fb1" - } + ] }, "image-info": { "boot-environment": { @@ -9324,4 +9321,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-ami-boot.json b/test/data/manifests/fedora_32-x86_64-ami-boot.json index a5f9f51..8d4ef8e 100644 --- a/test/data/manifests/fedora_32-x86_64-ami-boot.json +++ b/test/data/manifests/fedora_32-x86_64-ami-boot.json @@ -9133,10 +9133,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -9155,12 +9152,12 @@ "version": "5.6.6-300.fc32.x86_64" } ], + "default-target": "graphical.target", "firewall-enabled": [ "ssh", "mdns", "dhcpv6-client" ], - "default-target": "graphical.target", "fstab": [ [ "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac", @@ -9709,4 +9706,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json index 693bcfe..4110c21 100644 --- a/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json +++ b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit-boot.json @@ -10129,10 +10129,7 @@ "checksum": "sha256:3f7861ea2d8b4380b567f629a86fa31951a55f46f6eee017cb84ed87baf2c19e", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "default-target": "graphical.target", diff --git a/test/data/manifests/fedora_32-x86_64-fedora_iot_commit_debug-boot.json b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit_debug-boot.json new file mode 100644 index 0000000..b156dad --- /dev/null +++ b/test/data/manifests/fedora_32-x86_64-fedora_iot_commit_debug-boot.json @@ -0,0 +1,10746 @@ +{ + "compose-request": { + "distro": "fedora-32", + "arch": "x86_64", + "image-type": "fedora-iot-commit", + "repositories": [ + { + "baseurl": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n", + "check_gpg": true + } + ], + "filename": "commit.tar", + "blueprint": { + "customizations": { + "kernel": { + "name": "kernel-debug" + } + } + } + }, + "manifest": { + "sources": { + "org.osbuild.files": { + "urls": { + "sha256:0065bc128a5c8b08b57f92651bfa62895221a9f001f1169447a56a8a6671bbae": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-systemd-12-2.fc32.x86_64.rpm" + }, + "sha256:00d0bb6a08f20bea2b6bd0d2c4de99b51c770b2dab266d1d3da85891efeded01": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/attr-2.4.48-8.fc32.x86_64.rpm" + }, + "sha256:01173d218dccdf88c1159bba4af332ce703fc0dcd7171cd279cb3e16f12b30a9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-common-2.04-12.fc32.noarch.rpm" + }, + "sha256:024dd8a75eb5472692d0291292d25939b97a0295e5ab0958dcd22600d392eaae": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rsync-3.1.3-11.fc32.x86_64.rpm" + }, + "sha256:02654432f3853c9ae39c7601b5b0606c9d5eb5eef1d95e3e6f0074501842941f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-six-1.14.0-2.fc32.noarch.rpm" + }, + "sha256:032e4944fe53dc7a11ae62d746579177a5c52b00a4ad5540da8221aa287fdf18": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl1000-firmware-39.31.5.1-106.fc32.noarch.rpm" + }, + "sha256:04152a3a608d022a58830c0e3dac0818e2c060469b0f41d8d731f659981a4464": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-libs-6.1-15.20191109.fc32.x86_64.rpm" + }, + "sha256:052d04c9a6697c6e5aa546546ae5058d547fc4a4f474d2805a3e45dbf69193c6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtasn1-4.16.0-1.fc32.x86_64.rpm" + }, + "sha256:052ddc487a29acce1b5d44532f79f8ab594d0ac6565504071f4c7706d97fc552": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gobject-introspection-1.64.1-1.fc32.x86_64.rpm" + }, + "sha256:05efccb06aa336d2547eb8fd5b7e0935c883f89084688f32ce0b09954149b796": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efivar-libs-37-7.fc32.x86_64.rpm" + }, + "sha256:0608e0a9922e6748b39bd1719e2dabd6fe283b22cf590f1a3350327ae6c13561": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/containernetworking-plugins-0.8.5-1.1.gitf5c3d1b.fc32.x86_64.rpm" + }, + "sha256:08c41c10745c172c34880e384cf5cff014a9627f4895e59fa482948b27e2ce9e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-nft-1.8.4-7.fc32.x86_64.rpm" + }, + "sha256:09fea9af8b695af862b19c1a8fbe1b1e8854257825ee4f663f67b3782a75d58a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-gpg-keys-32-1.noarch.rpm" + }, + "sha256:0b290954bc2868b3dfc976b2b7a13ea8aeade76eeafc17674ff8e721049a5bf7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-unversioned-command-3.8.2-2.fc32.noarch.rpm" + }, + "sha256:0b7cd6f6cb3b7cd9e0704dd6c62b65254b04cb870ab638b9bed4951564436e24": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/findutils-4.7.0-3.fc32.x86_64.rpm" + }, + "sha256:0b7d24759aac33303ff4b101c111dea03ff2529efc95661140e22f629cc1ab7a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nftables-0.9.3-2.fc32.x86_64.rpm" + }, + "sha256:0bace0cf41921db39247c99bfccb228818b83b68c7b8be7c8c4a92ea298a9a29": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-m4-1.6.3-3.fc32.noarch.rpm" + }, + "sha256:0c6f4c1fbbdaf02014bf81726264e3301cbfe0ecda610765be11dbbfe99e34ae": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iproute-tc-5.5.0-1.fc32.x86_64.rpm" + }, + "sha256:0d51c1319ee78978e6ea5a49b815c2078b4ffd4d575e98c70e54ca01c3390eb8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-8.2p1-2.fc32.x86_64.rpm" + }, + "sha256:0d9d80adb91ccc8eed62bea68b23da5edb77675b1ec93227e2179d028449a2f7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libcomps-0.1.14-4.fc32.x86_64.rpm" + }, + "sha256:0e59b422e35eee975ba68e6e4de022c8f145feec7e169e86e0244d2fdad2f590": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-3.0-3.fc32.x86_64.rpm" + }, + "sha256:0fc0193d95d69c780b6feb1cb74759ca2d4804701b3de936dac8429cfbe0f2e9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-nftables-0.9.3-2.fc32.x86_64.rpm" + }, + "sha256:10883ce95852cc9ae9b4e0d435b100a25f8fe5c0ea4677eb4a0b39f4f8def886": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lua-libs-5.3.5-7.fc32.x86_64.rpm" + }, + "sha256:110f538d82f15f009d95e89d8c1e3669dc7358feb9aa7724301fef037f8b67fe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-2.04-12.fc32.x86_64.rpm" + }, + "sha256:1110261787146443e089955912255d99daf7ba042c3743e13648a9eb3d80ceb4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/filesystem-3.14-2.fc32.x86_64.rpm" + }, + "sha256:116b9d121fad9886f245cd5e1ef678fdba889cd23a39e91447e75649214a6a8d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cpio-2.13-4.fc32.x86_64.rpm" + }, + "sha256:11d6aa88c7e5bbaad38353bbb557ad8370452cd258f2a0d16bfd490116138d67": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-network-050-26.git20200316.fc32.x86_64.rpm" + }, + "sha256:129adf9147d5d120546ca8e0fb5f165761106d386d366fe82591e372754d0b4a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-decorator-4.4.0-6.fc32.noarch.rpm" + }, + "sha256:129d919e55c09edecaa8edd0fd4058dbf7460aaae5d1c5625ca11f6df7defefe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-all-langpacks-2.31-2.fc32.x86_64.rpm" + }, + "sha256:136a9cbae9c225be60718fdc8cc8988a55235d6502e451df77d1c5c765143850": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:13a0c9c767f71164cc678ee36d89b7fddcdd6fb8243e3daf8b47cca0d1d14c4f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gpgme-1.13.1-6.fc32.x86_64.rpm" + }, + "sha256:140708561a2ec1c7709fd38d8b1b115d02da710b80eeecd65c2b8387d9d78ef9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zchunk-libs-1.1.5-2.fc32.x86_64.rpm" + }, + "sha256:1446032720fb8e0090190828fcea294a86fc7f83edd70f6089e3446770ba0438": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-utils-3.0-3.fc32.x86_64.rpm" + }, + "sha256:14bd7e305e13795e0d37c613dfa3ead3a3219d28c32b27ad6527d3592361923d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libftdi-1.4-2.fc32.x86_64.rpm" + }, + "sha256:14cf772225c04c005add71372fce866e90f7144c27bbb8e846ce7887e0d286e0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/slirp4netns-0.4.3-6.0.dev.gita8414d1.fc32.x86_64.rpm" + }, + "sha256:150815dd62da40fee60ad5ceb988938c3be01e03aa54a025772b33a7a2c11311": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-tools-libs-5.6.6-300.fc32.x86_64.rpm" + }, + "sha256:156709efeaa1dfac72cc189d7e99de12d7c4b2069445da5d34fa807582e85719": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/passwd-0.80-8.fc32.x86_64.rpm" + }, + "sha256:15f08ce979e48fd25be5e16d63d1c95c57f9abff7704005137ea00b958442939": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pigz-2.4-6.fc32.x86_64.rpm" + }, + "sha256:15f2fc89b7bd39dcd3f6f8db30f56b76b65df311d7ad9852d498fbbc5c7d2aa2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-policycoreutils-3.0-2.fc32.noarch.rpm" + }, + "sha256:15f70393f706ea0ac6c622563268d9c00509ef376e3e087c1c05007b49894ee9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-firmware-whence-20200316-106.fc32.noarch.rpm" + }, + "sha256:178e4470a6dfca84ec133932606737bfe167094560bf473940504c511354ddc9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gmp-6.1.2-13.fc32.x86_64.rpm" + }, + "sha256:1830b4aa42ef492c13b62f63fe941970869ba19bd9abde4dea5c97f9e38ffd68": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libblkid-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:187dd61be71efcca6adf9819a523d432217abb335afcb2b95ef27b72928aff4b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/diffutils-3.7-4.fc32.x86_64.rpm" + }, + "sha256:1a2f22eed83ef568021c464cce841ef98725b614093f2c518307e85d5b6e759b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwd-1.6-1.fc32.x86_64.rpm" + }, + "sha256:1aee865249b031e591a5e94d62d05b69ad1a6118a26adccf2dfd46b0002716e5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-dicts-2.9.6-22.fc32.x86_64.rpm" + }, + "sha256:1b05dd5abad5a31380c859bc33e7851158c24333fda837ca9facf869005f81fe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libksba-1.3.5-11.fc32.x86_64.rpm" + }, + "sha256:1bc0542cf8a3746d0fe25c397a93c8206963f1f287246c6fb864eedfc9ffa4a7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-2.26-7.fc32.x86_64.rpm" + }, + "sha256:1bdde5dc99a5588a8983f70b7b3e45e7006215d529c72adfec118c3bcbf7b01c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-5.2.5-1.fc32.x86_64.rpm" + }, + "sha256:1c68255945533ed4e3368125bc46e19f3fe348d7ec507a85a35038dbb976003f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmnl-1.0.4-11.fc32.x86_64.rpm" + }, + "sha256:1de2be4fe5280ec3097305d9e671f5f2c768267f90d255edf2075eecb0c0afe9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-245.4-1.fc32.x86_64.rpm" + }, + "sha256:1ec84749250a0095d645f11fa0dcdf8c4500e0bbc303af696762a12616375757": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-reboot-0.9-1.fc32.noarch.rpm" + }, + "sha256:1f2ba0fc562864ad1bea31a42da124030fc188d23a84d144be616c2d066e1531": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-32-1.noarch.rpm" + }, + "sha256:20787251df57a108bbf9c40e30f041b71ac36c8a10900fb699e574ee7e259bf2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libidn2-2.3.0-2.fc32.x86_64.rpm" + }, + "sha256:213c17fb822ffa50fad16989ed363aa023de106c6262ccc3f16e52a154b7133f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-broker-22-1.fc32.x86_64.rpm" + }, + "sha256:2141f1dec8fe7a442c061f603bf4ee6203e10a290990789af0f4ef9db5523679": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-mesh-5.54-1.fc32.x86_64.rpm" + }, + "sha256:21e3fd914a3bcc65b79de022782967903c55a4aed9a3c7d3464bc2fef32d02b3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-repos-32-1.noarch.rpm" + }, + "sha256:22d311f22902d592f72bd0fb4010a682f796e5a4698d5ea209848468a2d5aa96": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/audit-libs-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm" + }, + "sha256:2434cd04a437c06f59d67ee2580443c0ba676c39440cd0f74cca768ec57577f9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libluksmeta-9-7.fc32.x86_64.rpm" + }, + "sha256:251fd875421da4708b76c15c7f5ba478d50b74d7e4242071a621625eac51a767": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsecret-0.20.2-2.fc32.x86_64.rpm" + }, + "sha256:25fc5d288536e1973436da38357690575ed58e03e17ca48d2b3840364f830659": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-base-6.1-15.20191109.fc32.noarch.rpm" + }, + "sha256:26db62c2bc52c3eee5f3039cdbdf19498f675d0f45aec0c2a1c61c635f01479e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-libs-1.45.5-3.fc32.x86_64.rpm" + }, + "sha256:27701cda24f5f6386e0173745aabc4f6df28052975e73529854432c35399cfc8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libss-1.45.5-3.fc32.x86_64.rpm" + }, + "sha256:27dd9c78e41c04b5151a2b9ac150d3ebb89f2ca7a23e4896dfc718f19a000be3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-plugin-selinux-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:28656826cb0dfbae9b6e8d1e5c5691773d84000493c4be47f727092fec6dc6f4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-5.38-2.fc32.x86_64.rpm" + }, + "sha256:28d1118b3debda3daee76fc89f250576627a28b3ec39069256ddc212d993ddbc": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/container-selinux-2.130.0-1.fc32.noarch.rpm" + }, + "sha256:28f4bcbf53258114ebbf0a167351d67e204ff6f717b49b3893c2372845e6bd0a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-1.8.4-7.fc32.x86_64.rpm" + }, + "sha256:29d7df69d66f51f6dddd637d3f599e70bdaa9bd476669002250bc038735a318c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/u/unbound-libs-1.9.6-2.fc32.x86_64.rpm" + }, + "sha256:29e2b62e9e63f25139a6863c863c3b534660440d7dec0c985807302a6895dbaf": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsepol-3.0-3.fc32.x86_64.rpm" + }, + "sha256:2b098bc6f8004270ee9eac9f63980b364b5fe19394dc73a230b3c846cf488b1b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mpfr-4.0.2-3.fc32.x86_64.rpm" + }, + "sha256:2b783576612dcf10ab151fee03084f8ae1667c044a9e2e9404a2a139e7c6c884": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/less-551-3.fc32.x86_64.rpm" + }, + "sha256:2cee64e12b295b74d2f4b008c7628ef3a01ef4149905fc4a7ae14b304da5f53b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tar-1.32-4.fc32.x86_64.rpm" + }, + "sha256:2db6d80760ab0e99f4e9c9816615e4f06b967bbb23a8c8c941b3f2d4b5f176c2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tzdata-2019c-3.fc32.noarch.rpm" + }, + "sha256:2fa5e252441852dae918b522a2ff3f46a5bbee4ce8936e06702bf65f57d7ff99": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-1.45.5-3.fc32.x86_64.rpm" + }, + "sha256:30c5f02ed28d59a4d72e020097602091bb8e34d65a6f3be69f4b1dd63a46f892": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/containers-common-0.1.41-1.fc32.x86_64.rpm" + }, + "sha256:3151132084577032b4c827eb577a1509950601888c6ff13a0a30b24252ee26d2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-build-libs-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:317654c97a9dc11fe498b61d4189ff31cd1277250993d826e9bc5815d0485f29": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/flashrom-1.2-2.fc32.x86_64.rpm" + }, + "sha256:32f8cbb3be91f589d569a2e737130f29c752f78eebc61e287af17f207e1b8c58": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-0.9.3-2.fc32.x86_64.rpm" + }, + "sha256:3343d9e7c90bd58e1e44ee07e7c59bb570ffc74da50f0607c5f5681a00b70e76": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-libs-2020.3-2.fc32.x86_64.rpm" + }, + "sha256:334d63914e7ff6fe8cfce0c8f80006c6cf2ab0615cd044a6ee588809395499e5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-udev-245.4-1.fc32.x86_64.rpm" + }, + "sha256:342bdf0143d9145f8846e1b5c3401685e0d1274b66df39ac8cbfb78013313861": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-1.22.10-1.fc32.x86_64.rpm" + }, + "sha256:34411604a91c301dc8489285065c68f3a2f50910717097fedcaade6481c7469e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-gobject-base-3.36.0-2.fc32.x86_64.rpm" + }, + "sha256:349af433b2f6d45ff2e1ea5a38f847ec692fef0a8dd656a9a07d423a981946d0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-0.20.1-4.fc32.x86_64.rpm" + }, + "sha256:355a095bb3c6d58f927277ff53267f88eb0729adbcafd8082b8d97e4815ee206": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-rpm-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:3589b982ac0c2f5f6b47cde5cb7ec33c2c01d756dabf8c4ca64f6d9d0d78b35e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-trust-0.23.20-1.fc32.x86_64.rpm" + }, + "sha256:397f0b024d3c58ca6e174c6de5abcb19304d7c58903199e1e6fe02e84d5bcb3a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gdisk-1.0.5-1.fc32.x86_64.rpm" + }, + "sha256:398ce75ffc673f048ffd47d417b17ef086abc43f318b2b77d2869095ec764d57": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/chrony-3.5-8.fc32.x86_64.rpm" + }, + "sha256:39961756e07f6f49ddf2ff277dc04a63fa4d5b4fb035480945bd2f665ba1dd4d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libell-0.30-1.fc32.x86_64.rpm" + }, + "sha256:3ab2173d9d4016febcdaf283408f9939d0a7b2fdba3e46a2d45fbef88a1463a0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-status-0.9-1.fc32.noarch.rpm" + }, + "sha256:3afab9512fd4d56a13c95b530c805ac8b2bc872572ec5bb435eccdd59fbbc8b6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnftnl-1.1.5-2.fc32.x86_64.rpm" + }, + "sha256:3b4ce7fc4e2778758881feedf6ea19b65e99aa3672e19a7dd62977efe3b910b9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnsl2-1.2.0-6.20180605git4a062cf.fc32.x86_64.rpm" + }, + "sha256:3b76bc46dd279404408d34946cfdb0c3899359a1c6b48e614e63d1259a94262a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lvm2-2.03.09-1.fc32.x86_64.rpm" + }, + "sha256:3be681b78e919bfd82eb186c7393718f1d37abd0b1bb8b1a8571aefa11e7a248": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-legacy-2.2.0-1.fc32.noarch.rpm" + }, + "sha256:3c2a641f118ab2e8b08df6dd2da72a60121d02df8d932b4afa2920eb80392875": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/npth-1.6-4.fc32.x86_64.rpm" + }, + "sha256:3cd56dea57c00e2c4a9d5aac69a1e843ebef581ba76dde9d9878082fa1215485": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/policycoreutils-python-utils-3.0-2.fc32.noarch.rpm" + }, + "sha256:3d33c29bcc4a39be16d6647a70a0d7ae2f08baf26dcea5c802289df1128d5f21": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libreport-filesystem-2.12.0-3.fc32.noarch.rpm" + }, + "sha256:3f2cb9092d6f55f84dd9eacd5359dfb354772e5f38308328027c7758f4a06fb6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-pkcs11-0.4.10-5.fc32.x86_64.rpm" + }, + "sha256:3f7861ea2d8b4380b567f629a86fa31951a55f46f6eee017cb84ed87baf2c19e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zram-0.4-1.fc32.noarch.rpm" + }, + "sha256:3f8dcae27ad3609b7de298d0ca8d34a2790b9898f5f1b03f3f9f8784374e307b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-20191128-5.gitcd267a5.fc32.noarch.rpm" + }, + "sha256:3f9c95f3827b785f49ac4a270d4c3a703dceba673c452838744ec5064cf43cbd": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-27-1.fc32.x86_64.rpm" + }, + "sha256:42fcfac5037eab4099648e0f0ed3eb2aec6eb6a23a9e3808f9b69619ea7c44e3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nss-altfiles-2.18.1-16.fc32.x86_64.rpm" + }, + "sha256:431d836b2be015212d8c15b4290d5ce5bb45282cbf3fc52696f632d84ce34dfe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-utils-5.3.28-40.fc32.x86_64.rpm" + }, + "sha256:4375c398dff722a29bd1700bc8dc8b528345412d1e17d8d9d1176d9774962957": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lzo-2.10-2.fc32.x86_64.rpm" + }, + "sha256:4494013eac1ad337673f084242aa8ebffb4a149243475b448bee9266401f2896": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcom_err-1.45.5-3.fc32.x86_64.rpm" + }, + "sha256:449d2888d6b835d207a55a2d9b4478eff1b926581fcead6260b6508e4db1b782": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/compat-readline5-5.2-36.fc32.x86_64.rpm" + }, + "sha256:44cfb58b368fba586981aa838a7f3974ac1d66d2b3b695f88d7b1d2e9c81a0b6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lz4-libs-1.9.1-2.fc32.x86_64.rpm" + }, + "sha256:44fabecae31a5900fe10837863ed231303f6863bd9fa5efa40a93a0fc059344f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libdnf-0.45.0-3.fc32.x86_64.rpm" + }, + "sha256:45132e53c649def28d63c199d8c3a3b9fd16fa8bca7426ad4e9c202e52a233b4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-common-3.9.1-1.fc32.x86_64.rpm" + }, + "sha256:4546444c0647efaa8fa8bf604ace7f7dbd152e74761b8d7a11fa185bc72bece8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-rpm-ostree-grub2-0.9-1.fc32.noarch.rpm" + }, + "sha256:45fc2608b746fd841dd25919e9e4d44834154758aec8fb8b529c014b11c7917d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/os-prober-1.77-4.fc32.x86_64.rpm" + }, + "sha256:4659e7b76850ce5dedbe80fb0a64947e83f15f907b35c5819d91be6ed0523653": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl3160-firmware-25.30.13.0-106.fc32.noarch.rpm" + }, + "sha256:474fd088c7e7234221d251153e9fda6081b0aa8979bf5ae25810c9862e1e9960": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-libs-1.12.16-4.fc32.x86_64.rpm" + }, + "sha256:47538b1db9720be4699329a8da32d873187d0c6c22f45252614ac5b8a8312482": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/firewalld-filesystem-0.8.2-2.fc32.noarch.rpm" + }, + "sha256:475b6de876914aec2187ac4858a13ae75585f5c4cb5d739c637f79a5ca6f05f9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/q/qemu-img-4.2.0-7.fc32.x86_64.rpm" + }, + "sha256:4819b3ce25b997d8d3e5e4e4be4ba270e8b66852576b474daf0e6d61b6e22d73": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-config-generic-050-26.git20200316.fc32.x86_64.rpm" + }, + "sha256:48cf5ab32f6af8f2283d4d4834e8dd262aa412be7ea07c2292483e150d614bef": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcc-10.0.1-0.11.fc32.x86_64.rpm" + }, + "sha256:49bac21d5cdf863fccfcc32bf070e582d204706e35ee9f60b3e69df694bff87d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-config-0.9.3-2.fc32.noarch.rpm" + }, + "sha256:4a7b63b32f176b8861f6ac7363bc8010caea0c323eaa83167227118f05603022": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-pkg-config-1.6.3-3.fc32.x86_64.rpm" + }, + "sha256:4c80ade4ac0889316930a8d181ea43fa2d1b2f1a6a5703c22f2b3ba191346eec": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pam-1.3.1-24.fc32.x86_64.rpm" + }, + "sha256:4cd01a3135b9e72906eaf4552e29929334dcccee2ed092a38bf60698522ecd5f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rng-tools-6.9-3.fc32.x86_64.rpm" + }, + "sha256:4dd6100e477d88a4987b6eebfddecff168f38c7ff47cbb12f2fecba1e87c10d9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shadow-utils-4.8.1-2.fc32.x86_64.rpm" + }, + "sha256:4eb6a2e34173a2b6ca7db031cecce56c0bed711691abf1c8d6bfe6cb7ca45dc0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmbim-utils-1.22.0-1.fc32.x86_64.rpm" + }, + "sha256:4f318cec61cb69fc233ba5505b7e24f679afdfb0b5defbaef507f1b471e7dbb5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-debuginfod-client-0.179-1.fc32.x86_64.rpm" + }, + "sha256:4f4ef59861c0566d22bd76369d22369d43130f5ccdb35a5fc2c8a236cf33651f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libndp-1.7-5.fc32.x86_64.rpm" + }, + "sha256:4fca21cfdcbed052e3e9e1eff74c22fb8ffb1fbbeb63e87e2aa540e43a8c0d09": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/v/vim-minimal-8.2.525-1.fc32.x86_64.rpm" + }, + "sha256:517ff9662e5a1897b74f4ab4fbc8a88eccaad9880bc18be9cf4df6aba9824bd5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-unbound-1.9.6-2.fc32.x86_64.rpm" + }, + "sha256:52fe378ffab317ec4d26ae5fc0389dec874002a8d70a9413cefb68c7b16b0612": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/protobuf-c-1.3.2-2.fc32.x86_64.rpm" + }, + "sha256:5323eb8d89b2d0c905a633513e04ca7df633c21eec288ee8c50f3f5170534e37": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-common-8.32-3.fc32.1.x86_64.rpm" + }, + "sha256:536a157da5332c0bdacb3e5891e3012b79b18fcdedb63b393110d6eb8b04e428": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/podman-plugins-1.8.2-2.fc32.x86_64.rpm" + }, + "sha256:53992752850779218421994f61f1589eda5d368e28d340dccaae3f67de06e7f2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-9.fc32.x86_64.rpm" + }, + "sha256:53f1e8570b175e8b58895646df6d8068a7e1f3cb1bafdde714ddd038bcf91e85": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gzip-1.10-2.fc32.x86_64.rpm" + }, + "sha256:54b740cf7a75a7215168970378d9a1d6b9a5e4eb81159a874ce8ea5990436641": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-libs-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:54cb827278ae474cbab1f05e0fbee0355bee2674d46a804f1c2b78ff80a48caa": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsemanage-3.0-3.fc32.x86_64.rpm" + }, + "sha256:55bafcdf9c31b1456af3bf584bfe7ac745a03f4decd17197ea97b498d68b3b82": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libsemanage-3.0-3.fc32.x86_64.rpm" + }, + "sha256:56187c1c980cc0680f4dbc433ed2c8507e7dc9ab00000615b63ea08c086b7ab2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-libs-27-1.fc32.x86_64.rpm" + }, + "sha256:598a136b7027cb9b4fef6bfa34715979d41c2f62c9d8bec5d50b633a17790f7b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libassuan-2.5.3-3.fc32.x86_64.rpm" + }, + "sha256:599549d72d26b48c45156585a5698898c853e56469142e202d3749b781428465": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_idmap-2.2.3-13.fc32.x86_64.rpm" + }, + "sha256:59be778afcf464d79f7dc440d6b49de8a9527fd73e7b514573d389bf8a51b246": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/criu-3.13-5.fc32.x86_64.rpm" + }, + "sha256:5a4c0187b96690e0088057f7656c67d399fad44b28b86644e3434c581377c229": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libproxy-0.4.15-17.fc32.x86_64.rpm" + }, + "sha256:5ad0d1b4e641e5d2fe7f6385ace0f827a431c5a52c6dc3516d85e655caca880f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libqmi-1.24.8-1.fc32.x86_64.rpm" + }, + "sha256:5b8a205f3d4bde162e01a821fdacbc10ebfa01b88ec61b166b4b6317c45910c4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-firmware-20200316-106.fc32.noarch.rpm" + }, + "sha256:5c91890bf33527b9fb422cbed17600e761750a4e596fad3f0d0fa419070e82b0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-1.6.3-3.fc32.x86_64.rpm" + }, + "sha256:5d520576b7ac63cb029c4b0b86398e2b71589df3bafa618018b3729d81036203": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-dracut-12-2.fc32.x86_64.rpm" + }, + "sha256:5d5c8c7e9c78e3b8827ad38771efb44951d1c3c1692cf4e07b138c1c8c42bd5b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-hmaccalc-1.1.5-2.fc32.x86_64.rpm" + }, + "sha256:5d933f9bf444d4c8732caa65e9227b27127c625840859a0453a32a5719916f48": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl2030-firmware-18.168.6.1-106.fc32.noarch.rpm" + }, + "sha256:5db7c0e949bd9172b9645237e72f6139d4ffcf14defad487262b8ad25b427daf": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-syntax-10.34-9.fc32.noarch.rpm" + }, + "sha256:5e7a16df5bdfab2acfd8ac061827ace0642f2e5521689d6b9f0812f2a6ece231": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-iot-32-1.noarch.rpm" + }, + "sha256:5f0ae954b5955c86623e68cd81ccf8505a89f260003b8a3be6a93bd76f18452c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcrypt-1.8.5-3.fc32.x86_64.rpm" + }, + "sha256:5f156c2a950699d5cb9a21349cce049b3c8bfdcc4fcc780665fe2d3103f576c1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-0.3.13-13.fc31.x86_64.rpm" + }, + "sha256:5fc2fd0cb5b6fdce1203e43d6f2df6a3098ec9522b04815d896ecedbb1489063": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glib-networking-2.64.1-1.fc32.x86_64.rpm" + }, + "sha256:605c3cf38451c6b93f331b605ab03ca611e37aa11d14a4019de61278add04f74": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/ModemManager-glib-1.12.8-1.fc32.x86_64.rpm" + }, + "sha256:60774007011889671c28158f599032f0db253c153ccae70f5e2f5840f2dc490b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-misc-2.2.0-1.fc32.noarch.rpm" + }, + "sha256:61cae80187ef2924857fdfc48a240646d23b331482cf181e7d8c661b02c15949": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-libs-1.02.171-1.fc32.x86_64.rpm" + }, + "sha256:624b9079b4a571218adced203e19bdaca1d2cf57891f9653f409dd1db92fbf86": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-12-2.fc32.x86_64.rpm" + }, + "sha256:630ad20496ff00f76764e01b9302ccbe94e3e91d76ececef88bd9e8a890b1ac3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-sign-libs-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:632aedc06003e319a1c3fa98876055fc3bd3b44c1188b44d3b7a455cef0d40e4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-dnf-4.2.19-1.fc32.noarch.rpm" + }, + "sha256:63400fedea4a6ddb8fced58d33e60560791f29cd439169998f337d09fb50a7d4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcroco-0.6.13-3.fc32.x86_64.rpm" + }, + "sha256:640afe5b9d499c9a7efc1d23cce8c54e3e3704d92eb7e7a93a048f97d1e983e1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mkpasswd-5.5.6-1.fc32.x86_64.rpm" + }, + "sha256:64567be564634937bd918d33a3f04017808d29269a5b0891a0f4d4aecad6161b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsysfs-2.1.0-28.fc32.x86_64.rpm" + }, + "sha256:64922311f45700f2f4f98d78efbdfa240987a6a2b1396ffe694d30e2b5f34ac3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libqmi-utils-1.24.8-1.fc32.x86_64.rpm" + }, + "sha256:65e0cfe367ae4d54cf8bf509cb05e063c9eb6f2fea8dadcf746cdd85adc31d88": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libattr-2.4.48-8.fc32.x86_64.rpm" + }, + "sha256:65e5209398c6b2c196cb42f3bc3f82e00af1026f623026857a9b330ec92d0330": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl100-firmware-39.31.5.1-106.fc32.noarch.rpm" + }, + "sha256:66bb5b2e99d2c74b82943fe61fe9b9a3674350b0242f69a6854ec9718dcf5e07": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_nss_idmap-2.2.3-13.fc32.x86_64.rpm" + }, + "sha256:6749bd0b96339c32b57635b69b474583b50c94e4bbaa3eb8753fa604b9d1c521": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ignition-2.2.1-3.git2d3ff58.fc32.x86_64.rpm" + }, + "sha256:6794fe48004c0403c29fc779b49f0fbea436123b96783a2df225eef2f0858795": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-10.34-9.fc32.x86_64.rpm" + }, + "sha256:684aae86de55bd42215c136777613211f596788d3b6405d8fa645fb967904354": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-targeted-3.14.5-32.fc32.noarch.rpm" + }, + "sha256:688fcc0b7ef3c48cf7d602eefd7fefae7bcad4f0dc71c9fe9432c2ce5bbd9daa": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-5.3.28-40.fc32.x86_64.rpm" + }, + "sha256:6952dfc6a8f583c9aeafb16d5d34208d7e39fd7ec8628c5aa8ccde039acbe548": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpkgconf-1.6.3-3.fc32.x86_64.rpm" + }, + "sha256:699c1a3ff311bbaa2380c085fb4f516aa08be474bed02bcd1569d0bbf5b22d07": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sssd-client-2.2.3-13.fc32.x86_64.rpm" + }, + "sha256:6a2f4706a37bc5ad229f6fdddbd70fbcf82da85ec577a8deeb455513cbedc174": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-hawkey-0.45.0-3.fc32.x86_64.rpm" + }, + "sha256:6a3282927f525629bc0aaf4090e108d33b0709d3d5b35bc442000c2837e7b9b4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iputils-20190515-5.fc32.x86_64.rpm" + }, + "sha256:6aa0c6420a03f20e18842da9de611d823580efb8f6da93a94dafb48d59c2a070": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-dbus-1.2.16-1.fc32.x86_64.rpm" + }, + "sha256:6eb95e39b9771c4dde5f9954a74cef6be90522c28c7c4aa767ebe7a9d55fcdf9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmetalink-0.1.3-10.fc32.x86_64.rpm" + }, + "sha256:6eeebf21f245bf0d6f58962dc49b6dfb51f55acb6a595c6b9cbe9628806b80a4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/curl-7.69.1-1.fc32.x86_64.rpm" + }, + "sha256:6f5f53b66f7c3bf6958f6f163788583265ff0360188620c3b0f7ddedeac3d1f4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-setools-4.3.0-1.fc32.x86_64.rpm" + }, + "sha256:6f669ae6f70cfa80917adf4ae9d5e86fbd9d31ee308a9a3408a19be3afc46f7b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tss2-1331-4.fc32.x86_64.rpm" + }, + "sha256:6fc1b9a27eeb368a98f50dba5fc514f20a5eb23f8e0ee7dd92c4051ef8b4a940": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-common-1.12.16-4.fc32.noarch.rpm" + }, + "sha256:6fe524feb38312f9c370b2190aeb42330acc9ce42f3a45e9cd05748b4aa00db2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glib2-2.64.1-1.fc32.x86_64.rpm" + }, + "sha256:7023687eb65baa56a9b4c3ffde1e439b3d41b03ac4ad35a1a1fc3903464548f7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-8.32-3.fc32.1.x86_64.rpm" + }, + "sha256:703fb5ca1651bb72d8ab58576ce3d78c9479cbb2e78ff8666ae3a3d1cd9bb0da": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/checkpolicy-3.0-3.fc32.x86_64.rpm" + }, + "sha256:705bdb96aab3a0f9d9e2ff48ead1208e2dbc1927d713d8637632af936235217b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/acl-2.2.53-5.fc32.x86_64.rpm" + }, + "sha256:70794c8537fb3cf197f051cfce3b23956d587062daf114f8480770754804f339": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-0.9-1.fc32.noarch.rpm" + }, + "sha256:724cca9919bb7b0183b030aca216d4d51de70bf35c2cc5e8325a21a52ca15ceb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-setuptools-41.6.0-2.fc32.noarch.rpm" + }, + "sha256:729fb595040f1e2e71ff0a8c1c22ebe4b7187f78b816af8e6a8d93c03fc5d844": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libusbx-1.0.23-1.fc32.x86_64.rpm" + }, + "sha256:73f6a9108f7d5ec3cd89c31dbbaa874ae28cd5cb443ef69700a1218903ee2fc4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/ca-certificates-2020.2.40-3.fc32.noarch.rpm" + }, + "sha256:750da30da0289d5e2ad9ca297dda44e5ca18dbed0c3e0d4200379bc1818c22f3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-pam-245.4-1.fc32.x86_64.rpm" + }, + "sha256:759165656ac8141b0c0ada230c258ffcd4516c4c8d132d7fbaf762cd5a5e4095": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grep-3.3-4.fc32.x86_64.rpm" + }, + "sha256:769e34caae25f05786ae53e535c6e3c64f5c548f06c422325d68598b7abb99b7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/conmon-2.0.14-1.fc32.x86_64.rpm" + }, + "sha256:78db9007c08fa51f177210e47343b8e733ce0751826abb357ca96429836588db": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-libs-245.4-1.fc32.x86_64.rpm" + }, + "sha256:78e1aa11379eec2906eedf843216f47bcbdfe4da4713d566fb44ca313c893f3f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnf-4.2.19-1.fc32.noarch.rpm" + }, + "sha256:79e22d23ba0a156b3d74ec4b0da8fd71bc632386366ade2c48006ba82074055d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl105-firmware-18.168.6.1-106.fc32.noarch.rpm" + }, + "sha256:7a525abda7230bfbc87763dfe58bf7684e385b3c78ca242a1685a589300909e9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-persistent-data-0.8.5-3.fc32.x86_64.rpm" + }, + "sha256:7a97e71cd552285ead303d07dbb6417403edf45c0a531e02cf4ebfb0efda4975": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bash-5.0.11-2.fc32.x86_64.rpm" + }, + "sha256:7bf42ff57ce2a31db0da7d6c5926552f4e51e9f25cded77bd634eb5cd35eadab": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libevent-2.1.8-8.fc32.x86_64.rpm" + }, + "sha256:7c1a229f4a36ac8b077e0514f68f311229652121528b0f8a2a7434c618276dcb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-4.4.16-1.fc32.x86_64.rpm" + }, + "sha256:7c21c21c3e3dbace06bee03fe4835ae6cb1e3ef86750ba2853f39d40dead2309": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ipset-7.6-1.fc32.x86_64.rpm" + }, + "sha256:7c7eff31251dedcc3285a8b08c1b18f7fd9ee2e07dff86ad090f45a81e19e85e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-pkla-compat-0.1-16.fc32.x86_64.rpm" + }, + "sha256:7d9bd2fe016ca8860e8fab4a430b3aae4c7b7bea55f8ccd7775ad470172e2886": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libargon2-20171227-4.fc32.x86_64.rpm" + }, + "sha256:7dd93baaf69a8004ae2cd3b9e6660b862d0b6f399d53c05a27a48a2e276ef1ee": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-setuptools-wheel-41.6.0-2.fc32.noarch.rpm" + }, + "sha256:7df4fa1a29772696d92866e890af6fbe006088f3407ed3e67b0e7867ef58d899": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pinentry-1.1.0-7.fc32.x86_64.rpm" + }, + "sha256:7dfe1e8dac6d759479ae3dfd415fdd2662bbed9ff0f4da6093279efd1bacae31": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcurl-7.69.1-1.fc32.x86_64.rpm" + }, + "sha256:7f555c600b35ba798d8c0a63e30a1a12e917231730e1a44f48161ba0fe4b5973": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sqlite-libs-3.31.1-1.fc32.x86_64.rpm" + }, + "sha256:7f6d2841ec9402ee5e57f1a46b9886935138c02005d860899f3c746c7885c7b9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-2.04-12.fc32.x86_64.rpm" + }, + "sha256:80cf220a3314f965c088e03d2b750426767db0b36b6b7c5e8059b9217ff4de6d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mozjs60-60.9.0-5.fc32.x86_64.rpm" + }, + "sha256:80d407bbc5f6bb8d95504cfdb51faaca937f6c4c08df4c4aadcd46fe703c8a57": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnf-data-4.2.19-1.fc32.noarch.rpm" + }, + "sha256:824fe37d58cadac2f23678c9eb95c29b4acb1852df97cf799e77aa7e8034b54e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgudev-232-7.fc32.x86_64.rpm" + }, + "sha256:82e0d8f1e0dccc6d18acd04b7806350343140d9c91da7a216f93167dcf650a61": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/which-2.21-19.fc32.x86_64.rpm" + }, + "sha256:83a08b7066000ebbdf8a6c5706485a19b5dfe2d492b1faaac1922e8f0c42cd0c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl6050-firmware-41.28.5.1-106.fc32.noarch.rpm" + }, + "sha256:8402d3aabfc02c16f3789f3f93338dbee2448db8a49956002b83aff5390922d9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libuuid-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:842f7a38be2e8dbb14eff3ede4091db214ebe241e1fde7a128e88c4e686b63b0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bzip2-libs-1.0.8-2.fc32.x86_64.rpm" + }, + "sha256:84702d6395a9577c1a268184f123cfd4b15bc2287f01033625ba388a34ec2338": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-libs-5.2.5-1.fc32.x86_64.rpm" + }, + "sha256:84c338b327a3fb2f6edb79caa2242804fff8c83ffa3db0d9227f55eef4107b2a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/setools-console-4.3.0-1.fc32.x86_64.rpm" + }, + "sha256:862e75c10377098a9cc50407a0395e5f3a81d14b5b6fecfb3f223325c8867829": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-2.9.6-22.fc32.x86_64.rpm" + }, + "sha256:865c7677d2664287bb4ba2874c83bc805232e1b3a02cf6ba96e047266d9ef684": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iproute-5.5.0-1.fc32.x86_64.rpm" + }, + "sha256:8677b34fa73f258b1a599d18419f6fbbb8961bb1ca2ae5b0f9abdcc4f93b319e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-1.1.5-2.fc32.x86_64.rpm" + }, + "sha256:86acbe8d77b05c1fe9bb0168443a579b1d4538f9733813db4e72e4a4a2be29e3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgusb-0.3.4-1.fc32.x86_64.rpm" + }, + "sha256:86c87a4169bdf75c6d3a2f11d3a7e20b6364b2db97c74bc7eb62b1b22bc54401": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libffi-3.1-24.fc32.x86_64.rpm" + }, + "sha256:872639e4ccb4f1c5de66d5eaa85ca673141b10e3d614b33c84ff887c228d465d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jitterentropy-2.2.0-2.fc32.x86_64.rpm" + }, + "sha256:879ba2533610771dbf3fa103fdbde878edf255b771b53aa8a170009d01446012": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fonts-filesystem-2.0.3-1.fc32.noarch.rpm" + }, + "sha256:884357540f4be2a74e608e2c7a31f2371ee3b4d29be2fe39a371c0b131d84aa6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnetfilter_conntrack-1.0.7-4.fc32.x86_64.rpm" + }, + "sha256:88d283c2d5aa96c2b0899f6bd6c0409a5d5c6fda2958e8eae19eb49c3ede58d6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl5150-firmware-8.24.2.2-106.fc32.noarch.rpm" + }, + "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libarchive-3.4.2-1.fc32.x86_64.rpm" + }, + "sha256:89f85f749bfee7d083c84845e908a3471297a3d8a75f7397903d15eb7f403297": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl6000-firmware-9.221.4.1-106.fc32.noarch.rpm" + }, + "sha256:8a03d482b5294f7452b2f9ce31ebb6aea9eefac002281c1b9152fbb1a0341987": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-glib-1.4.4-4.fc32.x86_64.rpm" + }, + "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/popt-1.16-19.fc32.x86_64.rpm" + }, + "sha256:8aa8258a1a13c1120d6c28321f618385111cb9363dae09eea2e4af481053e28b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-event-libs-1.02.171-1.fc32.x86_64.rpm" + }, + "sha256:8b148415fb6a583ef131d0ddff44f3209c30d0299fde7b20cd3ea385590927c1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-clients-8.2p1-2.fc32.x86_64.rpm" + }, + "sha256:8c560f3927e36e41657067e4bdc741fd8f3b55b497f0fc3c2331fb361ba8de8b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tpm2-tools-4.1-2.fc32.x86_64.rpm" + }, + "sha256:8df8541abd806578e43fe28a7ea2c41efbbb813866bed35fabe779274790a538": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse3-3.9.1-1.fc32.x86_64.rpm" + }, + "sha256:8df97dcfb42c1667b5d2e4150012eaf96f58eeac4f7b879e0928c8c36e3a7604": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/policycoreutils-3.0-2.fc32.x86_64.rpm" + }, + "sha256:8dfdbe51193bdcfc3db41b5b9f317f009bfab6373e6ed3c5475466b8772a85e1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnl3-3.5.0-2.fc32.x86_64.rpm" + }, + "sha256:8ee8c4bbf024b998ffb77a6b4194a2306ac21c5a6fcf70c8c81a0fbf38f7c7fc": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-firewall-0.8.2-2.fc32.noarch.rpm" + }, + "sha256:8fc2ae85f242105987d8fa7f05e4fa19358a7c81dff5fa163cf021eb6b9905e9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/expat-2.2.8-2.fc32.x86_64.rpm" + }, + "sha256:907393755387a351806ec2afff376e7491f177116caadd12f07d0fcbed796750": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fipscheck-1.5.0-8.fc32.x86_64.rpm" + }, + "sha256:90bc2171f438ffa7488a9c69cd86bb1de175807be468f285c8ca16cf8dd4a83c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tpm2-tss-2.4.0-1.fc32.x86_64.rpm" + }, + "sha256:9194788f87e4a1aa8835f1305d290cc2cd67cee6a5b1ab82643d3a068c0145b6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/y/yajl-2.1.0-14.fc32.x86_64.rpm" + }, + "sha256:929f1c5ce4775b28439a1b5726e98c38204930d5880dc6096fc56e8d3eab275f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-overlayfs-0.7.8-1.fc32.x86_64.rpm" + }, + "sha256:932a37ddd2a990a22a1ee7811d204552e8860e39a3e0c050ed618a535ae8c78c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-3.14.5-32.fc32.noarch.rpm" + }, + "sha256:933bdb4cc6e14b2ebb1ca76c14ca176c13d271a2d1e88632f237392777d11808": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre-8.44-1.fc32.x86_64.rpm" + }, + "sha256:9369d4fed30402f45705b7a5cb51b6eeefb1dabbe0942c84514c6fdf1edac5e0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-2.9.9-9.fc32.x86_64.rpm" + }, + "sha256:942707884401498938fba6e2439dc923d4e2d81f4bac205f4e73d458e9879927": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsigsegv-2.11-10.fc32.x86_64.rpm" + }, + "sha256:942d06ec1f7033ea4c729b84ee09f5491481770efe10151ba581479ac7f3f9dc": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libfdisk-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:9465f2f1103697207a52d15edd716ab72dc6c281823c60f424cd064d706c7a51": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libzstd-1.4.4-2.fc32.x86_64.rpm" + }, + "sha256:95a89032291b05a0e483f336ea29897d951e8845b0f347a4117de90ef3ef3467": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/microcode_ctl-2.1-35.fc32.x86_64.rpm" + }, + "sha256:966084f83e0fedb7a217aa102b484ac8a63082ccfe99517544ed2cb102191204": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-smime-2.2.19-1.fc32.x86_64.rpm" + }, + "sha256:96e0c019cb91d8deefb7664cfe417807d23562d2a1bfd2cbfd1051e243136b57": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/screen-4.8.0-2.fc32.x86_64.rpm" + }, + "sha256:97197411bca68cfba1ef6bab1fdd4b41c95ec71c36f1e67f525b963cf60598fd": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-rpm-macros-245.4-1.fc32.noarch.rpm" + }, + "sha256:975719a0c73cf5cb5bcbc8ad11b816ed75923dccd9c091baa4a6c6000753dcd8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jansson-2.12-5.fc32.x86_64.rpm" + }, + "sha256:9899cfd32ada2537693af30b60051da21c6264b0d0db51ba709fceb179d4c836": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gdbm-libs-1.18.1-3.fc32.x86_64.rpm" + }, + "sha256:993680d5cd133a0c21184be92b3df405d757613d0ca25c4abf08b203d8d26b79": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-050-26.git20200316.fc32.x86_64.rpm" + }, + "sha256:9976e6228a10fa2761f1265a2a7666578d79ca57819837e5d1fbecc53324f1b9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/u/util-linux-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:99f87b4ec7c5852d45028f3eae65fc813f3ef107e128777f265b09a19ce262e0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libs-0.179-1.fc32.x86_64.rpm" + }, + "sha256:9a12db30090023c60e3d7bcd5b07142cdc6d84c77e25ddb1cf41a4c490e52f09": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libedit-3.1-32.20191231cvs.fc32.x86_64.rpm" + }, + "sha256:9a2beeeede69d8910115608c2d98efa6a8dba73ab2df246df5b0f10e2fa37f54": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-event-1.02.171-1.fc32.x86_64.rpm" + }, + "sha256:9ade87dbb32f27e7f38ec981002ddc5a2189cc6f5ad5f24bada3b71cfa9167fd": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-pip-19.3.1-2.fc32.noarch.rpm" + }, + "sha256:9bd5cb588664e8427bc8bebde0cdf5e14315916624ab6b1979dde60f6eae4278": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpg-error-1.36-3.fc32.x86_64.rpm" + }, + "sha256:9c8a274158a6fe97598e33900cd51e171f7e7517ccfc8ad6351873e69b225986": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libyaml-0.2.2-3.fc32.x86_64.rpm" + }, + "sha256:9cf9b01f2c727e3576a8aa71fd7fe1bf4ec9ed1c9f50b756657cf9aeae18418f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mokutil-0.3.0-15.fc32.x86_64.rpm" + }, + "sha256:9d220d8ee28cd0adf28e8fef547af92c3ec66e238747165939cf8e1a413ddf83": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-libs-2020.1-1.fc32.x86_64.rpm" + }, + "sha256:9d4f1290565b852e56f9e9babc14b141b0283998121f78b0eb83dec367cf0abb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnutls-3.6.13-1.fc32.x86_64.rpm" + }, + "sha256:9dcc75ac945924ce496c9280e7ac31b88886d94a6494d0710725a81dd9d42c9a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/wpa_supplicant-2.9-3.fc32.x86_64.rpm" + }, + "sha256:9de8eb13fbdf8b8c5c3e04c52a890ccc5b667351ff17152786d12ffc66210433": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-gpg-1.13.1-6.fc32.x86_64.rpm" + }, + "sha256:9ebc5843faeb852bbbe3d53f03182197f6595a928ffa3f5d7a530749ee1e4ec8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodman-2.0.1-21.fc32.x86_64.rpm" + }, + "sha256:9ecc8aa9af05ba704cec879618afeda5ff92d8233811e2d6080aa02e0b5ceddf": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpwquality-1.4.2-2.fc32.x86_64.rpm" + }, + "sha256:9ee276ed9d036a4483bb8d1bd6f6d697b161a04276c6ce5f1d3f40d48e04bccb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/keyutils-1.6-4.fc32.x86_64.rpm" + }, + "sha256:9fa1959637c902dfeb19a0f16c7f42f7da4aab293f7c025c66d39debad6dbc34": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/luksmeta-9-7.fc32.x86_64.rpm" + }, + "sha256:a05178831a546e2001e52f065fc6969f36d2292efaee2971fe7a7e882cc8c813": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-2.2.0-1.fc32.x86_64.rpm" + }, + "sha256:a1835a7929d3c1613f3890caef878e9bdf857dcc0f63eb4d63a1140370b3f21b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-common-32-1.noarch.rpm" + }, + "sha256:a280c633b73517da167b91298fc97aeee2eb5fcc253c038ae0ce4b8478d3a103": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shared-mime-info-1.15-3.fc32.x86_64.rpm" + }, + "sha256:a336d2e77255df4783f52762e44efcc8d77b044a3e39c7f577d5535212848280": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/setup-2.13.6-2.fc32.noarch.rpm" + }, + "sha256:a346990bb07adca8c323a15f31b093ef6e639bde6ca84adf1a3abebc4dc9adce": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/basesystem-11-9.fc32.noarch.rpm" + }, + "sha256:a3f80bb7068618dff795b3e0a3d32fa3c640e492c8f175b16bb3c7ff64a88a8e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl7260-firmware-25.30.13.0-106.fc32.noarch.rpm" + }, + "sha256:a410db5c56d4f39f6ea71e7d5bb6d4a2bd518015d1e34f38fbc0d7bbd4e872d4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libaio-0.3.111-7.fc32.x86_64.rpm" + }, + "sha256:a4706de7a0d59f2b1e9e73f48c4279429676410c77fb93f82abf1b7b34330f82": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/adobe-source-code-pro-fonts-2.030.1.050-8.fc32.noarch.rpm" + }, + "sha256:a7452c18c2cffc266ec36c54105b884c4d63181f20cebd705e33730534cb9093": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libvarlink-util-18-3.fc32.x86_64.rpm" + }, + "sha256:a7da5590635b9c19afafc7dd247604194a5ce7d8d863dc600b8cb86accb2e469": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-pip-wheel-19.3.1-2.fc32.noarch.rpm" + }, + "sha256:a7deef0a324ccb272a25f5eb6b30c72d0a842bf2c602c31fe3b60f984b2e50af": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efibootmgr-16-7.fc32.x86_64.rpm" + }, + "sha256:a7f040de29d2414cc99fcffcd9ed3fa9d06ecc7aecd783ec3d2eef769e2389f1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxml2-2.9.10-3.fc32.x86_64.rpm" + }, + "sha256:a8ce7406c87f64972f0b70f1823c2aad05516c71fe375c6c97737459c2448825": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnghttp2-1.40.0-2.fc32.x86_64.rpm" + }, + "sha256:a9d5719cf5d4fdc4ae28099d623a751b0470264e7d2280be2669a066348b4ce1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/abattis-cantarell-fonts-0.201-2.fc32.noarch.rpm" + }, + "sha256:aa353206ef29b7d908554ccb7cd6f4c01a1f6c3c1c6358abb7452f4a745939d0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-efi-x64-2.04-12.fc32.x86_64.rpm" + }, + "sha256:aa5b658fd4a95c724b61eddadecdbcbc1b2a813ae681318ab092a2ed03954825": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodulemd1-1.8.16-2.fc32.x86_64.rpm" + }, + "sha256:aa783a91b1823b7b056575e6276df35910eb2e0d4b72121cf5649651c7d23a16": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/librepo-1.11.1-4.fc32.x86_64.rpm" + }, + "sha256:aac9be36fc9c345245b4a0db66bfb9ff8df25e36ae0c1ae89eca9bcf88e052e4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcab1-1.4-2.fc32.x86_64.rpm" + }, + "sha256:ab4c27523d6b5a0df75febac43cafa2dd9897dc3c1bb2f0d6990ca603b6168fe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse3-libs-3.9.1-1.fc32.x86_64.rpm" + }, + "sha256:ac8b1fea0b678d7630033a8900be5641b934306961b39a29c79c6d72f34f7d1c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libbrotli-1.0.7-10.fc32.x86_64.rpm" + }, + "sha256:ad50ed0c4f4c956e3b59ac9fc7bf5fba22068a661ea75a46eb81bc2209af4cc5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxmlb-0.1.14-2.fc32.x86_64.rpm" + }, + "sha256:ad6d7d9767e05978b14a39c08dba59ddc4396584576df194f77ed310a0816ae0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-libs-1.1.1d-7.fc32.x86_64.rpm" + }, + "sha256:ade8105796f5c1201a3efc8bcc654788cfc88c3815297b346845062a8c29cd59": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openldap-2.4.47-4.fc32.x86_64.rpm" + }, + "sha256:ae219ad5ecc0233271c3fd61263f817c646eecece19a8f075e7aa4dd9ff8698e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxkbcommon-0.10.0-2.fc32.x86_64.rpm" + }, + "sha256:af18c71bca1121ac3cdeace9f7249079ee0568fcbb15ca7e46131fa9b9b521f8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-libs-5.54-1.fc32.x86_64.rpm" + }, + "sha256:af62d0611b995b9f2b2c7b4d4852e03e521d66979534871ccb5a71275a15518d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-default-yama-scope-0.179-1.fc32.noarch.rpm" + }, + "sha256:af66820023c984d8b981ecac715d0c2daec1f89dcb69bed76ddf58b0ee80c1b1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_sudo-2.2.3-13.fc32.x86_64.rpm" + }, + "sha256:af992ad02594b68f17d2da41104a26aee41d02639edf22332d7dbb1fe9af58a5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/publicsuffix-list-dafsa-20190417-3.fc32.noarch.rpm" + }, + "sha256:b09015ae5fb5772b73bc7932991aaf6e1f6d509432af605a565ef53d2d50606a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsoup-2.70.0-1.fc32.x86_64.rpm" + }, + "sha256:b1111e77a5fdbacaa04acc90d3844706158bc5892173862928705620b8910adb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-audit-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm" + }, + "sha256:b13eed593b31a9cc0174774b97701c7da876f91ccdfc951b67a3134d59ccd8b5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcbor-0.5.0-7.fc32.x86_64.rpm" + }, + "sha256:b286141f38cd88b8c632515677423f49c81365f2ae99c5a7906205f35a273fb2": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl135-firmware-18.168.6.1-106.fc32.noarch.rpm" + }, + "sha256:b2e862283ac97b1d8b1ede2034ead452ac7dc4ff308593306275b1b0ae5b4102": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-6.1-15.20191109.fc32.x86_64.rpm" + }, + "sha256:b3201777d78ee13ee45ddbd982af5999ce058907b5dc552669644931b79c5f51": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpiod-utils-1.5.1-1.fc32.x86_64.rpm" + }, + "sha256:b3230630a471b806a9153669d187508350cdb2b368a68f8c439c82abad038c3f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpcap-1.9.1-3.fc32.x86_64.rpm" + }, + "sha256:b35256e417fd94c7efb1212f2f36b5e6b224ff5b9e8733774d4fbdc652078099": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtextstyle-0.20.1-4.fc32.x86_64.rpm" + }, + "sha256:b359ca3cdc68b6e5031f65975df38a8b96c19ddc4c367e1e3463fc8484a0b3b7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnet-1.1.6-19.fc32.x86_64.rpm" + }, + "sha256:b58828b2f1ce4f7778d3f511c61ee8925042b9752aea526c23d33fd7533aa975": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libuser-0.62-24.fc32.x86_64.rpm" + }, + "sha256:b60670fdcf91b50d97720f601d92277efedbd690bd887000ccd9a46b3fa8b314": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-ng-0.7.10-2.fc32.x86_64.rpm" + }, + "sha256:b67f1634acc7b84b284bda8afeef546aed4a3388dc7df67417001704aa444af1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/btrfs-progs-5.6-1.fc32.x86_64.rpm" + }, + "sha256:b70d1c93e3448b1a0b5e3f50488290283a260ff46e22bff4fb704469e6017fa8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/deltarpm-3.6.2-5.fc32.x86_64.rpm" + }, + "sha256:b743aafa82f3326f8f2e6d5464ae7fa57fabab3ad791099eaf2d151b43208b42": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efi-filesystem-4-4.fc32.noarch.rpm" + }, + "sha256:b79bb6af3e1650ba812c8affe42772ea566b164222a7d4d8e2f7efa867dc6849": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-3.8.2-2.fc32.x86_64.rpm" + }, + "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch.rpm" + }, + "sha256:b851f60332ff9e6b91bb76914c12329ce905d7fb8a9fe707f36cdbc94a549f8d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-5.6.6-300.fc32.x86_64.rpm" + }, + "sha256:b8cce19164a474c6398de4944ce41ed8c49c3469c7f019d04329284b0509c7b0": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-core-5.6.6-300.fc32.x86_64.rpm" + }, + "sha256:b8ecd7fa0e7e072828e374dfb0d61bb8eecca7c190f3661050cee5e3fc8854b4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/firewalld-0.8.2-2.fc32.noarch.rpm" + }, + "sha256:bca13571cf1452f3e41c8e89b8c64aa33d3d0f4e414571f9dde32a556591b339": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/initscripts-10.02-3.fc32.x86_64.rpm" + }, + "sha256:be7ba234b6c48717ac0f69fb5868b3caa6ef09fbfc76c42a47b367578cd19444": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/psmisc-23.3-3.fc32.x86_64.rpm" + }, + "sha256:be899d3e806441b1c46811c0ffe9f4e01f4ea4e1544f9cc32630254853e3f3a5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsolv-0.7.11-2.fc32.x86_64.rpm" + }, + "sha256:be998dfbcc9ca8e3021ac4f56ed723cfa3fa1517524e89ee0b636f623abe995f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libstdc++-10.0.1-0.11.fc32.x86_64.rpm" + }, + "sha256:bfeba60bfb137f270e3b28db96ecfe8b226ea05e1761f6cb5ccc64c48c73c748": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-5.54-1.fc32.x86_64.rpm" + }, + "sha256:c019d23ed2cb3ceb0ac9757a72c3e8b1d31f2a524b889e18049cc7d923bc9466": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nettle-3.5.1-5.fc32.x86_64.rpm" + }, + "sha256:c07fd5357963f99610bc676b25f1dfcbf1bae0b63538b5e1cd82ce42b79fd819": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bash-completion-2.8-8.fc32.noarch.rpm" + }, + "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zlib-1.2.11-21.fc32.x86_64.rpm" + }, + "sha256:c132999a3f110029cd427f7578965ad558e91374637087d5230ee11c626ebcd4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-1.02.171-1.fc32.x86_64.rpm" + }, + "sha256:c1d754773972b5f4ca157c0afa45d6767901d965a91f381660c72740d682df63": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtirpc-1.2.5-1.rc2.fc32.x86_64.rpm" + }, + "sha256:c1f957511b5e011e6f7995ed7bca9196703cf1214068f209e86b1dc4fd0e98bf": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ima-evm-utils-1.2.1-3.fc32.x86_64.rpm" + }, + "sha256:c2197913bc8db9548b0a40ffddf840a31956b18e932ad4eec77a48d87d2289ce": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-12.fc32.noarch.rpm" + }, + "sha256:c3e2a3c23288899456fb996f3074c10637bcd4886bc446698cb1efa2734c1e4d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/traceroute-2.1.0-10.fc32.x86_64.rpm" + }, + "sha256:c3f7089ae50f79cf4d2cb59e01091d33c70cab89ae08f95c547339a87404c3ec": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dosfstools-4.1-10.fc32.x86_64.rpm" + }, + "sha256:c50ff544430830086ce484b20a2b6eaa934c82b6277a6f4fb02fc8cbc9e25db7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/runc-1.0.0-144.dev.gite6555cc.fc32.x86_64.rpm" + }, + "sha256:c55b30a3a8c0d36a219953e20960185263ae63dada0f050446066be1e873ce08": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-luks-12-2.fc32.x86_64.rpm" + }, + "sha256:c574c5432197acbe08ea15c7837be7577cd0b49902a3e65227792f051d73ce5c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/alternatives-1.11-6.fc32.x86_64.rpm" + }, + "sha256:c8daa43a4504f9a4b6c106baf8a56aa0d256fc3c71bd417ea75b9c7fd830a9b7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpiod-1.5.1-1.fc32.x86_64.rpm" + }, + "sha256:c9ba05cb46a9cb52e3325ca20c457a377361abcd0e5a7dda776ba19481770467": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-atm-libs-2.5.1-26.fc32.x86_64.rpm" + }, + "sha256:c9f3d536c1fa73de90836147d15db06dc2025e84a44034bda6c66b9c4b60be58": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rootfiles-8.1-27.fc32.noarch.rpm" + }, + "sha256:caa3625b22908cf4f91faf2c281b0e7ab7d981c35ed1d761deb53b7b78d13cf8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl2000-firmware-18.168.6.1-106.fc32.noarch.rpm" + }, + "sha256:cb0c64cc81e0b384bbc9d27ffcb2a655b13c91a799aad8972264aed1767926a3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-slip-dbus-0.6.4-19.fc32.noarch.rpm" + }, + "sha256:cb4fb9b3733440ea15b3309c88d9471c4165aa7b71b4dbc5d0fb5bfcd97b2f2e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-compat-4.4.16-1.fc32.x86_64.rpm" + }, + "sha256:cbfc109588fa0e34bdc408dbb37dadf7873fb5788dd3fd8cd04c17c75f26e6db": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsmbios-2.4.2-7.fc32.x86_64.rpm" + }, + "sha256:cc1be420582afb6360f380ff301c5e3d873f69fe1f7e00e4450bf2daa40ef9ff": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-lib-0.3.13-13.fc31.x86_64.rpm" + }, + "sha256:cc3396df93ce0e8f439b83fb6b4d210903876846b0bd3a22c19c7770cf5a9050": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-2.2.19-1.fc32.x86_64.rpm" + }, + "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/keyutils-libs-1.6-4.fc32.x86_64.rpm" + }, + "sha256:ccdfb24da56aa394a64cf2f0c6ac6d15d0ebd6054686bd2ab27641a5502329be": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/podman-1.8.2-2.fc32.x86_64.rpm" + }, + "sha256:cd01ae91895e60f189106a159bb551f906a8b663110f421ad6ee83c9e008851e": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bubblewrap-0.4.1-1.fc32.x86_64.rpm" + }, + "sha256:cd5d539fd0c469f2ebae012a9a8f2ed280363c355f205edc8fc735678ac0adb8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-wwan-1.22.10-1.fc32.x86_64.rpm" + }, + "sha256:ce8c1f1ce3cb2cc0166dcaad17f35e84278ec39ea9bf232e24130d3ff3271923": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpsl-0.21.0-4.fc32.x86_64.rpm" + }, + "sha256:d027a3ff0712e3e98d7d2358f8c526fb8d143b2386c353aadcc27199cffe125b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/whois-nls-5.5.6-1.fc32.noarch.rpm" + }, + "sha256:d0e5d0104cf20c8dd332053a5903aab9b7fdadb84b35a1bfb3a6456f3399eb32": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gawk-5.0.1-7.fc32.x86_64.rpm" + }, + "sha256:d12326c38ad38354bbde510a297f68c991d0babf104f6a0a22bae3e1ae903506": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-modules-5.6.6-300.fc32.x86_64.rpm" + }, + "sha256:d1a369d501e3ce1c17d06418c9cd57c4ada551ecc3b45a581e162215e8bd77f5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gsettings-desktop-schemas-3.36.0-1.fc32.x86_64.rpm" + }, + "sha256:d1c6f183b9deaf6127db4ad7040046bd7f1aa62de177961aac39501605d2c815": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-minimal-2.04-12.fc32.x86_64.rpm" + }, + "sha256:d1e244b8b5ce7404846e97d96c762c8c18ff6447301f6fc63f50e615029aa7cd": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-server-8.2p1-2.fc32.x86_64.rpm" + }, + "sha256:d2abba1a0523bd9df5073900593ab13ec2ed2e391440be4d883314fa154370f8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-slip-0.6.4-19.fc32.noarch.rpm" + }, + "sha256:d3a64fcef3de79a97541b21c71ddd00d4cca9039c930bc660d6c5479eabf5f26": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-c-0.13.1-9.fc32.x86_64.rpm" + }, + "sha256:d439ffbe20c8c0e8244e31c0324d60cf959dc1cd6cecc575d7b34509a73e9386": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-libs-0.116-7.fc32.x86_64.rpm" + }, + "sha256:d49f0b1c8ecf9bc808ae93e9298a40fbcc124fe67c3bbdd37705b6b5d8cfdd87": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-0.116-7.fc32.x86_64.rpm" + }, + "sha256:d5acde111b4cafc918decc8b9c530c9a7dfd6cc77b75538d33b32478219ae5da": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crun-0.13-1.fc32.x86_64.rpm" + }, + "sha256:d61ea8b6299f00397f740b73de146ef4daa6d6bb5863d525459765fa0f23a991": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/wpan-tools-0.9-4.fc32.x86_64.rpm" + }, + "sha256:d65b4bb6fa49198237f9b704ec471d71dfd94b87290f4d03c1c34d12f6efeb95": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgomp-10.0.1-0.11.fc32.x86_64.rpm" + }, + "sha256:d74b76ce8c2c7306cc3f012d1ec56b1d5c67788748f56ecd505f257d342f97ee": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libbsd-0.10.0-2.fc32.x86_64.rpm" + }, + "sha256:d7b8b5815b72fb157de26579362383e357e026ae6ac2599c451fb336fe995555": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-1.1.1d-7.fc32.x86_64.rpm" + }, + "sha256:d7f57b9190c9cf05c36fe9fb3229330cdb9f0a1af1214a47b0a38dcc8ce929ee": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl5000-firmware-8.83.5.1_1-106.fc32.noarch.rpm" + }, + "sha256:d7fec1fb54953f1901cc505c225af94cb61f2206d0503be12313169a4b915e18": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jose-10-6.fc32.x86_64.rpm" + }, + "sha256:dc9c0401522bcf73fe5a692184c141b214947ad83364be97de0413ab46b712e5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-2.31-2.fc32.x86_64.rpm" + }, + "sha256:ddad78d00b09c6c85d46c06dcba4c951f7f7dfc9b2dab195bf45aa3f5a1fdc41": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsmartcols-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:de74076fc5073ad07ffa78fed6e7cd8f10133d99c1c73149b4ac74428699a6d1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmbim-1.22.0-1.fc32.x86_64.rpm" + }, + "sha256:dedd37a96262c35763ab2dcbc19838f5cc39a2a3a392a650a80bd6d5ae42ff8b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-0.23.20-1.fc32.x86_64.rpm" + }, + "sha256:def89a494acbfd6aae1fb70700dd18275ddd3050893bc962f1853499af9dd823": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/h/hostname-3.23-2.fc32.x86_64.rpm" + }, + "sha256:df0a39eb6b91c4a8f481c22445cbbd88334bf5e0a6e1dd5fb240981eb031c4eb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libseccomp-2.4.2-3.fc32.x86_64.rpm" + }, + "sha256:df174a90fd6bd3f9fae3b75433ae7f1869ff2db7102667fb243c8aede5b858d3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-wifi-1.22.10-1.fc32.x86_64.rpm" + }, + "sha256:e0b1da98020a740991dbb70b42c0ff1eece9e268a461e555a5ec763bda1645f5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-libs-5.38-2.fc32.x86_64.rpm" + }, + "sha256:e0f9c4327d62e35ee2a066c95dfa37f86021b405515d0f902b72a7437b7b98e9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cryptsetup-2.3.0-1.fc32.x86_64.rpm" + }, + "sha256:e2566356943c1c7485d206b858dd6ae3be37c28bfec2a43f869193f3b5b9cd23": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nmap-ncat-7.80-3.fc32.x86_64.rpm" + }, + "sha256:e291d6c021eaa01cc3c446b76c94aafde444936b8ba3f08a7fe7cbe66a23366b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-tools-5.6.6-300.fc32.x86_64.rpm" + }, + "sha256:e2a04f4de125ff60a3cdc3d2b3718a4530a9c9240c9cf14f55938444c229539f": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-plugin-systemd-inhibit-4.15.1-2.fc32.1.x86_64.rpm" + }, + "sha256:e2b2dddbce49fab5f01ba75fae8796ab7c9fd8280c652f78d06a2644246bd16d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/krb5-libs-1.18-1.fc32.x86_64.rpm" + }, + "sha256:e40be03bd5808e640bb5fb18196499680a7b7b1d3fce47617f987baee849c0e5": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dmidecode-3.2-5.fc32.x86_64.rpm" + }, + "sha256:e5bf9266edf112540ec662bd492ce4bda3ed8d5e33d763b9f2318c42963a1d1b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sudo-1.9.0-0.1.b4.fc32.x86_64.rpm" + }, + "sha256:e5efc87172d7081559137feaa221047385a5e248ffafd9794c2bfc73b61f8f37": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pciutils-libs-3.6.4-1.fc32.x86_64.rpm" + }, + "sha256:e712179ba8b9b6e93d14c902a6d6a390ba142153384dab9291c808a447b7ed0c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnsmasq-2.80-14.fc32.x86_64.rpm" + }, + "sha256:e740cc0a580639b887bda0039a779e750a32835be1fd8c64aa01183b4cbb98bf": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmount-2.35.1-7.fc32.x86_64.rpm" + }, + "sha256:e80533822e2a892345b869395b2c17c0bcc98d3c3c47787da30123096835db00": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-common-2.31-2.fc32.x86_64.rpm" + }, + "sha256:e851ba0019baa83e1bebbe92e1a1cf629694ccf3b42c5ff84e0ed7bea74931d3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lvm2-libs-2.03.09-1.fc32.x86_64.rpm" + }, + "sha256:e9a3ace2c71c2388ed6402e92ba148acb8d19b5c3495a47148b9e88cc6d6d1eb": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcomps-0.1.14-4.fc32.x86_64.rpm" + }, + "sha256:ea5f929563fb9ca0cf08da250c62c93d4755f4a41c1aca23eeeaf3e58e90d766": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tmux-3.0a-2.fc32.x86_64.rpm" + }, + "sha256:eaffaa8de8fd28ad124da12524a2ca5db86252404d70d66c7c42921dad6b69c1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cryptsetup-libs-2.3.0-1.fc32.x86_64.rpm" + }, + "sha256:ebbace15f986288bba7681f44a111b14bcc7cae00b7a1faadaa838bd51897357": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libfido2-1.3.1-1.fc32.x86_64.rpm" + }, + "sha256:ec12fef82d73314e3e4cb6e962f8de27e78989fa104dde0599a4480a53817647": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xkeyboard-config-2.29-1.fc32.noarch.rpm" + }, + "sha256:ec58d03c60386bfb8aed2af3d2a49f8c6e5ccb4d3fd592cf75fef3342be137c3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libs-3.8.2-2.fc32.x86_64.rpm" + }, + "sha256:ec64add7d60a70fbaf14a083929f22bd2637c33d20d2a30b7e842caa6040f817": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-2020.3-2.fc32.x86_64.rpm" + }, + "sha256:ec6abd65541b5bded814de19c9d064e6c21e3d8b424dba7cb25b2fdc52d45a2b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnfnetlink-1.0.1-17.fc32.x86_64.rpm" + }, + "sha256:ed36d759746e75a2834866fbeaa783df397f8813cae2ed79fcc4d146656bf6a6": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-1.12.16-4.fc32.x86_64.rpm" + }, + "sha256:ed84414c9b2190d3026f58db78dffd8bc3a9ad40311cb0adb8ff8e3c7c06ca60": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libverto-0.3.0-9.fc32.x86_64.rpm" + }, + "sha256:ee1681ee1ae6a3f86a876562939fbfe415ba78b0a803059e1b6d6cd63b0fa1a3": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shim-x64-15-8.x86_64.rpm" + }, + "sha256:ee664c392a97cdd272f57980c6856b2c57567005fa0ad9cb16c388b645d014f1": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-2020.1-1.fc32.x86_64.rpm" + }, + "sha256:f09047c09660bc998460f710b9ac0561b4f6028214168d4d40f2f4d99f61a94d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/audit-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm" + }, + "sha256:f1150f9e17beaef09aca0f291e10db8c3ee5566fbf4c929b7672334410fa74e9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/q/qrencode-libs-4.0.2-5.fc32.x86_64.rpm" + }, + "sha256:f14d3b113e2c3ba3f8ab7a8146439924f38487c20dd533062616f17f500ff46b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/skopeo-0.1.41-1.fc32.x86_64.rpm" + }, + "sha256:f1c79039f4c6ba0fad88590c2cb55a96489449c334a671cc18c0bf424a4548b8": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/readline-8.0-4.fc32.x86_64.rpm" + }, + "sha256:f2715fc8a04d33716f40f5b34466e082140df7ff3b7b972c29655d4dfc6e3a72": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fipscheck-lib-1.5.0-8.fc32.x86_64.rpm" + }, + "sha256:f36550dfc144e4608da672616fa44b2f2341f99bb38972e66e4a8fef4b59172c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-minimal-langpack-2.31-2.fc32.x86_64.rpm" + }, + "sha256:f3908831ae53f43b07a4e196850d0e59cc89b50c97d838538c3185fd0eb0d569": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/procps-ng-3.3.15-7.fc32.x86_64.rpm" + }, + "sha256:f3eb795f68c80ccf870f1d27f8fd019878db748c0c19275634c48cf5cea5bc46": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libelf-0.179-1.fc32.x86_64.rpm" + }, + "sha256:f4eb6d332b9aea8d8ef0a6ea8dc2b073d6bf5f2599d64f24111d8da2ee82ad48": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-libs-1.8.4-7.fc32.x86_64.rpm" + }, + "sha256:f60fc561675e41ffa2c48b229960291e2438441d5ed758c1f28cb06b5d4e4ea9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ipset-libs-7.6-1.fc32.x86_64.rpm" + }, + "sha256:f729c554ed4ac6335a548380a6f6335a332a3a2aca5321a322415a208701607d": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbxtool-8-11.fc32.x86_64.rpm" + }, + "sha256:f77cad4c497f11c5b5bd7c9a29fc1f5f5574f8443cc4496e3bd98e680b363124": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libselinux-3.0-3.fc32.x86_64.rpm" + }, + "sha256:f826f984b23d0701a1b72de5882b9c0e7bae87ef49d9edfea156654f489f8b2b": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libacl-2.2.53-5.fc32.x86_64.rpm" + }, + "sha256:f98f854a86c68b534f71e1f35852fabddbe2cbfe481b01bb15291b3363013b2a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodulemd-2.9.1-1.fc32.x86_64.rpm" + }, + "sha256:f9ccea65ecf98f4dfac65d25986d08efa62a1d1c0db9db0a061e7408d6805a1a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libutempter-1.1.6-18.fc32.x86_64.rpm" + }, + "sha256:fa08dccd7a2e38dfbab999613bdb41df2034b506d21964d0ef368af6e56c4cf9": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdnf-0.45.0-3.fc32.x86_64.rpm" + }, + "sha256:fb06aa3d8059406a23694ddafe0ef340ca627dd68bf3f351f094de58ef30fb2c": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libunistring-0.9.10-7.fc32.x86_64.rpm" + }, + "sha256:fbaf44214a3e93d4bdccb1519768849db5ea204c886df851b49f107e0c443e4a": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-grub2-0.9-1.fc32.noarch.rpm" + }, + "sha256:fbb81a7811f7a11b1c95eec20c3df63beef9e007f0b3d2713f13ad80029d7249": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kpartx-0.8.2-3.fc32.x86_64.rpm" + }, + "sha256:fc8a8027325828861bae0c41d2582d61f8cb4b9ed42a50e49c57939eabcad1b7": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/ModemManager-1.12.8-1.fc32.x86_64.rpm" + }, + "sha256:fd2a2dd726d855f877296227fb351883d647df28b1b0085f525d87df622d49e4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-libnm-1.22.10-1.fc32.x86_64.rpm" + }, + "sha256:fdb9bc612957a16fc44b717605a5a26e16a33850c0ff74a80a299cc2bab740e4": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-libs-0.20.1-4.fc32.x86_64.rpm" + }, + "sha256:fefa4162a563eba24714ac43874c508d1ba036afb5127c5d21bbcbeaf238a740": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cyrus-sasl-lib-2.1.27-4.fc32.x86_64.rpm" + }, + "sha256:ff44071d53a2ed543c2ddad99cca8fc25493cbefc5d7ad869f9b6dbda340a465": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libjose-10-6.fc32.x86_64.rpm" + }, + "sha256:ff5dd4d0c157cf1be9c8dbddce06640c67b2d02ae5a48d6b108bd70fc5c96211": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fwupd-1.3.9-2.fc32.x86_64.rpm" + }, + "sha256:ffe5076b9018efdb1612c487f637af39ab6c3c79ec37311978935cfa357ecd61": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sed-4.5-5.fc32.x86_64.rpm" + } + } + } + }, + "pipeline": { + "build": { + "pipeline": { + "stages": [ + { + "name": "org.osbuild.rpm", + "options": { + "gpgkeys": [ + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n" + ], + "packages": [ + { + "checksum": "sha256:705bdb96aab3a0f9d9e2ff48ead1208e2dbc1927d713d8637632af936235217b", + "check_gpg": true + }, + { + "checksum": "sha256:c574c5432197acbe08ea15c7837be7577cd0b49902a3e65227792f051d73ce5c", + "check_gpg": true + }, + { + "checksum": "sha256:22d311f22902d592f72bd0fb4010a682f796e5a4698d5ea209848468a2d5aa96", + "check_gpg": true + }, + { + "checksum": "sha256:a346990bb07adca8c323a15f31b093ef6e639bde6ca84adf1a3abebc4dc9adce", + "check_gpg": true + }, + { + "checksum": "sha256:7a97e71cd552285ead303d07dbb6417403edf45c0a531e02cf4ebfb0efda4975", + "check_gpg": true + }, + { + "checksum": "sha256:cd01ae91895e60f189106a159bb551f906a8b663110f421ad6ee83c9e008851e", + "check_gpg": true + }, + { + "checksum": "sha256:842f7a38be2e8dbb14eff3ede4091db214ebe241e1fde7a128e88c4e686b63b0", + "check_gpg": true + }, + { + "checksum": "sha256:73f6a9108f7d5ec3cd89c31dbbaa874ae28cd5cb443ef69700a1218903ee2fc4", + "check_gpg": true + }, + { + "checksum": "sha256:7023687eb65baa56a9b4c3ffde1e439b3d41b03ac4ad35a1a1fc3903464548f7", + "check_gpg": true + }, + { + "checksum": "sha256:5323eb8d89b2d0c905a633513e04ca7df633c21eec288ee8c50f3f5170534e37", + "check_gpg": true + }, + { + "checksum": "sha256:116b9d121fad9886f245cd5e1ef678fdba889cd23a39e91447e75649214a6a8d", + "check_gpg": true + }, + { + "checksum": "sha256:862e75c10377098a9cc50407a0395e5f3a81d14b5b6fecfb3f223325c8867829", + "check_gpg": true + }, + { + "checksum": "sha256:1aee865249b031e591a5e94d62d05b69ad1a6118a26adccf2dfd46b0002716e5", + "check_gpg": true + }, + { + "checksum": "sha256:3f8dcae27ad3609b7de298d0ca8d34a2790b9898f5f1b03f3f9f8784374e307b", + "check_gpg": true + }, + { + "checksum": "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b", + "check_gpg": true + }, + { + "checksum": "sha256:eaffaa8de8fd28ad124da12524a2ca5db86252404d70d66c7c42921dad6b69c1", + "check_gpg": true + }, + { + "checksum": "sha256:6eeebf21f245bf0d6f58962dc49b6dfb51f55acb6a595c6b9cbe9628806b80a4", + "check_gpg": true + }, + { + "checksum": "sha256:fefa4162a563eba24714ac43874c508d1ba036afb5127c5d21bbcbeaf238a740", + "check_gpg": true + }, + { + "checksum": "sha256:ed36d759746e75a2834866fbeaa783df397f8813cae2ed79fcc4d146656bf6a6", + "check_gpg": true + }, + { + "checksum": "sha256:213c17fb822ffa50fad16989ed363aa023de106c6262ccc3f16e52a154b7133f", + "check_gpg": true + }, + { + "checksum": "sha256:6fc1b9a27eeb368a98f50dba5fc514f20a5eb23f8e0ee7dd92c4051ef8b4a940", + "check_gpg": true + }, + { + "checksum": "sha256:474fd088c7e7234221d251153e9fda6081b0aa8979bf5ae25810c9862e1e9960", + "check_gpg": true + }, + { + "checksum": "sha256:b70d1c93e3448b1a0b5e3f50488290283a260ff46e22bff4fb704469e6017fa8", + "check_gpg": true + }, + { + "checksum": "sha256:c132999a3f110029cd427f7578965ad558e91374637087d5230ee11c626ebcd4", + "check_gpg": true + }, + { + "checksum": "sha256:61cae80187ef2924857fdfc48a240646d23b331482cf181e7d8c661b02c15949", + "check_gpg": true + }, + { + "checksum": "sha256:187dd61be71efcca6adf9819a523d432217abb335afcb2b95ef27b72928aff4b", + "check_gpg": true + }, + { + "checksum": "sha256:78e1aa11379eec2906eedf843216f47bcbdfe4da4713d566fb44ca313c893f3f", + "check_gpg": true + }, + { + "checksum": "sha256:80d407bbc5f6bb8d95504cfdb51faaca937f6c4c08df4c4aadcd46fe703c8a57", + "check_gpg": true + }, + { + "checksum": "sha256:c3f7089ae50f79cf4d2cb59e01091d33c70cab89ae08f95c547339a87404c3ec", + "check_gpg": true + }, + { + "checksum": "sha256:993680d5cd133a0c21184be92b3df405d757613d0ca25c4abf08b203d8d26b79", + "check_gpg": true + }, + { + "checksum": "sha256:2fa5e252441852dae918b522a2ff3f46a5bbee4ce8936e06702bf65f57d7ff99", + "check_gpg": true + }, + { + "checksum": "sha256:26db62c2bc52c3eee5f3039cdbdf19498f675d0f45aec0c2a1c61c635f01479e", + "check_gpg": true + }, + { + "checksum": "sha256:4f318cec61cb69fc233ba5505b7e24f679afdfb0b5defbaef507f1b471e7dbb5", + "check_gpg": true + }, + { + "checksum": "sha256:af62d0611b995b9f2b2c7b4d4852e03e521d66979534871ccb5a71275a15518d", + "check_gpg": true + }, + { + "checksum": "sha256:f3eb795f68c80ccf870f1d27f8fd019878db748c0c19275634c48cf5cea5bc46", + "check_gpg": true + }, + { + "checksum": "sha256:99f87b4ec7c5852d45028f3eae65fc813f3ef107e128777f265b09a19ce262e0", + "check_gpg": true + }, + { + "checksum": "sha256:8fc2ae85f242105987d8fa7f05e4fa19358a7c81dff5fa163cf021eb6b9905e9", + "check_gpg": true + }, + { + "checksum": "sha256:09fea9af8b695af862b19c1a8fbe1b1e8854257825ee4f663f67b3782a75d58a", + "check_gpg": true + }, + { + "checksum": "sha256:1f2ba0fc562864ad1bea31a42da124030fc188d23a84d144be616c2d066e1531", + "check_gpg": true + }, + { + "checksum": "sha256:a1835a7929d3c1613f3890caef878e9bdf857dcc0f63eb4d63a1140370b3f21b", + "check_gpg": true + }, + { + "checksum": "sha256:21e3fd914a3bcc65b79de022782967903c55a4aed9a3c7d3464bc2fef32d02b3", + "check_gpg": true + }, + { + "checksum": "sha256:28656826cb0dfbae9b6e8d1e5c5691773d84000493c4be47f727092fec6dc6f4", + "check_gpg": true + }, + { + "checksum": "sha256:e0b1da98020a740991dbb70b42c0ff1eece9e268a461e555a5ec763bda1645f5", + "check_gpg": true + }, + { + "checksum": "sha256:1110261787146443e089955912255d99daf7ba042c3743e13648a9eb3d80ceb4", + "check_gpg": true + }, + { + "checksum": "sha256:0b7cd6f6cb3b7cd9e0704dd6c62b65254b04cb870ab638b9bed4951564436e24", + "check_gpg": true + }, + { + "checksum": "sha256:9369d4fed30402f45705b7a5cb51b6eeefb1dabbe0942c84514c6fdf1edac5e0", + "check_gpg": true + }, + { + "checksum": "sha256:45132e53c649def28d63c199d8c3a3b9fd16fa8bca7426ad4e9c202e52a233b4", + "check_gpg": true + }, + { + "checksum": "sha256:53992752850779218421994f61f1589eda5d368e28d340dccaae3f67de06e7f2", + "check_gpg": true + }, + { + "checksum": "sha256:d0e5d0104cf20c8dd332053a5903aab9b7fdadb84b35a1bfb3a6456f3399eb32", + "check_gpg": true + }, + { + "checksum": "sha256:9899cfd32ada2537693af30b60051da21c6264b0d0db51ba709fceb179d4c836", + "check_gpg": true + }, + { + "checksum": "sha256:349af433b2f6d45ff2e1ea5a38f847ec692fef0a8dd656a9a07d423a981946d0", + "check_gpg": true + }, + { + "checksum": "sha256:fdb9bc612957a16fc44b717605a5a26e16a33850c0ff74a80a299cc2bab740e4", + "check_gpg": true + }, + { + "checksum": "sha256:6fe524feb38312f9c370b2190aeb42330acc9ce42f3a45e9cd05748b4aa00db2", + "check_gpg": true + }, + { + "checksum": "sha256:dc9c0401522bcf73fe5a692184c141b214947ad83364be97de0413ab46b712e5", + "check_gpg": true + }, + { + "checksum": "sha256:129d919e55c09edecaa8edd0fd4058dbf7460aaae5d1c5625ca11f6df7defefe", + "check_gpg": true + }, + { + "checksum": "sha256:e80533822e2a892345b869395b2c17c0bcc98d3c3c47787da30123096835db00", + "check_gpg": true + }, + { + "checksum": "sha256:178e4470a6dfca84ec133932606737bfe167094560bf473940504c511354ddc9", + "check_gpg": true + }, + { + "checksum": "sha256:cc3396df93ce0e8f439b83fb6b4d210903876846b0bd3a22c19c7770cf5a9050", + "check_gpg": true + }, + { + "checksum": "sha256:966084f83e0fedb7a217aa102b484ac8a63082ccfe99517544ed2cb102191204", + "check_gpg": true + }, + { + "checksum": "sha256:9d4f1290565b852e56f9e9babc14b141b0283998121f78b0eb83dec367cf0abb", + "check_gpg": true + }, + { + "checksum": "sha256:13a0c9c767f71164cc678ee36d89b7fddcdd6fb8243e3daf8b47cca0d1d14c4f", + "check_gpg": true + }, + { + "checksum": "sha256:759165656ac8141b0c0ada230c258ffcd4516c4c8d132d7fbaf762cd5a5e4095", + "check_gpg": true + }, + { + "checksum": "sha256:01173d218dccdf88c1159bba4af332ce703fc0dcd7171cd279cb3e16f12b30a9", + "check_gpg": true + }, + { + "checksum": "sha256:110f538d82f15f009d95e89d8c1e3669dc7358feb9aa7724301fef037f8b67fe", + "check_gpg": true + }, + { + "checksum": "sha256:c2197913bc8db9548b0a40ffddf840a31956b18e932ad4eec77a48d87d2289ce", + "check_gpg": true + }, + { + "checksum": "sha256:7f6d2841ec9402ee5e57f1a46b9886935138c02005d860899f3c746c7885c7b9", + "check_gpg": true + }, + { + "checksum": "sha256:d1c6f183b9deaf6127db4ad7040046bd7f1aa62de177961aac39501605d2c815", + "check_gpg": true + }, + { + "checksum": "sha256:53f1e8570b175e8b58895646df6d8068a7e1f3cb1bafdde714ddd038bcf91e85", + "check_gpg": true + }, + { + "checksum": "sha256:c1f957511b5e011e6f7995ed7bca9196703cf1214068f209e86b1dc4fd0e98bf", + "check_gpg": true + }, + { + "checksum": "sha256:f4eb6d332b9aea8d8ef0a6ea8dc2b073d6bf5f2599d64f24111d8da2ee82ad48", + "check_gpg": true + }, + { + "checksum": "sha256:d3a64fcef3de79a97541b21c71ddd00d4cca9039c930bc660d6c5479eabf5f26", + "check_gpg": true + }, + { + "checksum": "sha256:8a03d482b5294f7452b2f9ce31ebb6aea9eefac002281c1b9152fbb1a0341987", + "check_gpg": true + }, + { + "checksum": "sha256:a05178831a546e2001e52f065fc6969f36d2292efaee2971fe7a7e882cc8c813", + "check_gpg": true + }, + { + "checksum": "sha256:3be681b78e919bfd82eb186c7393718f1d37abd0b1bb8b1a8571aefa11e7a248", + "check_gpg": true + }, + { + "checksum": "sha256:60774007011889671c28158f599032f0db253c153ccae70f5e2f5840f2dc490b", + "check_gpg": true + }, + { + "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", + "check_gpg": true + }, + { + "checksum": "sha256:3f9c95f3827b785f49ac4a270d4c3a703dceba673c452838744ec5064cf43cbd", + "check_gpg": true + }, + { + "checksum": "sha256:56187c1c980cc0680f4dbc433ed2c8507e7dc9ab00000615b63ea08c086b7ab2", + "check_gpg": true + }, + { + "checksum": "sha256:fbb81a7811f7a11b1c95eec20c3df63beef9e007f0b3d2713f13ad80029d7249", + "check_gpg": true + }, + { + "checksum": "sha256:e2b2dddbce49fab5f01ba75fae8796ab7c9fd8280c652f78d06a2644246bd16d", + "check_gpg": true + }, + { + "checksum": "sha256:f826f984b23d0701a1b72de5882b9c0e7bae87ef49d9edfea156654f489f8b2b", + "check_gpg": true + }, + { + "checksum": "sha256:a410db5c56d4f39f6ea71e7d5bb6d4a2bd518015d1e34f38fbc0d7bbd4e872d4", + "check_gpg": true + }, + { + "checksum": "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58", + "check_gpg": true + }, + { + "checksum": "sha256:7d9bd2fe016ca8860e8fab4a430b3aae4c7b7bea55f8ccd7775ad470172e2886", + "check_gpg": true + }, + { + "checksum": "sha256:598a136b7027cb9b4fef6bfa34715979d41c2f62c9d8bec5d50b633a17790f7b", + "check_gpg": true + }, + { + "checksum": "sha256:65e0cfe367ae4d54cf8bf509cb05e063c9eb6f2fea8dadcf746cdd85adc31d88", + "check_gpg": true + }, + { + "checksum": "sha256:1830b4aa42ef492c13b62f63fe941970869ba19bd9abde4dea5c97f9e38ffd68", + "check_gpg": true + }, + { + "checksum": "sha256:ac8b1fea0b678d7630033a8900be5641b934306961b39a29c79c6d72f34f7d1c", + "check_gpg": true + }, + { + "checksum": "sha256:1bc0542cf8a3746d0fe25c397a93c8206963f1f287246c6fb864eedfc9ffa4a7", + "check_gpg": true + }, + { + "checksum": "sha256:b60670fdcf91b50d97720f601d92277efedbd690bd887000ccd9a46b3fa8b314", + "check_gpg": true + }, + { + "checksum": "sha256:4494013eac1ad337673f084242aa8ebffb4a149243475b448bee9266401f2896", + "check_gpg": true + }, + { + "checksum": "sha256:e9a3ace2c71c2388ed6402e92ba148acb8d19b5c3495a47148b9e88cc6d6d1eb", + "check_gpg": true + }, + { + "checksum": "sha256:63400fedea4a6ddb8fced58d33e60560791f29cd439169998f337d09fb50a7d4", + "check_gpg": true + }, + { + "checksum": "sha256:7dfe1e8dac6d759479ae3dfd415fdd2662bbed9ff0f4da6093279efd1bacae31", + "check_gpg": true + }, + { + "checksum": "sha256:688fcc0b7ef3c48cf7d602eefd7fefae7bcad4f0dc71c9fe9432c2ce5bbd9daa", + "check_gpg": true + }, + { + "checksum": "sha256:431d836b2be015212d8c15b4290d5ce5bb45282cbf3fc52696f632d84ce34dfe", + "check_gpg": true + }, + { + "checksum": "sha256:fa08dccd7a2e38dfbab999613bdb41df2034b506d21964d0ef368af6e56c4cf9", + "check_gpg": true + }, + { + "checksum": "sha256:7bf42ff57ce2a31db0da7d6c5926552f4e51e9f25cded77bd634eb5cd35eadab", + "check_gpg": true + }, + { + "checksum": "sha256:942d06ec1f7033ea4c729b84ee09f5491481770efe10151ba581479ac7f3f9dc", + "check_gpg": true + }, + { + "checksum": "sha256:86c87a4169bdf75c6d3a2f11d3a7e20b6364b2db97c74bc7eb62b1b22bc54401", + "check_gpg": true + }, + { + "checksum": "sha256:48cf5ab32f6af8f2283d4d4834e8dd262aa412be7ea07c2292483e150d614bef", + "check_gpg": true + }, + { + "checksum": "sha256:5f0ae954b5955c86623e68cd81ccf8505a89f260003b8a3be6a93bd76f18452c", + "check_gpg": true + }, + { + "checksum": "sha256:d65b4bb6fa49198237f9b704ec471d71dfd94b87290f4d03c1c34d12f6efeb95", + "check_gpg": true + }, + { + "checksum": "sha256:9bd5cb588664e8427bc8bebde0cdf5e14315916624ab6b1979dde60f6eae4278", + "check_gpg": true + }, + { + "checksum": "sha256:20787251df57a108bbf9c40e30f041b71ac36c8a10900fb699e574ee7e259bf2", + "check_gpg": true + }, + { + "checksum": "sha256:8677b34fa73f258b1a599d18419f6fbbb8961bb1ca2ae5b0f9abdcc4f93b319e", + "check_gpg": true + }, + { + "checksum": "sha256:5d5c8c7e9c78e3b8827ad38771efb44951d1c3c1692cf4e07b138c1c8c42bd5b", + "check_gpg": true + }, + { + "checksum": "sha256:1b05dd5abad5a31380c859bc33e7851158c24333fda837ca9facf869005f81fe", + "check_gpg": true + }, + { + "checksum": "sha256:6eb95e39b9771c4dde5f9954a74cef6be90522c28c7c4aa767ebe7a9d55fcdf9", + "check_gpg": true + }, + { + "checksum": "sha256:1c68255945533ed4e3368125bc46e19f3fe348d7ec507a85a35038dbb976003f", + "check_gpg": true + }, + { + "checksum": "sha256:f98f854a86c68b534f71e1f35852fabddbe2cbfe481b01bb15291b3363013b2a", + "check_gpg": true + }, + { + "checksum": "sha256:aa5b658fd4a95c724b61eddadecdbcbc1b2a813ae681318ab092a2ed03954825", + "check_gpg": true + }, + { + "checksum": "sha256:e740cc0a580639b887bda0039a779e750a32835be1fd8c64aa01183b4cbb98bf", + "check_gpg": true + }, + { + "checksum": "sha256:884357540f4be2a74e608e2c7a31f2371ee3b4d29be2fe39a371c0b131d84aa6", + "check_gpg": true + }, + { + "checksum": "sha256:ec6abd65541b5bded814de19c9d064e6c21e3d8b424dba7cb25b2fdc52d45a2b", + "check_gpg": true + }, + { + "checksum": "sha256:a8ce7406c87f64972f0b70f1823c2aad05516c71fe375c6c97737459c2448825", + "check_gpg": true + }, + { + "checksum": "sha256:3b4ce7fc4e2778758881feedf6ea19b65e99aa3672e19a7dd62977efe3b910b9", + "check_gpg": true + }, + { + "checksum": "sha256:b3230630a471b806a9153669d187508350cdb2b368a68f8c439c82abad038c3f", + "check_gpg": true + }, + { + "checksum": "sha256:ce8c1f1ce3cb2cc0166dcaad17f35e84278ec39ea9bf232e24130d3ff3271923", + "check_gpg": true + }, + { + "checksum": "sha256:9ecc8aa9af05ba704cec879618afeda5ff92d8233811e2d6080aa02e0b5ceddf", + "check_gpg": true + }, + { + "checksum": "sha256:aa783a91b1823b7b056575e6276df35910eb2e0d4b72121cf5649651c7d23a16", + "check_gpg": true + }, + { + "checksum": "sha256:3d33c29bcc4a39be16d6647a70a0d7ae2f08baf26dcea5c802289df1128d5f21", + "check_gpg": true + }, + { + "checksum": "sha256:df0a39eb6b91c4a8f481c22445cbbd88334bf5e0a6e1dd5fb240981eb031c4eb", + "check_gpg": true + }, + { + "checksum": "sha256:251fd875421da4708b76c15c7f5ba478d50b74d7e4242071a621625eac51a767", + "check_gpg": true + }, + { + "checksum": "sha256:0e59b422e35eee975ba68e6e4de022c8f145feec7e169e86e0244d2fdad2f590", + "check_gpg": true + }, + { + "checksum": "sha256:1446032720fb8e0090190828fcea294a86fc7f83edd70f6089e3446770ba0438", + "check_gpg": true + }, + { + "checksum": "sha256:54cb827278ae474cbab1f05e0fbee0355bee2674d46a804f1c2b78ff80a48caa", + "check_gpg": true + }, + { + "checksum": "sha256:29e2b62e9e63f25139a6863c863c3b534660440d7dec0c985807302a6895dbaf", + "check_gpg": true + }, + { + "checksum": "sha256:942707884401498938fba6e2439dc923d4e2d81f4bac205f4e73d458e9879927", + "check_gpg": true + }, + { + "checksum": "sha256:ddad78d00b09c6c85d46c06dcba4c951f7f7dfc9b2dab195bf45aa3f5a1fdc41", + "check_gpg": true + }, + { + "checksum": "sha256:be899d3e806441b1c46811c0ffe9f4e01f4ea4e1544f9cc32630254853e3f3a5", + "check_gpg": true + }, + { + "checksum": "sha256:27701cda24f5f6386e0173745aabc4f6df28052975e73529854432c35399cfc8", + "check_gpg": true + }, + { + "checksum": "sha256:32f8cbb3be91f589d569a2e737130f29c752f78eebc61e287af17f207e1b8c58", + "check_gpg": true + }, + { + "checksum": "sha256:49bac21d5cdf863fccfcc32bf070e582d204706e35ee9f60b3e69df694bff87d", + "check_gpg": true + }, + { + "checksum": "sha256:be998dfbcc9ca8e3021ac4f56ed723cfa3fa1517524e89ee0b636f623abe995f", + "check_gpg": true + }, + { + "checksum": "sha256:052d04c9a6697c6e5aa546546ae5058d547fc4a4f474d2805a3e45dbf69193c6", + "check_gpg": true + }, + { + "checksum": "sha256:b35256e417fd94c7efb1212f2f36b5e6b224ff5b9e8733774d4fbdc652078099", + "check_gpg": true + }, + { + "checksum": "sha256:c1d754773972b5f4ca157c0afa45d6767901d965a91f381660c72740d682df63", + "check_gpg": true + }, + { + "checksum": "sha256:fb06aa3d8059406a23694ddafe0ef340ca627dd68bf3f351f094de58ef30fb2c", + "check_gpg": true + }, + { + "checksum": "sha256:729fb595040f1e2e71ff0a8c1c22ebe4b7187f78b816af8e6a8d93c03fc5d844", + "check_gpg": true + }, + { + "checksum": "sha256:f9ccea65ecf98f4dfac65d25986d08efa62a1d1c0db9db0a061e7408d6805a1a", + "check_gpg": true + }, + { + "checksum": "sha256:8402d3aabfc02c16f3789f3f93338dbee2448db8a49956002b83aff5390922d9", + "check_gpg": true + }, + { + "checksum": "sha256:ed84414c9b2190d3026f58db78dffd8bc3a9ad40311cb0adb8ff8e3c7c06ca60", + "check_gpg": true + }, + { + "checksum": "sha256:7c1a229f4a36ac8b077e0514f68f311229652121528b0f8a2a7434c618276dcb", + "check_gpg": true + }, + { + "checksum": "sha256:cb4fb9b3733440ea15b3309c88d9471c4165aa7b71b4dbc5d0fb5bfcd97b2f2e", + "check_gpg": true + }, + { + "checksum": "sha256:ae219ad5ecc0233271c3fd61263f817c646eecece19a8f075e7aa4dd9ff8698e", + "check_gpg": true + }, + { + "checksum": "sha256:a7f040de29d2414cc99fcffcd9ed3fa9d06ecc7aecd783ec3d2eef769e2389f1", + "check_gpg": true + }, + { + "checksum": "sha256:9c8a274158a6fe97598e33900cd51e171f7e7517ccfc8ad6351873e69b225986", + "check_gpg": true + }, + { + "checksum": "sha256:9465f2f1103697207a52d15edd716ab72dc6c281823c60f424cd064d706c7a51", + "check_gpg": true + }, + { + "checksum": "sha256:10883ce95852cc9ae9b4e0d435b100a25f8fe5c0ea4677eb4a0b39f4f8def886", + "check_gpg": true + }, + { + "checksum": "sha256:44cfb58b368fba586981aa838a7f3974ac1d66d2b3b695f88d7b1d2e9c81a0b6", + "check_gpg": true + }, + { + "checksum": "sha256:640afe5b9d499c9a7efc1d23cce8c54e3e3704d92eb7e7a93a048f97d1e983e1", + "check_gpg": true + }, + { + "checksum": "sha256:2b098bc6f8004270ee9eac9f63980b364b5fe19394dc73a230b3c846cf488b1b", + "check_gpg": true + }, + { + "checksum": "sha256:b2e862283ac97b1d8b1ede2034ead452ac7dc4ff308593306275b1b0ae5b4102", + "check_gpg": true + }, + { + "checksum": "sha256:25fc5d288536e1973436da38357690575ed58e03e17ca48d2b3840364f830659", + "check_gpg": true + }, + { + "checksum": "sha256:04152a3a608d022a58830c0e3dac0818e2c060469b0f41d8d731f659981a4464", + "check_gpg": true + }, + { + "checksum": "sha256:c019d23ed2cb3ceb0ac9757a72c3e8b1d31f2a524b889e18049cc7d923bc9466", + "check_gpg": true + }, + { + "checksum": "sha256:3c2a641f118ab2e8b08df6dd2da72a60121d02df8d932b4afa2920eb80392875", + "check_gpg": true + }, + { + "checksum": "sha256:ade8105796f5c1201a3efc8bcc654788cfc88c3815297b346845062a8c29cd59", + "check_gpg": true + }, + { + "checksum": "sha256:d7b8b5815b72fb157de26579362383e357e026ae6ac2599c451fb336fe995555", + "check_gpg": true + }, + { + "checksum": "sha256:ad6d7d9767e05978b14a39c08dba59ddc4396584576df194f77ed310a0816ae0", + "check_gpg": true + }, + { + "checksum": "sha256:3f2cb9092d6f55f84dd9eacd5359dfb354772e5f38308328027c7758f4a06fb6", + "check_gpg": true + }, + { + "checksum": "sha256:45fc2608b746fd841dd25919e9e4d44834154758aec8fb8b529c014b11c7917d", + "check_gpg": true + }, + { + "checksum": "sha256:ec64add7d60a70fbaf14a083929f22bd2637c33d20d2a30b7e842caa6040f817", + "check_gpg": true + }, + { + "checksum": "sha256:3343d9e7c90bd58e1e44ee07e7c59bb570ffc74da50f0607c5f5681a00b70e76", + "check_gpg": true + }, + { + "checksum": "sha256:dedd37a96262c35763ab2dcbc19838f5cc39a2a3a392a650a80bd6d5ae42ff8b", + "check_gpg": true + }, + { + "checksum": "sha256:3589b982ac0c2f5f6b47cde5cb7ec33c2c01d756dabf8c4ca64f6d9d0d78b35e", + "check_gpg": true + }, + { + "checksum": "sha256:4c80ade4ac0889316930a8d181ea43fa2d1b2f1a6a5703c22f2b3ba191346eec", + "check_gpg": true + }, + { + "checksum": "sha256:933bdb4cc6e14b2ebb1ca76c14ca176c13d271a2d1e88632f237392777d11808", + "check_gpg": true + }, + { + "checksum": "sha256:6794fe48004c0403c29fc779b49f0fbea436123b96783a2df225eef2f0858795", + "check_gpg": true + }, + { + "checksum": "sha256:5db7c0e949bd9172b9645237e72f6139d4ffcf14defad487262b8ad25b427daf", + "check_gpg": true + }, + { + "checksum": "sha256:15f08ce979e48fd25be5e16d63d1c95c57f9abff7704005137ea00b958442939", + "check_gpg": true + }, + { + "checksum": "sha256:7df4fa1a29772696d92866e890af6fbe006088f3407ed3e67b0e7867ef58d899", + "check_gpg": true + }, + { + "checksum": "sha256:8df97dcfb42c1667b5d2e4150012eaf96f58eeac4f7b879e0928c8c36e3a7604", + "check_gpg": true + }, + { + "checksum": "sha256:d439ffbe20c8c0e8244e31c0324d60cf959dc1cd6cecc575d7b34509a73e9386", + "check_gpg": true + }, + { + "checksum": "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4", + "check_gpg": true + }, + { + "checksum": "sha256:f3908831ae53f43b07a4e196850d0e59cc89b50c97d838538c3185fd0eb0d569", + "check_gpg": true + }, + { + "checksum": "sha256:af992ad02594b68f17d2da41104a26aee41d02639edf22332d7dbb1fe9af58a5", + "check_gpg": true + }, + { + "checksum": "sha256:a7da5590635b9c19afafc7dd247604194a5ce7d8d863dc600b8cb86accb2e469", + "check_gpg": true + }, + { + "checksum": "sha256:7dd93baaf69a8004ae2cd3b9e6660b862d0b6f399d53c05a27a48a2e276ef1ee", + "check_gpg": true + }, + { + "checksum": "sha256:0b290954bc2868b3dfc976b2b7a13ea8aeade76eeafc17674ff8e721049a5bf7", + "check_gpg": true + }, + { + "checksum": "sha256:b79bb6af3e1650ba812c8affe42772ea566b164222a7d4d8e2f7efa867dc6849", + "check_gpg": true + }, + { + "checksum": "sha256:632aedc06003e319a1c3fa98876055fc3bd3b44c1188b44d3b7a455cef0d40e4", + "check_gpg": true + }, + { + "checksum": "sha256:9de8eb13fbdf8b8c5c3e04c52a890ccc5b667351ff17152786d12ffc66210433", + "check_gpg": true + }, + { + "checksum": "sha256:6a2f4706a37bc5ad229f6fdddbd70fbcf82da85ec577a8deeb455513cbedc174", + "check_gpg": true + }, + { + "checksum": "sha256:0d9d80adb91ccc8eed62bea68b23da5edb77675b1ec93227e2179d028449a2f7", + "check_gpg": true + }, + { + "checksum": "sha256:44fabecae31a5900fe10837863ed231303f6863bd9fa5efa40a93a0fc059344f", + "check_gpg": true + }, + { + "checksum": "sha256:ec58d03c60386bfb8aed2af3d2a49f8c6e5ccb4d3fd592cf75fef3342be137c3", + "check_gpg": true + }, + { + "checksum": "sha256:9ade87dbb32f27e7f38ec981002ddc5a2189cc6f5ad5f24bada3b71cfa9167fd", + "check_gpg": true + }, + { + "checksum": "sha256:355a095bb3c6d58f927277ff53267f88eb0729adbcafd8082b8d97e4815ee206", + "check_gpg": true + }, + { + "checksum": "sha256:724cca9919bb7b0183b030aca216d4d51de70bf35c2cc5e8325a21a52ca15ceb", + "check_gpg": true + }, + { + "checksum": "sha256:517ff9662e5a1897b74f4ab4fbc8a88eccaad9880bc18be9cf4df6aba9824bd5", + "check_gpg": true + }, + { + "checksum": "sha256:475b6de876914aec2187ac4858a13ae75585f5c4cb5d739c637f79a5ca6f05f9", + "check_gpg": true + }, + { + "checksum": "sha256:f1150f9e17beaef09aca0f291e10db8c3ee5566fbf4c929b7672334410fa74e9", + "check_gpg": true + }, + { + "checksum": "sha256:f1c79039f4c6ba0fad88590c2cb55a96489449c334a671cc18c0bf424a4548b8", + "check_gpg": true + }, + { + "checksum": "sha256:136a9cbae9c225be60718fdc8cc8988a55235d6502e451df77d1c5c765143850", + "check_gpg": true + }, + { + "checksum": "sha256:3151132084577032b4c827eb577a1509950601888c6ff13a0a30b24252ee26d2", + "check_gpg": true + }, + { + "checksum": "sha256:54b740cf7a75a7215168970378d9a1d6b9a5e4eb81159a874ce8ea5990436641", + "check_gpg": true + }, + { + "checksum": "sha256:ee664c392a97cdd272f57980c6856b2c57567005fa0ad9cb16c388b645d014f1", + "check_gpg": true + }, + { + "checksum": "sha256:9d220d8ee28cd0adf28e8fef547af92c3ec66e238747165939cf8e1a413ddf83", + "check_gpg": true + }, + { + "checksum": "sha256:27dd9c78e41c04b5151a2b9ac150d3ebb89f2ca7a23e4896dfc718f19a000be3", + "check_gpg": true + }, + { + "checksum": "sha256:e2a04f4de125ff60a3cdc3d2b3718a4530a9c9240c9cf14f55938444c229539f", + "check_gpg": true + }, + { + "checksum": "sha256:630ad20496ff00f76764e01b9302ccbe94e3e91d76ececef88bd9e8a890b1ac3", + "check_gpg": true + }, + { + "checksum": "sha256:ffe5076b9018efdb1612c487f637af39ab6c3c79ec37311978935cfa357ecd61", + "check_gpg": true + }, + { + "checksum": "sha256:932a37ddd2a990a22a1ee7811d204552e8860e39a3e0c050ed618a535ae8c78c", + "check_gpg": true + }, + { + "checksum": "sha256:684aae86de55bd42215c136777613211f596788d3b6405d8fa645fb967904354", + "check_gpg": true + }, + { + "checksum": "sha256:a336d2e77255df4783f52762e44efcc8d77b044a3e39c7f577d5535212848280", + "check_gpg": true + }, + { + "checksum": "sha256:4dd6100e477d88a4987b6eebfddecff168f38c7ff47cbb12f2fecba1e87c10d9", + "check_gpg": true + }, + { + "checksum": "sha256:a280c633b73517da167b91298fc97aeee2eb5fcc253c038ae0ce4b8478d3a103", + "check_gpg": true + }, + { + "checksum": "sha256:7f555c600b35ba798d8c0a63e30a1a12e917231730e1a44f48161ba0fe4b5973", + "check_gpg": true + }, + { + "checksum": "sha256:1de2be4fe5280ec3097305d9e671f5f2c768267f90d255edf2075eecb0c0afe9", + "check_gpg": true + }, + { + "checksum": "sha256:78db9007c08fa51f177210e47343b8e733ce0751826abb357ca96429836588db", + "check_gpg": true + }, + { + "checksum": "sha256:750da30da0289d5e2ad9ca297dda44e5ca18dbed0c3e0d4200379bc1818c22f3", + "check_gpg": true + }, + { + "checksum": "sha256:97197411bca68cfba1ef6bab1fdd4b41c95ec71c36f1e67f525b963cf60598fd", + "check_gpg": true + }, + { + "checksum": "sha256:334d63914e7ff6fe8cfce0c8f80006c6cf2ab0615cd044a6ee588809395499e5", + "check_gpg": true + }, + { + "checksum": "sha256:2cee64e12b295b74d2f4b008c7628ef3a01ef4149905fc4a7ae14b304da5f53b", + "check_gpg": true + }, + { + "checksum": "sha256:5f156c2a950699d5cb9a21349cce049b3c8bfdcc4fcc780665fe2d3103f576c1", + "check_gpg": true + }, + { + "checksum": "sha256:cc1be420582afb6360f380ff301c5e3d873f69fe1f7e00e4450bf2daa40ef9ff", + "check_gpg": true + }, + { + "checksum": "sha256:6f669ae6f70cfa80917adf4ae9d5e86fbd9d31ee308a9a3408a19be3afc46f7b", + "check_gpg": true + }, + { + "checksum": "sha256:2db6d80760ab0e99f4e9c9816615e4f06b967bbb23a8c8c941b3f2d4b5f176c2", + "check_gpg": true + }, + { + "checksum": "sha256:29d7df69d66f51f6dddd637d3f599e70bdaa9bd476669002250bc038735a318c", + "check_gpg": true + }, + { + "checksum": "sha256:9976e6228a10fa2761f1265a2a7666578d79ca57819837e5d1fbecc53324f1b9", + "check_gpg": true + }, + { + "checksum": "sha256:82e0d8f1e0dccc6d18acd04b7806350343140d9c91da7a216f93167dcf650a61", + "check_gpg": true + }, + { + "checksum": "sha256:d027a3ff0712e3e98d7d2358f8c526fb8d143b2386c353aadcc27199cffe125b", + "check_gpg": true + }, + { + "checksum": "sha256:ec12fef82d73314e3e4cb6e962f8de27e78989fa104dde0599a4480a53817647", + "check_gpg": true + }, + { + "checksum": "sha256:1bdde5dc99a5588a8983f70b7b3e45e7006215d529c72adfec118c3bcbf7b01c", + "check_gpg": true + }, + { + "checksum": "sha256:84702d6395a9577c1a268184f123cfd4b15bc2287f01033625ba388a34ec2338", + "check_gpg": true + }, + { + "checksum": "sha256:140708561a2ec1c7709fd38d8b1b115d02da710b80eeecd65c2b8387d9d78ef9", + "check_gpg": true + }, + { + "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", + "check_gpg": true + } + ] + } + }, + { + "name": "org.osbuild.selinux", + "options": { + "file_contexts": "etc/selinux/targeted/contexts/files/file_contexts", + "labels": { + "/usr/bin/cp": "system_u:object_r:install_exec_t:s0" + } + } + } + ] + }, + "runner": "org.osbuild.fedora32" + }, + "stages": [ + { + "name": "org.osbuild.rpm", + "options": { + "gpgkeys": [ + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF1RVqsBEADWMBqYv/G1r4PwyiPQCfg5fXFGXV1FCZ32qMi9gLUTv1CX7rYy\nH4Inj93oic+lt1kQ0kQCkINOwQczOkm6XDkEekmMrHknJpFLwrTK4AS28bYF2RjL\nM+QJ/dGXDMPYsP0tkLvoxaHr9WTRq89A+AmONcUAQIMJg3JxXAAafBi2UszUUEPI\nU35MyufFt2ePd1k/6hVAO8S2VT72TxXSY7Ha4X2J0pGzbqQ6Dq3AVzogsnoIi09A\n7fYutYZPVVAEGRUqavl0th8LyuZShASZ38CdAHBMvWV4bVZghd/wDV5ev3LXUE0o\nitLAqNSeiDJ3grKWN6v0qdU0l3Ya60sugABd3xaE+ROe8kDCy3WmAaO51Q880ZA2\niXOTJFObqkBTP9j9+ZeQ+KNE8SBoiH1EybKtBU8HmygZvu8ZC1TKUyL5gwGUJt8v\nergy5Bw3Q7av520sNGD3cIWr4fBAVYwdBoZT8RcsnU1PP67NmOGFcwSFJ/LpiOMC\npZ1IBvjOC7KyKEZY2/63kjW73mB7OHOd18BHtGVkA3QAdVlcSule/z68VOAy6bih\nE6mdxP28D4INsts8w6yr4G+3aEIN8u0qRQq66Ri5mOXTyle+ONudtfGg3U9lgicg\nz6oVk17RT0jV9uL6K41sGZ1sH/6yTXQKagdAYr3w1ix2L46JgzC+/+6SSwARAQAB\ntDFGZWRvcmEgKDMyKSA8ZmVkb3JhLTMyLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJdUVarAhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBsEwJtEslE0LdAD/wKdAMtfzr7O2y06/sOPnrb3D39Y2DXbB8y0iEmRdBL29Bq\n5btxwmAka7JZRJVFxPsOVqZ6KARjS0/oCBmJc0jCRANFCtM4UjVHTSsxrJfuPkel\nvrlNE9tcR6OCRpuj/PZgUa39iifF/FTUfDgh4Q91xiQoLqfBxOJzravQHoK9VzrM\nNTOu6J6l4zeGzY/ocj6DpT+5fdUO/3HgGFNiNYPC6GVzeiA3AAVR0sCyGENuqqdg\nwUxV3BIht05M5Wcdvxg1U9x5I3yjkLQw+idvX4pevTiCh9/0u+4g80cT/21Cxsdx\n7+DVHaewXbF87QQIcOAing0S5QE67r2uPVxmWy/56TKUqDoyP8SNsV62lT2jutsj\nLevNxUky011g5w3bc61UeaeKrrurFdRs+RwBVkXmtqm/i6g0ZTWZyWGO6gJd+HWA\nqY1NYiq4+cMvNLatmA2sOoCsRNmE9q6jM/ESVgaH8hSp8GcLuzt9/r4PZZGl5CvU\neldOiD221u8rzuHmLs4dsgwJJ9pgLT0cUAsOpbMPI0JpGIPQ2SG6yK7LmO6HFOxb\nAkz7IGUt0gy1MzPTyBvnB+WgD1I+IQXXsJbhP5+d+d3mOnqsd6oDM/grKBzrhoUe\noNadc9uzjqKlOrmrdIR3Bz38SSiWlde5fu6xPqJdmGZRNjXtcyJlbSPVDIloxw==\n=QWRO\n-----END PGP PUBLIC KEY BLOCK-----\n" + ], + "packages": [ + { + "checksum": "sha256:fc8a8027325828861bae0c41d2582d61f8cb4b9ed42a50e49c57939eabcad1b7", + "check_gpg": true + }, + { + "checksum": "sha256:605c3cf38451c6b93f331b605ab03ca611e37aa11d14a4019de61278add04f74", + "check_gpg": true + }, + { + "checksum": "sha256:342bdf0143d9145f8846e1b5c3401685e0d1274b66df39ac8cbfb78013313861", + "check_gpg": true + }, + { + "checksum": "sha256:fd2a2dd726d855f877296227fb351883d647df28b1b0085f525d87df622d49e4", + "check_gpg": true + }, + { + "checksum": "sha256:df174a90fd6bd3f9fae3b75433ae7f1869ff2db7102667fb243c8aede5b858d3", + "check_gpg": true + }, + { + "checksum": "sha256:cd5d539fd0c469f2ebae012a9a8f2ed280363c355f205edc8fc735678ac0adb8", + "check_gpg": true + }, + { + "checksum": "sha256:a9d5719cf5d4fdc4ae28099d623a751b0470264e7d2280be2669a066348b4ce1", + "check_gpg": true + }, + { + "checksum": "sha256:705bdb96aab3a0f9d9e2ff48ead1208e2dbc1927d713d8637632af936235217b", + "check_gpg": true + }, + { + "checksum": "sha256:a4706de7a0d59f2b1e9e73f48c4279429676410c77fb93f82abf1b7b34330f82", + "check_gpg": true + }, + { + "checksum": "sha256:c574c5432197acbe08ea15c7837be7577cd0b49902a3e65227792f051d73ce5c", + "check_gpg": true + }, + { + "checksum": "sha256:00d0bb6a08f20bea2b6bd0d2c4de99b51c770b2dab266d1d3da85891efeded01", + "check_gpg": true + }, + { + "checksum": "sha256:f09047c09660bc998460f710b9ac0561b4f6028214168d4d40f2f4d99f61a94d", + "check_gpg": true + }, + { + "checksum": "sha256:22d311f22902d592f72bd0fb4010a682f796e5a4698d5ea209848468a2d5aa96", + "check_gpg": true + }, + { + "checksum": "sha256:a346990bb07adca8c323a15f31b093ef6e639bde6ca84adf1a3abebc4dc9adce", + "check_gpg": true + }, + { + "checksum": "sha256:7a97e71cd552285ead303d07dbb6417403edf45c0a531e02cf4ebfb0efda4975", + "check_gpg": true + }, + { + "checksum": "sha256:c07fd5357963f99610bc676b25f1dfcbf1bae0b63538b5e1cd82ce42b79fd819", + "check_gpg": true + }, + { + "checksum": "sha256:bfeba60bfb137f270e3b28db96ecfe8b226ea05e1761f6cb5ccc64c48c73c748", + "check_gpg": true + }, + { + "checksum": "sha256:af18c71bca1121ac3cdeace9f7249079ee0568fcbb15ca7e46131fa9b9b521f8", + "check_gpg": true + }, + { + "checksum": "sha256:2141f1dec8fe7a442c061f603bf4ee6203e10a290990789af0f4ef9db5523679", + "check_gpg": true + }, + { + "checksum": "sha256:b67f1634acc7b84b284bda8afeef546aed4a3388dc7df67417001704aa444af1", + "check_gpg": true + }, + { + "checksum": "sha256:cd01ae91895e60f189106a159bb551f906a8b663110f421ad6ee83c9e008851e", + "check_gpg": true + }, + { + "checksum": "sha256:842f7a38be2e8dbb14eff3ede4091db214ebe241e1fde7a128e88c4e686b63b0", + "check_gpg": true + }, + { + "checksum": "sha256:73f6a9108f7d5ec3cd89c31dbbaa874ae28cd5cb443ef69700a1218903ee2fc4", + "check_gpg": true + }, + { + "checksum": "sha256:703fb5ca1651bb72d8ab58576ce3d78c9479cbb2e78ff8666ae3a3d1cd9bb0da", + "check_gpg": true + }, + { + "checksum": "sha256:398ce75ffc673f048ffd47d417b17ef086abc43f318b2b77d2869095ec764d57", + "check_gpg": true + }, + { + "checksum": "sha256:624b9079b4a571218adced203e19bdaca1d2cf57891f9653f409dd1db92fbf86", + "check_gpg": true + }, + { + "checksum": "sha256:5d520576b7ac63cb029c4b0b86398e2b71589df3bafa618018b3729d81036203", + "check_gpg": true + }, + { + "checksum": "sha256:c55b30a3a8c0d36a219953e20960185263ae63dada0f050446066be1e873ce08", + "check_gpg": true + }, + { + "checksum": "sha256:0065bc128a5c8b08b57f92651bfa62895221a9f001f1169447a56a8a6671bbae", + "check_gpg": true + }, + { + "checksum": "sha256:449d2888d6b835d207a55a2d9b4478eff1b926581fcead6260b6508e4db1b782", + "check_gpg": true + }, + { + "checksum": "sha256:769e34caae25f05786ae53e535c6e3c64f5c548f06c422325d68598b7abb99b7", + "check_gpg": true + }, + { + "checksum": "sha256:28d1118b3debda3daee76fc89f250576627a28b3ec39069256ddc212d993ddbc", + "check_gpg": true + }, + { + "checksum": "sha256:0608e0a9922e6748b39bd1719e2dabd6fe283b22cf590f1a3350327ae6c13561", + "check_gpg": true + }, + { + "checksum": "sha256:30c5f02ed28d59a4d72e020097602091bb8e34d65a6f3be69f4b1dd63a46f892", + "check_gpg": true + }, + { + "checksum": "sha256:7023687eb65baa56a9b4c3ffde1e439b3d41b03ac4ad35a1a1fc3903464548f7", + "check_gpg": true + }, + { + "checksum": "sha256:5323eb8d89b2d0c905a633513e04ca7df633c21eec288ee8c50f3f5170534e37", + "check_gpg": true + }, + { + "checksum": "sha256:116b9d121fad9886f245cd5e1ef678fdba889cd23a39e91447e75649214a6a8d", + "check_gpg": true + }, + { + "checksum": "sha256:862e75c10377098a9cc50407a0395e5f3a81d14b5b6fecfb3f223325c8867829", + "check_gpg": true + }, + { + "checksum": "sha256:1aee865249b031e591a5e94d62d05b69ad1a6118a26adccf2dfd46b0002716e5", + "check_gpg": true + }, + { + "checksum": "sha256:59be778afcf464d79f7dc440d6b49de8a9527fd73e7b514573d389bf8a51b246", + "check_gpg": true + }, + { + "checksum": "sha256:d5acde111b4cafc918decc8b9c530c9a7dfd6cc77b75538d33b32478219ae5da", + "check_gpg": true + }, + { + "checksum": "sha256:3f8dcae27ad3609b7de298d0ca8d34a2790b9898f5f1b03f3f9f8784374e307b", + "check_gpg": true + }, + { + "checksum": "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b", + "check_gpg": true + }, + { + "checksum": "sha256:e0f9c4327d62e35ee2a066c95dfa37f86021b405515d0f902b72a7437b7b98e9", + "check_gpg": true + }, + { + "checksum": "sha256:eaffaa8de8fd28ad124da12524a2ca5db86252404d70d66c7c42921dad6b69c1", + "check_gpg": true + }, + { + "checksum": "sha256:6eeebf21f245bf0d6f58962dc49b6dfb51f55acb6a595c6b9cbe9628806b80a4", + "check_gpg": true + }, + { + "checksum": "sha256:fefa4162a563eba24714ac43874c508d1ba036afb5127c5d21bbcbeaf238a740", + "check_gpg": true + }, + { + "checksum": "sha256:ed36d759746e75a2834866fbeaa783df397f8813cae2ed79fcc4d146656bf6a6", + "check_gpg": true + }, + { + "checksum": "sha256:213c17fb822ffa50fad16989ed363aa023de106c6262ccc3f16e52a154b7133f", + "check_gpg": true + }, + { + "checksum": "sha256:6fc1b9a27eeb368a98f50dba5fc514f20a5eb23f8e0ee7dd92c4051ef8b4a940", + "check_gpg": true + }, + { + "checksum": "sha256:474fd088c7e7234221d251153e9fda6081b0aa8979bf5ae25810c9862e1e9960", + "check_gpg": true + }, + { + "checksum": "sha256:f729c554ed4ac6335a548380a6f6335a332a3a2aca5321a322415a208701607d", + "check_gpg": true + }, + { + "checksum": "sha256:c132999a3f110029cd427f7578965ad558e91374637087d5230ee11c626ebcd4", + "check_gpg": true + }, + { + "checksum": "sha256:9a2beeeede69d8910115608c2d98efa6a8dba73ab2df246df5b0f10e2fa37f54", + "check_gpg": true + }, + { + "checksum": "sha256:8aa8258a1a13c1120d6c28321f618385111cb9363dae09eea2e4af481053e28b", + "check_gpg": true + }, + { + "checksum": "sha256:61cae80187ef2924857fdfc48a240646d23b331482cf181e7d8c661b02c15949", + "check_gpg": true + }, + { + "checksum": "sha256:7a525abda7230bfbc87763dfe58bf7684e385b3c78ca242a1685a589300909e9", + "check_gpg": true + }, + { + "checksum": "sha256:187dd61be71efcca6adf9819a523d432217abb335afcb2b95ef27b72928aff4b", + "check_gpg": true + }, + { + "checksum": "sha256:e40be03bd5808e640bb5fb18196499680a7b7b1d3fce47617f987baee849c0e5", + "check_gpg": true + }, + { + "checksum": "sha256:e712179ba8b9b6e93d14c902a6d6a390ba142153384dab9291c808a447b7ed0c", + "check_gpg": true + }, + { + "checksum": "sha256:c3f7089ae50f79cf4d2cb59e01091d33c70cab89ae08f95c547339a87404c3ec", + "check_gpg": true + }, + { + "checksum": "sha256:993680d5cd133a0c21184be92b3df405d757613d0ca25c4abf08b203d8d26b79", + "check_gpg": true + }, + { + "checksum": "sha256:4819b3ce25b997d8d3e5e4e4be4ba270e8b66852576b474daf0e6d61b6e22d73", + "check_gpg": true + }, + { + "checksum": "sha256:11d6aa88c7e5bbaad38353bbb557ad8370452cd258f2a0d16bfd490116138d67", + "check_gpg": true + }, + { + "checksum": "sha256:2fa5e252441852dae918b522a2ff3f46a5bbee4ce8936e06702bf65f57d7ff99", + "check_gpg": true + }, + { + "checksum": "sha256:26db62c2bc52c3eee5f3039cdbdf19498f675d0f45aec0c2a1c61c635f01479e", + "check_gpg": true + }, + { + "checksum": "sha256:b743aafa82f3326f8f2e6d5464ae7fa57fabab3ad791099eaf2d151b43208b42", + "check_gpg": true + }, + { + "checksum": "sha256:a7deef0a324ccb272a25f5eb6b30c72d0a842bf2c602c31fe3b60f984b2e50af", + "check_gpg": true + }, + { + "checksum": "sha256:05efccb06aa336d2547eb8fd5b7e0935c883f89084688f32ce0b09954149b796", + "check_gpg": true + }, + { + "checksum": "sha256:4f318cec61cb69fc233ba5505b7e24f679afdfb0b5defbaef507f1b471e7dbb5", + "check_gpg": true + }, + { + "checksum": "sha256:af62d0611b995b9f2b2c7b4d4852e03e521d66979534871ccb5a71275a15518d", + "check_gpg": true + }, + { + "checksum": "sha256:f3eb795f68c80ccf870f1d27f8fd019878db748c0c19275634c48cf5cea5bc46", + "check_gpg": true + }, + { + "checksum": "sha256:99f87b4ec7c5852d45028f3eae65fc813f3ef107e128777f265b09a19ce262e0", + "check_gpg": true + }, + { + "checksum": "sha256:8fc2ae85f242105987d8fa7f05e4fa19358a7c81dff5fa163cf021eb6b9905e9", + "check_gpg": true + }, + { + "checksum": "sha256:09fea9af8b695af862b19c1a8fbe1b1e8854257825ee4f663f67b3782a75d58a", + "check_gpg": true + }, + { + "checksum": "sha256:a1835a7929d3c1613f3890caef878e9bdf857dcc0f63eb4d63a1140370b3f21b", + "check_gpg": true + }, + { + "checksum": "sha256:5e7a16df5bdfab2acfd8ac061827ace0642f2e5521689d6b9f0812f2a6ece231", + "check_gpg": true + }, + { + "checksum": "sha256:21e3fd914a3bcc65b79de022782967903c55a4aed9a3c7d3464bc2fef32d02b3", + "check_gpg": true + }, + { + "checksum": "sha256:28656826cb0dfbae9b6e8d1e5c5691773d84000493c4be47f727092fec6dc6f4", + "check_gpg": true + }, + { + "checksum": "sha256:e0b1da98020a740991dbb70b42c0ff1eece9e268a461e555a5ec763bda1645f5", + "check_gpg": true + }, + { + "checksum": "sha256:1110261787146443e089955912255d99daf7ba042c3743e13648a9eb3d80ceb4", + "check_gpg": true + }, + { + "checksum": "sha256:0b7cd6f6cb3b7cd9e0704dd6c62b65254b04cb870ab638b9bed4951564436e24", + "check_gpg": true + }, + { + "checksum": "sha256:907393755387a351806ec2afff376e7491f177116caadd12f07d0fcbed796750", + "check_gpg": true + }, + { + "checksum": "sha256:f2715fc8a04d33716f40f5b34466e082140df7ff3b7b972c29655d4dfc6e3a72", + "check_gpg": true + }, + { + "checksum": "sha256:b8ecd7fa0e7e072828e374dfb0d61bb8eecca7c190f3661050cee5e3fc8854b4", + "check_gpg": true + }, + { + "checksum": "sha256:47538b1db9720be4699329a8da32d873187d0c6c22f45252614ac5b8a8312482", + "check_gpg": true + }, + { + "checksum": "sha256:317654c97a9dc11fe498b61d4189ff31cd1277250993d826e9bc5815d0485f29", + "check_gpg": true + }, + { + "checksum": "sha256:879ba2533610771dbf3fa103fdbde878edf255b771b53aa8a170009d01446012", + "check_gpg": true + }, + { + "checksum": "sha256:9369d4fed30402f45705b7a5cb51b6eeefb1dabbe0942c84514c6fdf1edac5e0", + "check_gpg": true + }, + { + "checksum": "sha256:45132e53c649def28d63c199d8c3a3b9fd16fa8bca7426ad4e9c202e52a233b4", + "check_gpg": true + }, + { + "checksum": "sha256:53992752850779218421994f61f1589eda5d368e28d340dccaae3f67de06e7f2", + "check_gpg": true + }, + { + "checksum": "sha256:929f1c5ce4775b28439a1b5726e98c38204930d5880dc6096fc56e8d3eab275f", + "check_gpg": true + }, + { + "checksum": "sha256:8df8541abd806578e43fe28a7ea2c41efbbb813866bed35fabe779274790a538", + "check_gpg": true + }, + { + "checksum": "sha256:ab4c27523d6b5a0df75febac43cafa2dd9897dc3c1bb2f0d6990ca603b6168fe", + "check_gpg": true + }, + { + "checksum": "sha256:ff5dd4d0c157cf1be9c8dbddce06640c67b2d02ae5a48d6b108bd70fc5c96211", + "check_gpg": true + }, + { + "checksum": "sha256:d0e5d0104cf20c8dd332053a5903aab9b7fdadb84b35a1bfb3a6456f3399eb32", + "check_gpg": true + }, + { + "checksum": "sha256:9899cfd32ada2537693af30b60051da21c6264b0d0db51ba709fceb179d4c836", + "check_gpg": true + }, + { + "checksum": "sha256:397f0b024d3c58ca6e174c6de5abcb19304d7c58903199e1e6fe02e84d5bcb3a", + "check_gpg": true + }, + { + "checksum": "sha256:349af433b2f6d45ff2e1ea5a38f847ec692fef0a8dd656a9a07d423a981946d0", + "check_gpg": true + }, + { + "checksum": "sha256:fdb9bc612957a16fc44b717605a5a26e16a33850c0ff74a80a299cc2bab740e4", + "check_gpg": true + }, + { + "checksum": "sha256:5fc2fd0cb5b6fdce1203e43d6f2df6a3098ec9522b04815d896ecedbb1489063", + "check_gpg": true + }, + { + "checksum": "sha256:6fe524feb38312f9c370b2190aeb42330acc9ce42f3a45e9cd05748b4aa00db2", + "check_gpg": true + }, + { + "checksum": "sha256:dc9c0401522bcf73fe5a692184c141b214947ad83364be97de0413ab46b712e5", + "check_gpg": true + }, + { + "checksum": "sha256:e80533822e2a892345b869395b2c17c0bcc98d3c3c47787da30123096835db00", + "check_gpg": true + }, + { + "checksum": "sha256:f36550dfc144e4608da672616fa44b2f2341f99bb38972e66e4a8fef4b59172c", + "check_gpg": true + }, + { + "checksum": "sha256:178e4470a6dfca84ec133932606737bfe167094560bf473940504c511354ddc9", + "check_gpg": true + }, + { + "checksum": "sha256:cc3396df93ce0e8f439b83fb6b4d210903876846b0bd3a22c19c7770cf5a9050", + "check_gpg": true + }, + { + "checksum": "sha256:966084f83e0fedb7a217aa102b484ac8a63082ccfe99517544ed2cb102191204", + "check_gpg": true + }, + { + "checksum": "sha256:9d4f1290565b852e56f9e9babc14b141b0283998121f78b0eb83dec367cf0abb", + "check_gpg": true + }, + { + "checksum": "sha256:052ddc487a29acce1b5d44532f79f8ab594d0ac6565504071f4c7706d97fc552", + "check_gpg": true + }, + { + "checksum": "sha256:13a0c9c767f71164cc678ee36d89b7fddcdd6fb8243e3daf8b47cca0d1d14c4f", + "check_gpg": true + }, + { + "checksum": "sha256:70794c8537fb3cf197f051cfce3b23956d587062daf114f8480770754804f339", + "check_gpg": true + }, + { + "checksum": "sha256:fbaf44214a3e93d4bdccb1519768849db5ea204c886df851b49f107e0c443e4a", + "check_gpg": true + }, + { + "checksum": "sha256:1ec84749250a0095d645f11fa0dcdf8c4500e0bbc303af696762a12616375757", + "check_gpg": true + }, + { + "checksum": "sha256:4546444c0647efaa8fa8bf604ace7f7dbd152e74761b8d7a11fa185bc72bece8", + "check_gpg": true + }, + { + "checksum": "sha256:3ab2173d9d4016febcdaf283408f9939d0a7b2fdba3e46a2d45fbef88a1463a0", + "check_gpg": true + }, + { + "checksum": "sha256:759165656ac8141b0c0ada230c258ffcd4516c4c8d132d7fbaf762cd5a5e4095", + "check_gpg": true + }, + { + "checksum": "sha256:01173d218dccdf88c1159bba4af332ce703fc0dcd7171cd279cb3e16f12b30a9", + "check_gpg": true + }, + { + "checksum": "sha256:aa353206ef29b7d908554ccb7cd6f4c01a1f6c3c1c6358abb7452f4a745939d0", + "check_gpg": true + }, + { + "checksum": "sha256:110f538d82f15f009d95e89d8c1e3669dc7358feb9aa7724301fef037f8b67fe", + "check_gpg": true + }, + { + "checksum": "sha256:c2197913bc8db9548b0a40ffddf840a31956b18e932ad4eec77a48d87d2289ce", + "check_gpg": true + }, + { + "checksum": "sha256:7f6d2841ec9402ee5e57f1a46b9886935138c02005d860899f3c746c7885c7b9", + "check_gpg": true + }, + { + "checksum": "sha256:d1c6f183b9deaf6127db4ad7040046bd7f1aa62de177961aac39501605d2c815", + "check_gpg": true + }, + { + "checksum": "sha256:d1a369d501e3ce1c17d06418c9cd57c4ada551ecc3b45a581e162215e8bd77f5", + "check_gpg": true + }, + { + "checksum": "sha256:53f1e8570b175e8b58895646df6d8068a7e1f3cb1bafdde714ddd038bcf91e85", + "check_gpg": true + }, + { + "checksum": "sha256:def89a494acbfd6aae1fb70700dd18275ddd3050893bc962f1853499af9dd823", + "check_gpg": true + }, + { + "checksum": "sha256:6749bd0b96339c32b57635b69b474583b50c94e4bbaa3eb8753fa604b9d1c521", + "check_gpg": true + }, + { + "checksum": "sha256:c1f957511b5e011e6f7995ed7bca9196703cf1214068f209e86b1dc4fd0e98bf", + "check_gpg": true + }, + { + "checksum": "sha256:bca13571cf1452f3e41c8e89b8c64aa33d3d0f4e414571f9dde32a556591b339", + "check_gpg": true + }, + { + "checksum": "sha256:865c7677d2664287bb4ba2874c83bc805232e1b3a02cf6ba96e047266d9ef684", + "check_gpg": true + }, + { + "checksum": "sha256:0c6f4c1fbbdaf02014bf81726264e3301cbfe0ecda610765be11dbbfe99e34ae", + "check_gpg": true + }, + { + "checksum": "sha256:7c21c21c3e3dbace06bee03fe4835ae6cb1e3ef86750ba2853f39d40dead2309", + "check_gpg": true + }, + { + "checksum": "sha256:f60fc561675e41ffa2c48b229960291e2438441d5ed758c1f28cb06b5d4e4ea9", + "check_gpg": true + }, + { + "checksum": "sha256:28f4bcbf53258114ebbf0a167351d67e204ff6f717b49b3893c2372845e6bd0a", + "check_gpg": true + }, + { + "checksum": "sha256:f4eb6d332b9aea8d8ef0a6ea8dc2b073d6bf5f2599d64f24111d8da2ee82ad48", + "check_gpg": true + }, + { + "checksum": "sha256:08c41c10745c172c34880e384cf5cff014a9627f4895e59fa482948b27e2ce9e", + "check_gpg": true + }, + { + "checksum": "sha256:6a3282927f525629bc0aaf4090e108d33b0709d3d5b35bc442000c2837e7b9b4", + "check_gpg": true + }, + { + "checksum": "sha256:1a2f22eed83ef568021c464cce841ef98725b614093f2c518307e85d5b6e759b", + "check_gpg": true + }, + { + "checksum": "sha256:65e5209398c6b2c196cb42f3bc3f82e00af1026f623026857a9b330ec92d0330", + "check_gpg": true + }, + { + "checksum": "sha256:032e4944fe53dc7a11ae62d746579177a5c52b00a4ad5540da8221aa287fdf18", + "check_gpg": true + }, + { + "checksum": "sha256:79e22d23ba0a156b3d74ec4b0da8fd71bc632386366ade2c48006ba82074055d", + "check_gpg": true + }, + { + "checksum": "sha256:b286141f38cd88b8c632515677423f49c81365f2ae99c5a7906205f35a273fb2", + "check_gpg": true + }, + { + "checksum": "sha256:caa3625b22908cf4f91faf2c281b0e7ab7d981c35ed1d761deb53b7b78d13cf8", + "check_gpg": true + }, + { + "checksum": "sha256:5d933f9bf444d4c8732caa65e9227b27127c625840859a0453a32a5719916f48", + "check_gpg": true + }, + { + "checksum": "sha256:4659e7b76850ce5dedbe80fb0a64947e83f15f907b35c5819d91be6ed0523653", + "check_gpg": true + }, + { + "checksum": "sha256:d7f57b9190c9cf05c36fe9fb3229330cdb9f0a1af1214a47b0a38dcc8ce929ee", + "check_gpg": true + }, + { + "checksum": "sha256:88d283c2d5aa96c2b0899f6bd6c0409a5d5c6fda2958e8eae19eb49c3ede58d6", + "check_gpg": true + }, + { + "checksum": "sha256:89f85f749bfee7d083c84845e908a3471297a3d8a75f7397903d15eb7f403297", + "check_gpg": true + }, + { + "checksum": "sha256:83a08b7066000ebbdf8a6c5706485a19b5dfe2d492b1faaac1922e8f0c42cd0c", + "check_gpg": true + }, + { + "checksum": "sha256:a3f80bb7068618dff795b3e0a3d32fa3c640e492c8f175b16bb3c7ff64a88a8e", + "check_gpg": true + }, + { + "checksum": "sha256:975719a0c73cf5cb5bcbc8ad11b816ed75923dccd9c091baa4a6c6000753dcd8", + "check_gpg": true + }, + { + "checksum": "sha256:872639e4ccb4f1c5de66d5eaa85ca673141b10e3d614b33c84ff887c228d465d", + "check_gpg": true + }, + { + "checksum": "sha256:d7fec1fb54953f1901cc505c225af94cb61f2206d0503be12313169a4b915e18", + "check_gpg": true + }, + { + "checksum": "sha256:d3a64fcef3de79a97541b21c71ddd00d4cca9039c930bc660d6c5479eabf5f26", + "check_gpg": true + }, + { + "checksum": "sha256:8a03d482b5294f7452b2f9ce31ebb6aea9eefac002281c1b9152fbb1a0341987", + "check_gpg": true + }, + { + "checksum": "sha256:a05178831a546e2001e52f065fc6969f36d2292efaee2971fe7a7e882cc8c813", + "check_gpg": true + }, + { + "checksum": "sha256:3be681b78e919bfd82eb186c7393718f1d37abd0b1bb8b1a8571aefa11e7a248", + "check_gpg": true + }, + { + "checksum": "sha256:60774007011889671c28158f599032f0db253c153ccae70f5e2f5840f2dc490b", + "check_gpg": true + }, + { + "checksum": "sha256:b851f60332ff9e6b91bb76914c12329ce905d7fb8a9fe707f36cdbc94a549f8d", + "check_gpg": true + }, + { + "checksum": "sha256:b8cce19164a474c6398de4944ce41ed8c49c3469c7f019d04329284b0509c7b0", + "check_gpg": true + }, + { + "checksum": "sha256:d12326c38ad38354bbde510a297f68c991d0babf104f6a0a22bae3e1ae903506", + "check_gpg": true + }, + { + "checksum": "sha256:e291d6c021eaa01cc3c446b76c94aafde444936b8ba3f08a7fe7cbe66a23366b", + "check_gpg": true + }, + { + "checksum": "sha256:150815dd62da40fee60ad5ceb988938c3be01e03aa54a025772b33a7a2c11311", + "check_gpg": true + }, + { + "checksum": "sha256:9ee276ed9d036a4483bb8d1bd6f6d697b161a04276c6ce5f1d3f40d48e04bccb", + "check_gpg": true + }, + { + "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", + "check_gpg": true + }, + { + "checksum": "sha256:3f9c95f3827b785f49ac4a270d4c3a703dceba673c452838744ec5064cf43cbd", + "check_gpg": true + }, + { + "checksum": "sha256:56187c1c980cc0680f4dbc433ed2c8507e7dc9ab00000615b63ea08c086b7ab2", + "check_gpg": true + }, + { + "checksum": "sha256:fbb81a7811f7a11b1c95eec20c3df63beef9e007f0b3d2713f13ad80029d7249", + "check_gpg": true + }, + { + "checksum": "sha256:e2b2dddbce49fab5f01ba75fae8796ab7c9fd8280c652f78d06a2644246bd16d", + "check_gpg": true + }, + { + "checksum": "sha256:2b783576612dcf10ab151fee03084f8ae1667c044a9e2e9404a2a139e7c6c884", + "check_gpg": true + }, + { + "checksum": "sha256:f826f984b23d0701a1b72de5882b9c0e7bae87ef49d9edfea156654f489f8b2b", + "check_gpg": true + }, + { + "checksum": "sha256:a410db5c56d4f39f6ea71e7d5bb6d4a2bd518015d1e34f38fbc0d7bbd4e872d4", + "check_gpg": true + }, + { + "checksum": "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58", + "check_gpg": true + }, + { + "checksum": "sha256:7d9bd2fe016ca8860e8fab4a430b3aae4c7b7bea55f8ccd7775ad470172e2886", + "check_gpg": true + }, + { + "checksum": "sha256:598a136b7027cb9b4fef6bfa34715979d41c2f62c9d8bec5d50b633a17790f7b", + "check_gpg": true + }, + { + "checksum": "sha256:65e0cfe367ae4d54cf8bf509cb05e063c9eb6f2fea8dadcf746cdd85adc31d88", + "check_gpg": true + }, + { + "checksum": "sha256:1830b4aa42ef492c13b62f63fe941970869ba19bd9abde4dea5c97f9e38ffd68", + "check_gpg": true + }, + { + "checksum": "sha256:ac8b1fea0b678d7630033a8900be5641b934306961b39a29c79c6d72f34f7d1c", + "check_gpg": true + }, + { + "checksum": "sha256:d74b76ce8c2c7306cc3f012d1ec56b1d5c67788748f56ecd505f257d342f97ee", + "check_gpg": true + }, + { + "checksum": "sha256:1bc0542cf8a3746d0fe25c397a93c8206963f1f287246c6fb864eedfc9ffa4a7", + "check_gpg": true + }, + { + "checksum": "sha256:b60670fdcf91b50d97720f601d92277efedbd690bd887000ccd9a46b3fa8b314", + "check_gpg": true + }, + { + "checksum": "sha256:b13eed593b31a9cc0174774b97701c7da876f91ccdfc951b67a3134d59ccd8b5", + "check_gpg": true + }, + { + "checksum": "sha256:4494013eac1ad337673f084242aa8ebffb4a149243475b448bee9266401f2896", + "check_gpg": true + }, + { + "checksum": "sha256:63400fedea4a6ddb8fced58d33e60560791f29cd439169998f337d09fb50a7d4", + "check_gpg": true + }, + { + "checksum": "sha256:7dfe1e8dac6d759479ae3dfd415fdd2662bbed9ff0f4da6093279efd1bacae31", + "check_gpg": true + }, + { + "checksum": "sha256:688fcc0b7ef3c48cf7d602eefd7fefae7bcad4f0dc71c9fe9432c2ce5bbd9daa", + "check_gpg": true + }, + { + "checksum": "sha256:431d836b2be015212d8c15b4290d5ce5bb45282cbf3fc52696f632d84ce34dfe", + "check_gpg": true + }, + { + "checksum": "sha256:9a12db30090023c60e3d7bcd5b07142cdc6d84c77e25ddb1cf41a4c490e52f09", + "check_gpg": true + }, + { + "checksum": "sha256:39961756e07f6f49ddf2ff277dc04a63fa4d5b4fb035480945bd2f665ba1dd4d", + "check_gpg": true + }, + { + "checksum": "sha256:7bf42ff57ce2a31db0da7d6c5926552f4e51e9f25cded77bd634eb5cd35eadab", + "check_gpg": true + }, + { + "checksum": "sha256:942d06ec1f7033ea4c729b84ee09f5491481770efe10151ba581479ac7f3f9dc", + "check_gpg": true + }, + { + "checksum": "sha256:86c87a4169bdf75c6d3a2f11d3a7e20b6364b2db97c74bc7eb62b1b22bc54401", + "check_gpg": true + }, + { + "checksum": "sha256:ebbace15f986288bba7681f44a111b14bcc7cae00b7a1faadaa838bd51897357", + "check_gpg": true + }, + { + "checksum": "sha256:14bd7e305e13795e0d37c613dfa3ead3a3219d28c32b27ad6527d3592361923d", + "check_gpg": true + }, + { + "checksum": "sha256:aac9be36fc9c345245b4a0db66bfb9ff8df25e36ae0c1ae89eca9bcf88e052e4", + "check_gpg": true + }, + { + "checksum": "sha256:48cf5ab32f6af8f2283d4d4834e8dd262aa412be7ea07c2292483e150d614bef", + "check_gpg": true + }, + { + "checksum": "sha256:5f0ae954b5955c86623e68cd81ccf8505a89f260003b8a3be6a93bd76f18452c", + "check_gpg": true + }, + { + "checksum": "sha256:d65b4bb6fa49198237f9b704ec471d71dfd94b87290f4d03c1c34d12f6efeb95", + "check_gpg": true + }, + { + "checksum": "sha256:9bd5cb588664e8427bc8bebde0cdf5e14315916624ab6b1979dde60f6eae4278", + "check_gpg": true + }, + { + "checksum": "sha256:c8daa43a4504f9a4b6c106baf8a56aa0d256fc3c71bd417ea75b9c7fd830a9b7", + "check_gpg": true + }, + { + "checksum": "sha256:b3201777d78ee13ee45ddbd982af5999ce058907b5dc552669644931b79c5f51", + "check_gpg": true + }, + { + "checksum": "sha256:824fe37d58cadac2f23678c9eb95c29b4acb1852df97cf799e77aa7e8034b54e", + "check_gpg": true + }, + { + "checksum": "sha256:86acbe8d77b05c1fe9bb0168443a579b1d4538f9733813db4e72e4a4a2be29e3", + "check_gpg": true + }, + { + "checksum": "sha256:20787251df57a108bbf9c40e30f041b71ac36c8a10900fb699e574ee7e259bf2", + "check_gpg": true + }, + { + "checksum": "sha256:ff44071d53a2ed543c2ddad99cca8fc25493cbefc5d7ad869f9b6dbda340a465", + "check_gpg": true + }, + { + "checksum": "sha256:8677b34fa73f258b1a599d18419f6fbbb8961bb1ca2ae5b0f9abdcc4f93b319e", + "check_gpg": true + }, + { + "checksum": "sha256:5d5c8c7e9c78e3b8827ad38771efb44951d1c3c1692cf4e07b138c1c8c42bd5b", + "check_gpg": true + }, + { + "checksum": "sha256:1b05dd5abad5a31380c859bc33e7851158c24333fda837ca9facf869005f81fe", + "check_gpg": true + }, + { + "checksum": "sha256:2434cd04a437c06f59d67ee2580443c0ba676c39440cd0f74cca768ec57577f9", + "check_gpg": true + }, + { + "checksum": "sha256:de74076fc5073ad07ffa78fed6e7cd8f10133d99c1c73149b4ac74428699a6d1", + "check_gpg": true + }, + { + "checksum": "sha256:4eb6a2e34173a2b6ca7db031cecce56c0bed711691abf1c8d6bfe6cb7ca45dc0", + "check_gpg": true + }, + { + "checksum": "sha256:6eb95e39b9771c4dde5f9954a74cef6be90522c28c7c4aa767ebe7a9d55fcdf9", + "check_gpg": true + }, + { + "checksum": "sha256:1c68255945533ed4e3368125bc46e19f3fe348d7ec507a85a35038dbb976003f", + "check_gpg": true + }, + { + "checksum": "sha256:9ebc5843faeb852bbbe3d53f03182197f6595a928ffa3f5d7a530749ee1e4ec8", + "check_gpg": true + }, + { + "checksum": "sha256:aa5b658fd4a95c724b61eddadecdbcbc1b2a813ae681318ab092a2ed03954825", + "check_gpg": true + }, + { + "checksum": "sha256:e740cc0a580639b887bda0039a779e750a32835be1fd8c64aa01183b4cbb98bf", + "check_gpg": true + }, + { + "checksum": "sha256:4f4ef59861c0566d22bd76369d22369d43130f5ccdb35a5fc2c8a236cf33651f", + "check_gpg": true + }, + { + "checksum": "sha256:b359ca3cdc68b6e5031f65975df38a8b96c19ddc4c367e1e3463fc8484a0b3b7", + "check_gpg": true + }, + { + "checksum": "sha256:884357540f4be2a74e608e2c7a31f2371ee3b4d29be2fe39a371c0b131d84aa6", + "check_gpg": true + }, + { + "checksum": "sha256:ec6abd65541b5bded814de19c9d064e6c21e3d8b424dba7cb25b2fdc52d45a2b", + "check_gpg": true + }, + { + "checksum": "sha256:3afab9512fd4d56a13c95b530c805ac8b2bc872572ec5bb435eccdd59fbbc8b6", + "check_gpg": true + }, + { + "checksum": "sha256:a8ce7406c87f64972f0b70f1823c2aad05516c71fe375c6c97737459c2448825", + "check_gpg": true + }, + { + "checksum": "sha256:8dfdbe51193bdcfc3db41b5b9f317f009bfab6373e6ed3c5475466b8772a85e1", + "check_gpg": true + }, + { + "checksum": "sha256:3b4ce7fc4e2778758881feedf6ea19b65e99aa3672e19a7dd62977efe3b910b9", + "check_gpg": true + }, + { + "checksum": "sha256:b3230630a471b806a9153669d187508350cdb2b368a68f8c439c82abad038c3f", + "check_gpg": true + }, + { + "checksum": "sha256:6952dfc6a8f583c9aeafb16d5d34208d7e39fd7ec8628c5aa8ccde039acbe548", + "check_gpg": true + }, + { + "checksum": "sha256:5a4c0187b96690e0088057f7656c67d399fad44b28b86644e3434c581377c229", + "check_gpg": true + }, + { + "checksum": "sha256:ce8c1f1ce3cb2cc0166dcaad17f35e84278ec39ea9bf232e24130d3ff3271923", + "check_gpg": true + }, + { + "checksum": "sha256:9ecc8aa9af05ba704cec879618afeda5ff92d8233811e2d6080aa02e0b5ceddf", + "check_gpg": true + }, + { + "checksum": "sha256:5ad0d1b4e641e5d2fe7f6385ace0f827a431c5a52c6dc3516d85e655caca880f", + "check_gpg": true + }, + { + "checksum": "sha256:64922311f45700f2f4f98d78efbdfa240987a6a2b1396ffe694d30e2b5f34ac3", + "check_gpg": true + }, + { + "checksum": "sha256:aa783a91b1823b7b056575e6276df35910eb2e0d4b72121cf5649651c7d23a16", + "check_gpg": true + }, + { + "checksum": "sha256:df0a39eb6b91c4a8f481c22445cbbd88334bf5e0a6e1dd5fb240981eb031c4eb", + "check_gpg": true + }, + { + "checksum": "sha256:251fd875421da4708b76c15c7f5ba478d50b74d7e4242071a621625eac51a767", + "check_gpg": true + }, + { + "checksum": "sha256:0e59b422e35eee975ba68e6e4de022c8f145feec7e169e86e0244d2fdad2f590", + "check_gpg": true + }, + { + "checksum": "sha256:1446032720fb8e0090190828fcea294a86fc7f83edd70f6089e3446770ba0438", + "check_gpg": true + }, + { + "checksum": "sha256:54cb827278ae474cbab1f05e0fbee0355bee2674d46a804f1c2b78ff80a48caa", + "check_gpg": true + }, + { + "checksum": "sha256:29e2b62e9e63f25139a6863c863c3b534660440d7dec0c985807302a6895dbaf", + "check_gpg": true + }, + { + "checksum": "sha256:942707884401498938fba6e2439dc923d4e2d81f4bac205f4e73d458e9879927", + "check_gpg": true + }, + { + "checksum": "sha256:ddad78d00b09c6c85d46c06dcba4c951f7f7dfc9b2dab195bf45aa3f5a1fdc41", + "check_gpg": true + }, + { + "checksum": "sha256:cbfc109588fa0e34bdc408dbb37dadf7873fb5788dd3fd8cd04c17c75f26e6db", + "check_gpg": true + }, + { + "checksum": "sha256:be899d3e806441b1c46811c0ffe9f4e01f4ea4e1544f9cc32630254853e3f3a5", + "check_gpg": true + }, + { + "checksum": "sha256:b09015ae5fb5772b73bc7932991aaf6e1f6d509432af605a565ef53d2d50606a", + "check_gpg": true + }, + { + "checksum": "sha256:27701cda24f5f6386e0173745aabc4f6df28052975e73529854432c35399cfc8", + "check_gpg": true + }, + { + "checksum": "sha256:32f8cbb3be91f589d569a2e737130f29c752f78eebc61e287af17f207e1b8c58", + "check_gpg": true + }, + { + "checksum": "sha256:49bac21d5cdf863fccfcc32bf070e582d204706e35ee9f60b3e69df694bff87d", + "check_gpg": true + }, + { + "checksum": "sha256:599549d72d26b48c45156585a5698898c853e56469142e202d3749b781428465", + "check_gpg": true + }, + { + "checksum": "sha256:66bb5b2e99d2c74b82943fe61fe9b9a3674350b0242f69a6854ec9718dcf5e07", + "check_gpg": true + }, + { + "checksum": "sha256:af66820023c984d8b981ecac715d0c2daec1f89dcb69bed76ddf58b0ee80c1b1", + "check_gpg": true + }, + { + "checksum": "sha256:be998dfbcc9ca8e3021ac4f56ed723cfa3fa1517524e89ee0b636f623abe995f", + "check_gpg": true + }, + { + "checksum": "sha256:64567be564634937bd918d33a3f04017808d29269a5b0891a0f4d4aecad6161b", + "check_gpg": true + }, + { + "checksum": "sha256:052d04c9a6697c6e5aa546546ae5058d547fc4a4f474d2805a3e45dbf69193c6", + "check_gpg": true + }, + { + "checksum": "sha256:b35256e417fd94c7efb1212f2f36b5e6b224ff5b9e8733774d4fbdc652078099", + "check_gpg": true + }, + { + "checksum": "sha256:c1d754773972b5f4ca157c0afa45d6767901d965a91f381660c72740d682df63", + "check_gpg": true + }, + { + "checksum": "sha256:fb06aa3d8059406a23694ddafe0ef340ca627dd68bf3f351f094de58ef30fb2c", + "check_gpg": true + }, + { + "checksum": "sha256:729fb595040f1e2e71ff0a8c1c22ebe4b7187f78b816af8e6a8d93c03fc5d844", + "check_gpg": true + }, + { + "checksum": "sha256:b58828b2f1ce4f7778d3f511c61ee8925042b9752aea526c23d33fd7533aa975", + "check_gpg": true + }, + { + "checksum": "sha256:f9ccea65ecf98f4dfac65d25986d08efa62a1d1c0db9db0a061e7408d6805a1a", + "check_gpg": true + }, + { + "checksum": "sha256:8402d3aabfc02c16f3789f3f93338dbee2448db8a49956002b83aff5390922d9", + "check_gpg": true + }, + { + "checksum": "sha256:a7452c18c2cffc266ec36c54105b884c4d63181f20cebd705e33730534cb9093", + "check_gpg": true + }, + { + "checksum": "sha256:ed84414c9b2190d3026f58db78dffd8bc3a9ad40311cb0adb8ff8e3c7c06ca60", + "check_gpg": true + }, + { + "checksum": "sha256:7c1a229f4a36ac8b077e0514f68f311229652121528b0f8a2a7434c618276dcb", + "check_gpg": true + }, + { + "checksum": "sha256:cb4fb9b3733440ea15b3309c88d9471c4165aa7b71b4dbc5d0fb5bfcd97b2f2e", + "check_gpg": true + }, + { + "checksum": "sha256:ae219ad5ecc0233271c3fd61263f817c646eecece19a8f075e7aa4dd9ff8698e", + "check_gpg": true + }, + { + "checksum": "sha256:a7f040de29d2414cc99fcffcd9ed3fa9d06ecc7aecd783ec3d2eef769e2389f1", + "check_gpg": true + }, + { + "checksum": "sha256:ad50ed0c4f4c956e3b59ac9fc7bf5fba22068a661ea75a46eb81bc2209af4cc5", + "check_gpg": true + }, + { + "checksum": "sha256:9c8a274158a6fe97598e33900cd51e171f7e7517ccfc8ad6351873e69b225986", + "check_gpg": true + }, + { + "checksum": "sha256:9465f2f1103697207a52d15edd716ab72dc6c281823c60f424cd064d706c7a51", + "check_gpg": true + }, + { + "checksum": "sha256:c9ba05cb46a9cb52e3325ca20c457a377361abcd0e5a7dda776ba19481770467", + "check_gpg": true + }, + { + "checksum": "sha256:5b8a205f3d4bde162e01a821fdacbc10ebfa01b88ec61b166b4b6317c45910c4", + "check_gpg": true + }, + { + "checksum": "sha256:15f70393f706ea0ac6c622563268d9c00509ef376e3e087c1c05007b49894ee9", + "check_gpg": true + }, + { + "checksum": "sha256:10883ce95852cc9ae9b4e0d435b100a25f8fe5c0ea4677eb4a0b39f4f8def886", + "check_gpg": true + }, + { + "checksum": "sha256:9fa1959637c902dfeb19a0f16c7f42f7da4aab293f7c025c66d39debad6dbc34", + "check_gpg": true + }, + { + "checksum": "sha256:3b76bc46dd279404408d34946cfdb0c3899359a1c6b48e614e63d1259a94262a", + "check_gpg": true + }, + { + "checksum": "sha256:e851ba0019baa83e1bebbe92e1a1cf629694ccf3b42c5ff84e0ed7bea74931d3", + "check_gpg": true + }, + { + "checksum": "sha256:44cfb58b368fba586981aa838a7f3974ac1d66d2b3b695f88d7b1d2e9c81a0b6", + "check_gpg": true + }, + { + "checksum": "sha256:4375c398dff722a29bd1700bc8dc8b528345412d1e17d8d9d1176d9774962957", + "check_gpg": true + }, + { + "checksum": "sha256:95a89032291b05a0e483f336ea29897d951e8845b0f347a4117de90ef3ef3467", + "check_gpg": true + }, + { + "checksum": "sha256:640afe5b9d499c9a7efc1d23cce8c54e3e3704d92eb7e7a93a048f97d1e983e1", + "check_gpg": true + }, + { + "checksum": "sha256:9cf9b01f2c727e3576a8aa71fd7fe1bf4ec9ed1c9f50b756657cf9aeae18418f", + "check_gpg": true + }, + { + "checksum": "sha256:80cf220a3314f965c088e03d2b750426767db0b36b6b7c5e8059b9217ff4de6d", + "check_gpg": true + }, + { + "checksum": "sha256:2b098bc6f8004270ee9eac9f63980b364b5fe19394dc73a230b3c846cf488b1b", + "check_gpg": true + }, + { + "checksum": "sha256:b2e862283ac97b1d8b1ede2034ead452ac7dc4ff308593306275b1b0ae5b4102", + "check_gpg": true + }, + { + "checksum": "sha256:25fc5d288536e1973436da38357690575ed58e03e17ca48d2b3840364f830659", + "check_gpg": true + }, + { + "checksum": "sha256:04152a3a608d022a58830c0e3dac0818e2c060469b0f41d8d731f659981a4464", + "check_gpg": true + }, + { + "checksum": "sha256:c019d23ed2cb3ceb0ac9757a72c3e8b1d31f2a524b889e18049cc7d923bc9466", + "check_gpg": true + }, + { + "checksum": "sha256:0b7d24759aac33303ff4b101c111dea03ff2529efc95661140e22f629cc1ab7a", + "check_gpg": true + }, + { + "checksum": "sha256:e2566356943c1c7485d206b858dd6ae3be37c28bfec2a43f869193f3b5b9cd23", + "check_gpg": true + }, + { + "checksum": "sha256:3c2a641f118ab2e8b08df6dd2da72a60121d02df8d932b4afa2920eb80392875", + "check_gpg": true + }, + { + "checksum": "sha256:42fcfac5037eab4099648e0f0ed3eb2aec6eb6a23a9e3808f9b69619ea7c44e3", + "check_gpg": true + }, + { + "checksum": "sha256:ade8105796f5c1201a3efc8bcc654788cfc88c3815297b346845062a8c29cd59", + "check_gpg": true + }, + { + "checksum": "sha256:0d51c1319ee78978e6ea5a49b815c2078b4ffd4d575e98c70e54ca01c3390eb8", + "check_gpg": true + }, + { + "checksum": "sha256:8b148415fb6a583ef131d0ddff44f3209c30d0299fde7b20cd3ea385590927c1", + "check_gpg": true + }, + { + "checksum": "sha256:d1e244b8b5ce7404846e97d96c762c8c18ff6447301f6fc63f50e615029aa7cd", + "check_gpg": true + }, + { + "checksum": "sha256:d7b8b5815b72fb157de26579362383e357e026ae6ac2599c451fb336fe995555", + "check_gpg": true + }, + { + "checksum": "sha256:ad6d7d9767e05978b14a39c08dba59ddc4396584576df194f77ed310a0816ae0", + "check_gpg": true + }, + { + "checksum": "sha256:3f2cb9092d6f55f84dd9eacd5359dfb354772e5f38308328027c7758f4a06fb6", + "check_gpg": true + }, + { + "checksum": "sha256:45fc2608b746fd841dd25919e9e4d44834154758aec8fb8b529c014b11c7917d", + "check_gpg": true + }, + { + "checksum": "sha256:ec64add7d60a70fbaf14a083929f22bd2637c33d20d2a30b7e842caa6040f817", + "check_gpg": true + }, + { + "checksum": "sha256:3343d9e7c90bd58e1e44ee07e7c59bb570ffc74da50f0607c5f5681a00b70e76", + "check_gpg": true + }, + { + "checksum": "sha256:dedd37a96262c35763ab2dcbc19838f5cc39a2a3a392a650a80bd6d5ae42ff8b", + "check_gpg": true + }, + { + "checksum": "sha256:3589b982ac0c2f5f6b47cde5cb7ec33c2c01d756dabf8c4ca64f6d9d0d78b35e", + "check_gpg": true + }, + { + "checksum": "sha256:4c80ade4ac0889316930a8d181ea43fa2d1b2f1a6a5703c22f2b3ba191346eec", + "check_gpg": true + }, + { + "checksum": "sha256:156709efeaa1dfac72cc189d7e99de12d7c4b2069445da5d34fa807582e85719", + "check_gpg": true + }, + { + "checksum": "sha256:e5efc87172d7081559137feaa221047385a5e248ffafd9794c2bfc73b61f8f37", + "check_gpg": true + }, + { + "checksum": "sha256:933bdb4cc6e14b2ebb1ca76c14ca176c13d271a2d1e88632f237392777d11808", + "check_gpg": true + }, + { + "checksum": "sha256:6794fe48004c0403c29fc779b49f0fbea436123b96783a2df225eef2f0858795", + "check_gpg": true + }, + { + "checksum": "sha256:5db7c0e949bd9172b9645237e72f6139d4ffcf14defad487262b8ad25b427daf", + "check_gpg": true + }, + { + "checksum": "sha256:15f08ce979e48fd25be5e16d63d1c95c57f9abff7704005137ea00b958442939", + "check_gpg": true + }, + { + "checksum": "sha256:7df4fa1a29772696d92866e890af6fbe006088f3407ed3e67b0e7867ef58d899", + "check_gpg": true + }, + { + "checksum": "sha256:5c91890bf33527b9fb422cbed17600e761750a4e596fad3f0d0fa419070e82b0", + "check_gpg": true + }, + { + "checksum": "sha256:0bace0cf41921db39247c99bfccb228818b83b68c7b8be7c8c4a92ea298a9a29", + "check_gpg": true + }, + { + "checksum": "sha256:4a7b63b32f176b8861f6ac7363bc8010caea0c323eaa83167227118f05603022", + "check_gpg": true + }, + { + "checksum": "sha256:ccdfb24da56aa394a64cf2f0c6ac6d15d0ebd6054686bd2ab27641a5502329be", + "check_gpg": true + }, + { + "checksum": "sha256:536a157da5332c0bdacb3e5891e3012b79b18fcdedb63b393110d6eb8b04e428", + "check_gpg": true + }, + { + "checksum": "sha256:8df97dcfb42c1667b5d2e4150012eaf96f58eeac4f7b879e0928c8c36e3a7604", + "check_gpg": true + }, + { + "checksum": "sha256:3cd56dea57c00e2c4a9d5aac69a1e843ebef581ba76dde9d9878082fa1215485", + "check_gpg": true + }, + { + "checksum": "sha256:d49f0b1c8ecf9bc808ae93e9298a40fbcc124fe67c3bbdd37705b6b5d8cfdd87", + "check_gpg": true + }, + { + "checksum": "sha256:d439ffbe20c8c0e8244e31c0324d60cf959dc1cd6cecc575d7b34509a73e9386", + "check_gpg": true + }, + { + "checksum": "sha256:7c7eff31251dedcc3285a8b08c1b18f7fd9ee2e07dff86ad090f45a81e19e85e", + "check_gpg": true + }, + { + "checksum": "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4", + "check_gpg": true + }, + { + "checksum": "sha256:f3908831ae53f43b07a4e196850d0e59cc89b50c97d838538c3185fd0eb0d569", + "check_gpg": true + }, + { + "checksum": "sha256:52fe378ffab317ec4d26ae5fc0389dec874002a8d70a9413cefb68c7b16b0612", + "check_gpg": true + }, + { + "checksum": "sha256:be7ba234b6c48717ac0f69fb5868b3caa6ef09fbfc76c42a47b367578cd19444", + "check_gpg": true + }, + { + "checksum": "sha256:af992ad02594b68f17d2da41104a26aee41d02639edf22332d7dbb1fe9af58a5", + "check_gpg": true + }, + { + "checksum": "sha256:a7da5590635b9c19afafc7dd247604194a5ce7d8d863dc600b8cb86accb2e469", + "check_gpg": true + }, + { + "checksum": "sha256:7dd93baaf69a8004ae2cd3b9e6660b862d0b6f399d53c05a27a48a2e276ef1ee", + "check_gpg": true + }, + { + "checksum": "sha256:0b290954bc2868b3dfc976b2b7a13ea8aeade76eeafc17674ff8e721049a5bf7", + "check_gpg": true + }, + { + "checksum": "sha256:b79bb6af3e1650ba812c8affe42772ea566b164222a7d4d8e2f7efa867dc6849", + "check_gpg": true + }, + { + "checksum": "sha256:b1111e77a5fdbacaa04acc90d3844706158bc5892173862928705620b8910adb", + "check_gpg": true + }, + { + "checksum": "sha256:6aa0c6420a03f20e18842da9de611d823580efb8f6da93a94dafb48d59c2a070", + "check_gpg": true + }, + { + "checksum": "sha256:129adf9147d5d120546ca8e0fb5f165761106d386d366fe82591e372754d0b4a", + "check_gpg": true + }, + { + "checksum": "sha256:8ee8c4bbf024b998ffb77a6b4194a2306ac21c5a6fcf70c8c81a0fbf38f7c7fc", + "check_gpg": true + }, + { + "checksum": "sha256:34411604a91c301dc8489285065c68f3a2f50910717097fedcaade6481c7469e", + "check_gpg": true + }, + { + "checksum": "sha256:ec58d03c60386bfb8aed2af3d2a49f8c6e5ccb4d3fd592cf75fef3342be137c3", + "check_gpg": true + }, + { + "checksum": "sha256:f77cad4c497f11c5b5bd7c9a29fc1f5f5574f8443cc4496e3bd98e680b363124", + "check_gpg": true + }, + { + "checksum": "sha256:55bafcdf9c31b1456af3bf584bfe7ac745a03f4decd17197ea97b498d68b3b82", + "check_gpg": true + }, + { + "checksum": "sha256:0fc0193d95d69c780b6feb1cb74759ca2d4804701b3de936dac8429cfbe0f2e9", + "check_gpg": true + }, + { + "checksum": "sha256:9ade87dbb32f27e7f38ec981002ddc5a2189cc6f5ad5f24bada3b71cfa9167fd", + "check_gpg": true + }, + { + "checksum": "sha256:15f2fc89b7bd39dcd3f6f8db30f56b76b65df311d7ad9852d498fbbc5c7d2aa2", + "check_gpg": true + }, + { + "checksum": "sha256:6f5f53b66f7c3bf6958f6f163788583265ff0360188620c3b0f7ddedeac3d1f4", + "check_gpg": true + }, + { + "checksum": "sha256:724cca9919bb7b0183b030aca216d4d51de70bf35c2cc5e8325a21a52ca15ceb", + "check_gpg": true + }, + { + "checksum": "sha256:02654432f3853c9ae39c7601b5b0606c9d5eb5eef1d95e3e6f0074501842941f", + "check_gpg": true + }, + { + "checksum": "sha256:d2abba1a0523bd9df5073900593ab13ec2ed2e391440be4d883314fa154370f8", + "check_gpg": true + }, + { + "checksum": "sha256:cb0c64cc81e0b384bbc9d27ffcb2a655b13c91a799aad8972264aed1767926a3", + "check_gpg": true + }, + { + "checksum": "sha256:f1150f9e17beaef09aca0f291e10db8c3ee5566fbf4c929b7672334410fa74e9", + "check_gpg": true + }, + { + "checksum": "sha256:f1c79039f4c6ba0fad88590c2cb55a96489449c334a671cc18c0bf424a4548b8", + "check_gpg": true + }, + { + "checksum": "sha256:4cd01a3135b9e72906eaf4552e29929334dcccee2ed092a38bf60698522ecd5f", + "check_gpg": true + }, + { + "checksum": "sha256:c9f3d536c1fa73de90836147d15db06dc2025e84a44034bda6c66b9c4b60be58", + "check_gpg": true + }, + { + "checksum": "sha256:136a9cbae9c225be60718fdc8cc8988a55235d6502e451df77d1c5c765143850", + "check_gpg": true + }, + { + "checksum": "sha256:54b740cf7a75a7215168970378d9a1d6b9a5e4eb81159a874ce8ea5990436641", + "check_gpg": true + }, + { + "checksum": "sha256:ee664c392a97cdd272f57980c6856b2c57567005fa0ad9cb16c388b645d014f1", + "check_gpg": true + }, + { + "checksum": "sha256:9d220d8ee28cd0adf28e8fef547af92c3ec66e238747165939cf8e1a413ddf83", + "check_gpg": true + }, + { + "checksum": "sha256:27dd9c78e41c04b5151a2b9ac150d3ebb89f2ca7a23e4896dfc718f19a000be3", + "check_gpg": true + }, + { + "checksum": "sha256:024dd8a75eb5472692d0291292d25939b97a0295e5ab0958dcd22600d392eaae", + "check_gpg": true + }, + { + "checksum": "sha256:c50ff544430830086ce484b20a2b6eaa934c82b6277a6f4fb02fc8cbc9e25db7", + "check_gpg": true + }, + { + "checksum": "sha256:96e0c019cb91d8deefb7664cfe417807d23562d2a1bfd2cbfd1051e243136b57", + "check_gpg": true + }, + { + "checksum": "sha256:ffe5076b9018efdb1612c487f637af39ab6c3c79ec37311978935cfa357ecd61", + "check_gpg": true + }, + { + "checksum": "sha256:932a37ddd2a990a22a1ee7811d204552e8860e39a3e0c050ed618a535ae8c78c", + "check_gpg": true + }, + { + "checksum": "sha256:684aae86de55bd42215c136777613211f596788d3b6405d8fa645fb967904354", + "check_gpg": true + }, + { + "checksum": "sha256:84c338b327a3fb2f6edb79caa2242804fff8c83ffa3db0d9227f55eef4107b2a", + "check_gpg": true + }, + { + "checksum": "sha256:a336d2e77255df4783f52762e44efcc8d77b044a3e39c7f577d5535212848280", + "check_gpg": true + }, + { + "checksum": "sha256:4dd6100e477d88a4987b6eebfddecff168f38c7ff47cbb12f2fecba1e87c10d9", + "check_gpg": true + }, + { + "checksum": "sha256:a280c633b73517da167b91298fc97aeee2eb5fcc253c038ae0ce4b8478d3a103", + "check_gpg": true + }, + { + "checksum": "sha256:ee1681ee1ae6a3f86a876562939fbfe415ba78b0a803059e1b6d6cd63b0fa1a3", + "check_gpg": true + }, + { + "checksum": "sha256:f14d3b113e2c3ba3f8ab7a8146439924f38487c20dd533062616f17f500ff46b", + "check_gpg": true + }, + { + "checksum": "sha256:14cf772225c04c005add71372fce866e90f7144c27bbb8e846ce7887e0d286e0", + "check_gpg": true + }, + { + "checksum": "sha256:7f555c600b35ba798d8c0a63e30a1a12e917231730e1a44f48161ba0fe4b5973", + "check_gpg": true + }, + { + "checksum": "sha256:699c1a3ff311bbaa2380c085fb4f516aa08be474bed02bcd1569d0bbf5b22d07", + "check_gpg": true + }, + { + "checksum": "sha256:e5bf9266edf112540ec662bd492ce4bda3ed8d5e33d763b9f2318c42963a1d1b", + "check_gpg": true + }, + { + "checksum": "sha256:1de2be4fe5280ec3097305d9e671f5f2c768267f90d255edf2075eecb0c0afe9", + "check_gpg": true + }, + { + "checksum": "sha256:78db9007c08fa51f177210e47343b8e733ce0751826abb357ca96429836588db", + "check_gpg": true + }, + { + "checksum": "sha256:750da30da0289d5e2ad9ca297dda44e5ca18dbed0c3e0d4200379bc1818c22f3", + "check_gpg": true + }, + { + "checksum": "sha256:97197411bca68cfba1ef6bab1fdd4b41c95ec71c36f1e67f525b963cf60598fd", + "check_gpg": true + }, + { + "checksum": "sha256:334d63914e7ff6fe8cfce0c8f80006c6cf2ab0615cd044a6ee588809395499e5", + "check_gpg": true + }, + { + "checksum": "sha256:2cee64e12b295b74d2f4b008c7628ef3a01ef4149905fc4a7ae14b304da5f53b", + "check_gpg": true + }, + { + "checksum": "sha256:ea5f929563fb9ca0cf08da250c62c93d4755f4a41c1aca23eeeaf3e58e90d766", + "check_gpg": true + }, + { + "checksum": "sha256:8c560f3927e36e41657067e4bdc741fd8f3b55b497f0fc3c2331fb361ba8de8b", + "check_gpg": true + }, + { + "checksum": "sha256:90bc2171f438ffa7488a9c69cd86bb1de175807be468f285c8ca16cf8dd4a83c", + "check_gpg": true + }, + { + "checksum": "sha256:c3e2a3c23288899456fb996f3074c10637bcd4886bc446698cb1efa2734c1e4d", + "check_gpg": true + }, + { + "checksum": "sha256:5f156c2a950699d5cb9a21349cce049b3c8bfdcc4fcc780665fe2d3103f576c1", + "check_gpg": true + }, + { + "checksum": "sha256:cc1be420582afb6360f380ff301c5e3d873f69fe1f7e00e4450bf2daa40ef9ff", + "check_gpg": true + }, + { + "checksum": "sha256:6f669ae6f70cfa80917adf4ae9d5e86fbd9d31ee308a9a3408a19be3afc46f7b", + "check_gpg": true + }, + { + "checksum": "sha256:2db6d80760ab0e99f4e9c9816615e4f06b967bbb23a8c8c941b3f2d4b5f176c2", + "check_gpg": true + }, + { + "checksum": "sha256:9976e6228a10fa2761f1265a2a7666578d79ca57819837e5d1fbecc53324f1b9", + "check_gpg": true + }, + { + "checksum": "sha256:4fca21cfdcbed052e3e9e1eff74c22fb8ffb1fbbeb63e87e2aa540e43a8c0d09", + "check_gpg": true + }, + { + "checksum": "sha256:82e0d8f1e0dccc6d18acd04b7806350343140d9c91da7a216f93167dcf650a61", + "check_gpg": true + }, + { + "checksum": "sha256:d027a3ff0712e3e98d7d2358f8c526fb8d143b2386c353aadcc27199cffe125b", + "check_gpg": true + }, + { + "checksum": "sha256:9dcc75ac945924ce496c9280e7ac31b88886d94a6494d0710725a81dd9d42c9a", + "check_gpg": true + }, + { + "checksum": "sha256:d61ea8b6299f00397f740b73de146ef4daa6d6bb5863d525459765fa0f23a991", + "check_gpg": true + }, + { + "checksum": "sha256:ec12fef82d73314e3e4cb6e962f8de27e78989fa104dde0599a4480a53817647", + "check_gpg": true + }, + { + "checksum": "sha256:1bdde5dc99a5588a8983f70b7b3e45e7006215d529c72adfec118c3bcbf7b01c", + "check_gpg": true + }, + { + "checksum": "sha256:84702d6395a9577c1a268184f123cfd4b15bc2287f01033625ba388a34ec2338", + "check_gpg": true + }, + { + "checksum": "sha256:9194788f87e4a1aa8835f1305d290cc2cd67cee6a5b1ab82643d3a068c0145b6", + "check_gpg": true + }, + { + "checksum": "sha256:140708561a2ec1c7709fd38d8b1b115d02da710b80eeecd65c2b8387d9d78ef9", + "check_gpg": true + }, + { + "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", + "check_gpg": true + }, + { + "checksum": "sha256:3f7861ea2d8b4380b567f629a86fa31951a55f46f6eee017cb84ed87baf2c19e", + "check_gpg": true + } + ] + } + }, + { + "name": "org.osbuild.fix-bls", + "options": {} + }, + { + "name": "org.osbuild.locale", + "options": { + "language": "en_US" + } + }, + { + "name": "org.osbuild.systemd", + "options": { + "enabled_services": [ + "NetworkManager.service", + "firewalld.service", + "rngd.service", + "sshd.service", + "zram-swap.service" + ] + } + }, + { + "name": "org.osbuild.selinux", + "options": { + "file_contexts": "etc/selinux/targeted/contexts/files/file_contexts" + } + }, + { + "name": "org.osbuild.rpm-ostree", + "options": { + "etc_group_members": [ + "wheel", + "docker" + ] + } + } + ], + "assembler": { + "name": "org.osbuild.ostree.commit", + "options": { + "ref": "fedora/32/x86_64/iot", + "tar": { + "filename": "commit.tar" + } + } + } + } + }, + "rpmmd": { + "build-packages": [ + { + "name": "acl", + "epoch": 0, + "version": "2.2.53", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/acl-2.2.53-5.fc32.x86_64.rpm", + "checksum": "sha256:705bdb96aab3a0f9d9e2ff48ead1208e2dbc1927d713d8637632af936235217b", + "check_gpg": true + }, + { + "name": "alternatives", + "epoch": 0, + "version": "1.11", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/alternatives-1.11-6.fc32.x86_64.rpm", + "checksum": "sha256:c574c5432197acbe08ea15c7837be7577cd0b49902a3e65227792f051d73ce5c", + "check_gpg": true + }, + { + "name": "audit-libs", + "epoch": 0, + "version": "3.0", + "release": "0.19.20191104git1c2f876.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/audit-libs-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm", + "checksum": "sha256:22d311f22902d592f72bd0fb4010a682f796e5a4698d5ea209848468a2d5aa96", + "check_gpg": true + }, + { + "name": "basesystem", + "epoch": 0, + "version": "11", + "release": "9.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/basesystem-11-9.fc32.noarch.rpm", + "checksum": "sha256:a346990bb07adca8c323a15f31b093ef6e639bde6ca84adf1a3abebc4dc9adce", + "check_gpg": true + }, + { + "name": "bash", + "epoch": 0, + "version": "5.0.11", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bash-5.0.11-2.fc32.x86_64.rpm", + "checksum": "sha256:7a97e71cd552285ead303d07dbb6417403edf45c0a531e02cf4ebfb0efda4975", + "check_gpg": true + }, + { + "name": "bubblewrap", + "epoch": 0, + "version": "0.4.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bubblewrap-0.4.1-1.fc32.x86_64.rpm", + "checksum": "sha256:cd01ae91895e60f189106a159bb551f906a8b663110f421ad6ee83c9e008851e", + "check_gpg": true + }, + { + "name": "bzip2-libs", + "epoch": 0, + "version": "1.0.8", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bzip2-libs-1.0.8-2.fc32.x86_64.rpm", + "checksum": "sha256:842f7a38be2e8dbb14eff3ede4091db214ebe241e1fde7a128e88c4e686b63b0", + "check_gpg": true + }, + { + "name": "ca-certificates", + "epoch": 0, + "version": "2020.2.40", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/ca-certificates-2020.2.40-3.fc32.noarch.rpm", + "checksum": "sha256:73f6a9108f7d5ec3cd89c31dbbaa874ae28cd5cb443ef69700a1218903ee2fc4", + "check_gpg": true + }, + { + "name": "coreutils", + "epoch": 0, + "version": "8.32", + "release": "3.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-8.32-3.fc32.1.x86_64.rpm", + "checksum": "sha256:7023687eb65baa56a9b4c3ffde1e439b3d41b03ac4ad35a1a1fc3903464548f7", + "check_gpg": true + }, + { + "name": "coreutils-common", + "epoch": 0, + "version": "8.32", + "release": "3.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-common-8.32-3.fc32.1.x86_64.rpm", + "checksum": "sha256:5323eb8d89b2d0c905a633513e04ca7df633c21eec288ee8c50f3f5170534e37", + "check_gpg": true + }, + { + "name": "cpio", + "epoch": 0, + "version": "2.13", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cpio-2.13-4.fc32.x86_64.rpm", + "checksum": "sha256:116b9d121fad9886f245cd5e1ef678fdba889cd23a39e91447e75649214a6a8d", + "check_gpg": true + }, + { + "name": "cracklib", + "epoch": 0, + "version": "2.9.6", + "release": "22.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-2.9.6-22.fc32.x86_64.rpm", + "checksum": "sha256:862e75c10377098a9cc50407a0395e5f3a81d14b5b6fecfb3f223325c8867829", + "check_gpg": true + }, + { + "name": "cracklib-dicts", + "epoch": 0, + "version": "2.9.6", + "release": "22.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-dicts-2.9.6-22.fc32.x86_64.rpm", + "checksum": "sha256:1aee865249b031e591a5e94d62d05b69ad1a6118a26adccf2dfd46b0002716e5", + "check_gpg": true + }, + { + "name": "crypto-policies", + "epoch": 0, + "version": "20191128", + "release": "5.gitcd267a5.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-20191128-5.gitcd267a5.fc32.noarch.rpm", + "checksum": "sha256:3f8dcae27ad3609b7de298d0ca8d34a2790b9898f5f1b03f3f9f8784374e307b", + "check_gpg": true + }, + { + "name": "crypto-policies-scripts", + "epoch": 0, + "version": "20191128", + "release": "5.gitcd267a5.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch.rpm", + "checksum": "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b", + "check_gpg": true + }, + { + "name": "cryptsetup-libs", + "epoch": 0, + "version": "2.3.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cryptsetup-libs-2.3.0-1.fc32.x86_64.rpm", + "checksum": "sha256:eaffaa8de8fd28ad124da12524a2ca5db86252404d70d66c7c42921dad6b69c1", + "check_gpg": true + }, + { + "name": "curl", + "epoch": 0, + "version": "7.69.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/curl-7.69.1-1.fc32.x86_64.rpm", + "checksum": "sha256:6eeebf21f245bf0d6f58962dc49b6dfb51f55acb6a595c6b9cbe9628806b80a4", + "check_gpg": true + }, + { + "name": "cyrus-sasl-lib", + "epoch": 0, + "version": "2.1.27", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cyrus-sasl-lib-2.1.27-4.fc32.x86_64.rpm", + "checksum": "sha256:fefa4162a563eba24714ac43874c508d1ba036afb5127c5d21bbcbeaf238a740", + "check_gpg": true + }, + { + "name": "dbus", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-1.12.16-4.fc32.x86_64.rpm", + "checksum": "sha256:ed36d759746e75a2834866fbeaa783df397f8813cae2ed79fcc4d146656bf6a6", + "check_gpg": true + }, + { + "name": "dbus-broker", + "epoch": 0, + "version": "22", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-broker-22-1.fc32.x86_64.rpm", + "checksum": "sha256:213c17fb822ffa50fad16989ed363aa023de106c6262ccc3f16e52a154b7133f", + "check_gpg": true + }, + { + "name": "dbus-common", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-common-1.12.16-4.fc32.noarch.rpm", + "checksum": "sha256:6fc1b9a27eeb368a98f50dba5fc514f20a5eb23f8e0ee7dd92c4051ef8b4a940", + "check_gpg": true + }, + { + "name": "dbus-libs", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-libs-1.12.16-4.fc32.x86_64.rpm", + "checksum": "sha256:474fd088c7e7234221d251153e9fda6081b0aa8979bf5ae25810c9862e1e9960", + "check_gpg": true + }, + { + "name": "deltarpm", + "epoch": 0, + "version": "3.6.2", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/deltarpm-3.6.2-5.fc32.x86_64.rpm", + "checksum": "sha256:b70d1c93e3448b1a0b5e3f50488290283a260ff46e22bff4fb704469e6017fa8", + "check_gpg": true + }, + { + "name": "device-mapper", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:c132999a3f110029cd427f7578965ad558e91374637087d5230ee11c626ebcd4", + "check_gpg": true + }, + { + "name": "device-mapper-libs", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-libs-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:61cae80187ef2924857fdfc48a240646d23b331482cf181e7d8c661b02c15949", + "check_gpg": true + }, + { + "name": "diffutils", + "epoch": 0, + "version": "3.7", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/diffutils-3.7-4.fc32.x86_64.rpm", + "checksum": "sha256:187dd61be71efcca6adf9819a523d432217abb335afcb2b95ef27b72928aff4b", + "check_gpg": true + }, + { + "name": "dnf", + "epoch": 0, + "version": "4.2.19", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnf-4.2.19-1.fc32.noarch.rpm", + "checksum": "sha256:78e1aa11379eec2906eedf843216f47bcbdfe4da4713d566fb44ca313c893f3f", + "check_gpg": true + }, + { + "name": "dnf-data", + "epoch": 0, + "version": "4.2.19", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnf-data-4.2.19-1.fc32.noarch.rpm", + "checksum": "sha256:80d407bbc5f6bb8d95504cfdb51faaca937f6c4c08df4c4aadcd46fe703c8a57", + "check_gpg": true + }, + { + "name": "dosfstools", + "epoch": 0, + "version": "4.1", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dosfstools-4.1-10.fc32.x86_64.rpm", + "checksum": "sha256:c3f7089ae50f79cf4d2cb59e01091d33c70cab89ae08f95c547339a87404c3ec", + "check_gpg": true + }, + { + "name": "dracut", + "epoch": 0, + "version": "050", + "release": "26.git20200316.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-050-26.git20200316.fc32.x86_64.rpm", + "checksum": "sha256:993680d5cd133a0c21184be92b3df405d757613d0ca25c4abf08b203d8d26b79", + "check_gpg": true + }, + { + "name": "e2fsprogs", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:2fa5e252441852dae918b522a2ff3f46a5bbee4ce8936e06702bf65f57d7ff99", + "check_gpg": true + }, + { + "name": "e2fsprogs-libs", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-libs-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:26db62c2bc52c3eee5f3039cdbdf19498f675d0f45aec0c2a1c61c635f01479e", + "check_gpg": true + }, + { + "name": "elfutils-debuginfod-client", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-debuginfod-client-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:4f318cec61cb69fc233ba5505b7e24f679afdfb0b5defbaef507f1b471e7dbb5", + "check_gpg": true + }, + { + "name": "elfutils-default-yama-scope", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-default-yama-scope-0.179-1.fc32.noarch.rpm", + "checksum": "sha256:af62d0611b995b9f2b2c7b4d4852e03e521d66979534871ccb5a71275a15518d", + "check_gpg": true + }, + { + "name": "elfutils-libelf", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libelf-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:f3eb795f68c80ccf870f1d27f8fd019878db748c0c19275634c48cf5cea5bc46", + "check_gpg": true + }, + { + "name": "elfutils-libs", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libs-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:99f87b4ec7c5852d45028f3eae65fc813f3ef107e128777f265b09a19ce262e0", + "check_gpg": true + }, + { + "name": "expat", + "epoch": 0, + "version": "2.2.8", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/expat-2.2.8-2.fc32.x86_64.rpm", + "checksum": "sha256:8fc2ae85f242105987d8fa7f05e4fa19358a7c81dff5fa163cf021eb6b9905e9", + "check_gpg": true + }, + { + "name": "fedora-gpg-keys", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-gpg-keys-32-1.noarch.rpm", + "checksum": "sha256:09fea9af8b695af862b19c1a8fbe1b1e8854257825ee4f663f67b3782a75d58a", + "check_gpg": true + }, + { + "name": "fedora-release", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-32-1.noarch.rpm", + "checksum": "sha256:1f2ba0fc562864ad1bea31a42da124030fc188d23a84d144be616c2d066e1531", + "check_gpg": true + }, + { + "name": "fedora-release-common", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-common-32-1.noarch.rpm", + "checksum": "sha256:a1835a7929d3c1613f3890caef878e9bdf857dcc0f63eb4d63a1140370b3f21b", + "check_gpg": true + }, + { + "name": "fedora-repos", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-repos-32-1.noarch.rpm", + "checksum": "sha256:21e3fd914a3bcc65b79de022782967903c55a4aed9a3c7d3464bc2fef32d02b3", + "check_gpg": true + }, + { + "name": "file", + "epoch": 0, + "version": "5.38", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-5.38-2.fc32.x86_64.rpm", + "checksum": "sha256:28656826cb0dfbae9b6e8d1e5c5691773d84000493c4be47f727092fec6dc6f4", + "check_gpg": true + }, + { + "name": "file-libs", + "epoch": 0, + "version": "5.38", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-libs-5.38-2.fc32.x86_64.rpm", + "checksum": "sha256:e0b1da98020a740991dbb70b42c0ff1eece9e268a461e555a5ec763bda1645f5", + "check_gpg": true + }, + { + "name": "filesystem", + "epoch": 0, + "version": "3.14", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/filesystem-3.14-2.fc32.x86_64.rpm", + "checksum": "sha256:1110261787146443e089955912255d99daf7ba042c3743e13648a9eb3d80ceb4", + "check_gpg": true + }, + { + "name": "findutils", + "epoch": 1, + "version": "4.7.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/findutils-4.7.0-3.fc32.x86_64.rpm", + "checksum": "sha256:0b7cd6f6cb3b7cd9e0704dd6c62b65254b04cb870ab638b9bed4951564436e24", + "check_gpg": true + }, + { + "name": "fuse", + "epoch": 0, + "version": "2.9.9", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-2.9.9-9.fc32.x86_64.rpm", + "checksum": "sha256:9369d4fed30402f45705b7a5cb51b6eeefb1dabbe0942c84514c6fdf1edac5e0", + "check_gpg": true + }, + { + "name": "fuse-common", + "epoch": 0, + "version": "3.9.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-common-3.9.1-1.fc32.x86_64.rpm", + "checksum": "sha256:45132e53c649def28d63c199d8c3a3b9fd16fa8bca7426ad4e9c202e52a233b4", + "check_gpg": true + }, + { + "name": "fuse-libs", + "epoch": 0, + "version": "2.9.9", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-9.fc32.x86_64.rpm", + "checksum": "sha256:53992752850779218421994f61f1589eda5d368e28d340dccaae3f67de06e7f2", + "check_gpg": true + }, + { + "name": "gawk", + "epoch": 0, + "version": "5.0.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gawk-5.0.1-7.fc32.x86_64.rpm", + "checksum": "sha256:d0e5d0104cf20c8dd332053a5903aab9b7fdadb84b35a1bfb3a6456f3399eb32", + "check_gpg": true + }, + { + "name": "gdbm-libs", + "epoch": 1, + "version": "1.18.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gdbm-libs-1.18.1-3.fc32.x86_64.rpm", + "checksum": "sha256:9899cfd32ada2537693af30b60051da21c6264b0d0db51ba709fceb179d4c836", + "check_gpg": true + }, + { + "name": "gettext", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:349af433b2f6d45ff2e1ea5a38f847ec692fef0a8dd656a9a07d423a981946d0", + "check_gpg": true + }, + { + "name": "gettext-libs", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-libs-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:fdb9bc612957a16fc44b717605a5a26e16a33850c0ff74a80a299cc2bab740e4", + "check_gpg": true + }, + { + "name": "glib2", + "epoch": 0, + "version": "2.64.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glib2-2.64.1-1.fc32.x86_64.rpm", + "checksum": "sha256:6fe524feb38312f9c370b2190aeb42330acc9ce42f3a45e9cd05748b4aa00db2", + "check_gpg": true + }, + { + "name": "glibc", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:dc9c0401522bcf73fe5a692184c141b214947ad83364be97de0413ab46b712e5", + "check_gpg": true + }, + { + "name": "glibc-all-langpacks", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-all-langpacks-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:129d919e55c09edecaa8edd0fd4058dbf7460aaae5d1c5625ca11f6df7defefe", + "check_gpg": true + }, + { + "name": "glibc-common", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-common-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:e80533822e2a892345b869395b2c17c0bcc98d3c3c47787da30123096835db00", + "check_gpg": true + }, + { + "name": "gmp", + "epoch": 1, + "version": "6.1.2", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gmp-6.1.2-13.fc32.x86_64.rpm", + "checksum": "sha256:178e4470a6dfca84ec133932606737bfe167094560bf473940504c511354ddc9", + "check_gpg": true + }, + { + "name": "gnupg2", + "epoch": 0, + "version": "2.2.19", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-2.2.19-1.fc32.x86_64.rpm", + "checksum": "sha256:cc3396df93ce0e8f439b83fb6b4d210903876846b0bd3a22c19c7770cf5a9050", + "check_gpg": true + }, + { + "name": "gnupg2-smime", + "epoch": 0, + "version": "2.2.19", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-smime-2.2.19-1.fc32.x86_64.rpm", + "checksum": "sha256:966084f83e0fedb7a217aa102b484ac8a63082ccfe99517544ed2cb102191204", + "check_gpg": true + }, + { + "name": "gnutls", + "epoch": 0, + "version": "3.6.13", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnutls-3.6.13-1.fc32.x86_64.rpm", + "checksum": "sha256:9d4f1290565b852e56f9e9babc14b141b0283998121f78b0eb83dec367cf0abb", + "check_gpg": true + }, + { + "name": "gpgme", + "epoch": 0, + "version": "1.13.1", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gpgme-1.13.1-6.fc32.x86_64.rpm", + "checksum": "sha256:13a0c9c767f71164cc678ee36d89b7fddcdd6fb8243e3daf8b47cca0d1d14c4f", + "check_gpg": true + }, + { + "name": "grep", + "epoch": 0, + "version": "3.3", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grep-3.3-4.fc32.x86_64.rpm", + "checksum": "sha256:759165656ac8141b0c0ada230c258ffcd4516c4c8d132d7fbaf762cd5a5e4095", + "check_gpg": true + }, + { + "name": "grub2-common", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-common-2.04-12.fc32.noarch.rpm", + "checksum": "sha256:01173d218dccdf88c1159bba4af332ce703fc0dcd7171cd279cb3e16f12b30a9", + "check_gpg": true + }, + { + "name": "grub2-pc", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:110f538d82f15f009d95e89d8c1e3669dc7358feb9aa7724301fef037f8b67fe", + "check_gpg": true + }, + { + "name": "grub2-pc-modules", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-12.fc32.noarch.rpm", + "checksum": "sha256:c2197913bc8db9548b0a40ffddf840a31956b18e932ad4eec77a48d87d2289ce", + "check_gpg": true + }, + { + "name": "grub2-tools", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:7f6d2841ec9402ee5e57f1a46b9886935138c02005d860899f3c746c7885c7b9", + "check_gpg": true + }, + { + "name": "grub2-tools-minimal", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-minimal-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:d1c6f183b9deaf6127db4ad7040046bd7f1aa62de177961aac39501605d2c815", + "check_gpg": true + }, + { + "name": "gzip", + "epoch": 0, + "version": "1.10", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gzip-1.10-2.fc32.x86_64.rpm", + "checksum": "sha256:53f1e8570b175e8b58895646df6d8068a7e1f3cb1bafdde714ddd038bcf91e85", + "check_gpg": true + }, + { + "name": "ima-evm-utils", + "epoch": 0, + "version": "1.2.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ima-evm-utils-1.2.1-3.fc32.x86_64.rpm", + "checksum": "sha256:c1f957511b5e011e6f7995ed7bca9196703cf1214068f209e86b1dc4fd0e98bf", + "check_gpg": true + }, + { + "name": "iptables-libs", + "epoch": 0, + "version": "1.8.4", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-libs-1.8.4-7.fc32.x86_64.rpm", + "checksum": "sha256:f4eb6d332b9aea8d8ef0a6ea8dc2b073d6bf5f2599d64f24111d8da2ee82ad48", + "check_gpg": true + }, + { + "name": "json-c", + "epoch": 0, + "version": "0.13.1", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-c-0.13.1-9.fc32.x86_64.rpm", + "checksum": "sha256:d3a64fcef3de79a97541b21c71ddd00d4cca9039c930bc660d6c5479eabf5f26", + "check_gpg": true + }, + { + "name": "json-glib", + "epoch": 0, + "version": "1.4.4", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-glib-1.4.4-4.fc32.x86_64.rpm", + "checksum": "sha256:8a03d482b5294f7452b2f9ce31ebb6aea9eefac002281c1b9152fbb1a0341987", + "check_gpg": true + }, + { + "name": "kbd", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-2.2.0-1.fc32.x86_64.rpm", + "checksum": "sha256:a05178831a546e2001e52f065fc6969f36d2292efaee2971fe7a7e882cc8c813", + "check_gpg": true + }, + { + "name": "kbd-legacy", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-legacy-2.2.0-1.fc32.noarch.rpm", + "checksum": "sha256:3be681b78e919bfd82eb186c7393718f1d37abd0b1bb8b1a8571aefa11e7a248", + "check_gpg": true + }, + { + "name": "kbd-misc", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-misc-2.2.0-1.fc32.noarch.rpm", + "checksum": "sha256:60774007011889671c28158f599032f0db253c153ccae70f5e2f5840f2dc490b", + "check_gpg": true + }, + { + "name": "keyutils-libs", + "epoch": 0, + "version": "1.6", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/keyutils-libs-1.6-4.fc32.x86_64.rpm", + "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", + "check_gpg": true + }, + { + "name": "kmod", + "epoch": 0, + "version": "27", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-27-1.fc32.x86_64.rpm", + "checksum": "sha256:3f9c95f3827b785f49ac4a270d4c3a703dceba673c452838744ec5064cf43cbd", + "check_gpg": true + }, + { + "name": "kmod-libs", + "epoch": 0, + "version": "27", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-libs-27-1.fc32.x86_64.rpm", + "checksum": "sha256:56187c1c980cc0680f4dbc433ed2c8507e7dc9ab00000615b63ea08c086b7ab2", + "check_gpg": true + }, + { + "name": "kpartx", + "epoch": 0, + "version": "0.8.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kpartx-0.8.2-3.fc32.x86_64.rpm", + "checksum": "sha256:fbb81a7811f7a11b1c95eec20c3df63beef9e007f0b3d2713f13ad80029d7249", + "check_gpg": true + }, + { + "name": "krb5-libs", + "epoch": 0, + "version": "1.18", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/krb5-libs-1.18-1.fc32.x86_64.rpm", + "checksum": "sha256:e2b2dddbce49fab5f01ba75fae8796ab7c9fd8280c652f78d06a2644246bd16d", + "check_gpg": true + }, + { + "name": "libacl", + "epoch": 0, + "version": "2.2.53", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libacl-2.2.53-5.fc32.x86_64.rpm", + "checksum": "sha256:f826f984b23d0701a1b72de5882b9c0e7bae87ef49d9edfea156654f489f8b2b", + "check_gpg": true + }, + { + "name": "libaio", + "epoch": 0, + "version": "0.3.111", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libaio-0.3.111-7.fc32.x86_64.rpm", + "checksum": "sha256:a410db5c56d4f39f6ea71e7d5bb6d4a2bd518015d1e34f38fbc0d7bbd4e872d4", + "check_gpg": true + }, + { + "name": "libarchive", + "epoch": 0, + "version": "3.4.2", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libarchive-3.4.2-1.fc32.x86_64.rpm", + "checksum": "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58", + "check_gpg": true + }, + { + "name": "libargon2", + "epoch": 0, + "version": "20171227", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libargon2-20171227-4.fc32.x86_64.rpm", + "checksum": "sha256:7d9bd2fe016ca8860e8fab4a430b3aae4c7b7bea55f8ccd7775ad470172e2886", + "check_gpg": true + }, + { + "name": "libassuan", + "epoch": 0, + "version": "2.5.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libassuan-2.5.3-3.fc32.x86_64.rpm", + "checksum": "sha256:598a136b7027cb9b4fef6bfa34715979d41c2f62c9d8bec5d50b633a17790f7b", + "check_gpg": true + }, + { + "name": "libattr", + "epoch": 0, + "version": "2.4.48", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libattr-2.4.48-8.fc32.x86_64.rpm", + "checksum": "sha256:65e0cfe367ae4d54cf8bf509cb05e063c9eb6f2fea8dadcf746cdd85adc31d88", + "check_gpg": true + }, + { + "name": "libblkid", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libblkid-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:1830b4aa42ef492c13b62f63fe941970869ba19bd9abde4dea5c97f9e38ffd68", + "check_gpg": true + }, + { + "name": "libbrotli", + "epoch": 0, + "version": "1.0.7", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libbrotli-1.0.7-10.fc32.x86_64.rpm", + "checksum": "sha256:ac8b1fea0b678d7630033a8900be5641b934306961b39a29c79c6d72f34f7d1c", + "check_gpg": true + }, + { + "name": "libcap", + "epoch": 0, + "version": "2.26", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-2.26-7.fc32.x86_64.rpm", + "checksum": "sha256:1bc0542cf8a3746d0fe25c397a93c8206963f1f287246c6fb864eedfc9ffa4a7", + "check_gpg": true + }, + { + "name": "libcap-ng", + "epoch": 0, + "version": "0.7.10", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-ng-0.7.10-2.fc32.x86_64.rpm", + "checksum": "sha256:b60670fdcf91b50d97720f601d92277efedbd690bd887000ccd9a46b3fa8b314", + "check_gpg": true + }, + { + "name": "libcom_err", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcom_err-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:4494013eac1ad337673f084242aa8ebffb4a149243475b448bee9266401f2896", + "check_gpg": true + }, + { + "name": "libcomps", + "epoch": 0, + "version": "0.1.14", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcomps-0.1.14-4.fc32.x86_64.rpm", + "checksum": "sha256:e9a3ace2c71c2388ed6402e92ba148acb8d19b5c3495a47148b9e88cc6d6d1eb", + "check_gpg": true + }, + { + "name": "libcroco", + "epoch": 0, + "version": "0.6.13", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcroco-0.6.13-3.fc32.x86_64.rpm", + "checksum": "sha256:63400fedea4a6ddb8fced58d33e60560791f29cd439169998f337d09fb50a7d4", + "check_gpg": true + }, + { + "name": "libcurl", + "epoch": 0, + "version": "7.69.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcurl-7.69.1-1.fc32.x86_64.rpm", + "checksum": "sha256:7dfe1e8dac6d759479ae3dfd415fdd2662bbed9ff0f4da6093279efd1bacae31", + "check_gpg": true + }, + { + "name": "libdb", + "epoch": 0, + "version": "5.3.28", + "release": "40.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-5.3.28-40.fc32.x86_64.rpm", + "checksum": "sha256:688fcc0b7ef3c48cf7d602eefd7fefae7bcad4f0dc71c9fe9432c2ce5bbd9daa", + "check_gpg": true + }, + { + "name": "libdb-utils", + "epoch": 0, + "version": "5.3.28", + "release": "40.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-utils-5.3.28-40.fc32.x86_64.rpm", + "checksum": "sha256:431d836b2be015212d8c15b4290d5ce5bb45282cbf3fc52696f632d84ce34dfe", + "check_gpg": true + }, + { + "name": "libdnf", + "epoch": 0, + "version": "0.45.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdnf-0.45.0-3.fc32.x86_64.rpm", + "checksum": "sha256:fa08dccd7a2e38dfbab999613bdb41df2034b506d21964d0ef368af6e56c4cf9", + "check_gpg": true + }, + { + "name": "libevent", + "epoch": 0, + "version": "2.1.8", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libevent-2.1.8-8.fc32.x86_64.rpm", + "checksum": "sha256:7bf42ff57ce2a31db0da7d6c5926552f4e51e9f25cded77bd634eb5cd35eadab", + "check_gpg": true + }, + { + "name": "libfdisk", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libfdisk-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:942d06ec1f7033ea4c729b84ee09f5491481770efe10151ba581479ac7f3f9dc", + "check_gpg": true + }, + { + "name": "libffi", + "epoch": 0, + "version": "3.1", + "release": "24.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libffi-3.1-24.fc32.x86_64.rpm", + "checksum": "sha256:86c87a4169bdf75c6d3a2f11d3a7e20b6364b2db97c74bc7eb62b1b22bc54401", + "check_gpg": true + }, + { + "name": "libgcc", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcc-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:48cf5ab32f6af8f2283d4d4834e8dd262aa412be7ea07c2292483e150d614bef", + "check_gpg": true + }, + { + "name": "libgcrypt", + "epoch": 0, + "version": "1.8.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcrypt-1.8.5-3.fc32.x86_64.rpm", + "checksum": "sha256:5f0ae954b5955c86623e68cd81ccf8505a89f260003b8a3be6a93bd76f18452c", + "check_gpg": true + }, + { + "name": "libgomp", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgomp-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:d65b4bb6fa49198237f9b704ec471d71dfd94b87290f4d03c1c34d12f6efeb95", + "check_gpg": true + }, + { + "name": "libgpg-error", + "epoch": 0, + "version": "1.36", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpg-error-1.36-3.fc32.x86_64.rpm", + "checksum": "sha256:9bd5cb588664e8427bc8bebde0cdf5e14315916624ab6b1979dde60f6eae4278", + "check_gpg": true + }, + { + "name": "libidn2", + "epoch": 0, + "version": "2.3.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libidn2-2.3.0-2.fc32.x86_64.rpm", + "checksum": "sha256:20787251df57a108bbf9c40e30f041b71ac36c8a10900fb699e574ee7e259bf2", + "check_gpg": true + }, + { + "name": "libkcapi", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:8677b34fa73f258b1a599d18419f6fbbb8961bb1ca2ae5b0f9abdcc4f93b319e", + "check_gpg": true + }, + { + "name": "libkcapi-hmaccalc", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-hmaccalc-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:5d5c8c7e9c78e3b8827ad38771efb44951d1c3c1692cf4e07b138c1c8c42bd5b", + "check_gpg": true + }, + { + "name": "libksba", + "epoch": 0, + "version": "1.3.5", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libksba-1.3.5-11.fc32.x86_64.rpm", + "checksum": "sha256:1b05dd5abad5a31380c859bc33e7851158c24333fda837ca9facf869005f81fe", + "check_gpg": true + }, + { + "name": "libmetalink", + "epoch": 0, + "version": "0.1.3", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmetalink-0.1.3-10.fc32.x86_64.rpm", + "checksum": "sha256:6eb95e39b9771c4dde5f9954a74cef6be90522c28c7c4aa767ebe7a9d55fcdf9", + "check_gpg": true + }, + { + "name": "libmnl", + "epoch": 0, + "version": "1.0.4", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmnl-1.0.4-11.fc32.x86_64.rpm", + "checksum": "sha256:1c68255945533ed4e3368125bc46e19f3fe348d7ec507a85a35038dbb976003f", + "check_gpg": true + }, + { + "name": "libmodulemd", + "epoch": 0, + "version": "2.9.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodulemd-2.9.1-1.fc32.x86_64.rpm", + "checksum": "sha256:f98f854a86c68b534f71e1f35852fabddbe2cbfe481b01bb15291b3363013b2a", + "check_gpg": true + }, + { + "name": "libmodulemd1", + "epoch": 0, + "version": "1.8.16", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodulemd1-1.8.16-2.fc32.x86_64.rpm", + "checksum": "sha256:aa5b658fd4a95c724b61eddadecdbcbc1b2a813ae681318ab092a2ed03954825", + "check_gpg": true + }, + { + "name": "libmount", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmount-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:e740cc0a580639b887bda0039a779e750a32835be1fd8c64aa01183b4cbb98bf", + "check_gpg": true + }, + { + "name": "libnetfilter_conntrack", + "epoch": 0, + "version": "1.0.7", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnetfilter_conntrack-1.0.7-4.fc32.x86_64.rpm", + "checksum": "sha256:884357540f4be2a74e608e2c7a31f2371ee3b4d29be2fe39a371c0b131d84aa6", + "check_gpg": true + }, + { + "name": "libnfnetlink", + "epoch": 0, + "version": "1.0.1", + "release": "17.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnfnetlink-1.0.1-17.fc32.x86_64.rpm", + "checksum": "sha256:ec6abd65541b5bded814de19c9d064e6c21e3d8b424dba7cb25b2fdc52d45a2b", + "check_gpg": true + }, + { + "name": "libnghttp2", + "epoch": 0, + "version": "1.40.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnghttp2-1.40.0-2.fc32.x86_64.rpm", + "checksum": "sha256:a8ce7406c87f64972f0b70f1823c2aad05516c71fe375c6c97737459c2448825", + "check_gpg": true + }, + { + "name": "libnsl2", + "epoch": 0, + "version": "1.2.0", + "release": "6.20180605git4a062cf.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnsl2-1.2.0-6.20180605git4a062cf.fc32.x86_64.rpm", + "checksum": "sha256:3b4ce7fc4e2778758881feedf6ea19b65e99aa3672e19a7dd62977efe3b910b9", + "check_gpg": true + }, + { + "name": "libpcap", + "epoch": 14, + "version": "1.9.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpcap-1.9.1-3.fc32.x86_64.rpm", + "checksum": "sha256:b3230630a471b806a9153669d187508350cdb2b368a68f8c439c82abad038c3f", + "check_gpg": true + }, + { + "name": "libpsl", + "epoch": 0, + "version": "0.21.0", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpsl-0.21.0-4.fc32.x86_64.rpm", + "checksum": "sha256:ce8c1f1ce3cb2cc0166dcaad17f35e84278ec39ea9bf232e24130d3ff3271923", + "check_gpg": true + }, + { + "name": "libpwquality", + "epoch": 0, + "version": "1.4.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpwquality-1.4.2-2.fc32.x86_64.rpm", + "checksum": "sha256:9ecc8aa9af05ba704cec879618afeda5ff92d8233811e2d6080aa02e0b5ceddf", + "check_gpg": true + }, + { + "name": "librepo", + "epoch": 0, + "version": "1.11.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/librepo-1.11.1-4.fc32.x86_64.rpm", + "checksum": "sha256:aa783a91b1823b7b056575e6276df35910eb2e0d4b72121cf5649651c7d23a16", + "check_gpg": true + }, + { + "name": "libreport-filesystem", + "epoch": 0, + "version": "2.12.0", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libreport-filesystem-2.12.0-3.fc32.noarch.rpm", + "checksum": "sha256:3d33c29bcc4a39be16d6647a70a0d7ae2f08baf26dcea5c802289df1128d5f21", + "check_gpg": true + }, + { + "name": "libseccomp", + "epoch": 0, + "version": "2.4.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libseccomp-2.4.2-3.fc32.x86_64.rpm", + "checksum": "sha256:df0a39eb6b91c4a8f481c22445cbbd88334bf5e0a6e1dd5fb240981eb031c4eb", + "check_gpg": true + }, + { + "name": "libsecret", + "epoch": 0, + "version": "0.20.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsecret-0.20.2-2.fc32.x86_64.rpm", + "checksum": "sha256:251fd875421da4708b76c15c7f5ba478d50b74d7e4242071a621625eac51a767", + "check_gpg": true + }, + { + "name": "libselinux", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:0e59b422e35eee975ba68e6e4de022c8f145feec7e169e86e0244d2fdad2f590", + "check_gpg": true + }, + { + "name": "libselinux-utils", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-utils-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:1446032720fb8e0090190828fcea294a86fc7f83edd70f6089e3446770ba0438", + "check_gpg": true + }, + { + "name": "libsemanage", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsemanage-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:54cb827278ae474cbab1f05e0fbee0355bee2674d46a804f1c2b78ff80a48caa", + "check_gpg": true + }, + { + "name": "libsepol", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsepol-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:29e2b62e9e63f25139a6863c863c3b534660440d7dec0c985807302a6895dbaf", + "check_gpg": true + }, + { + "name": "libsigsegv", + "epoch": 0, + "version": "2.11", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsigsegv-2.11-10.fc32.x86_64.rpm", + "checksum": "sha256:942707884401498938fba6e2439dc923d4e2d81f4bac205f4e73d458e9879927", + "check_gpg": true + }, + { + "name": "libsmartcols", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsmartcols-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:ddad78d00b09c6c85d46c06dcba4c951f7f7dfc9b2dab195bf45aa3f5a1fdc41", + "check_gpg": true + }, + { + "name": "libsolv", + "epoch": 0, + "version": "0.7.11", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsolv-0.7.11-2.fc32.x86_64.rpm", + "checksum": "sha256:be899d3e806441b1c46811c0ffe9f4e01f4ea4e1544f9cc32630254853e3f3a5", + "check_gpg": true + }, + { + "name": "libss", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libss-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:27701cda24f5f6386e0173745aabc4f6df28052975e73529854432c35399cfc8", + "check_gpg": true + }, + { + "name": "libssh", + "epoch": 0, + "version": "0.9.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-0.9.3-2.fc32.x86_64.rpm", + "checksum": "sha256:32f8cbb3be91f589d569a2e737130f29c752f78eebc61e287af17f207e1b8c58", + "check_gpg": true + }, + { + "name": "libssh-config", + "epoch": 0, + "version": "0.9.3", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-config-0.9.3-2.fc32.noarch.rpm", + "checksum": "sha256:49bac21d5cdf863fccfcc32bf070e582d204706e35ee9f60b3e69df694bff87d", + "check_gpg": true + }, + { + "name": "libstdc++", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libstdc++-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:be998dfbcc9ca8e3021ac4f56ed723cfa3fa1517524e89ee0b636f623abe995f", + "check_gpg": true + }, + { + "name": "libtasn1", + "epoch": 0, + "version": "4.16.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtasn1-4.16.0-1.fc32.x86_64.rpm", + "checksum": "sha256:052d04c9a6697c6e5aa546546ae5058d547fc4a4f474d2805a3e45dbf69193c6", + "check_gpg": true + }, + { + "name": "libtextstyle", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtextstyle-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:b35256e417fd94c7efb1212f2f36b5e6b224ff5b9e8733774d4fbdc652078099", + "check_gpg": true + }, + { + "name": "libtirpc", + "epoch": 0, + "version": "1.2.5", + "release": "1.rc2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtirpc-1.2.5-1.rc2.fc32.x86_64.rpm", + "checksum": "sha256:c1d754773972b5f4ca157c0afa45d6767901d965a91f381660c72740d682df63", + "check_gpg": true + }, + { + "name": "libunistring", + "epoch": 0, + "version": "0.9.10", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libunistring-0.9.10-7.fc32.x86_64.rpm", + "checksum": "sha256:fb06aa3d8059406a23694ddafe0ef340ca627dd68bf3f351f094de58ef30fb2c", + "check_gpg": true + }, + { + "name": "libusbx", + "epoch": 0, + "version": "1.0.23", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libusbx-1.0.23-1.fc32.x86_64.rpm", + "checksum": "sha256:729fb595040f1e2e71ff0a8c1c22ebe4b7187f78b816af8e6a8d93c03fc5d844", + "check_gpg": true + }, + { + "name": "libutempter", + "epoch": 0, + "version": "1.1.6", + "release": "18.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libutempter-1.1.6-18.fc32.x86_64.rpm", + "checksum": "sha256:f9ccea65ecf98f4dfac65d25986d08efa62a1d1c0db9db0a061e7408d6805a1a", + "check_gpg": true + }, + { + "name": "libuuid", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libuuid-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:8402d3aabfc02c16f3789f3f93338dbee2448db8a49956002b83aff5390922d9", + "check_gpg": true + }, + { + "name": "libverto", + "epoch": 0, + "version": "0.3.0", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libverto-0.3.0-9.fc32.x86_64.rpm", + "checksum": "sha256:ed84414c9b2190d3026f58db78dffd8bc3a9ad40311cb0adb8ff8e3c7c06ca60", + "check_gpg": true + }, + { + "name": "libxcrypt", + "epoch": 0, + "version": "4.4.16", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-4.4.16-1.fc32.x86_64.rpm", + "checksum": "sha256:7c1a229f4a36ac8b077e0514f68f311229652121528b0f8a2a7434c618276dcb", + "check_gpg": true + }, + { + "name": "libxcrypt-compat", + "epoch": 0, + "version": "4.4.16", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-compat-4.4.16-1.fc32.x86_64.rpm", + "checksum": "sha256:cb4fb9b3733440ea15b3309c88d9471c4165aa7b71b4dbc5d0fb5bfcd97b2f2e", + "check_gpg": true + }, + { + "name": "libxkbcommon", + "epoch": 0, + "version": "0.10.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxkbcommon-0.10.0-2.fc32.x86_64.rpm", + "checksum": "sha256:ae219ad5ecc0233271c3fd61263f817c646eecece19a8f075e7aa4dd9ff8698e", + "check_gpg": true + }, + { + "name": "libxml2", + "epoch": 0, + "version": "2.9.10", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxml2-2.9.10-3.fc32.x86_64.rpm", + "checksum": "sha256:a7f040de29d2414cc99fcffcd9ed3fa9d06ecc7aecd783ec3d2eef769e2389f1", + "check_gpg": true + }, + { + "name": "libyaml", + "epoch": 0, + "version": "0.2.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libyaml-0.2.2-3.fc32.x86_64.rpm", + "checksum": "sha256:9c8a274158a6fe97598e33900cd51e171f7e7517ccfc8ad6351873e69b225986", + "check_gpg": true + }, + { + "name": "libzstd", + "epoch": 0, + "version": "1.4.4", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libzstd-1.4.4-2.fc32.x86_64.rpm", + "checksum": "sha256:9465f2f1103697207a52d15edd716ab72dc6c281823c60f424cd064d706c7a51", + "check_gpg": true + }, + { + "name": "lua-libs", + "epoch": 0, + "version": "5.3.5", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lua-libs-5.3.5-7.fc32.x86_64.rpm", + "checksum": "sha256:10883ce95852cc9ae9b4e0d435b100a25f8fe5c0ea4677eb4a0b39f4f8def886", + "check_gpg": true + }, + { + "name": "lz4-libs", + "epoch": 0, + "version": "1.9.1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lz4-libs-1.9.1-2.fc32.x86_64.rpm", + "checksum": "sha256:44cfb58b368fba586981aa838a7f3974ac1d66d2b3b695f88d7b1d2e9c81a0b6", + "check_gpg": true + }, + { + "name": "mkpasswd", + "epoch": 0, + "version": "5.5.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mkpasswd-5.5.6-1.fc32.x86_64.rpm", + "checksum": "sha256:640afe5b9d499c9a7efc1d23cce8c54e3e3704d92eb7e7a93a048f97d1e983e1", + "check_gpg": true + }, + { + "name": "mpfr", + "epoch": 0, + "version": "4.0.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mpfr-4.0.2-3.fc32.x86_64.rpm", + "checksum": "sha256:2b098bc6f8004270ee9eac9f63980b364b5fe19394dc73a230b3c846cf488b1b", + "check_gpg": true + }, + { + "name": "ncurses", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-6.1-15.20191109.fc32.x86_64.rpm", + "checksum": "sha256:b2e862283ac97b1d8b1ede2034ead452ac7dc4ff308593306275b1b0ae5b4102", + "check_gpg": true + }, + { + "name": "ncurses-base", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-base-6.1-15.20191109.fc32.noarch.rpm", + "checksum": "sha256:25fc5d288536e1973436da38357690575ed58e03e17ca48d2b3840364f830659", + "check_gpg": true + }, + { + "name": "ncurses-libs", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-libs-6.1-15.20191109.fc32.x86_64.rpm", + "checksum": "sha256:04152a3a608d022a58830c0e3dac0818e2c060469b0f41d8d731f659981a4464", + "check_gpg": true + }, + { + "name": "nettle", + "epoch": 0, + "version": "3.5.1", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nettle-3.5.1-5.fc32.x86_64.rpm", + "checksum": "sha256:c019d23ed2cb3ceb0ac9757a72c3e8b1d31f2a524b889e18049cc7d923bc9466", + "check_gpg": true + }, + { + "name": "npth", + "epoch": 0, + "version": "1.6", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/npth-1.6-4.fc32.x86_64.rpm", + "checksum": "sha256:3c2a641f118ab2e8b08df6dd2da72a60121d02df8d932b4afa2920eb80392875", + "check_gpg": true + }, + { + "name": "openldap", + "epoch": 0, + "version": "2.4.47", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openldap-2.4.47-4.fc32.x86_64.rpm", + "checksum": "sha256:ade8105796f5c1201a3efc8bcc654788cfc88c3815297b346845062a8c29cd59", + "check_gpg": true + }, + { + "name": "openssl", + "epoch": 1, + "version": "1.1.1d", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-1.1.1d-7.fc32.x86_64.rpm", + "checksum": "sha256:d7b8b5815b72fb157de26579362383e357e026ae6ac2599c451fb336fe995555", + "check_gpg": true + }, + { + "name": "openssl-libs", + "epoch": 1, + "version": "1.1.1d", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-libs-1.1.1d-7.fc32.x86_64.rpm", + "checksum": "sha256:ad6d7d9767e05978b14a39c08dba59ddc4396584576df194f77ed310a0816ae0", + "check_gpg": true + }, + { + "name": "openssl-pkcs11", + "epoch": 0, + "version": "0.4.10", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-pkcs11-0.4.10-5.fc32.x86_64.rpm", + "checksum": "sha256:3f2cb9092d6f55f84dd9eacd5359dfb354772e5f38308328027c7758f4a06fb6", + "check_gpg": true + }, + { + "name": "os-prober", + "epoch": 0, + "version": "1.77", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/os-prober-1.77-4.fc32.x86_64.rpm", + "checksum": "sha256:45fc2608b746fd841dd25919e9e4d44834154758aec8fb8b529c014b11c7917d", + "check_gpg": true + }, + { + "name": "ostree", + "epoch": 0, + "version": "2020.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-2020.3-2.fc32.x86_64.rpm", + "checksum": "sha256:ec64add7d60a70fbaf14a083929f22bd2637c33d20d2a30b7e842caa6040f817", + "check_gpg": true + }, + { + "name": "ostree-libs", + "epoch": 0, + "version": "2020.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-libs-2020.3-2.fc32.x86_64.rpm", + "checksum": "sha256:3343d9e7c90bd58e1e44ee07e7c59bb570ffc74da50f0607c5f5681a00b70e76", + "check_gpg": true + }, + { + "name": "p11-kit", + "epoch": 0, + "version": "0.23.20", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-0.23.20-1.fc32.x86_64.rpm", + "checksum": "sha256:dedd37a96262c35763ab2dcbc19838f5cc39a2a3a392a650a80bd6d5ae42ff8b", + "check_gpg": true + }, + { + "name": "p11-kit-trust", + "epoch": 0, + "version": "0.23.20", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-trust-0.23.20-1.fc32.x86_64.rpm", + "checksum": "sha256:3589b982ac0c2f5f6b47cde5cb7ec33c2c01d756dabf8c4ca64f6d9d0d78b35e", + "check_gpg": true + }, + { + "name": "pam", + "epoch": 0, + "version": "1.3.1", + "release": "24.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pam-1.3.1-24.fc32.x86_64.rpm", + "checksum": "sha256:4c80ade4ac0889316930a8d181ea43fa2d1b2f1a6a5703c22f2b3ba191346eec", + "check_gpg": true + }, + { + "name": "pcre", + "epoch": 0, + "version": "8.44", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre-8.44-1.fc32.x86_64.rpm", + "checksum": "sha256:933bdb4cc6e14b2ebb1ca76c14ca176c13d271a2d1e88632f237392777d11808", + "check_gpg": true + }, + { + "name": "pcre2", + "epoch": 0, + "version": "10.34", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-10.34-9.fc32.x86_64.rpm", + "checksum": "sha256:6794fe48004c0403c29fc779b49f0fbea436123b96783a2df225eef2f0858795", + "check_gpg": true + }, + { + "name": "pcre2-syntax", + "epoch": 0, + "version": "10.34", + "release": "9.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-syntax-10.34-9.fc32.noarch.rpm", + "checksum": "sha256:5db7c0e949bd9172b9645237e72f6139d4ffcf14defad487262b8ad25b427daf", + "check_gpg": true + }, + { + "name": "pigz", + "epoch": 0, + "version": "2.4", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pigz-2.4-6.fc32.x86_64.rpm", + "checksum": "sha256:15f08ce979e48fd25be5e16d63d1c95c57f9abff7704005137ea00b958442939", + "check_gpg": true + }, + { + "name": "pinentry", + "epoch": 0, + "version": "1.1.0", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pinentry-1.1.0-7.fc32.x86_64.rpm", + "checksum": "sha256:7df4fa1a29772696d92866e890af6fbe006088f3407ed3e67b0e7867ef58d899", + "check_gpg": true + }, + { + "name": "policycoreutils", + "epoch": 0, + "version": "3.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/policycoreutils-3.0-2.fc32.x86_64.rpm", + "checksum": "sha256:8df97dcfb42c1667b5d2e4150012eaf96f58eeac4f7b879e0928c8c36e3a7604", + "check_gpg": true + }, + { + "name": "polkit-libs", + "epoch": 0, + "version": "0.116", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-libs-0.116-7.fc32.x86_64.rpm", + "checksum": "sha256:d439ffbe20c8c0e8244e31c0324d60cf959dc1cd6cecc575d7b34509a73e9386", + "check_gpg": true + }, + { + "name": "popt", + "epoch": 0, + "version": "1.16", + "release": "19.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/popt-1.16-19.fc32.x86_64.rpm", + "checksum": "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4", + "check_gpg": true + }, + { + "name": "procps-ng", + "epoch": 0, + "version": "3.3.15", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/procps-ng-3.3.15-7.fc32.x86_64.rpm", + "checksum": "sha256:f3908831ae53f43b07a4e196850d0e59cc89b50c97d838538c3185fd0eb0d569", + "check_gpg": true + }, + { + "name": "publicsuffix-list-dafsa", + "epoch": 0, + "version": "20190417", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/publicsuffix-list-dafsa-20190417-3.fc32.noarch.rpm", + "checksum": "sha256:af992ad02594b68f17d2da41104a26aee41d02639edf22332d7dbb1fe9af58a5", + "check_gpg": true + }, + { + "name": "python-pip-wheel", + "epoch": 0, + "version": "19.3.1", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-pip-wheel-19.3.1-2.fc32.noarch.rpm", + "checksum": "sha256:a7da5590635b9c19afafc7dd247604194a5ce7d8d863dc600b8cb86accb2e469", + "check_gpg": true + }, + { + "name": "python-setuptools-wheel", + "epoch": 0, + "version": "41.6.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-setuptools-wheel-41.6.0-2.fc32.noarch.rpm", + "checksum": "sha256:7dd93baaf69a8004ae2cd3b9e6660b862d0b6f399d53c05a27a48a2e276ef1ee", + "check_gpg": true + }, + { + "name": "python-unversioned-command", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-unversioned-command-3.8.2-2.fc32.noarch.rpm", + "checksum": "sha256:0b290954bc2868b3dfc976b2b7a13ea8aeade76eeafc17674ff8e721049a5bf7", + "check_gpg": true + }, + { + "name": "python3", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-3.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:b79bb6af3e1650ba812c8affe42772ea566b164222a7d4d8e2f7efa867dc6849", + "check_gpg": true + }, + { + "name": "python3-dnf", + "epoch": 0, + "version": "4.2.19", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-dnf-4.2.19-1.fc32.noarch.rpm", + "checksum": "sha256:632aedc06003e319a1c3fa98876055fc3bd3b44c1188b44d3b7a455cef0d40e4", + "check_gpg": true + }, + { + "name": "python3-gpg", + "epoch": 0, + "version": "1.13.1", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-gpg-1.13.1-6.fc32.x86_64.rpm", + "checksum": "sha256:9de8eb13fbdf8b8c5c3e04c52a890ccc5b667351ff17152786d12ffc66210433", + "check_gpg": true + }, + { + "name": "python3-hawkey", + "epoch": 0, + "version": "0.45.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-hawkey-0.45.0-3.fc32.x86_64.rpm", + "checksum": "sha256:6a2f4706a37bc5ad229f6fdddbd70fbcf82da85ec577a8deeb455513cbedc174", + "check_gpg": true + }, + { + "name": "python3-libcomps", + "epoch": 0, + "version": "0.1.14", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libcomps-0.1.14-4.fc32.x86_64.rpm", + "checksum": "sha256:0d9d80adb91ccc8eed62bea68b23da5edb77675b1ec93227e2179d028449a2f7", + "check_gpg": true + }, + { + "name": "python3-libdnf", + "epoch": 0, + "version": "0.45.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libdnf-0.45.0-3.fc32.x86_64.rpm", + "checksum": "sha256:44fabecae31a5900fe10837863ed231303f6863bd9fa5efa40a93a0fc059344f", + "check_gpg": true + }, + { + "name": "python3-libs", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libs-3.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:ec58d03c60386bfb8aed2af3d2a49f8c6e5ccb4d3fd592cf75fef3342be137c3", + "check_gpg": true + }, + { + "name": "python3-pip", + "epoch": 0, + "version": "19.3.1", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-pip-19.3.1-2.fc32.noarch.rpm", + "checksum": "sha256:9ade87dbb32f27e7f38ec981002ddc5a2189cc6f5ad5f24bada3b71cfa9167fd", + "check_gpg": true + }, + { + "name": "python3-rpm", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-rpm-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:355a095bb3c6d58f927277ff53267f88eb0729adbcafd8082b8d97e4815ee206", + "check_gpg": true + }, + { + "name": "python3-setuptools", + "epoch": 0, + "version": "41.6.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-setuptools-41.6.0-2.fc32.noarch.rpm", + "checksum": "sha256:724cca9919bb7b0183b030aca216d4d51de70bf35c2cc5e8325a21a52ca15ceb", + "check_gpg": true + }, + { + "name": "python3-unbound", + "epoch": 0, + "version": "1.9.6", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-unbound-1.9.6-2.fc32.x86_64.rpm", + "checksum": "sha256:517ff9662e5a1897b74f4ab4fbc8a88eccaad9880bc18be9cf4df6aba9824bd5", + "check_gpg": true + }, + { + "name": "qemu-img", + "epoch": 2, + "version": "4.2.0", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/q/qemu-img-4.2.0-7.fc32.x86_64.rpm", + "checksum": "sha256:475b6de876914aec2187ac4858a13ae75585f5c4cb5d739c637f79a5ca6f05f9", + "check_gpg": true + }, + { + "name": "qrencode-libs", + "epoch": 0, + "version": "4.0.2", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/q/qrencode-libs-4.0.2-5.fc32.x86_64.rpm", + "checksum": "sha256:f1150f9e17beaef09aca0f291e10db8c3ee5566fbf4c929b7672334410fa74e9", + "check_gpg": true + }, + { + "name": "readline", + "epoch": 0, + "version": "8.0", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/readline-8.0-4.fc32.x86_64.rpm", + "checksum": "sha256:f1c79039f4c6ba0fad88590c2cb55a96489449c334a671cc18c0bf424a4548b8", + "check_gpg": true + }, + { + "name": "rpm", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:136a9cbae9c225be60718fdc8cc8988a55235d6502e451df77d1c5c765143850", + "check_gpg": true + }, + { + "name": "rpm-build-libs", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-build-libs-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:3151132084577032b4c827eb577a1509950601888c6ff13a0a30b24252ee26d2", + "check_gpg": true + }, + { + "name": "rpm-libs", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-libs-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:54b740cf7a75a7215168970378d9a1d6b9a5e4eb81159a874ce8ea5990436641", + "check_gpg": true + }, + { + "name": "rpm-ostree", + "epoch": 0, + "version": "2020.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-2020.1-1.fc32.x86_64.rpm", + "checksum": "sha256:ee664c392a97cdd272f57980c6856b2c57567005fa0ad9cb16c388b645d014f1", + "check_gpg": true + }, + { + "name": "rpm-ostree-libs", + "epoch": 0, + "version": "2020.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-libs-2020.1-1.fc32.x86_64.rpm", + "checksum": "sha256:9d220d8ee28cd0adf28e8fef547af92c3ec66e238747165939cf8e1a413ddf83", + "check_gpg": true + }, + { + "name": "rpm-plugin-selinux", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-plugin-selinux-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:27dd9c78e41c04b5151a2b9ac150d3ebb89f2ca7a23e4896dfc718f19a000be3", + "check_gpg": true + }, + { + "name": "rpm-plugin-systemd-inhibit", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-plugin-systemd-inhibit-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:e2a04f4de125ff60a3cdc3d2b3718a4530a9c9240c9cf14f55938444c229539f", + "check_gpg": true + }, + { + "name": "rpm-sign-libs", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-sign-libs-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:630ad20496ff00f76764e01b9302ccbe94e3e91d76ececef88bd9e8a890b1ac3", + "check_gpg": true + }, + { + "name": "sed", + "epoch": 0, + "version": "4.5", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sed-4.5-5.fc32.x86_64.rpm", + "checksum": "sha256:ffe5076b9018efdb1612c487f637af39ab6c3c79ec37311978935cfa357ecd61", + "check_gpg": true + }, + { + "name": "selinux-policy", + "epoch": 0, + "version": "3.14.5", + "release": "32.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-3.14.5-32.fc32.noarch.rpm", + "checksum": "sha256:932a37ddd2a990a22a1ee7811d204552e8860e39a3e0c050ed618a535ae8c78c", + "check_gpg": true + }, + { + "name": "selinux-policy-targeted", + "epoch": 0, + "version": "3.14.5", + "release": "32.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-targeted-3.14.5-32.fc32.noarch.rpm", + "checksum": "sha256:684aae86de55bd42215c136777613211f596788d3b6405d8fa645fb967904354", + "check_gpg": true + }, + { + "name": "setup", + "epoch": 0, + "version": "2.13.6", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/setup-2.13.6-2.fc32.noarch.rpm", + "checksum": "sha256:a336d2e77255df4783f52762e44efcc8d77b044a3e39c7f577d5535212848280", + "check_gpg": true + }, + { + "name": "shadow-utils", + "epoch": 2, + "version": "4.8.1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shadow-utils-4.8.1-2.fc32.x86_64.rpm", + "checksum": "sha256:4dd6100e477d88a4987b6eebfddecff168f38c7ff47cbb12f2fecba1e87c10d9", + "check_gpg": true + }, + { + "name": "shared-mime-info", + "epoch": 0, + "version": "1.15", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shared-mime-info-1.15-3.fc32.x86_64.rpm", + "checksum": "sha256:a280c633b73517da167b91298fc97aeee2eb5fcc253c038ae0ce4b8478d3a103", + "check_gpg": true + }, + { + "name": "sqlite-libs", + "epoch": 0, + "version": "3.31.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sqlite-libs-3.31.1-1.fc32.x86_64.rpm", + "checksum": "sha256:7f555c600b35ba798d8c0a63e30a1a12e917231730e1a44f48161ba0fe4b5973", + "check_gpg": true + }, + { + "name": "systemd", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:1de2be4fe5280ec3097305d9e671f5f2c768267f90d255edf2075eecb0c0afe9", + "check_gpg": true + }, + { + "name": "systemd-libs", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-libs-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:78db9007c08fa51f177210e47343b8e733ce0751826abb357ca96429836588db", + "check_gpg": true + }, + { + "name": "systemd-pam", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-pam-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:750da30da0289d5e2ad9ca297dda44e5ca18dbed0c3e0d4200379bc1818c22f3", + "check_gpg": true + }, + { + "name": "systemd-rpm-macros", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-rpm-macros-245.4-1.fc32.noarch.rpm", + "checksum": "sha256:97197411bca68cfba1ef6bab1fdd4b41c95ec71c36f1e67f525b963cf60598fd", + "check_gpg": true + }, + { + "name": "systemd-udev", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-udev-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:334d63914e7ff6fe8cfce0c8f80006c6cf2ab0615cd044a6ee588809395499e5", + "check_gpg": true + }, + { + "name": "tar", + "epoch": 2, + "version": "1.32", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tar-1.32-4.fc32.x86_64.rpm", + "checksum": "sha256:2cee64e12b295b74d2f4b008c7628ef3a01ef4149905fc4a7ae14b304da5f53b", + "check_gpg": true + }, + { + "name": "trousers", + "epoch": 0, + "version": "0.3.13", + "release": "13.fc31", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-0.3.13-13.fc31.x86_64.rpm", + "checksum": "sha256:5f156c2a950699d5cb9a21349cce049b3c8bfdcc4fcc780665fe2d3103f576c1", + "check_gpg": true + }, + { + "name": "trousers-lib", + "epoch": 0, + "version": "0.3.13", + "release": "13.fc31", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-lib-0.3.13-13.fc31.x86_64.rpm", + "checksum": "sha256:cc1be420582afb6360f380ff301c5e3d873f69fe1f7e00e4450bf2daa40ef9ff", + "check_gpg": true + }, + { + "name": "tss2", + "epoch": 0, + "version": "1331", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tss2-1331-4.fc32.x86_64.rpm", + "checksum": "sha256:6f669ae6f70cfa80917adf4ae9d5e86fbd9d31ee308a9a3408a19be3afc46f7b", + "check_gpg": true + }, + { + "name": "tzdata", + "epoch": 0, + "version": "2019c", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tzdata-2019c-3.fc32.noarch.rpm", + "checksum": "sha256:2db6d80760ab0e99f4e9c9816615e4f06b967bbb23a8c8c941b3f2d4b5f176c2", + "check_gpg": true + }, + { + "name": "unbound-libs", + "epoch": 0, + "version": "1.9.6", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/u/unbound-libs-1.9.6-2.fc32.x86_64.rpm", + "checksum": "sha256:29d7df69d66f51f6dddd637d3f599e70bdaa9bd476669002250bc038735a318c", + "check_gpg": true + }, + { + "name": "util-linux", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/u/util-linux-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:9976e6228a10fa2761f1265a2a7666578d79ca57819837e5d1fbecc53324f1b9", + "check_gpg": true + }, + { + "name": "which", + "epoch": 0, + "version": "2.21", + "release": "19.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/which-2.21-19.fc32.x86_64.rpm", + "checksum": "sha256:82e0d8f1e0dccc6d18acd04b7806350343140d9c91da7a216f93167dcf650a61", + "check_gpg": true + }, + { + "name": "whois-nls", + "epoch": 0, + "version": "5.5.6", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/whois-nls-5.5.6-1.fc32.noarch.rpm", + "checksum": "sha256:d027a3ff0712e3e98d7d2358f8c526fb8d143b2386c353aadcc27199cffe125b", + "check_gpg": true + }, + { + "name": "xkeyboard-config", + "epoch": 0, + "version": "2.29", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xkeyboard-config-2.29-1.fc32.noarch.rpm", + "checksum": "sha256:ec12fef82d73314e3e4cb6e962f8de27e78989fa104dde0599a4480a53817647", + "check_gpg": true + }, + { + "name": "xz", + "epoch": 0, + "version": "5.2.5", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-5.2.5-1.fc32.x86_64.rpm", + "checksum": "sha256:1bdde5dc99a5588a8983f70b7b3e45e7006215d529c72adfec118c3bcbf7b01c", + "check_gpg": true + }, + { + "name": "xz-libs", + "epoch": 0, + "version": "5.2.5", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-libs-5.2.5-1.fc32.x86_64.rpm", + "checksum": "sha256:84702d6395a9577c1a268184f123cfd4b15bc2287f01033625ba388a34ec2338", + "check_gpg": true + }, + { + "name": "zchunk-libs", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zchunk-libs-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:140708561a2ec1c7709fd38d8b1b115d02da710b80eeecd65c2b8387d9d78ef9", + "check_gpg": true + }, + { + "name": "zlib", + "epoch": 0, + "version": "1.2.11", + "release": "21.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zlib-1.2.11-21.fc32.x86_64.rpm", + "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", + "check_gpg": true + } + ], + "packages": [ + { + "name": "ModemManager", + "epoch": 0, + "version": "1.12.8", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/ModemManager-1.12.8-1.fc32.x86_64.rpm", + "checksum": "sha256:fc8a8027325828861bae0c41d2582d61f8cb4b9ed42a50e49c57939eabcad1b7", + "check_gpg": true + }, + { + "name": "ModemManager-glib", + "epoch": 0, + "version": "1.12.8", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/ModemManager-glib-1.12.8-1.fc32.x86_64.rpm", + "checksum": "sha256:605c3cf38451c6b93f331b605ab03ca611e37aa11d14a4019de61278add04f74", + "check_gpg": true + }, + { + "name": "NetworkManager", + "epoch": 1, + "version": "1.22.10", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-1.22.10-1.fc32.x86_64.rpm", + "checksum": "sha256:342bdf0143d9145f8846e1b5c3401685e0d1274b66df39ac8cbfb78013313861", + "check_gpg": true + }, + { + "name": "NetworkManager-libnm", + "epoch": 1, + "version": "1.22.10", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-libnm-1.22.10-1.fc32.x86_64.rpm", + "checksum": "sha256:fd2a2dd726d855f877296227fb351883d647df28b1b0085f525d87df622d49e4", + "check_gpg": true + }, + { + "name": "NetworkManager-wifi", + "epoch": 1, + "version": "1.22.10", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-wifi-1.22.10-1.fc32.x86_64.rpm", + "checksum": "sha256:df174a90fd6bd3f9fae3b75433ae7f1869ff2db7102667fb243c8aede5b858d3", + "check_gpg": true + }, + { + "name": "NetworkManager-wwan", + "epoch": 1, + "version": "1.22.10", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/NetworkManager-wwan-1.22.10-1.fc32.x86_64.rpm", + "checksum": "sha256:cd5d539fd0c469f2ebae012a9a8f2ed280363c355f205edc8fc735678ac0adb8", + "check_gpg": true + }, + { + "name": "abattis-cantarell-fonts", + "epoch": 0, + "version": "0.201", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/abattis-cantarell-fonts-0.201-2.fc32.noarch.rpm", + "checksum": "sha256:a9d5719cf5d4fdc4ae28099d623a751b0470264e7d2280be2669a066348b4ce1", + "check_gpg": true + }, + { + "name": "acl", + "epoch": 0, + "version": "2.2.53", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/acl-2.2.53-5.fc32.x86_64.rpm", + "checksum": "sha256:705bdb96aab3a0f9d9e2ff48ead1208e2dbc1927d713d8637632af936235217b", + "check_gpg": true + }, + { + "name": "adobe-source-code-pro-fonts", + "epoch": 0, + "version": "2.030.1.050", + "release": "8.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/adobe-source-code-pro-fonts-2.030.1.050-8.fc32.noarch.rpm", + "checksum": "sha256:a4706de7a0d59f2b1e9e73f48c4279429676410c77fb93f82abf1b7b34330f82", + "check_gpg": true + }, + { + "name": "alternatives", + "epoch": 0, + "version": "1.11", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/alternatives-1.11-6.fc32.x86_64.rpm", + "checksum": "sha256:c574c5432197acbe08ea15c7837be7577cd0b49902a3e65227792f051d73ce5c", + "check_gpg": true + }, + { + "name": "attr", + "epoch": 0, + "version": "2.4.48", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/attr-2.4.48-8.fc32.x86_64.rpm", + "checksum": "sha256:00d0bb6a08f20bea2b6bd0d2c4de99b51c770b2dab266d1d3da85891efeded01", + "check_gpg": true + }, + { + "name": "audit", + "epoch": 0, + "version": "3.0", + "release": "0.19.20191104git1c2f876.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/audit-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm", + "checksum": "sha256:f09047c09660bc998460f710b9ac0561b4f6028214168d4d40f2f4d99f61a94d", + "check_gpg": true + }, + { + "name": "audit-libs", + "epoch": 0, + "version": "3.0", + "release": "0.19.20191104git1c2f876.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/a/audit-libs-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm", + "checksum": "sha256:22d311f22902d592f72bd0fb4010a682f796e5a4698d5ea209848468a2d5aa96", + "check_gpg": true + }, + { + "name": "basesystem", + "epoch": 0, + "version": "11", + "release": "9.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/basesystem-11-9.fc32.noarch.rpm", + "checksum": "sha256:a346990bb07adca8c323a15f31b093ef6e639bde6ca84adf1a3abebc4dc9adce", + "check_gpg": true + }, + { + "name": "bash", + "epoch": 0, + "version": "5.0.11", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bash-5.0.11-2.fc32.x86_64.rpm", + "checksum": "sha256:7a97e71cd552285ead303d07dbb6417403edf45c0a531e02cf4ebfb0efda4975", + "check_gpg": true + }, + { + "name": "bash-completion", + "epoch": 1, + "version": "2.8", + "release": "8.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bash-completion-2.8-8.fc32.noarch.rpm", + "checksum": "sha256:c07fd5357963f99610bc676b25f1dfcbf1bae0b63538b5e1cd82ce42b79fd819", + "check_gpg": true + }, + { + "name": "bluez", + "epoch": 0, + "version": "5.54", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-5.54-1.fc32.x86_64.rpm", + "checksum": "sha256:bfeba60bfb137f270e3b28db96ecfe8b226ea05e1761f6cb5ccc64c48c73c748", + "check_gpg": true + }, + { + "name": "bluez-libs", + "epoch": 0, + "version": "5.54", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-libs-5.54-1.fc32.x86_64.rpm", + "checksum": "sha256:af18c71bca1121ac3cdeace9f7249079ee0568fcbb15ca7e46131fa9b9b521f8", + "check_gpg": true + }, + { + "name": "bluez-mesh", + "epoch": 0, + "version": "5.54", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bluez-mesh-5.54-1.fc32.x86_64.rpm", + "checksum": "sha256:2141f1dec8fe7a442c061f603bf4ee6203e10a290990789af0f4ef9db5523679", + "check_gpg": true + }, + { + "name": "btrfs-progs", + "epoch": 0, + "version": "5.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/btrfs-progs-5.6-1.fc32.x86_64.rpm", + "checksum": "sha256:b67f1634acc7b84b284bda8afeef546aed4a3388dc7df67417001704aa444af1", + "check_gpg": true + }, + { + "name": "bubblewrap", + "epoch": 0, + "version": "0.4.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bubblewrap-0.4.1-1.fc32.x86_64.rpm", + "checksum": "sha256:cd01ae91895e60f189106a159bb551f906a8b663110f421ad6ee83c9e008851e", + "check_gpg": true + }, + { + "name": "bzip2-libs", + "epoch": 0, + "version": "1.0.8", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/b/bzip2-libs-1.0.8-2.fc32.x86_64.rpm", + "checksum": "sha256:842f7a38be2e8dbb14eff3ede4091db214ebe241e1fde7a128e88c4e686b63b0", + "check_gpg": true + }, + { + "name": "ca-certificates", + "epoch": 0, + "version": "2020.2.40", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/ca-certificates-2020.2.40-3.fc32.noarch.rpm", + "checksum": "sha256:73f6a9108f7d5ec3cd89c31dbbaa874ae28cd5cb443ef69700a1218903ee2fc4", + "check_gpg": true + }, + { + "name": "checkpolicy", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/checkpolicy-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:703fb5ca1651bb72d8ab58576ce3d78c9479cbb2e78ff8666ae3a3d1cd9bb0da", + "check_gpg": true + }, + { + "name": "chrony", + "epoch": 0, + "version": "3.5", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/chrony-3.5-8.fc32.x86_64.rpm", + "checksum": "sha256:398ce75ffc673f048ffd47d417b17ef086abc43f318b2b77d2869095ec764d57", + "check_gpg": true + }, + { + "name": "clevis", + "epoch": 0, + "version": "12", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-12-2.fc32.x86_64.rpm", + "checksum": "sha256:624b9079b4a571218adced203e19bdaca1d2cf57891f9653f409dd1db92fbf86", + "check_gpg": true + }, + { + "name": "clevis-dracut", + "epoch": 0, + "version": "12", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-dracut-12-2.fc32.x86_64.rpm", + "checksum": "sha256:5d520576b7ac63cb029c4b0b86398e2b71589df3bafa618018b3729d81036203", + "check_gpg": true + }, + { + "name": "clevis-luks", + "epoch": 0, + "version": "12", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-luks-12-2.fc32.x86_64.rpm", + "checksum": "sha256:c55b30a3a8c0d36a219953e20960185263ae63dada0f050446066be1e873ce08", + "check_gpg": true + }, + { + "name": "clevis-systemd", + "epoch": 0, + "version": "12", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/clevis-systemd-12-2.fc32.x86_64.rpm", + "checksum": "sha256:0065bc128a5c8b08b57f92651bfa62895221a9f001f1169447a56a8a6671bbae", + "check_gpg": true + }, + { + "name": "compat-readline5", + "epoch": 0, + "version": "5.2", + "release": "36.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/compat-readline5-5.2-36.fc32.x86_64.rpm", + "checksum": "sha256:449d2888d6b835d207a55a2d9b4478eff1b926581fcead6260b6508e4db1b782", + "check_gpg": true + }, + { + "name": "conmon", + "epoch": 2, + "version": "2.0.14", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/conmon-2.0.14-1.fc32.x86_64.rpm", + "checksum": "sha256:769e34caae25f05786ae53e535c6e3c64f5c548f06c422325d68598b7abb99b7", + "check_gpg": true + }, + { + "name": "container-selinux", + "epoch": 2, + "version": "2.130.0", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/container-selinux-2.130.0-1.fc32.noarch.rpm", + "checksum": "sha256:28d1118b3debda3daee76fc89f250576627a28b3ec39069256ddc212d993ddbc", + "check_gpg": true + }, + { + "name": "containernetworking-plugins", + "epoch": 0, + "version": "0.8.5", + "release": "1.1.gitf5c3d1b.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/containernetworking-plugins-0.8.5-1.1.gitf5c3d1b.fc32.x86_64.rpm", + "checksum": "sha256:0608e0a9922e6748b39bd1719e2dabd6fe283b22cf590f1a3350327ae6c13561", + "check_gpg": true + }, + { + "name": "containers-common", + "epoch": 1, + "version": "0.1.41", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/containers-common-0.1.41-1.fc32.x86_64.rpm", + "checksum": "sha256:30c5f02ed28d59a4d72e020097602091bb8e34d65a6f3be69f4b1dd63a46f892", + "check_gpg": true + }, + { + "name": "coreutils", + "epoch": 0, + "version": "8.32", + "release": "3.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-8.32-3.fc32.1.x86_64.rpm", + "checksum": "sha256:7023687eb65baa56a9b4c3ffde1e439b3d41b03ac4ad35a1a1fc3903464548f7", + "check_gpg": true + }, + { + "name": "coreutils-common", + "epoch": 0, + "version": "8.32", + "release": "3.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/coreutils-common-8.32-3.fc32.1.x86_64.rpm", + "checksum": "sha256:5323eb8d89b2d0c905a633513e04ca7df633c21eec288ee8c50f3f5170534e37", + "check_gpg": true + }, + { + "name": "cpio", + "epoch": 0, + "version": "2.13", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cpio-2.13-4.fc32.x86_64.rpm", + "checksum": "sha256:116b9d121fad9886f245cd5e1ef678fdba889cd23a39e91447e75649214a6a8d", + "check_gpg": true + }, + { + "name": "cracklib", + "epoch": 0, + "version": "2.9.6", + "release": "22.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-2.9.6-22.fc32.x86_64.rpm", + "checksum": "sha256:862e75c10377098a9cc50407a0395e5f3a81d14b5b6fecfb3f223325c8867829", + "check_gpg": true + }, + { + "name": "cracklib-dicts", + "epoch": 0, + "version": "2.9.6", + "release": "22.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cracklib-dicts-2.9.6-22.fc32.x86_64.rpm", + "checksum": "sha256:1aee865249b031e591a5e94d62d05b69ad1a6118a26adccf2dfd46b0002716e5", + "check_gpg": true + }, + { + "name": "criu", + "epoch": 0, + "version": "3.13", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/criu-3.13-5.fc32.x86_64.rpm", + "checksum": "sha256:59be778afcf464d79f7dc440d6b49de8a9527fd73e7b514573d389bf8a51b246", + "check_gpg": true + }, + { + "name": "crun", + "epoch": 0, + "version": "0.13", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crun-0.13-1.fc32.x86_64.rpm", + "checksum": "sha256:d5acde111b4cafc918decc8b9c530c9a7dfd6cc77b75538d33b32478219ae5da", + "check_gpg": true + }, + { + "name": "crypto-policies", + "epoch": 0, + "version": "20191128", + "release": "5.gitcd267a5.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-20191128-5.gitcd267a5.fc32.noarch.rpm", + "checksum": "sha256:3f8dcae27ad3609b7de298d0ca8d34a2790b9898f5f1b03f3f9f8784374e307b", + "check_gpg": true + }, + { + "name": "crypto-policies-scripts", + "epoch": 0, + "version": "20191128", + "release": "5.gitcd267a5.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch.rpm", + "checksum": "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b", + "check_gpg": true + }, + { + "name": "cryptsetup", + "epoch": 0, + "version": "2.3.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cryptsetup-2.3.0-1.fc32.x86_64.rpm", + "checksum": "sha256:e0f9c4327d62e35ee2a066c95dfa37f86021b405515d0f902b72a7437b7b98e9", + "check_gpg": true + }, + { + "name": "cryptsetup-libs", + "epoch": 0, + "version": "2.3.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cryptsetup-libs-2.3.0-1.fc32.x86_64.rpm", + "checksum": "sha256:eaffaa8de8fd28ad124da12524a2ca5db86252404d70d66c7c42921dad6b69c1", + "check_gpg": true + }, + { + "name": "curl", + "epoch": 0, + "version": "7.69.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/curl-7.69.1-1.fc32.x86_64.rpm", + "checksum": "sha256:6eeebf21f245bf0d6f58962dc49b6dfb51f55acb6a595c6b9cbe9628806b80a4", + "check_gpg": true + }, + { + "name": "cyrus-sasl-lib", + "epoch": 0, + "version": "2.1.27", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/cyrus-sasl-lib-2.1.27-4.fc32.x86_64.rpm", + "checksum": "sha256:fefa4162a563eba24714ac43874c508d1ba036afb5127c5d21bbcbeaf238a740", + "check_gpg": true + }, + { + "name": "dbus", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-1.12.16-4.fc32.x86_64.rpm", + "checksum": "sha256:ed36d759746e75a2834866fbeaa783df397f8813cae2ed79fcc4d146656bf6a6", + "check_gpg": true + }, + { + "name": "dbus-broker", + "epoch": 0, + "version": "22", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-broker-22-1.fc32.x86_64.rpm", + "checksum": "sha256:213c17fb822ffa50fad16989ed363aa023de106c6262ccc3f16e52a154b7133f", + "check_gpg": true + }, + { + "name": "dbus-common", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-common-1.12.16-4.fc32.noarch.rpm", + "checksum": "sha256:6fc1b9a27eeb368a98f50dba5fc514f20a5eb23f8e0ee7dd92c4051ef8b4a940", + "check_gpg": true + }, + { + "name": "dbus-libs", + "epoch": 1, + "version": "1.12.16", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbus-libs-1.12.16-4.fc32.x86_64.rpm", + "checksum": "sha256:474fd088c7e7234221d251153e9fda6081b0aa8979bf5ae25810c9862e1e9960", + "check_gpg": true + }, + { + "name": "dbxtool", + "epoch": 0, + "version": "8", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dbxtool-8-11.fc32.x86_64.rpm", + "checksum": "sha256:f729c554ed4ac6335a548380a6f6335a332a3a2aca5321a322415a208701607d", + "check_gpg": true + }, + { + "name": "device-mapper", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:c132999a3f110029cd427f7578965ad558e91374637087d5230ee11c626ebcd4", + "check_gpg": true + }, + { + "name": "device-mapper-event", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-event-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:9a2beeeede69d8910115608c2d98efa6a8dba73ab2df246df5b0f10e2fa37f54", + "check_gpg": true + }, + { + "name": "device-mapper-event-libs", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-event-libs-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:8aa8258a1a13c1120d6c28321f618385111cb9363dae09eea2e4af481053e28b", + "check_gpg": true + }, + { + "name": "device-mapper-libs", + "epoch": 0, + "version": "1.02.171", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-libs-1.02.171-1.fc32.x86_64.rpm", + "checksum": "sha256:61cae80187ef2924857fdfc48a240646d23b331482cf181e7d8c661b02c15949", + "check_gpg": true + }, + { + "name": "device-mapper-persistent-data", + "epoch": 0, + "version": "0.8.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/device-mapper-persistent-data-0.8.5-3.fc32.x86_64.rpm", + "checksum": "sha256:7a525abda7230bfbc87763dfe58bf7684e385b3c78ca242a1685a589300909e9", + "check_gpg": true + }, + { + "name": "diffutils", + "epoch": 0, + "version": "3.7", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/diffutils-3.7-4.fc32.x86_64.rpm", + "checksum": "sha256:187dd61be71efcca6adf9819a523d432217abb335afcb2b95ef27b72928aff4b", + "check_gpg": true + }, + { + "name": "dmidecode", + "epoch": 1, + "version": "3.2", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dmidecode-3.2-5.fc32.x86_64.rpm", + "checksum": "sha256:e40be03bd5808e640bb5fb18196499680a7b7b1d3fce47617f987baee849c0e5", + "check_gpg": true + }, + { + "name": "dnsmasq", + "epoch": 0, + "version": "2.80", + "release": "14.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dnsmasq-2.80-14.fc32.x86_64.rpm", + "checksum": "sha256:e712179ba8b9b6e93d14c902a6d6a390ba142153384dab9291c808a447b7ed0c", + "check_gpg": true + }, + { + "name": "dosfstools", + "epoch": 0, + "version": "4.1", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dosfstools-4.1-10.fc32.x86_64.rpm", + "checksum": "sha256:c3f7089ae50f79cf4d2cb59e01091d33c70cab89ae08f95c547339a87404c3ec", + "check_gpg": true + }, + { + "name": "dracut", + "epoch": 0, + "version": "050", + "release": "26.git20200316.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-050-26.git20200316.fc32.x86_64.rpm", + "checksum": "sha256:993680d5cd133a0c21184be92b3df405d757613d0ca25c4abf08b203d8d26b79", + "check_gpg": true + }, + { + "name": "dracut-config-generic", + "epoch": 0, + "version": "050", + "release": "26.git20200316.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-config-generic-050-26.git20200316.fc32.x86_64.rpm", + "checksum": "sha256:4819b3ce25b997d8d3e5e4e4be4ba270e8b66852576b474daf0e6d61b6e22d73", + "check_gpg": true + }, + { + "name": "dracut-network", + "epoch": 0, + "version": "050", + "release": "26.git20200316.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/d/dracut-network-050-26.git20200316.fc32.x86_64.rpm", + "checksum": "sha256:11d6aa88c7e5bbaad38353bbb557ad8370452cd258f2a0d16bfd490116138d67", + "check_gpg": true + }, + { + "name": "e2fsprogs", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:2fa5e252441852dae918b522a2ff3f46a5bbee4ce8936e06702bf65f57d7ff99", + "check_gpg": true + }, + { + "name": "e2fsprogs-libs", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/e2fsprogs-libs-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:26db62c2bc52c3eee5f3039cdbdf19498f675d0f45aec0c2a1c61c635f01479e", + "check_gpg": true + }, + { + "name": "efi-filesystem", + "epoch": 0, + "version": "4", + "release": "4.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efi-filesystem-4-4.fc32.noarch.rpm", + "checksum": "sha256:b743aafa82f3326f8f2e6d5464ae7fa57fabab3ad791099eaf2d151b43208b42", + "check_gpg": true + }, + { + "name": "efibootmgr", + "epoch": 0, + "version": "16", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efibootmgr-16-7.fc32.x86_64.rpm", + "checksum": "sha256:a7deef0a324ccb272a25f5eb6b30c72d0a842bf2c602c31fe3b60f984b2e50af", + "check_gpg": true + }, + { + "name": "efivar-libs", + "epoch": 0, + "version": "37", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/efivar-libs-37-7.fc32.x86_64.rpm", + "checksum": "sha256:05efccb06aa336d2547eb8fd5b7e0935c883f89084688f32ce0b09954149b796", + "check_gpg": true + }, + { + "name": "elfutils-debuginfod-client", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-debuginfod-client-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:4f318cec61cb69fc233ba5505b7e24f679afdfb0b5defbaef507f1b471e7dbb5", + "check_gpg": true + }, + { + "name": "elfutils-default-yama-scope", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-default-yama-scope-0.179-1.fc32.noarch.rpm", + "checksum": "sha256:af62d0611b995b9f2b2c7b4d4852e03e521d66979534871ccb5a71275a15518d", + "check_gpg": true + }, + { + "name": "elfutils-libelf", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libelf-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:f3eb795f68c80ccf870f1d27f8fd019878db748c0c19275634c48cf5cea5bc46", + "check_gpg": true + }, + { + "name": "elfutils-libs", + "epoch": 0, + "version": "0.179", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/elfutils-libs-0.179-1.fc32.x86_64.rpm", + "checksum": "sha256:99f87b4ec7c5852d45028f3eae65fc813f3ef107e128777f265b09a19ce262e0", + "check_gpg": true + }, + { + "name": "expat", + "epoch": 0, + "version": "2.2.8", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/e/expat-2.2.8-2.fc32.x86_64.rpm", + "checksum": "sha256:8fc2ae85f242105987d8fa7f05e4fa19358a7c81dff5fa163cf021eb6b9905e9", + "check_gpg": true + }, + { + "name": "fedora-gpg-keys", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-gpg-keys-32-1.noarch.rpm", + "checksum": "sha256:09fea9af8b695af862b19c1a8fbe1b1e8854257825ee4f663f67b3782a75d58a", + "check_gpg": true + }, + { + "name": "fedora-release-common", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-common-32-1.noarch.rpm", + "checksum": "sha256:a1835a7929d3c1613f3890caef878e9bdf857dcc0f63eb4d63a1140370b3f21b", + "check_gpg": true + }, + { + "name": "fedora-release-iot", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-release-iot-32-1.noarch.rpm", + "checksum": "sha256:5e7a16df5bdfab2acfd8ac061827ace0642f2e5521689d6b9f0812f2a6ece231", + "check_gpg": true + }, + { + "name": "fedora-repos", + "epoch": 0, + "version": "32", + "release": "1", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fedora-repos-32-1.noarch.rpm", + "checksum": "sha256:21e3fd914a3bcc65b79de022782967903c55a4aed9a3c7d3464bc2fef32d02b3", + "check_gpg": true + }, + { + "name": "file", + "epoch": 0, + "version": "5.38", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-5.38-2.fc32.x86_64.rpm", + "checksum": "sha256:28656826cb0dfbae9b6e8d1e5c5691773d84000493c4be47f727092fec6dc6f4", + "check_gpg": true + }, + { + "name": "file-libs", + "epoch": 0, + "version": "5.38", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/file-libs-5.38-2.fc32.x86_64.rpm", + "checksum": "sha256:e0b1da98020a740991dbb70b42c0ff1eece9e268a461e555a5ec763bda1645f5", + "check_gpg": true + }, + { + "name": "filesystem", + "epoch": 0, + "version": "3.14", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/filesystem-3.14-2.fc32.x86_64.rpm", + "checksum": "sha256:1110261787146443e089955912255d99daf7ba042c3743e13648a9eb3d80ceb4", + "check_gpg": true + }, + { + "name": "findutils", + "epoch": 1, + "version": "4.7.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/findutils-4.7.0-3.fc32.x86_64.rpm", + "checksum": "sha256:0b7cd6f6cb3b7cd9e0704dd6c62b65254b04cb870ab638b9bed4951564436e24", + "check_gpg": true + }, + { + "name": "fipscheck", + "epoch": 0, + "version": "1.5.0", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fipscheck-1.5.0-8.fc32.x86_64.rpm", + "checksum": "sha256:907393755387a351806ec2afff376e7491f177116caadd12f07d0fcbed796750", + "check_gpg": true + }, + { + "name": "fipscheck-lib", + "epoch": 0, + "version": "1.5.0", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fipscheck-lib-1.5.0-8.fc32.x86_64.rpm", + "checksum": "sha256:f2715fc8a04d33716f40f5b34466e082140df7ff3b7b972c29655d4dfc6e3a72", + "check_gpg": true + }, + { + "name": "firewalld", + "epoch": 0, + "version": "0.8.2", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/firewalld-0.8.2-2.fc32.noarch.rpm", + "checksum": "sha256:b8ecd7fa0e7e072828e374dfb0d61bb8eecca7c190f3661050cee5e3fc8854b4", + "check_gpg": true + }, + { + "name": "firewalld-filesystem", + "epoch": 0, + "version": "0.8.2", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/firewalld-filesystem-0.8.2-2.fc32.noarch.rpm", + "checksum": "sha256:47538b1db9720be4699329a8da32d873187d0c6c22f45252614ac5b8a8312482", + "check_gpg": true + }, + { + "name": "flashrom", + "epoch": 0, + "version": "1.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/flashrom-1.2-2.fc32.x86_64.rpm", + "checksum": "sha256:317654c97a9dc11fe498b61d4189ff31cd1277250993d826e9bc5815d0485f29", + "check_gpg": true + }, + { + "name": "fonts-filesystem", + "epoch": 0, + "version": "2.0.3", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fonts-filesystem-2.0.3-1.fc32.noarch.rpm", + "checksum": "sha256:879ba2533610771dbf3fa103fdbde878edf255b771b53aa8a170009d01446012", + "check_gpg": true + }, + { + "name": "fuse", + "epoch": 0, + "version": "2.9.9", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-2.9.9-9.fc32.x86_64.rpm", + "checksum": "sha256:9369d4fed30402f45705b7a5cb51b6eeefb1dabbe0942c84514c6fdf1edac5e0", + "check_gpg": true + }, + { + "name": "fuse-common", + "epoch": 0, + "version": "3.9.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-common-3.9.1-1.fc32.x86_64.rpm", + "checksum": "sha256:45132e53c649def28d63c199d8c3a3b9fd16fa8bca7426ad4e9c202e52a233b4", + "check_gpg": true + }, + { + "name": "fuse-libs", + "epoch": 0, + "version": "2.9.9", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-9.fc32.x86_64.rpm", + "checksum": "sha256:53992752850779218421994f61f1589eda5d368e28d340dccaae3f67de06e7f2", + "check_gpg": true + }, + { + "name": "fuse-overlayfs", + "epoch": 0, + "version": "0.7.8", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse-overlayfs-0.7.8-1.fc32.x86_64.rpm", + "checksum": "sha256:929f1c5ce4775b28439a1b5726e98c38204930d5880dc6096fc56e8d3eab275f", + "check_gpg": true + }, + { + "name": "fuse3", + "epoch": 0, + "version": "3.9.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse3-3.9.1-1.fc32.x86_64.rpm", + "checksum": "sha256:8df8541abd806578e43fe28a7ea2c41efbbb813866bed35fabe779274790a538", + "check_gpg": true + }, + { + "name": "fuse3-libs", + "epoch": 0, + "version": "3.9.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fuse3-libs-3.9.1-1.fc32.x86_64.rpm", + "checksum": "sha256:ab4c27523d6b5a0df75febac43cafa2dd9897dc3c1bb2f0d6990ca603b6168fe", + "check_gpg": true + }, + { + "name": "fwupd", + "epoch": 0, + "version": "1.3.9", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/f/fwupd-1.3.9-2.fc32.x86_64.rpm", + "checksum": "sha256:ff5dd4d0c157cf1be9c8dbddce06640c67b2d02ae5a48d6b108bd70fc5c96211", + "check_gpg": true + }, + { + "name": "gawk", + "epoch": 0, + "version": "5.0.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gawk-5.0.1-7.fc32.x86_64.rpm", + "checksum": "sha256:d0e5d0104cf20c8dd332053a5903aab9b7fdadb84b35a1bfb3a6456f3399eb32", + "check_gpg": true + }, + { + "name": "gdbm-libs", + "epoch": 1, + "version": "1.18.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gdbm-libs-1.18.1-3.fc32.x86_64.rpm", + "checksum": "sha256:9899cfd32ada2537693af30b60051da21c6264b0d0db51ba709fceb179d4c836", + "check_gpg": true + }, + { + "name": "gdisk", + "epoch": 0, + "version": "1.0.5", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gdisk-1.0.5-1.fc32.x86_64.rpm", + "checksum": "sha256:397f0b024d3c58ca6e174c6de5abcb19304d7c58903199e1e6fe02e84d5bcb3a", + "check_gpg": true + }, + { + "name": "gettext", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:349af433b2f6d45ff2e1ea5a38f847ec692fef0a8dd656a9a07d423a981946d0", + "check_gpg": true + }, + { + "name": "gettext-libs", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gettext-libs-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:fdb9bc612957a16fc44b717605a5a26e16a33850c0ff74a80a299cc2bab740e4", + "check_gpg": true + }, + { + "name": "glib-networking", + "epoch": 0, + "version": "2.64.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glib-networking-2.64.1-1.fc32.x86_64.rpm", + "checksum": "sha256:5fc2fd0cb5b6fdce1203e43d6f2df6a3098ec9522b04815d896ecedbb1489063", + "check_gpg": true + }, + { + "name": "glib2", + "epoch": 0, + "version": "2.64.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glib2-2.64.1-1.fc32.x86_64.rpm", + "checksum": "sha256:6fe524feb38312f9c370b2190aeb42330acc9ce42f3a45e9cd05748b4aa00db2", + "check_gpg": true + }, + { + "name": "glibc", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:dc9c0401522bcf73fe5a692184c141b214947ad83364be97de0413ab46b712e5", + "check_gpg": true + }, + { + "name": "glibc-common", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-common-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:e80533822e2a892345b869395b2c17c0bcc98d3c3c47787da30123096835db00", + "check_gpg": true + }, + { + "name": "glibc-minimal-langpack", + "epoch": 0, + "version": "2.31", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/glibc-minimal-langpack-2.31-2.fc32.x86_64.rpm", + "checksum": "sha256:f36550dfc144e4608da672616fa44b2f2341f99bb38972e66e4a8fef4b59172c", + "check_gpg": true + }, + { + "name": "gmp", + "epoch": 1, + "version": "6.1.2", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gmp-6.1.2-13.fc32.x86_64.rpm", + "checksum": "sha256:178e4470a6dfca84ec133932606737bfe167094560bf473940504c511354ddc9", + "check_gpg": true + }, + { + "name": "gnupg2", + "epoch": 0, + "version": "2.2.19", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-2.2.19-1.fc32.x86_64.rpm", + "checksum": "sha256:cc3396df93ce0e8f439b83fb6b4d210903876846b0bd3a22c19c7770cf5a9050", + "check_gpg": true + }, + { + "name": "gnupg2-smime", + "epoch": 0, + "version": "2.2.19", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnupg2-smime-2.2.19-1.fc32.x86_64.rpm", + "checksum": "sha256:966084f83e0fedb7a217aa102b484ac8a63082ccfe99517544ed2cb102191204", + "check_gpg": true + }, + { + "name": "gnutls", + "epoch": 0, + "version": "3.6.13", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gnutls-3.6.13-1.fc32.x86_64.rpm", + "checksum": "sha256:9d4f1290565b852e56f9e9babc14b141b0283998121f78b0eb83dec367cf0abb", + "check_gpg": true + }, + { + "name": "gobject-introspection", + "epoch": 0, + "version": "1.64.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gobject-introspection-1.64.1-1.fc32.x86_64.rpm", + "checksum": "sha256:052ddc487a29acce1b5d44532f79f8ab594d0ac6565504071f4c7706d97fc552", + "check_gpg": true + }, + { + "name": "gpgme", + "epoch": 0, + "version": "1.13.1", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gpgme-1.13.1-6.fc32.x86_64.rpm", + "checksum": "sha256:13a0c9c767f71164cc678ee36d89b7fddcdd6fb8243e3daf8b47cca0d1d14c4f", + "check_gpg": true + }, + { + "name": "greenboot", + "epoch": 0, + "version": "0.9", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-0.9-1.fc32.noarch.rpm", + "checksum": "sha256:70794c8537fb3cf197f051cfce3b23956d587062daf114f8480770754804f339", + "check_gpg": true + }, + { + "name": "greenboot-grub2", + "epoch": 0, + "version": "0.9", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-grub2-0.9-1.fc32.noarch.rpm", + "checksum": "sha256:fbaf44214a3e93d4bdccb1519768849db5ea204c886df851b49f107e0c443e4a", + "check_gpg": true + }, + { + "name": "greenboot-reboot", + "epoch": 0, + "version": "0.9", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-reboot-0.9-1.fc32.noarch.rpm", + "checksum": "sha256:1ec84749250a0095d645f11fa0dcdf8c4500e0bbc303af696762a12616375757", + "check_gpg": true + }, + { + "name": "greenboot-rpm-ostree-grub2", + "epoch": 0, + "version": "0.9", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-rpm-ostree-grub2-0.9-1.fc32.noarch.rpm", + "checksum": "sha256:4546444c0647efaa8fa8bf604ace7f7dbd152e74761b8d7a11fa185bc72bece8", + "check_gpg": true + }, + { + "name": "greenboot-status", + "epoch": 0, + "version": "0.9", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/greenboot-status-0.9-1.fc32.noarch.rpm", + "checksum": "sha256:3ab2173d9d4016febcdaf283408f9939d0a7b2fdba3e46a2d45fbef88a1463a0", + "check_gpg": true + }, + { + "name": "grep", + "epoch": 0, + "version": "3.3", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grep-3.3-4.fc32.x86_64.rpm", + "checksum": "sha256:759165656ac8141b0c0ada230c258ffcd4516c4c8d132d7fbaf762cd5a5e4095", + "check_gpg": true + }, + { + "name": "grub2-common", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-common-2.04-12.fc32.noarch.rpm", + "checksum": "sha256:01173d218dccdf88c1159bba4af332ce703fc0dcd7171cd279cb3e16f12b30a9", + "check_gpg": true + }, + { + "name": "grub2-efi-x64", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-efi-x64-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:aa353206ef29b7d908554ccb7cd6f4c01a1f6c3c1c6358abb7452f4a745939d0", + "check_gpg": true + }, + { + "name": "grub2-pc", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:110f538d82f15f009d95e89d8c1e3669dc7358feb9aa7724301fef037f8b67fe", + "check_gpg": true + }, + { + "name": "grub2-pc-modules", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-12.fc32.noarch.rpm", + "checksum": "sha256:c2197913bc8db9548b0a40ffddf840a31956b18e932ad4eec77a48d87d2289ce", + "check_gpg": true + }, + { + "name": "grub2-tools", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:7f6d2841ec9402ee5e57f1a46b9886935138c02005d860899f3c746c7885c7b9", + "check_gpg": true + }, + { + "name": "grub2-tools-minimal", + "epoch": 1, + "version": "2.04", + "release": "12.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/grub2-tools-minimal-2.04-12.fc32.x86_64.rpm", + "checksum": "sha256:d1c6f183b9deaf6127db4ad7040046bd7f1aa62de177961aac39501605d2c815", + "check_gpg": true + }, + { + "name": "gsettings-desktop-schemas", + "epoch": 0, + "version": "3.36.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gsettings-desktop-schemas-3.36.0-1.fc32.x86_64.rpm", + "checksum": "sha256:d1a369d501e3ce1c17d06418c9cd57c4ada551ecc3b45a581e162215e8bd77f5", + "check_gpg": true + }, + { + "name": "gzip", + "epoch": 0, + "version": "1.10", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/g/gzip-1.10-2.fc32.x86_64.rpm", + "checksum": "sha256:53f1e8570b175e8b58895646df6d8068a7e1f3cb1bafdde714ddd038bcf91e85", + "check_gpg": true + }, + { + "name": "hostname", + "epoch": 0, + "version": "3.23", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/h/hostname-3.23-2.fc32.x86_64.rpm", + "checksum": "sha256:def89a494acbfd6aae1fb70700dd18275ddd3050893bc962f1853499af9dd823", + "check_gpg": true + }, + { + "name": "ignition", + "epoch": 0, + "version": "2.2.1", + "release": "3.git2d3ff58.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ignition-2.2.1-3.git2d3ff58.fc32.x86_64.rpm", + "checksum": "sha256:6749bd0b96339c32b57635b69b474583b50c94e4bbaa3eb8753fa604b9d1c521", + "check_gpg": true + }, + { + "name": "ima-evm-utils", + "epoch": 0, + "version": "1.2.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ima-evm-utils-1.2.1-3.fc32.x86_64.rpm", + "checksum": "sha256:c1f957511b5e011e6f7995ed7bca9196703cf1214068f209e86b1dc4fd0e98bf", + "check_gpg": true + }, + { + "name": "initscripts", + "epoch": 0, + "version": "10.02", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/initscripts-10.02-3.fc32.x86_64.rpm", + "checksum": "sha256:bca13571cf1452f3e41c8e89b8c64aa33d3d0f4e414571f9dde32a556591b339", + "check_gpg": true + }, + { + "name": "iproute", + "epoch": 0, + "version": "5.5.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iproute-5.5.0-1.fc32.x86_64.rpm", + "checksum": "sha256:865c7677d2664287bb4ba2874c83bc805232e1b3a02cf6ba96e047266d9ef684", + "check_gpg": true + }, + { + "name": "iproute-tc", + "epoch": 0, + "version": "5.5.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iproute-tc-5.5.0-1.fc32.x86_64.rpm", + "checksum": "sha256:0c6f4c1fbbdaf02014bf81726264e3301cbfe0ecda610765be11dbbfe99e34ae", + "check_gpg": true + }, + { + "name": "ipset", + "epoch": 0, + "version": "7.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ipset-7.6-1.fc32.x86_64.rpm", + "checksum": "sha256:7c21c21c3e3dbace06bee03fe4835ae6cb1e3ef86750ba2853f39d40dead2309", + "check_gpg": true + }, + { + "name": "ipset-libs", + "epoch": 0, + "version": "7.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/ipset-libs-7.6-1.fc32.x86_64.rpm", + "checksum": "sha256:f60fc561675e41ffa2c48b229960291e2438441d5ed758c1f28cb06b5d4e4ea9", + "check_gpg": true + }, + { + "name": "iptables", + "epoch": 0, + "version": "1.8.4", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-1.8.4-7.fc32.x86_64.rpm", + "checksum": "sha256:28f4bcbf53258114ebbf0a167351d67e204ff6f717b49b3893c2372845e6bd0a", + "check_gpg": true + }, + { + "name": "iptables-libs", + "epoch": 0, + "version": "1.8.4", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-libs-1.8.4-7.fc32.x86_64.rpm", + "checksum": "sha256:f4eb6d332b9aea8d8ef0a6ea8dc2b073d6bf5f2599d64f24111d8da2ee82ad48", + "check_gpg": true + }, + { + "name": "iptables-nft", + "epoch": 0, + "version": "1.8.4", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iptables-nft-1.8.4-7.fc32.x86_64.rpm", + "checksum": "sha256:08c41c10745c172c34880e384cf5cff014a9627f4895e59fa482948b27e2ce9e", + "check_gpg": true + }, + { + "name": "iputils", + "epoch": 0, + "version": "20190515", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iputils-20190515-5.fc32.x86_64.rpm", + "checksum": "sha256:6a3282927f525629bc0aaf4090e108d33b0709d3d5b35bc442000c2837e7b9b4", + "check_gpg": true + }, + { + "name": "iwd", + "epoch": 0, + "version": "1.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwd-1.6-1.fc32.x86_64.rpm", + "checksum": "sha256:1a2f22eed83ef568021c464cce841ef98725b614093f2c518307e85d5b6e759b", + "check_gpg": true + }, + { + "name": "iwl100-firmware", + "epoch": 0, + "version": "39.31.5.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl100-firmware-39.31.5.1-106.fc32.noarch.rpm", + "checksum": "sha256:65e5209398c6b2c196cb42f3bc3f82e00af1026f623026857a9b330ec92d0330", + "check_gpg": true + }, + { + "name": "iwl1000-firmware", + "epoch": 1, + "version": "39.31.5.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl1000-firmware-39.31.5.1-106.fc32.noarch.rpm", + "checksum": "sha256:032e4944fe53dc7a11ae62d746579177a5c52b00a4ad5540da8221aa287fdf18", + "check_gpg": true + }, + { + "name": "iwl105-firmware", + "epoch": 0, + "version": "18.168.6.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl105-firmware-18.168.6.1-106.fc32.noarch.rpm", + "checksum": "sha256:79e22d23ba0a156b3d74ec4b0da8fd71bc632386366ade2c48006ba82074055d", + "check_gpg": true + }, + { + "name": "iwl135-firmware", + "epoch": 0, + "version": "18.168.6.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl135-firmware-18.168.6.1-106.fc32.noarch.rpm", + "checksum": "sha256:b286141f38cd88b8c632515677423f49c81365f2ae99c5a7906205f35a273fb2", + "check_gpg": true + }, + { + "name": "iwl2000-firmware", + "epoch": 0, + "version": "18.168.6.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl2000-firmware-18.168.6.1-106.fc32.noarch.rpm", + "checksum": "sha256:caa3625b22908cf4f91faf2c281b0e7ab7d981c35ed1d761deb53b7b78d13cf8", + "check_gpg": true + }, + { + "name": "iwl2030-firmware", + "epoch": 0, + "version": "18.168.6.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl2030-firmware-18.168.6.1-106.fc32.noarch.rpm", + "checksum": "sha256:5d933f9bf444d4c8732caa65e9227b27127c625840859a0453a32a5719916f48", + "check_gpg": true + }, + { + "name": "iwl3160-firmware", + "epoch": 1, + "version": "25.30.13.0", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl3160-firmware-25.30.13.0-106.fc32.noarch.rpm", + "checksum": "sha256:4659e7b76850ce5dedbe80fb0a64947e83f15f907b35c5819d91be6ed0523653", + "check_gpg": true + }, + { + "name": "iwl5000-firmware", + "epoch": 0, + "version": "8.83.5.1_1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl5000-firmware-8.83.5.1_1-106.fc32.noarch.rpm", + "checksum": "sha256:d7f57b9190c9cf05c36fe9fb3229330cdb9f0a1af1214a47b0a38dcc8ce929ee", + "check_gpg": true + }, + { + "name": "iwl5150-firmware", + "epoch": 0, + "version": "8.24.2.2", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl5150-firmware-8.24.2.2-106.fc32.noarch.rpm", + "checksum": "sha256:88d283c2d5aa96c2b0899f6bd6c0409a5d5c6fda2958e8eae19eb49c3ede58d6", + "check_gpg": true + }, + { + "name": "iwl6000-firmware", + "epoch": 0, + "version": "9.221.4.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl6000-firmware-9.221.4.1-106.fc32.noarch.rpm", + "checksum": "sha256:89f85f749bfee7d083c84845e908a3471297a3d8a75f7397903d15eb7f403297", + "check_gpg": true + }, + { + "name": "iwl6050-firmware", + "epoch": 0, + "version": "41.28.5.1", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl6050-firmware-41.28.5.1-106.fc32.noarch.rpm", + "checksum": "sha256:83a08b7066000ebbdf8a6c5706485a19b5dfe2d492b1faaac1922e8f0c42cd0c", + "check_gpg": true + }, + { + "name": "iwl7260-firmware", + "epoch": 1, + "version": "25.30.13.0", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/i/iwl7260-firmware-25.30.13.0-106.fc32.noarch.rpm", + "checksum": "sha256:a3f80bb7068618dff795b3e0a3d32fa3c640e492c8f175b16bb3c7ff64a88a8e", + "check_gpg": true + }, + { + "name": "jansson", + "epoch": 0, + "version": "2.12", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jansson-2.12-5.fc32.x86_64.rpm", + "checksum": "sha256:975719a0c73cf5cb5bcbc8ad11b816ed75923dccd9c091baa4a6c6000753dcd8", + "check_gpg": true + }, + { + "name": "jitterentropy", + "epoch": 0, + "version": "2.2.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jitterentropy-2.2.0-2.fc32.x86_64.rpm", + "checksum": "sha256:872639e4ccb4f1c5de66d5eaa85ca673141b10e3d614b33c84ff887c228d465d", + "check_gpg": true + }, + { + "name": "jose", + "epoch": 0, + "version": "10", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/jose-10-6.fc32.x86_64.rpm", + "checksum": "sha256:d7fec1fb54953f1901cc505c225af94cb61f2206d0503be12313169a4b915e18", + "check_gpg": true + }, + { + "name": "json-c", + "epoch": 0, + "version": "0.13.1", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-c-0.13.1-9.fc32.x86_64.rpm", + "checksum": "sha256:d3a64fcef3de79a97541b21c71ddd00d4cca9039c930bc660d6c5479eabf5f26", + "check_gpg": true + }, + { + "name": "json-glib", + "epoch": 0, + "version": "1.4.4", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/j/json-glib-1.4.4-4.fc32.x86_64.rpm", + "checksum": "sha256:8a03d482b5294f7452b2f9ce31ebb6aea9eefac002281c1b9152fbb1a0341987", + "check_gpg": true + }, + { + "name": "kbd", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-2.2.0-1.fc32.x86_64.rpm", + "checksum": "sha256:a05178831a546e2001e52f065fc6969f36d2292efaee2971fe7a7e882cc8c813", + "check_gpg": true + }, + { + "name": "kbd-legacy", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-legacy-2.2.0-1.fc32.noarch.rpm", + "checksum": "sha256:3be681b78e919bfd82eb186c7393718f1d37abd0b1bb8b1a8571aefa11e7a248", + "check_gpg": true + }, + { + "name": "kbd-misc", + "epoch": 0, + "version": "2.2.0", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kbd-misc-2.2.0-1.fc32.noarch.rpm", + "checksum": "sha256:60774007011889671c28158f599032f0db253c153ccae70f5e2f5840f2dc490b", + "check_gpg": true + }, + { + "name": "kernel-debug", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:b851f60332ff9e6b91bb76914c12329ce905d7fb8a9fe707f36cdbc94a549f8d", + "check_gpg": true + }, + { + "name": "kernel-debug-core", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-core-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:b8cce19164a474c6398de4944ce41ed8c49c3469c7f019d04329284b0509c7b0", + "check_gpg": true + }, + { + "name": "kernel-debug-modules", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-debug-modules-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:d12326c38ad38354bbde510a297f68c991d0babf104f6a0a22bae3e1ae903506", + "check_gpg": true + }, + { + "name": "kernel-tools", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-tools-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:e291d6c021eaa01cc3c446b76c94aafde444936b8ba3f08a7fe7cbe66a23366b", + "check_gpg": true + }, + { + "name": "kernel-tools-libs", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-tools-libs-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:150815dd62da40fee60ad5ceb988938c3be01e03aa54a025772b33a7a2c11311", + "check_gpg": true + }, + { + "name": "keyutils", + "epoch": 0, + "version": "1.6", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/keyutils-1.6-4.fc32.x86_64.rpm", + "checksum": "sha256:9ee276ed9d036a4483bb8d1bd6f6d697b161a04276c6ce5f1d3f40d48e04bccb", + "check_gpg": true + }, + { + "name": "keyutils-libs", + "epoch": 0, + "version": "1.6", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/keyutils-libs-1.6-4.fc32.x86_64.rpm", + "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", + "check_gpg": true + }, + { + "name": "kmod", + "epoch": 0, + "version": "27", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-27-1.fc32.x86_64.rpm", + "checksum": "sha256:3f9c95f3827b785f49ac4a270d4c3a703dceba673c452838744ec5064cf43cbd", + "check_gpg": true + }, + { + "name": "kmod-libs", + "epoch": 0, + "version": "27", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kmod-libs-27-1.fc32.x86_64.rpm", + "checksum": "sha256:56187c1c980cc0680f4dbc433ed2c8507e7dc9ab00000615b63ea08c086b7ab2", + "check_gpg": true + }, + { + "name": "kpartx", + "epoch": 0, + "version": "0.8.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kpartx-0.8.2-3.fc32.x86_64.rpm", + "checksum": "sha256:fbb81a7811f7a11b1c95eec20c3df63beef9e007f0b3d2713f13ad80029d7249", + "check_gpg": true + }, + { + "name": "krb5-libs", + "epoch": 0, + "version": "1.18", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/krb5-libs-1.18-1.fc32.x86_64.rpm", + "checksum": "sha256:e2b2dddbce49fab5f01ba75fae8796ab7c9fd8280c652f78d06a2644246bd16d", + "check_gpg": true + }, + { + "name": "less", + "epoch": 0, + "version": "551", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/less-551-3.fc32.x86_64.rpm", + "checksum": "sha256:2b783576612dcf10ab151fee03084f8ae1667c044a9e2e9404a2a139e7c6c884", + "check_gpg": true + }, + { + "name": "libacl", + "epoch": 0, + "version": "2.2.53", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libacl-2.2.53-5.fc32.x86_64.rpm", + "checksum": "sha256:f826f984b23d0701a1b72de5882b9c0e7bae87ef49d9edfea156654f489f8b2b", + "check_gpg": true + }, + { + "name": "libaio", + "epoch": 0, + "version": "0.3.111", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libaio-0.3.111-7.fc32.x86_64.rpm", + "checksum": "sha256:a410db5c56d4f39f6ea71e7d5bb6d4a2bd518015d1e34f38fbc0d7bbd4e872d4", + "check_gpg": true + }, + { + "name": "libarchive", + "epoch": 0, + "version": "3.4.2", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libarchive-3.4.2-1.fc32.x86_64.rpm", + "checksum": "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58", + "check_gpg": true + }, + { + "name": "libargon2", + "epoch": 0, + "version": "20171227", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libargon2-20171227-4.fc32.x86_64.rpm", + "checksum": "sha256:7d9bd2fe016ca8860e8fab4a430b3aae4c7b7bea55f8ccd7775ad470172e2886", + "check_gpg": true + }, + { + "name": "libassuan", + "epoch": 0, + "version": "2.5.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libassuan-2.5.3-3.fc32.x86_64.rpm", + "checksum": "sha256:598a136b7027cb9b4fef6bfa34715979d41c2f62c9d8bec5d50b633a17790f7b", + "check_gpg": true + }, + { + "name": "libattr", + "epoch": 0, + "version": "2.4.48", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libattr-2.4.48-8.fc32.x86_64.rpm", + "checksum": "sha256:65e0cfe367ae4d54cf8bf509cb05e063c9eb6f2fea8dadcf746cdd85adc31d88", + "check_gpg": true + }, + { + "name": "libblkid", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libblkid-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:1830b4aa42ef492c13b62f63fe941970869ba19bd9abde4dea5c97f9e38ffd68", + "check_gpg": true + }, + { + "name": "libbrotli", + "epoch": 0, + "version": "1.0.7", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libbrotli-1.0.7-10.fc32.x86_64.rpm", + "checksum": "sha256:ac8b1fea0b678d7630033a8900be5641b934306961b39a29c79c6d72f34f7d1c", + "check_gpg": true + }, + { + "name": "libbsd", + "epoch": 0, + "version": "0.10.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libbsd-0.10.0-2.fc32.x86_64.rpm", + "checksum": "sha256:d74b76ce8c2c7306cc3f012d1ec56b1d5c67788748f56ecd505f257d342f97ee", + "check_gpg": true + }, + { + "name": "libcap", + "epoch": 0, + "version": "2.26", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-2.26-7.fc32.x86_64.rpm", + "checksum": "sha256:1bc0542cf8a3746d0fe25c397a93c8206963f1f287246c6fb864eedfc9ffa4a7", + "check_gpg": true + }, + { + "name": "libcap-ng", + "epoch": 0, + "version": "0.7.10", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcap-ng-0.7.10-2.fc32.x86_64.rpm", + "checksum": "sha256:b60670fdcf91b50d97720f601d92277efedbd690bd887000ccd9a46b3fa8b314", + "check_gpg": true + }, + { + "name": "libcbor", + "epoch": 0, + "version": "0.5.0", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcbor-0.5.0-7.fc32.x86_64.rpm", + "checksum": "sha256:b13eed593b31a9cc0174774b97701c7da876f91ccdfc951b67a3134d59ccd8b5", + "check_gpg": true + }, + { + "name": "libcom_err", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcom_err-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:4494013eac1ad337673f084242aa8ebffb4a149243475b448bee9266401f2896", + "check_gpg": true + }, + { + "name": "libcroco", + "epoch": 0, + "version": "0.6.13", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcroco-0.6.13-3.fc32.x86_64.rpm", + "checksum": "sha256:63400fedea4a6ddb8fced58d33e60560791f29cd439169998f337d09fb50a7d4", + "check_gpg": true + }, + { + "name": "libcurl", + "epoch": 0, + "version": "7.69.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libcurl-7.69.1-1.fc32.x86_64.rpm", + "checksum": "sha256:7dfe1e8dac6d759479ae3dfd415fdd2662bbed9ff0f4da6093279efd1bacae31", + "check_gpg": true + }, + { + "name": "libdb", + "epoch": 0, + "version": "5.3.28", + "release": "40.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-5.3.28-40.fc32.x86_64.rpm", + "checksum": "sha256:688fcc0b7ef3c48cf7d602eefd7fefae7bcad4f0dc71c9fe9432c2ce5bbd9daa", + "check_gpg": true + }, + { + "name": "libdb-utils", + "epoch": 0, + "version": "5.3.28", + "release": "40.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libdb-utils-5.3.28-40.fc32.x86_64.rpm", + "checksum": "sha256:431d836b2be015212d8c15b4290d5ce5bb45282cbf3fc52696f632d84ce34dfe", + "check_gpg": true + }, + { + "name": "libedit", + "epoch": 0, + "version": "3.1", + "release": "32.20191231cvs.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libedit-3.1-32.20191231cvs.fc32.x86_64.rpm", + "checksum": "sha256:9a12db30090023c60e3d7bcd5b07142cdc6d84c77e25ddb1cf41a4c490e52f09", + "check_gpg": true + }, + { + "name": "libell", + "epoch": 0, + "version": "0.30", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libell-0.30-1.fc32.x86_64.rpm", + "checksum": "sha256:39961756e07f6f49ddf2ff277dc04a63fa4d5b4fb035480945bd2f665ba1dd4d", + "check_gpg": true + }, + { + "name": "libevent", + "epoch": 0, + "version": "2.1.8", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libevent-2.1.8-8.fc32.x86_64.rpm", + "checksum": "sha256:7bf42ff57ce2a31db0da7d6c5926552f4e51e9f25cded77bd634eb5cd35eadab", + "check_gpg": true + }, + { + "name": "libfdisk", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libfdisk-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:942d06ec1f7033ea4c729b84ee09f5491481770efe10151ba581479ac7f3f9dc", + "check_gpg": true + }, + { + "name": "libffi", + "epoch": 0, + "version": "3.1", + "release": "24.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libffi-3.1-24.fc32.x86_64.rpm", + "checksum": "sha256:86c87a4169bdf75c6d3a2f11d3a7e20b6364b2db97c74bc7eb62b1b22bc54401", + "check_gpg": true + }, + { + "name": "libfido2", + "epoch": 0, + "version": "1.3.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libfido2-1.3.1-1.fc32.x86_64.rpm", + "checksum": "sha256:ebbace15f986288bba7681f44a111b14bcc7cae00b7a1faadaa838bd51897357", + "check_gpg": true + }, + { + "name": "libftdi", + "epoch": 0, + "version": "1.4", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libftdi-1.4-2.fc32.x86_64.rpm", + "checksum": "sha256:14bd7e305e13795e0d37c613dfa3ead3a3219d28c32b27ad6527d3592361923d", + "check_gpg": true + }, + { + "name": "libgcab1", + "epoch": 0, + "version": "1.4", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcab1-1.4-2.fc32.x86_64.rpm", + "checksum": "sha256:aac9be36fc9c345245b4a0db66bfb9ff8df25e36ae0c1ae89eca9bcf88e052e4", + "check_gpg": true + }, + { + "name": "libgcc", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcc-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:48cf5ab32f6af8f2283d4d4834e8dd262aa412be7ea07c2292483e150d614bef", + "check_gpg": true + }, + { + "name": "libgcrypt", + "epoch": 0, + "version": "1.8.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgcrypt-1.8.5-3.fc32.x86_64.rpm", + "checksum": "sha256:5f0ae954b5955c86623e68cd81ccf8505a89f260003b8a3be6a93bd76f18452c", + "check_gpg": true + }, + { + "name": "libgomp", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgomp-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:d65b4bb6fa49198237f9b704ec471d71dfd94b87290f4d03c1c34d12f6efeb95", + "check_gpg": true + }, + { + "name": "libgpg-error", + "epoch": 0, + "version": "1.36", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpg-error-1.36-3.fc32.x86_64.rpm", + "checksum": "sha256:9bd5cb588664e8427bc8bebde0cdf5e14315916624ab6b1979dde60f6eae4278", + "check_gpg": true + }, + { + "name": "libgpiod", + "epoch": 0, + "version": "1.5.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpiod-1.5.1-1.fc32.x86_64.rpm", + "checksum": "sha256:c8daa43a4504f9a4b6c106baf8a56aa0d256fc3c71bd417ea75b9c7fd830a9b7", + "check_gpg": true + }, + { + "name": "libgpiod-utils", + "epoch": 0, + "version": "1.5.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgpiod-utils-1.5.1-1.fc32.x86_64.rpm", + "checksum": "sha256:b3201777d78ee13ee45ddbd982af5999ce058907b5dc552669644931b79c5f51", + "check_gpg": true + }, + { + "name": "libgudev", + "epoch": 0, + "version": "232", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgudev-232-7.fc32.x86_64.rpm", + "checksum": "sha256:824fe37d58cadac2f23678c9eb95c29b4acb1852df97cf799e77aa7e8034b54e", + "check_gpg": true + }, + { + "name": "libgusb", + "epoch": 0, + "version": "0.3.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libgusb-0.3.4-1.fc32.x86_64.rpm", + "checksum": "sha256:86acbe8d77b05c1fe9bb0168443a579b1d4538f9733813db4e72e4a4a2be29e3", + "check_gpg": true + }, + { + "name": "libidn2", + "epoch": 0, + "version": "2.3.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libidn2-2.3.0-2.fc32.x86_64.rpm", + "checksum": "sha256:20787251df57a108bbf9c40e30f041b71ac36c8a10900fb699e574ee7e259bf2", + "check_gpg": true + }, + { + "name": "libjose", + "epoch": 0, + "version": "10", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libjose-10-6.fc32.x86_64.rpm", + "checksum": "sha256:ff44071d53a2ed543c2ddad99cca8fc25493cbefc5d7ad869f9b6dbda340a465", + "check_gpg": true + }, + { + "name": "libkcapi", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:8677b34fa73f258b1a599d18419f6fbbb8961bb1ca2ae5b0f9abdcc4f93b319e", + "check_gpg": true + }, + { + "name": "libkcapi-hmaccalc", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libkcapi-hmaccalc-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:5d5c8c7e9c78e3b8827ad38771efb44951d1c3c1692cf4e07b138c1c8c42bd5b", + "check_gpg": true + }, + { + "name": "libksba", + "epoch": 0, + "version": "1.3.5", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libksba-1.3.5-11.fc32.x86_64.rpm", + "checksum": "sha256:1b05dd5abad5a31380c859bc33e7851158c24333fda837ca9facf869005f81fe", + "check_gpg": true + }, + { + "name": "libluksmeta", + "epoch": 0, + "version": "9", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libluksmeta-9-7.fc32.x86_64.rpm", + "checksum": "sha256:2434cd04a437c06f59d67ee2580443c0ba676c39440cd0f74cca768ec57577f9", + "check_gpg": true + }, + { + "name": "libmbim", + "epoch": 0, + "version": "1.22.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmbim-1.22.0-1.fc32.x86_64.rpm", + "checksum": "sha256:de74076fc5073ad07ffa78fed6e7cd8f10133d99c1c73149b4ac74428699a6d1", + "check_gpg": true + }, + { + "name": "libmbim-utils", + "epoch": 0, + "version": "1.22.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmbim-utils-1.22.0-1.fc32.x86_64.rpm", + "checksum": "sha256:4eb6a2e34173a2b6ca7db031cecce56c0bed711691abf1c8d6bfe6cb7ca45dc0", + "check_gpg": true + }, + { + "name": "libmetalink", + "epoch": 0, + "version": "0.1.3", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmetalink-0.1.3-10.fc32.x86_64.rpm", + "checksum": "sha256:6eb95e39b9771c4dde5f9954a74cef6be90522c28c7c4aa767ebe7a9d55fcdf9", + "check_gpg": true + }, + { + "name": "libmnl", + "epoch": 0, + "version": "1.0.4", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmnl-1.0.4-11.fc32.x86_64.rpm", + "checksum": "sha256:1c68255945533ed4e3368125bc46e19f3fe348d7ec507a85a35038dbb976003f", + "check_gpg": true + }, + { + "name": "libmodman", + "epoch": 0, + "version": "2.0.1", + "release": "21.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodman-2.0.1-21.fc32.x86_64.rpm", + "checksum": "sha256:9ebc5843faeb852bbbe3d53f03182197f6595a928ffa3f5d7a530749ee1e4ec8", + "check_gpg": true + }, + { + "name": "libmodulemd1", + "epoch": 0, + "version": "1.8.16", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmodulemd1-1.8.16-2.fc32.x86_64.rpm", + "checksum": "sha256:aa5b658fd4a95c724b61eddadecdbcbc1b2a813ae681318ab092a2ed03954825", + "check_gpg": true + }, + { + "name": "libmount", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libmount-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:e740cc0a580639b887bda0039a779e750a32835be1fd8c64aa01183b4cbb98bf", + "check_gpg": true + }, + { + "name": "libndp", + "epoch": 0, + "version": "1.7", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libndp-1.7-5.fc32.x86_64.rpm", + "checksum": "sha256:4f4ef59861c0566d22bd76369d22369d43130f5ccdb35a5fc2c8a236cf33651f", + "check_gpg": true + }, + { + "name": "libnet", + "epoch": 0, + "version": "1.1.6", + "release": "19.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnet-1.1.6-19.fc32.x86_64.rpm", + "checksum": "sha256:b359ca3cdc68b6e5031f65975df38a8b96c19ddc4c367e1e3463fc8484a0b3b7", + "check_gpg": true + }, + { + "name": "libnetfilter_conntrack", + "epoch": 0, + "version": "1.0.7", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnetfilter_conntrack-1.0.7-4.fc32.x86_64.rpm", + "checksum": "sha256:884357540f4be2a74e608e2c7a31f2371ee3b4d29be2fe39a371c0b131d84aa6", + "check_gpg": true + }, + { + "name": "libnfnetlink", + "epoch": 0, + "version": "1.0.1", + "release": "17.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnfnetlink-1.0.1-17.fc32.x86_64.rpm", + "checksum": "sha256:ec6abd65541b5bded814de19c9d064e6c21e3d8b424dba7cb25b2fdc52d45a2b", + "check_gpg": true + }, + { + "name": "libnftnl", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnftnl-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:3afab9512fd4d56a13c95b530c805ac8b2bc872572ec5bb435eccdd59fbbc8b6", + "check_gpg": true + }, + { + "name": "libnghttp2", + "epoch": 0, + "version": "1.40.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnghttp2-1.40.0-2.fc32.x86_64.rpm", + "checksum": "sha256:a8ce7406c87f64972f0b70f1823c2aad05516c71fe375c6c97737459c2448825", + "check_gpg": true + }, + { + "name": "libnl3", + "epoch": 0, + "version": "3.5.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnl3-3.5.0-2.fc32.x86_64.rpm", + "checksum": "sha256:8dfdbe51193bdcfc3db41b5b9f317f009bfab6373e6ed3c5475466b8772a85e1", + "check_gpg": true + }, + { + "name": "libnsl2", + "epoch": 0, + "version": "1.2.0", + "release": "6.20180605git4a062cf.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnsl2-1.2.0-6.20180605git4a062cf.fc32.x86_64.rpm", + "checksum": "sha256:3b4ce7fc4e2778758881feedf6ea19b65e99aa3672e19a7dd62977efe3b910b9", + "check_gpg": true + }, + { + "name": "libpcap", + "epoch": 14, + "version": "1.9.1", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpcap-1.9.1-3.fc32.x86_64.rpm", + "checksum": "sha256:b3230630a471b806a9153669d187508350cdb2b368a68f8c439c82abad038c3f", + "check_gpg": true + }, + { + "name": "libpkgconf", + "epoch": 0, + "version": "1.6.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpkgconf-1.6.3-3.fc32.x86_64.rpm", + "checksum": "sha256:6952dfc6a8f583c9aeafb16d5d34208d7e39fd7ec8628c5aa8ccde039acbe548", + "check_gpg": true + }, + { + "name": "libproxy", + "epoch": 0, + "version": "0.4.15", + "release": "17.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libproxy-0.4.15-17.fc32.x86_64.rpm", + "checksum": "sha256:5a4c0187b96690e0088057f7656c67d399fad44b28b86644e3434c581377c229", + "check_gpg": true + }, + { + "name": "libpsl", + "epoch": 0, + "version": "0.21.0", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpsl-0.21.0-4.fc32.x86_64.rpm", + "checksum": "sha256:ce8c1f1ce3cb2cc0166dcaad17f35e84278ec39ea9bf232e24130d3ff3271923", + "check_gpg": true + }, + { + "name": "libpwquality", + "epoch": 0, + "version": "1.4.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libpwquality-1.4.2-2.fc32.x86_64.rpm", + "checksum": "sha256:9ecc8aa9af05ba704cec879618afeda5ff92d8233811e2d6080aa02e0b5ceddf", + "check_gpg": true + }, + { + "name": "libqmi", + "epoch": 0, + "version": "1.24.8", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libqmi-1.24.8-1.fc32.x86_64.rpm", + "checksum": "sha256:5ad0d1b4e641e5d2fe7f6385ace0f827a431c5a52c6dc3516d85e655caca880f", + "check_gpg": true + }, + { + "name": "libqmi-utils", + "epoch": 0, + "version": "1.24.8", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libqmi-utils-1.24.8-1.fc32.x86_64.rpm", + "checksum": "sha256:64922311f45700f2f4f98d78efbdfa240987a6a2b1396ffe694d30e2b5f34ac3", + "check_gpg": true + }, + { + "name": "librepo", + "epoch": 0, + "version": "1.11.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/librepo-1.11.1-4.fc32.x86_64.rpm", + "checksum": "sha256:aa783a91b1823b7b056575e6276df35910eb2e0d4b72121cf5649651c7d23a16", + "check_gpg": true + }, + { + "name": "libseccomp", + "epoch": 0, + "version": "2.4.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libseccomp-2.4.2-3.fc32.x86_64.rpm", + "checksum": "sha256:df0a39eb6b91c4a8f481c22445cbbd88334bf5e0a6e1dd5fb240981eb031c4eb", + "check_gpg": true + }, + { + "name": "libsecret", + "epoch": 0, + "version": "0.20.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsecret-0.20.2-2.fc32.x86_64.rpm", + "checksum": "sha256:251fd875421da4708b76c15c7f5ba478d50b74d7e4242071a621625eac51a767", + "check_gpg": true + }, + { + "name": "libselinux", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:0e59b422e35eee975ba68e6e4de022c8f145feec7e169e86e0244d2fdad2f590", + "check_gpg": true + }, + { + "name": "libselinux-utils", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libselinux-utils-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:1446032720fb8e0090190828fcea294a86fc7f83edd70f6089e3446770ba0438", + "check_gpg": true + }, + { + "name": "libsemanage", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsemanage-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:54cb827278ae474cbab1f05e0fbee0355bee2674d46a804f1c2b78ff80a48caa", + "check_gpg": true + }, + { + "name": "libsepol", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsepol-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:29e2b62e9e63f25139a6863c863c3b534660440d7dec0c985807302a6895dbaf", + "check_gpg": true + }, + { + "name": "libsigsegv", + "epoch": 0, + "version": "2.11", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsigsegv-2.11-10.fc32.x86_64.rpm", + "checksum": "sha256:942707884401498938fba6e2439dc923d4e2d81f4bac205f4e73d458e9879927", + "check_gpg": true + }, + { + "name": "libsmartcols", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsmartcols-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:ddad78d00b09c6c85d46c06dcba4c951f7f7dfc9b2dab195bf45aa3f5a1fdc41", + "check_gpg": true + }, + { + "name": "libsmbios", + "epoch": 0, + "version": "2.4.2", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsmbios-2.4.2-7.fc32.x86_64.rpm", + "checksum": "sha256:cbfc109588fa0e34bdc408dbb37dadf7873fb5788dd3fd8cd04c17c75f26e6db", + "check_gpg": true + }, + { + "name": "libsolv", + "epoch": 0, + "version": "0.7.11", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsolv-0.7.11-2.fc32.x86_64.rpm", + "checksum": "sha256:be899d3e806441b1c46811c0ffe9f4e01f4ea4e1544f9cc32630254853e3f3a5", + "check_gpg": true + }, + { + "name": "libsoup", + "epoch": 0, + "version": "2.70.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsoup-2.70.0-1.fc32.x86_64.rpm", + "checksum": "sha256:b09015ae5fb5772b73bc7932991aaf6e1f6d509432af605a565ef53d2d50606a", + "check_gpg": true + }, + { + "name": "libss", + "epoch": 0, + "version": "1.45.5", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libss-1.45.5-3.fc32.x86_64.rpm", + "checksum": "sha256:27701cda24f5f6386e0173745aabc4f6df28052975e73529854432c35399cfc8", + "check_gpg": true + }, + { + "name": "libssh", + "epoch": 0, + "version": "0.9.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-0.9.3-2.fc32.x86_64.rpm", + "checksum": "sha256:32f8cbb3be91f589d569a2e737130f29c752f78eebc61e287af17f207e1b8c58", + "check_gpg": true + }, + { + "name": "libssh-config", + "epoch": 0, + "version": "0.9.3", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libssh-config-0.9.3-2.fc32.noarch.rpm", + "checksum": "sha256:49bac21d5cdf863fccfcc32bf070e582d204706e35ee9f60b3e69df694bff87d", + "check_gpg": true + }, + { + "name": "libsss_idmap", + "epoch": 0, + "version": "2.2.3", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_idmap-2.2.3-13.fc32.x86_64.rpm", + "checksum": "sha256:599549d72d26b48c45156585a5698898c853e56469142e202d3749b781428465", + "check_gpg": true + }, + { + "name": "libsss_nss_idmap", + "epoch": 0, + "version": "2.2.3", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_nss_idmap-2.2.3-13.fc32.x86_64.rpm", + "checksum": "sha256:66bb5b2e99d2c74b82943fe61fe9b9a3674350b0242f69a6854ec9718dcf5e07", + "check_gpg": true + }, + { + "name": "libsss_sudo", + "epoch": 0, + "version": "2.2.3", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsss_sudo-2.2.3-13.fc32.x86_64.rpm", + "checksum": "sha256:af66820023c984d8b981ecac715d0c2daec1f89dcb69bed76ddf58b0ee80c1b1", + "check_gpg": true + }, + { + "name": "libstdc++", + "epoch": 0, + "version": "10.0.1", + "release": "0.11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libstdc++-10.0.1-0.11.fc32.x86_64.rpm", + "checksum": "sha256:be998dfbcc9ca8e3021ac4f56ed723cfa3fa1517524e89ee0b636f623abe995f", + "check_gpg": true + }, + { + "name": "libsysfs", + "epoch": 0, + "version": "2.1.0", + "release": "28.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libsysfs-2.1.0-28.fc32.x86_64.rpm", + "checksum": "sha256:64567be564634937bd918d33a3f04017808d29269a5b0891a0f4d4aecad6161b", + "check_gpg": true + }, + { + "name": "libtasn1", + "epoch": 0, + "version": "4.16.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtasn1-4.16.0-1.fc32.x86_64.rpm", + "checksum": "sha256:052d04c9a6697c6e5aa546546ae5058d547fc4a4f474d2805a3e45dbf69193c6", + "check_gpg": true + }, + { + "name": "libtextstyle", + "epoch": 0, + "version": "0.20.1", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtextstyle-0.20.1-4.fc32.x86_64.rpm", + "checksum": "sha256:b35256e417fd94c7efb1212f2f36b5e6b224ff5b9e8733774d4fbdc652078099", + "check_gpg": true + }, + { + "name": "libtirpc", + "epoch": 0, + "version": "1.2.5", + "release": "1.rc2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libtirpc-1.2.5-1.rc2.fc32.x86_64.rpm", + "checksum": "sha256:c1d754773972b5f4ca157c0afa45d6767901d965a91f381660c72740d682df63", + "check_gpg": true + }, + { + "name": "libunistring", + "epoch": 0, + "version": "0.9.10", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libunistring-0.9.10-7.fc32.x86_64.rpm", + "checksum": "sha256:fb06aa3d8059406a23694ddafe0ef340ca627dd68bf3f351f094de58ef30fb2c", + "check_gpg": true + }, + { + "name": "libusbx", + "epoch": 0, + "version": "1.0.23", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libusbx-1.0.23-1.fc32.x86_64.rpm", + "checksum": "sha256:729fb595040f1e2e71ff0a8c1c22ebe4b7187f78b816af8e6a8d93c03fc5d844", + "check_gpg": true + }, + { + "name": "libuser", + "epoch": 0, + "version": "0.62", + "release": "24.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libuser-0.62-24.fc32.x86_64.rpm", + "checksum": "sha256:b58828b2f1ce4f7778d3f511c61ee8925042b9752aea526c23d33fd7533aa975", + "check_gpg": true + }, + { + "name": "libutempter", + "epoch": 0, + "version": "1.1.6", + "release": "18.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libutempter-1.1.6-18.fc32.x86_64.rpm", + "checksum": "sha256:f9ccea65ecf98f4dfac65d25986d08efa62a1d1c0db9db0a061e7408d6805a1a", + "check_gpg": true + }, + { + "name": "libuuid", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libuuid-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:8402d3aabfc02c16f3789f3f93338dbee2448db8a49956002b83aff5390922d9", + "check_gpg": true + }, + { + "name": "libvarlink-util", + "epoch": 0, + "version": "18", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libvarlink-util-18-3.fc32.x86_64.rpm", + "checksum": "sha256:a7452c18c2cffc266ec36c54105b884c4d63181f20cebd705e33730534cb9093", + "check_gpg": true + }, + { + "name": "libverto", + "epoch": 0, + "version": "0.3.0", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libverto-0.3.0-9.fc32.x86_64.rpm", + "checksum": "sha256:ed84414c9b2190d3026f58db78dffd8bc3a9ad40311cb0adb8ff8e3c7c06ca60", + "check_gpg": true + }, + { + "name": "libxcrypt", + "epoch": 0, + "version": "4.4.16", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-4.4.16-1.fc32.x86_64.rpm", + "checksum": "sha256:7c1a229f4a36ac8b077e0514f68f311229652121528b0f8a2a7434c618276dcb", + "check_gpg": true + }, + { + "name": "libxcrypt-compat", + "epoch": 0, + "version": "4.4.16", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxcrypt-compat-4.4.16-1.fc32.x86_64.rpm", + "checksum": "sha256:cb4fb9b3733440ea15b3309c88d9471c4165aa7b71b4dbc5d0fb5bfcd97b2f2e", + "check_gpg": true + }, + { + "name": "libxkbcommon", + "epoch": 0, + "version": "0.10.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxkbcommon-0.10.0-2.fc32.x86_64.rpm", + "checksum": "sha256:ae219ad5ecc0233271c3fd61263f817c646eecece19a8f075e7aa4dd9ff8698e", + "check_gpg": true + }, + { + "name": "libxml2", + "epoch": 0, + "version": "2.9.10", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxml2-2.9.10-3.fc32.x86_64.rpm", + "checksum": "sha256:a7f040de29d2414cc99fcffcd9ed3fa9d06ecc7aecd783ec3d2eef769e2389f1", + "check_gpg": true + }, + { + "name": "libxmlb", + "epoch": 0, + "version": "0.1.14", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libxmlb-0.1.14-2.fc32.x86_64.rpm", + "checksum": "sha256:ad50ed0c4f4c956e3b59ac9fc7bf5fba22068a661ea75a46eb81bc2209af4cc5", + "check_gpg": true + }, + { + "name": "libyaml", + "epoch": 0, + "version": "0.2.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libyaml-0.2.2-3.fc32.x86_64.rpm", + "checksum": "sha256:9c8a274158a6fe97598e33900cd51e171f7e7517ccfc8ad6351873e69b225986", + "check_gpg": true + }, + { + "name": "libzstd", + "epoch": 0, + "version": "1.4.4", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libzstd-1.4.4-2.fc32.x86_64.rpm", + "checksum": "sha256:9465f2f1103697207a52d15edd716ab72dc6c281823c60f424cd064d706c7a51", + "check_gpg": true + }, + { + "name": "linux-atm-libs", + "epoch": 0, + "version": "2.5.1", + "release": "26.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-atm-libs-2.5.1-26.fc32.x86_64.rpm", + "checksum": "sha256:c9ba05cb46a9cb52e3325ca20c457a377361abcd0e5a7dda776ba19481770467", + "check_gpg": true + }, + { + "name": "linux-firmware", + "epoch": 0, + "version": "20200316", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-firmware-20200316-106.fc32.noarch.rpm", + "checksum": "sha256:5b8a205f3d4bde162e01a821fdacbc10ebfa01b88ec61b166b4b6317c45910c4", + "check_gpg": true + }, + { + "name": "linux-firmware-whence", + "epoch": 0, + "version": "20200316", + "release": "106.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/linux-firmware-whence-20200316-106.fc32.noarch.rpm", + "checksum": "sha256:15f70393f706ea0ac6c622563268d9c00509ef376e3e087c1c05007b49894ee9", + "check_gpg": true + }, + { + "name": "lua-libs", + "epoch": 0, + "version": "5.3.5", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lua-libs-5.3.5-7.fc32.x86_64.rpm", + "checksum": "sha256:10883ce95852cc9ae9b4e0d435b100a25f8fe5c0ea4677eb4a0b39f4f8def886", + "check_gpg": true + }, + { + "name": "luksmeta", + "epoch": 0, + "version": "9", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/luksmeta-9-7.fc32.x86_64.rpm", + "checksum": "sha256:9fa1959637c902dfeb19a0f16c7f42f7da4aab293f7c025c66d39debad6dbc34", + "check_gpg": true + }, + { + "name": "lvm2", + "epoch": 0, + "version": "2.03.09", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lvm2-2.03.09-1.fc32.x86_64.rpm", + "checksum": "sha256:3b76bc46dd279404408d34946cfdb0c3899359a1c6b48e614e63d1259a94262a", + "check_gpg": true + }, + { + "name": "lvm2-libs", + "epoch": 0, + "version": "2.03.09", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lvm2-libs-2.03.09-1.fc32.x86_64.rpm", + "checksum": "sha256:e851ba0019baa83e1bebbe92e1a1cf629694ccf3b42c5ff84e0ed7bea74931d3", + "check_gpg": true + }, + { + "name": "lz4-libs", + "epoch": 0, + "version": "1.9.1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lz4-libs-1.9.1-2.fc32.x86_64.rpm", + "checksum": "sha256:44cfb58b368fba586981aa838a7f3974ac1d66d2b3b695f88d7b1d2e9c81a0b6", + "check_gpg": true + }, + { + "name": "lzo", + "epoch": 0, + "version": "2.10", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/lzo-2.10-2.fc32.x86_64.rpm", + "checksum": "sha256:4375c398dff722a29bd1700bc8dc8b528345412d1e17d8d9d1176d9774962957", + "check_gpg": true + }, + { + "name": "microcode_ctl", + "epoch": 2, + "version": "2.1", + "release": "35.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/microcode_ctl-2.1-35.fc32.x86_64.rpm", + "checksum": "sha256:95a89032291b05a0e483f336ea29897d951e8845b0f347a4117de90ef3ef3467", + "check_gpg": true + }, + { + "name": "mkpasswd", + "epoch": 0, + "version": "5.5.6", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mkpasswd-5.5.6-1.fc32.x86_64.rpm", + "checksum": "sha256:640afe5b9d499c9a7efc1d23cce8c54e3e3704d92eb7e7a93a048f97d1e983e1", + "check_gpg": true + }, + { + "name": "mokutil", + "epoch": 2, + "version": "0.3.0", + "release": "15.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mokutil-0.3.0-15.fc32.x86_64.rpm", + "checksum": "sha256:9cf9b01f2c727e3576a8aa71fd7fe1bf4ec9ed1c9f50b756657cf9aeae18418f", + "check_gpg": true + }, + { + "name": "mozjs60", + "epoch": 0, + "version": "60.9.0", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mozjs60-60.9.0-5.fc32.x86_64.rpm", + "checksum": "sha256:80cf220a3314f965c088e03d2b750426767db0b36b6b7c5e8059b9217ff4de6d", + "check_gpg": true + }, + { + "name": "mpfr", + "epoch": 0, + "version": "4.0.2", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/m/mpfr-4.0.2-3.fc32.x86_64.rpm", + "checksum": "sha256:2b098bc6f8004270ee9eac9f63980b364b5fe19394dc73a230b3c846cf488b1b", + "check_gpg": true + }, + { + "name": "ncurses", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-6.1-15.20191109.fc32.x86_64.rpm", + "checksum": "sha256:b2e862283ac97b1d8b1ede2034ead452ac7dc4ff308593306275b1b0ae5b4102", + "check_gpg": true + }, + { + "name": "ncurses-base", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-base-6.1-15.20191109.fc32.noarch.rpm", + "checksum": "sha256:25fc5d288536e1973436da38357690575ed58e03e17ca48d2b3840364f830659", + "check_gpg": true + }, + { + "name": "ncurses-libs", + "epoch": 0, + "version": "6.1", + "release": "15.20191109.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/ncurses-libs-6.1-15.20191109.fc32.x86_64.rpm", + "checksum": "sha256:04152a3a608d022a58830c0e3dac0818e2c060469b0f41d8d731f659981a4464", + "check_gpg": true + }, + { + "name": "nettle", + "epoch": 0, + "version": "3.5.1", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nettle-3.5.1-5.fc32.x86_64.rpm", + "checksum": "sha256:c019d23ed2cb3ceb0ac9757a72c3e8b1d31f2a524b889e18049cc7d923bc9466", + "check_gpg": true + }, + { + "name": "nftables", + "epoch": 1, + "version": "0.9.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nftables-0.9.3-2.fc32.x86_64.rpm", + "checksum": "sha256:0b7d24759aac33303ff4b101c111dea03ff2529efc95661140e22f629cc1ab7a", + "check_gpg": true + }, + { + "name": "nmap-ncat", + "epoch": 2, + "version": "7.80", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nmap-ncat-7.80-3.fc32.x86_64.rpm", + "checksum": "sha256:e2566356943c1c7485d206b858dd6ae3be37c28bfec2a43f869193f3b5b9cd23", + "check_gpg": true + }, + { + "name": "npth", + "epoch": 0, + "version": "1.6", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/npth-1.6-4.fc32.x86_64.rpm", + "checksum": "sha256:3c2a641f118ab2e8b08df6dd2da72a60121d02df8d932b4afa2920eb80392875", + "check_gpg": true + }, + { + "name": "nss-altfiles", + "epoch": 0, + "version": "2.18.1", + "release": "16.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/n/nss-altfiles-2.18.1-16.fc32.x86_64.rpm", + "checksum": "sha256:42fcfac5037eab4099648e0f0ed3eb2aec6eb6a23a9e3808f9b69619ea7c44e3", + "check_gpg": true + }, + { + "name": "openldap", + "epoch": 0, + "version": "2.4.47", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openldap-2.4.47-4.fc32.x86_64.rpm", + "checksum": "sha256:ade8105796f5c1201a3efc8bcc654788cfc88c3815297b346845062a8c29cd59", + "check_gpg": true + }, + { + "name": "openssh", + "epoch": 0, + "version": "8.2p1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-8.2p1-2.fc32.x86_64.rpm", + "checksum": "sha256:0d51c1319ee78978e6ea5a49b815c2078b4ffd4d575e98c70e54ca01c3390eb8", + "check_gpg": true + }, + { + "name": "openssh-clients", + "epoch": 0, + "version": "8.2p1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-clients-8.2p1-2.fc32.x86_64.rpm", + "checksum": "sha256:8b148415fb6a583ef131d0ddff44f3209c30d0299fde7b20cd3ea385590927c1", + "check_gpg": true + }, + { + "name": "openssh-server", + "epoch": 0, + "version": "8.2p1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssh-server-8.2p1-2.fc32.x86_64.rpm", + "checksum": "sha256:d1e244b8b5ce7404846e97d96c762c8c18ff6447301f6fc63f50e615029aa7cd", + "check_gpg": true + }, + { + "name": "openssl", + "epoch": 1, + "version": "1.1.1d", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-1.1.1d-7.fc32.x86_64.rpm", + "checksum": "sha256:d7b8b5815b72fb157de26579362383e357e026ae6ac2599c451fb336fe995555", + "check_gpg": true + }, + { + "name": "openssl-libs", + "epoch": 1, + "version": "1.1.1d", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-libs-1.1.1d-7.fc32.x86_64.rpm", + "checksum": "sha256:ad6d7d9767e05978b14a39c08dba59ddc4396584576df194f77ed310a0816ae0", + "check_gpg": true + }, + { + "name": "openssl-pkcs11", + "epoch": 0, + "version": "0.4.10", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/openssl-pkcs11-0.4.10-5.fc32.x86_64.rpm", + "checksum": "sha256:3f2cb9092d6f55f84dd9eacd5359dfb354772e5f38308328027c7758f4a06fb6", + "check_gpg": true + }, + { + "name": "os-prober", + "epoch": 0, + "version": "1.77", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/os-prober-1.77-4.fc32.x86_64.rpm", + "checksum": "sha256:45fc2608b746fd841dd25919e9e4d44834154758aec8fb8b529c014b11c7917d", + "check_gpg": true + }, + { + "name": "ostree", + "epoch": 0, + "version": "2020.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-2020.3-2.fc32.x86_64.rpm", + "checksum": "sha256:ec64add7d60a70fbaf14a083929f22bd2637c33d20d2a30b7e842caa6040f817", + "check_gpg": true + }, + { + "name": "ostree-libs", + "epoch": 0, + "version": "2020.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/o/ostree-libs-2020.3-2.fc32.x86_64.rpm", + "checksum": "sha256:3343d9e7c90bd58e1e44ee07e7c59bb570ffc74da50f0607c5f5681a00b70e76", + "check_gpg": true + }, + { + "name": "p11-kit", + "epoch": 0, + "version": "0.23.20", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-0.23.20-1.fc32.x86_64.rpm", + "checksum": "sha256:dedd37a96262c35763ab2dcbc19838f5cc39a2a3a392a650a80bd6d5ae42ff8b", + "check_gpg": true + }, + { + "name": "p11-kit-trust", + "epoch": 0, + "version": "0.23.20", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/p11-kit-trust-0.23.20-1.fc32.x86_64.rpm", + "checksum": "sha256:3589b982ac0c2f5f6b47cde5cb7ec33c2c01d756dabf8c4ca64f6d9d0d78b35e", + "check_gpg": true + }, + { + "name": "pam", + "epoch": 0, + "version": "1.3.1", + "release": "24.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pam-1.3.1-24.fc32.x86_64.rpm", + "checksum": "sha256:4c80ade4ac0889316930a8d181ea43fa2d1b2f1a6a5703c22f2b3ba191346eec", + "check_gpg": true + }, + { + "name": "passwd", + "epoch": 0, + "version": "0.80", + "release": "8.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/passwd-0.80-8.fc32.x86_64.rpm", + "checksum": "sha256:156709efeaa1dfac72cc189d7e99de12d7c4b2069445da5d34fa807582e85719", + "check_gpg": true + }, + { + "name": "pciutils-libs", + "epoch": 0, + "version": "3.6.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pciutils-libs-3.6.4-1.fc32.x86_64.rpm", + "checksum": "sha256:e5efc87172d7081559137feaa221047385a5e248ffafd9794c2bfc73b61f8f37", + "check_gpg": true + }, + { + "name": "pcre", + "epoch": 0, + "version": "8.44", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre-8.44-1.fc32.x86_64.rpm", + "checksum": "sha256:933bdb4cc6e14b2ebb1ca76c14ca176c13d271a2d1e88632f237392777d11808", + "check_gpg": true + }, + { + "name": "pcre2", + "epoch": 0, + "version": "10.34", + "release": "9.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-10.34-9.fc32.x86_64.rpm", + "checksum": "sha256:6794fe48004c0403c29fc779b49f0fbea436123b96783a2df225eef2f0858795", + "check_gpg": true + }, + { + "name": "pcre2-syntax", + "epoch": 0, + "version": "10.34", + "release": "9.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pcre2-syntax-10.34-9.fc32.noarch.rpm", + "checksum": "sha256:5db7c0e949bd9172b9645237e72f6139d4ffcf14defad487262b8ad25b427daf", + "check_gpg": true + }, + { + "name": "pigz", + "epoch": 0, + "version": "2.4", + "release": "6.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pigz-2.4-6.fc32.x86_64.rpm", + "checksum": "sha256:15f08ce979e48fd25be5e16d63d1c95c57f9abff7704005137ea00b958442939", + "check_gpg": true + }, + { + "name": "pinentry", + "epoch": 0, + "version": "1.1.0", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pinentry-1.1.0-7.fc32.x86_64.rpm", + "checksum": "sha256:7df4fa1a29772696d92866e890af6fbe006088f3407ed3e67b0e7867ef58d899", + "check_gpg": true + }, + { + "name": "pkgconf", + "epoch": 0, + "version": "1.6.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-1.6.3-3.fc32.x86_64.rpm", + "checksum": "sha256:5c91890bf33527b9fb422cbed17600e761750a4e596fad3f0d0fa419070e82b0", + "check_gpg": true + }, + { + "name": "pkgconf-m4", + "epoch": 0, + "version": "1.6.3", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-m4-1.6.3-3.fc32.noarch.rpm", + "checksum": "sha256:0bace0cf41921db39247c99bfccb228818b83b68c7b8be7c8c4a92ea298a9a29", + "check_gpg": true + }, + { + "name": "pkgconf-pkg-config", + "epoch": 0, + "version": "1.6.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/pkgconf-pkg-config-1.6.3-3.fc32.x86_64.rpm", + "checksum": "sha256:4a7b63b32f176b8861f6ac7363bc8010caea0c323eaa83167227118f05603022", + "check_gpg": true + }, + { + "name": "podman", + "epoch": 2, + "version": "1.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/podman-1.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:ccdfb24da56aa394a64cf2f0c6ac6d15d0ebd6054686bd2ab27641a5502329be", + "check_gpg": true + }, + { + "name": "podman-plugins", + "epoch": 2, + "version": "1.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/podman-plugins-1.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:536a157da5332c0bdacb3e5891e3012b79b18fcdedb63b393110d6eb8b04e428", + "check_gpg": true + }, + { + "name": "policycoreutils", + "epoch": 0, + "version": "3.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/policycoreutils-3.0-2.fc32.x86_64.rpm", + "checksum": "sha256:8df97dcfb42c1667b5d2e4150012eaf96f58eeac4f7b879e0928c8c36e3a7604", + "check_gpg": true + }, + { + "name": "policycoreutils-python-utils", + "epoch": 0, + "version": "3.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/policycoreutils-python-utils-3.0-2.fc32.noarch.rpm", + "checksum": "sha256:3cd56dea57c00e2c4a9d5aac69a1e843ebef581ba76dde9d9878082fa1215485", + "check_gpg": true + }, + { + "name": "polkit", + "epoch": 0, + "version": "0.116", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-0.116-7.fc32.x86_64.rpm", + "checksum": "sha256:d49f0b1c8ecf9bc808ae93e9298a40fbcc124fe67c3bbdd37705b6b5d8cfdd87", + "check_gpg": true + }, + { + "name": "polkit-libs", + "epoch": 0, + "version": "0.116", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-libs-0.116-7.fc32.x86_64.rpm", + "checksum": "sha256:d439ffbe20c8c0e8244e31c0324d60cf959dc1cd6cecc575d7b34509a73e9386", + "check_gpg": true + }, + { + "name": "polkit-pkla-compat", + "epoch": 0, + "version": "0.1", + "release": "16.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/polkit-pkla-compat-0.1-16.fc32.x86_64.rpm", + "checksum": "sha256:7c7eff31251dedcc3285a8b08c1b18f7fd9ee2e07dff86ad090f45a81e19e85e", + "check_gpg": true + }, + { + "name": "popt", + "epoch": 0, + "version": "1.16", + "release": "19.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/popt-1.16-19.fc32.x86_64.rpm", + "checksum": "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4", + "check_gpg": true + }, + { + "name": "procps-ng", + "epoch": 0, + "version": "3.3.15", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/procps-ng-3.3.15-7.fc32.x86_64.rpm", + "checksum": "sha256:f3908831ae53f43b07a4e196850d0e59cc89b50c97d838538c3185fd0eb0d569", + "check_gpg": true + }, + { + "name": "protobuf-c", + "epoch": 0, + "version": "1.3.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/protobuf-c-1.3.2-2.fc32.x86_64.rpm", + "checksum": "sha256:52fe378ffab317ec4d26ae5fc0389dec874002a8d70a9413cefb68c7b16b0612", + "check_gpg": true + }, + { + "name": "psmisc", + "epoch": 0, + "version": "23.3", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/psmisc-23.3-3.fc32.x86_64.rpm", + "checksum": "sha256:be7ba234b6c48717ac0f69fb5868b3caa6ef09fbfc76c42a47b367578cd19444", + "check_gpg": true + }, + { + "name": "publicsuffix-list-dafsa", + "epoch": 0, + "version": "20190417", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/publicsuffix-list-dafsa-20190417-3.fc32.noarch.rpm", + "checksum": "sha256:af992ad02594b68f17d2da41104a26aee41d02639edf22332d7dbb1fe9af58a5", + "check_gpg": true + }, + { + "name": "python-pip-wheel", + "epoch": 0, + "version": "19.3.1", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-pip-wheel-19.3.1-2.fc32.noarch.rpm", + "checksum": "sha256:a7da5590635b9c19afafc7dd247604194a5ce7d8d863dc600b8cb86accb2e469", + "check_gpg": true + }, + { + "name": "python-setuptools-wheel", + "epoch": 0, + "version": "41.6.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-setuptools-wheel-41.6.0-2.fc32.noarch.rpm", + "checksum": "sha256:7dd93baaf69a8004ae2cd3b9e6660b862d0b6f399d53c05a27a48a2e276ef1ee", + "check_gpg": true + }, + { + "name": "python-unversioned-command", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python-unversioned-command-3.8.2-2.fc32.noarch.rpm", + "checksum": "sha256:0b290954bc2868b3dfc976b2b7a13ea8aeade76eeafc17674ff8e721049a5bf7", + "check_gpg": true + }, + { + "name": "python3", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-3.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:b79bb6af3e1650ba812c8affe42772ea566b164222a7d4d8e2f7efa867dc6849", + "check_gpg": true + }, + { + "name": "python3-audit", + "epoch": 0, + "version": "3.0", + "release": "0.19.20191104git1c2f876.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-audit-3.0-0.19.20191104git1c2f876.fc32.x86_64.rpm", + "checksum": "sha256:b1111e77a5fdbacaa04acc90d3844706158bc5892173862928705620b8910adb", + "check_gpg": true + }, + { + "name": "python3-dbus", + "epoch": 0, + "version": "1.2.16", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-dbus-1.2.16-1.fc32.x86_64.rpm", + "checksum": "sha256:6aa0c6420a03f20e18842da9de611d823580efb8f6da93a94dafb48d59c2a070", + "check_gpg": true + }, + { + "name": "python3-decorator", + "epoch": 0, + "version": "4.4.0", + "release": "6.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-decorator-4.4.0-6.fc32.noarch.rpm", + "checksum": "sha256:129adf9147d5d120546ca8e0fb5f165761106d386d366fe82591e372754d0b4a", + "check_gpg": true + }, + { + "name": "python3-firewall", + "epoch": 0, + "version": "0.8.2", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-firewall-0.8.2-2.fc32.noarch.rpm", + "checksum": "sha256:8ee8c4bbf024b998ffb77a6b4194a2306ac21c5a6fcf70c8c81a0fbf38f7c7fc", + "check_gpg": true + }, + { + "name": "python3-gobject-base", + "epoch": 0, + "version": "3.36.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-gobject-base-3.36.0-2.fc32.x86_64.rpm", + "checksum": "sha256:34411604a91c301dc8489285065c68f3a2f50910717097fedcaade6481c7469e", + "check_gpg": true + }, + { + "name": "python3-libs", + "epoch": 0, + "version": "3.8.2", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libs-3.8.2-2.fc32.x86_64.rpm", + "checksum": "sha256:ec58d03c60386bfb8aed2af3d2a49f8c6e5ccb4d3fd592cf75fef3342be137c3", + "check_gpg": true + }, + { + "name": "python3-libselinux", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libselinux-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:f77cad4c497f11c5b5bd7c9a29fc1f5f5574f8443cc4496e3bd98e680b363124", + "check_gpg": true + }, + { + "name": "python3-libsemanage", + "epoch": 0, + "version": "3.0", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-libsemanage-3.0-3.fc32.x86_64.rpm", + "checksum": "sha256:55bafcdf9c31b1456af3bf584bfe7ac745a03f4decd17197ea97b498d68b3b82", + "check_gpg": true + }, + { + "name": "python3-nftables", + "epoch": 1, + "version": "0.9.3", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-nftables-0.9.3-2.fc32.x86_64.rpm", + "checksum": "sha256:0fc0193d95d69c780b6feb1cb74759ca2d4804701b3de936dac8429cfbe0f2e9", + "check_gpg": true + }, + { + "name": "python3-pip", + "epoch": 0, + "version": "19.3.1", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-pip-19.3.1-2.fc32.noarch.rpm", + "checksum": "sha256:9ade87dbb32f27e7f38ec981002ddc5a2189cc6f5ad5f24bada3b71cfa9167fd", + "check_gpg": true + }, + { + "name": "python3-policycoreutils", + "epoch": 0, + "version": "3.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-policycoreutils-3.0-2.fc32.noarch.rpm", + "checksum": "sha256:15f2fc89b7bd39dcd3f6f8db30f56b76b65df311d7ad9852d498fbbc5c7d2aa2", + "check_gpg": true + }, + { + "name": "python3-setools", + "epoch": 0, + "version": "4.3.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-setools-4.3.0-1.fc32.x86_64.rpm", + "checksum": "sha256:6f5f53b66f7c3bf6958f6f163788583265ff0360188620c3b0f7ddedeac3d1f4", + "check_gpg": true + }, + { + "name": "python3-setuptools", + "epoch": 0, + "version": "41.6.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-setuptools-41.6.0-2.fc32.noarch.rpm", + "checksum": "sha256:724cca9919bb7b0183b030aca216d4d51de70bf35c2cc5e8325a21a52ca15ceb", + "check_gpg": true + }, + { + "name": "python3-six", + "epoch": 0, + "version": "1.14.0", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-six-1.14.0-2.fc32.noarch.rpm", + "checksum": "sha256:02654432f3853c9ae39c7601b5b0606c9d5eb5eef1d95e3e6f0074501842941f", + "check_gpg": true + }, + { + "name": "python3-slip", + "epoch": 0, + "version": "0.6.4", + "release": "19.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-slip-0.6.4-19.fc32.noarch.rpm", + "checksum": "sha256:d2abba1a0523bd9df5073900593ab13ec2ed2e391440be4d883314fa154370f8", + "check_gpg": true + }, + { + "name": "python3-slip-dbus", + "epoch": 0, + "version": "0.6.4", + "release": "19.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/python3-slip-dbus-0.6.4-19.fc32.noarch.rpm", + "checksum": "sha256:cb0c64cc81e0b384bbc9d27ffcb2a655b13c91a799aad8972264aed1767926a3", + "check_gpg": true + }, + { + "name": "qrencode-libs", + "epoch": 0, + "version": "4.0.2", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/q/qrencode-libs-4.0.2-5.fc32.x86_64.rpm", + "checksum": "sha256:f1150f9e17beaef09aca0f291e10db8c3ee5566fbf4c929b7672334410fa74e9", + "check_gpg": true + }, + { + "name": "readline", + "epoch": 0, + "version": "8.0", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/readline-8.0-4.fc32.x86_64.rpm", + "checksum": "sha256:f1c79039f4c6ba0fad88590c2cb55a96489449c334a671cc18c0bf424a4548b8", + "check_gpg": true + }, + { + "name": "rng-tools", + "epoch": 0, + "version": "6.9", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rng-tools-6.9-3.fc32.x86_64.rpm", + "checksum": "sha256:4cd01a3135b9e72906eaf4552e29929334dcccee2ed092a38bf60698522ecd5f", + "check_gpg": true + }, + { + "name": "rootfiles", + "epoch": 0, + "version": "8.1", + "release": "27.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rootfiles-8.1-27.fc32.noarch.rpm", + "checksum": "sha256:c9f3d536c1fa73de90836147d15db06dc2025e84a44034bda6c66b9c4b60be58", + "check_gpg": true + }, + { + "name": "rpm", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:136a9cbae9c225be60718fdc8cc8988a55235d6502e451df77d1c5c765143850", + "check_gpg": true + }, + { + "name": "rpm-libs", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-libs-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:54b740cf7a75a7215168970378d9a1d6b9a5e4eb81159a874ce8ea5990436641", + "check_gpg": true + }, + { + "name": "rpm-ostree", + "epoch": 0, + "version": "2020.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-2020.1-1.fc32.x86_64.rpm", + "checksum": "sha256:ee664c392a97cdd272f57980c6856b2c57567005fa0ad9cb16c388b645d014f1", + "check_gpg": true + }, + { + "name": "rpm-ostree-libs", + "epoch": 0, + "version": "2020.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-ostree-libs-2020.1-1.fc32.x86_64.rpm", + "checksum": "sha256:9d220d8ee28cd0adf28e8fef547af92c3ec66e238747165939cf8e1a413ddf83", + "check_gpg": true + }, + { + "name": "rpm-plugin-selinux", + "epoch": 0, + "version": "4.15.1", + "release": "2.fc32.1", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rpm-plugin-selinux-4.15.1-2.fc32.1.x86_64.rpm", + "checksum": "sha256:27dd9c78e41c04b5151a2b9ac150d3ebb89f2ca7a23e4896dfc718f19a000be3", + "check_gpg": true + }, + { + "name": "rsync", + "epoch": 0, + "version": "3.1.3", + "release": "11.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/rsync-3.1.3-11.fc32.x86_64.rpm", + "checksum": "sha256:024dd8a75eb5472692d0291292d25939b97a0295e5ab0958dcd22600d392eaae", + "check_gpg": true + }, + { + "name": "runc", + "epoch": 2, + "version": "1.0.0", + "release": "144.dev.gite6555cc.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/r/runc-1.0.0-144.dev.gite6555cc.fc32.x86_64.rpm", + "checksum": "sha256:c50ff544430830086ce484b20a2b6eaa934c82b6277a6f4fb02fc8cbc9e25db7", + "check_gpg": true + }, + { + "name": "screen", + "epoch": 0, + "version": "4.8.0", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/screen-4.8.0-2.fc32.x86_64.rpm", + "checksum": "sha256:96e0c019cb91d8deefb7664cfe417807d23562d2a1bfd2cbfd1051e243136b57", + "check_gpg": true + }, + { + "name": "sed", + "epoch": 0, + "version": "4.5", + "release": "5.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sed-4.5-5.fc32.x86_64.rpm", + "checksum": "sha256:ffe5076b9018efdb1612c487f637af39ab6c3c79ec37311978935cfa357ecd61", + "check_gpg": true + }, + { + "name": "selinux-policy", + "epoch": 0, + "version": "3.14.5", + "release": "32.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-3.14.5-32.fc32.noarch.rpm", + "checksum": "sha256:932a37ddd2a990a22a1ee7811d204552e8860e39a3e0c050ed618a535ae8c78c", + "check_gpg": true + }, + { + "name": "selinux-policy-targeted", + "epoch": 0, + "version": "3.14.5", + "release": "32.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/selinux-policy-targeted-3.14.5-32.fc32.noarch.rpm", + "checksum": "sha256:684aae86de55bd42215c136777613211f596788d3b6405d8fa645fb967904354", + "check_gpg": true + }, + { + "name": "setools-console", + "epoch": 0, + "version": "4.3.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/setools-console-4.3.0-1.fc32.x86_64.rpm", + "checksum": "sha256:84c338b327a3fb2f6edb79caa2242804fff8c83ffa3db0d9227f55eef4107b2a", + "check_gpg": true + }, + { + "name": "setup", + "epoch": 0, + "version": "2.13.6", + "release": "2.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/setup-2.13.6-2.fc32.noarch.rpm", + "checksum": "sha256:a336d2e77255df4783f52762e44efcc8d77b044a3e39c7f577d5535212848280", + "check_gpg": true + }, + { + "name": "shadow-utils", + "epoch": 2, + "version": "4.8.1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shadow-utils-4.8.1-2.fc32.x86_64.rpm", + "checksum": "sha256:4dd6100e477d88a4987b6eebfddecff168f38c7ff47cbb12f2fecba1e87c10d9", + "check_gpg": true + }, + { + "name": "shared-mime-info", + "epoch": 0, + "version": "1.15", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shared-mime-info-1.15-3.fc32.x86_64.rpm", + "checksum": "sha256:a280c633b73517da167b91298fc97aeee2eb5fcc253c038ae0ce4b8478d3a103", + "check_gpg": true + }, + { + "name": "shim-x64", + "epoch": 0, + "version": "15", + "release": "8", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/shim-x64-15-8.x86_64.rpm", + "checksum": "sha256:ee1681ee1ae6a3f86a876562939fbfe415ba78b0a803059e1b6d6cd63b0fa1a3", + "check_gpg": true + }, + { + "name": "skopeo", + "epoch": 1, + "version": "0.1.41", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/skopeo-0.1.41-1.fc32.x86_64.rpm", + "checksum": "sha256:f14d3b113e2c3ba3f8ab7a8146439924f38487c20dd533062616f17f500ff46b", + "check_gpg": true + }, + { + "name": "slirp4netns", + "epoch": 0, + "version": "0.4.3", + "release": "6.0.dev.gita8414d1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/slirp4netns-0.4.3-6.0.dev.gita8414d1.fc32.x86_64.rpm", + "checksum": "sha256:14cf772225c04c005add71372fce866e90f7144c27bbb8e846ce7887e0d286e0", + "check_gpg": true + }, + { + "name": "sqlite-libs", + "epoch": 0, + "version": "3.31.1", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sqlite-libs-3.31.1-1.fc32.x86_64.rpm", + "checksum": "sha256:7f555c600b35ba798d8c0a63e30a1a12e917231730e1a44f48161ba0fe4b5973", + "check_gpg": true + }, + { + "name": "sssd-client", + "epoch": 0, + "version": "2.2.3", + "release": "13.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sssd-client-2.2.3-13.fc32.x86_64.rpm", + "checksum": "sha256:699c1a3ff311bbaa2380c085fb4f516aa08be474bed02bcd1569d0bbf5b22d07", + "check_gpg": true + }, + { + "name": "sudo", + "epoch": 0, + "version": "1.9.0", + "release": "0.1.b4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/sudo-1.9.0-0.1.b4.fc32.x86_64.rpm", + "checksum": "sha256:e5bf9266edf112540ec662bd492ce4bda3ed8d5e33d763b9f2318c42963a1d1b", + "check_gpg": true + }, + { + "name": "systemd", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:1de2be4fe5280ec3097305d9e671f5f2c768267f90d255edf2075eecb0c0afe9", + "check_gpg": true + }, + { + "name": "systemd-libs", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-libs-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:78db9007c08fa51f177210e47343b8e733ce0751826abb357ca96429836588db", + "check_gpg": true + }, + { + "name": "systemd-pam", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-pam-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:750da30da0289d5e2ad9ca297dda44e5ca18dbed0c3e0d4200379bc1818c22f3", + "check_gpg": true + }, + { + "name": "systemd-rpm-macros", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-rpm-macros-245.4-1.fc32.noarch.rpm", + "checksum": "sha256:97197411bca68cfba1ef6bab1fdd4b41c95ec71c36f1e67f525b963cf60598fd", + "check_gpg": true + }, + { + "name": "systemd-udev", + "epoch": 0, + "version": "245.4", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/s/systemd-udev-245.4-1.fc32.x86_64.rpm", + "checksum": "sha256:334d63914e7ff6fe8cfce0c8f80006c6cf2ab0615cd044a6ee588809395499e5", + "check_gpg": true + }, + { + "name": "tar", + "epoch": 2, + "version": "1.32", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tar-1.32-4.fc32.x86_64.rpm", + "checksum": "sha256:2cee64e12b295b74d2f4b008c7628ef3a01ef4149905fc4a7ae14b304da5f53b", + "check_gpg": true + }, + { + "name": "tmux", + "epoch": 0, + "version": "3.0a", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tmux-3.0a-2.fc32.x86_64.rpm", + "checksum": "sha256:ea5f929563fb9ca0cf08da250c62c93d4755f4a41c1aca23eeeaf3e58e90d766", + "check_gpg": true + }, + { + "name": "tpm2-tools", + "epoch": 0, + "version": "4.1", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tpm2-tools-4.1-2.fc32.x86_64.rpm", + "checksum": "sha256:8c560f3927e36e41657067e4bdc741fd8f3b55b497f0fc3c2331fb361ba8de8b", + "check_gpg": true + }, + { + "name": "tpm2-tss", + "epoch": 0, + "version": "2.4.0", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tpm2-tss-2.4.0-1.fc32.x86_64.rpm", + "checksum": "sha256:90bc2171f438ffa7488a9c69cd86bb1de175807be468f285c8ca16cf8dd4a83c", + "check_gpg": true + }, + { + "name": "traceroute", + "epoch": 3, + "version": "2.1.0", + "release": "10.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/traceroute-2.1.0-10.fc32.x86_64.rpm", + "checksum": "sha256:c3e2a3c23288899456fb996f3074c10637bcd4886bc446698cb1efa2734c1e4d", + "check_gpg": true + }, + { + "name": "trousers", + "epoch": 0, + "version": "0.3.13", + "release": "13.fc31", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-0.3.13-13.fc31.x86_64.rpm", + "checksum": "sha256:5f156c2a950699d5cb9a21349cce049b3c8bfdcc4fcc780665fe2d3103f576c1", + "check_gpg": true + }, + { + "name": "trousers-lib", + "epoch": 0, + "version": "0.3.13", + "release": "13.fc31", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/trousers-lib-0.3.13-13.fc31.x86_64.rpm", + "checksum": "sha256:cc1be420582afb6360f380ff301c5e3d873f69fe1f7e00e4450bf2daa40ef9ff", + "check_gpg": true + }, + { + "name": "tss2", + "epoch": 0, + "version": "1331", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tss2-1331-4.fc32.x86_64.rpm", + "checksum": "sha256:6f669ae6f70cfa80917adf4ae9d5e86fbd9d31ee308a9a3408a19be3afc46f7b", + "check_gpg": true + }, + { + "name": "tzdata", + "epoch": 0, + "version": "2019c", + "release": "3.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/t/tzdata-2019c-3.fc32.noarch.rpm", + "checksum": "sha256:2db6d80760ab0e99f4e9c9816615e4f06b967bbb23a8c8c941b3f2d4b5f176c2", + "check_gpg": true + }, + { + "name": "util-linux", + "epoch": 0, + "version": "2.35.1", + "release": "7.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/u/util-linux-2.35.1-7.fc32.x86_64.rpm", + "checksum": "sha256:9976e6228a10fa2761f1265a2a7666578d79ca57819837e5d1fbecc53324f1b9", + "check_gpg": true + }, + { + "name": "vim-minimal", + "epoch": 2, + "version": "8.2.525", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/v/vim-minimal-8.2.525-1.fc32.x86_64.rpm", + "checksum": "sha256:4fca21cfdcbed052e3e9e1eff74c22fb8ffb1fbbeb63e87e2aa540e43a8c0d09", + "check_gpg": true + }, + { + "name": "which", + "epoch": 0, + "version": "2.21", + "release": "19.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/which-2.21-19.fc32.x86_64.rpm", + "checksum": "sha256:82e0d8f1e0dccc6d18acd04b7806350343140d9c91da7a216f93167dcf650a61", + "check_gpg": true + }, + { + "name": "whois-nls", + "epoch": 0, + "version": "5.5.6", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/whois-nls-5.5.6-1.fc32.noarch.rpm", + "checksum": "sha256:d027a3ff0712e3e98d7d2358f8c526fb8d143b2386c353aadcc27199cffe125b", + "check_gpg": true + }, + { + "name": "wpa_supplicant", + "epoch": 1, + "version": "2.9", + "release": "3.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/wpa_supplicant-2.9-3.fc32.x86_64.rpm", + "checksum": "sha256:9dcc75ac945924ce496c9280e7ac31b88886d94a6494d0710725a81dd9d42c9a", + "check_gpg": true + }, + { + "name": "wpan-tools", + "epoch": 0, + "version": "0.9", + "release": "4.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/w/wpan-tools-0.9-4.fc32.x86_64.rpm", + "checksum": "sha256:d61ea8b6299f00397f740b73de146ef4daa6d6bb5863d525459765fa0f23a991", + "check_gpg": true + }, + { + "name": "xkeyboard-config", + "epoch": 0, + "version": "2.29", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xkeyboard-config-2.29-1.fc32.noarch.rpm", + "checksum": "sha256:ec12fef82d73314e3e4cb6e962f8de27e78989fa104dde0599a4480a53817647", + "check_gpg": true + }, + { + "name": "xz", + "epoch": 0, + "version": "5.2.5", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-5.2.5-1.fc32.x86_64.rpm", + "checksum": "sha256:1bdde5dc99a5588a8983f70b7b3e45e7006215d529c72adfec118c3bcbf7b01c", + "check_gpg": true + }, + { + "name": "xz-libs", + "epoch": 0, + "version": "5.2.5", + "release": "1.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/x/xz-libs-5.2.5-1.fc32.x86_64.rpm", + "checksum": "sha256:84702d6395a9577c1a268184f123cfd4b15bc2287f01033625ba388a34ec2338", + "check_gpg": true + }, + { + "name": "yajl", + "epoch": 0, + "version": "2.1.0", + "release": "14.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/y/yajl-2.1.0-14.fc32.x86_64.rpm", + "checksum": "sha256:9194788f87e4a1aa8835f1305d290cc2cd67cee6a5b1ab82643d3a068c0145b6", + "check_gpg": true + }, + { + "name": "zchunk-libs", + "epoch": 0, + "version": "1.1.5", + "release": "2.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zchunk-libs-1.1.5-2.fc32.x86_64.rpm", + "checksum": "sha256:140708561a2ec1c7709fd38d8b1b115d02da710b80eeecd65c2b8387d9d78ef9", + "check_gpg": true + }, + { + "name": "zlib", + "epoch": 0, + "version": "1.2.11", + "release": "21.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zlib-1.2.11-21.fc32.x86_64.rpm", + "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", + "check_gpg": true + }, + { + "name": "zram", + "epoch": 0, + "version": "0.4", + "release": "1.fc32", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/z/zram-0.4-1.fc32.noarch.rpm", + "checksum": "sha256:3f7861ea2d8b4380b567f629a86fa31951a55f46f6eee017cb84ed87baf2c19e", + "check_gpg": true + } + ] + }, + "image-info": { + "default-target": "graphical.target", + "firewall-enabled": [ + "ssh", + "mdns", + "dhcpv6-client" + ], + "groups": [ + "root:x:0:", + "wheel:x:10:" + ], + "groups-system": [ + "adm:x:4:", + "audio:x:63:", + "bin:x:1:", + "cdrom:x:11:", + "chrony:x:992:", + "clevis:x:998:", + "daemon:x:2:", + "dbus:x:81:", + "dialout:x:18:", + "disk:x:6:", + "dnsmasq:x:991:", + "floppy:x:19:", + "ftp:x:50:", + "games:x:20:", + "input:x:997:", + "kmem:x:9:", + "kvm:x:36:", + "lock:x:54:", + "lp:x:7:", + "mail:x:12:", + "man:x:15:", + "mem:x:8:", + "nobody:x:65534:", + "polkitd:x:993:", + "render:x:996:", + "screen:x:84:", + "ssh_keys:x:999:", + "sshd:x:74:", + "sys:x:3:", + "systemd-coredump:x:995:", + "systemd-journal:x:190:", + "systemd-network:x:192:", + "systemd-resolve:x:193:", + "systemd-timesync:x:994:", + "tape:x:33:", + "tss:x:59:", + "tty:x:5:", + "users:x:100:", + "utempter:x:35:", + "utmp:x:22:", + "video:x:39:", + "wheel:x:10:" + ], + "os-release": { + "ANSI_COLOR": "0;34", + "BUG_REPORT_URL": "https://bugzilla.redhat.com/", + "CPE_NAME": "cpe:/o:fedoraproject:fedora:32", + "DOCUMENTATION_URL": "https://docs.fedoraproject.org/en-US/fedora/f32/system-administrators-guide/", + "HOME_URL": "https://fedoraproject.org/", + "ID": "fedora", + "LOGO": "fedora-logo-icon", + "NAME": "Fedora", + "PLATFORM_ID": "platform:f32", + "PRETTY_NAME": "Fedora 32 (IoT Edition)", + "PRIVACY_POLICY_URL": "https://fedoraproject.org/wiki/Legal:PrivacyPolicy", + "REDHAT_BUGZILLA_PRODUCT": "Fedora", + "REDHAT_BUGZILLA_PRODUCT_VERSION": "32", + "REDHAT_SUPPORT_PRODUCT": "Fedora", + "REDHAT_SUPPORT_PRODUCT_VERSION": "32", + "SUPPORT_URL": "https://fedoraproject.org/wiki/Communicating_and_getting_help", + "VARIANT": "IoT Edition", + "VARIANT_ID": "iot", + "VERSION": "32 (IoT Edition)", + "VERSION_CODENAME": "", + "VERSION_ID": "32" + }, + "ostree": { + "refs": [ + "fedora/32/x86_64/iot" + ], + "repo": { + "core.mode": "archive-z2" + } + }, + "packages": [ + "ModemManager-1.12.8-1.fc32.x86_64", + "ModemManager-glib-1.12.8-1.fc32.x86_64", + "NetworkManager-1.22.10-1.fc32.x86_64", + "NetworkManager-libnm-1.22.10-1.fc32.x86_64", + "NetworkManager-wifi-1.22.10-1.fc32.x86_64", + "NetworkManager-wwan-1.22.10-1.fc32.x86_64", + "abattis-cantarell-fonts-0.201-2.fc32.noarch", + "acl-2.2.53-5.fc32.x86_64", + "adobe-source-code-pro-fonts-2.030.1.050-8.fc32.noarch", + "alternatives-1.11-6.fc32.x86_64", + "attr-2.4.48-8.fc32.x86_64", + "audit-3.0-0.19.20191104git1c2f876.fc32.x86_64", + "audit-libs-3.0-0.19.20191104git1c2f876.fc32.x86_64", + "basesystem-11-9.fc32.noarch", + "bash-5.0.11-2.fc32.x86_64", + "bash-completion-2.8-8.fc32.noarch", + "bluez-5.54-1.fc32.x86_64", + "bluez-libs-5.54-1.fc32.x86_64", + "bluez-mesh-5.54-1.fc32.x86_64", + "btrfs-progs-5.6-1.fc32.x86_64", + "bubblewrap-0.4.1-1.fc32.x86_64", + "bzip2-libs-1.0.8-2.fc32.x86_64", + "ca-certificates-2020.2.40-3.fc32.noarch", + "checkpolicy-3.0-3.fc32.x86_64", + "chrony-3.5-8.fc32.x86_64", + "clevis-12-2.fc32.x86_64", + "clevis-dracut-12-2.fc32.x86_64", + "clevis-luks-12-2.fc32.x86_64", + "clevis-systemd-12-2.fc32.x86_64", + "compat-readline5-5.2-36.fc32.x86_64", + "conmon-2.0.14-1.fc32.x86_64", + "container-selinux-2.130.0-1.fc32.noarch", + "containernetworking-plugins-0.8.5-1.1.gitf5c3d1b.fc32.x86_64", + "containers-common-0.1.41-1.fc32.x86_64", + "coreutils-8.32-3.fc32.1.x86_64", + "coreutils-common-8.32-3.fc32.1.x86_64", + "cpio-2.13-4.fc32.x86_64", + "cracklib-2.9.6-22.fc32.x86_64", + "cracklib-dicts-2.9.6-22.fc32.x86_64", + "criu-3.13-5.fc32.x86_64", + "crun-0.13-1.fc32.x86_64", + "crypto-policies-20191128-5.gitcd267a5.fc32.noarch", + "crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch", + "cryptsetup-2.3.0-1.fc32.x86_64", + "cryptsetup-libs-2.3.0-1.fc32.x86_64", + "curl-7.69.1-1.fc32.x86_64", + "cyrus-sasl-lib-2.1.27-4.fc32.x86_64", + "dbus-1.12.16-4.fc32.x86_64", + "dbus-broker-22-1.fc32.x86_64", + "dbus-common-1.12.16-4.fc32.noarch", + "dbus-libs-1.12.16-4.fc32.x86_64", + "dbxtool-8-11.fc32.x86_64", + "device-mapper-1.02.171-1.fc32.x86_64", + "device-mapper-event-1.02.171-1.fc32.x86_64", + "device-mapper-event-libs-1.02.171-1.fc32.x86_64", + "device-mapper-libs-1.02.171-1.fc32.x86_64", + "device-mapper-persistent-data-0.8.5-3.fc32.x86_64", + "diffutils-3.7-4.fc32.x86_64", + "dmidecode-3.2-5.fc32.x86_64", + "dnsmasq-2.80-14.fc32.x86_64", + "dosfstools-4.1-10.fc32.x86_64", + "dracut-050-26.git20200316.fc32.x86_64", + "dracut-config-generic-050-26.git20200316.fc32.x86_64", + "dracut-network-050-26.git20200316.fc32.x86_64", + "e2fsprogs-1.45.5-3.fc32.x86_64", + "e2fsprogs-libs-1.45.5-3.fc32.x86_64", + "efi-filesystem-4-4.fc32.noarch", + "efibootmgr-16-7.fc32.x86_64", + "efivar-libs-37-7.fc32.x86_64", + "elfutils-debuginfod-client-0.179-1.fc32.x86_64", + "elfutils-default-yama-scope-0.179-1.fc32.noarch", + "elfutils-libelf-0.179-1.fc32.x86_64", + "elfutils-libs-0.179-1.fc32.x86_64", + "expat-2.2.8-2.fc32.x86_64", + "fedora-gpg-keys-32-1.noarch", + "fedora-release-common-32-1.noarch", + "fedora-release-iot-32-1.noarch", + "fedora-repos-32-1.noarch", + "file-5.38-2.fc32.x86_64", + "file-libs-5.38-2.fc32.x86_64", + "filesystem-3.14-2.fc32.x86_64", + "findutils-4.7.0-3.fc32.x86_64", + "fipscheck-1.5.0-8.fc32.x86_64", + "fipscheck-lib-1.5.0-8.fc32.x86_64", + "firewalld-0.8.2-2.fc32.noarch", + "firewalld-filesystem-0.8.2-2.fc32.noarch", + "flashrom-1.2-2.fc32.x86_64", + "fonts-filesystem-2.0.3-1.fc32.noarch", + "fuse-2.9.9-9.fc32.x86_64", + "fuse-common-3.9.1-1.fc32.x86_64", + "fuse-libs-2.9.9-9.fc32.x86_64", + "fuse-overlayfs-0.7.8-1.fc32.x86_64", + "fuse3-3.9.1-1.fc32.x86_64", + "fuse3-libs-3.9.1-1.fc32.x86_64", + "fwupd-1.3.9-2.fc32.x86_64", + "gawk-5.0.1-7.fc32.x86_64", + "gdbm-libs-1.18.1-3.fc32.x86_64", + "gdisk-1.0.5-1.fc32.x86_64", + "gettext-0.20.1-4.fc32.x86_64", + "gettext-libs-0.20.1-4.fc32.x86_64", + "glib-networking-2.64.1-1.fc32.x86_64", + "glib2-2.64.1-1.fc32.x86_64", + "glibc-2.31-2.fc32.x86_64", + "glibc-common-2.31-2.fc32.x86_64", + "glibc-minimal-langpack-2.31-2.fc32.x86_64", + "gmp-6.1.2-13.fc32.x86_64", + "gnupg2-2.2.19-1.fc32.x86_64", + "gnupg2-smime-2.2.19-1.fc32.x86_64", + "gnutls-3.6.13-1.fc32.x86_64", + "gobject-introspection-1.64.1-1.fc32.x86_64", + "gpg-pubkey-12c944d0-5d5156ab", + "gpgme-1.13.1-6.fc32.x86_64", + "greenboot-0.9-1.fc32.noarch", + "greenboot-grub2-0.9-1.fc32.noarch", + "greenboot-reboot-0.9-1.fc32.noarch", + "greenboot-rpm-ostree-grub2-0.9-1.fc32.noarch", + "greenboot-status-0.9-1.fc32.noarch", + "grep-3.3-4.fc32.x86_64", + "grub2-common-2.04-12.fc32.noarch", + "grub2-efi-x64-2.04-12.fc32.x86_64", + "grub2-pc-2.04-12.fc32.x86_64", + "grub2-pc-modules-2.04-12.fc32.noarch", + "grub2-tools-2.04-12.fc32.x86_64", + "grub2-tools-minimal-2.04-12.fc32.x86_64", + "gsettings-desktop-schemas-3.36.0-1.fc32.x86_64", + "gzip-1.10-2.fc32.x86_64", + "hostname-3.23-2.fc32.x86_64", + "ignition-2.2.1-3.git2d3ff58.fc32.x86_64", + "ima-evm-utils-1.2.1-3.fc32.x86_64", + "initscripts-10.02-3.fc32.x86_64", + "iproute-5.5.0-1.fc32.x86_64", + "iproute-tc-5.5.0-1.fc32.x86_64", + "ipset-7.6-1.fc32.x86_64", + "ipset-libs-7.6-1.fc32.x86_64", + "iptables-1.8.4-7.fc32.x86_64", + "iptables-libs-1.8.4-7.fc32.x86_64", + "iptables-nft-1.8.4-7.fc32.x86_64", + "iputils-20190515-5.fc32.x86_64", + "iwd-1.6-1.fc32.x86_64", + "iwl100-firmware-39.31.5.1-106.fc32.noarch", + "iwl1000-firmware-39.31.5.1-106.fc32.noarch", + "iwl105-firmware-18.168.6.1-106.fc32.noarch", + "iwl135-firmware-18.168.6.1-106.fc32.noarch", + "iwl2000-firmware-18.168.6.1-106.fc32.noarch", + "iwl2030-firmware-18.168.6.1-106.fc32.noarch", + "iwl3160-firmware-25.30.13.0-106.fc32.noarch", + "iwl5000-firmware-8.83.5.1_1-106.fc32.noarch", + "iwl5150-firmware-8.24.2.2-106.fc32.noarch", + "iwl6000-firmware-9.221.4.1-106.fc32.noarch", + "iwl6050-firmware-41.28.5.1-106.fc32.noarch", + "iwl7260-firmware-25.30.13.0-106.fc32.noarch", + "jansson-2.12-5.fc32.x86_64", + "jitterentropy-2.2.0-2.fc32.x86_64", + "jose-10-6.fc32.x86_64", + "json-c-0.13.1-9.fc32.x86_64", + "json-glib-1.4.4-4.fc32.x86_64", + "kbd-2.2.0-1.fc32.x86_64", + "kbd-legacy-2.2.0-1.fc32.noarch", + "kbd-misc-2.2.0-1.fc32.noarch", + "kernel-debug-5.6.6-300.fc32.x86_64", + "kernel-debug-core-5.6.6-300.fc32.x86_64", + "kernel-debug-modules-5.6.6-300.fc32.x86_64", + "kernel-tools-5.6.6-300.fc32.x86_64", + "kernel-tools-libs-5.6.6-300.fc32.x86_64", + "keyutils-1.6-4.fc32.x86_64", + "keyutils-libs-1.6-4.fc32.x86_64", + "kmod-27-1.fc32.x86_64", + "kmod-libs-27-1.fc32.x86_64", + "kpartx-0.8.2-3.fc32.x86_64", + "krb5-libs-1.18-1.fc32.x86_64", + "less-551-3.fc32.x86_64", + "libacl-2.2.53-5.fc32.x86_64", + "libaio-0.3.111-7.fc32.x86_64", + "libarchive-3.4.2-1.fc32.x86_64", + "libargon2-20171227-4.fc32.x86_64", + "libassuan-2.5.3-3.fc32.x86_64", + "libattr-2.4.48-8.fc32.x86_64", + "libblkid-2.35.1-7.fc32.x86_64", + "libbrotli-1.0.7-10.fc32.x86_64", + "libbsd-0.10.0-2.fc32.x86_64", + "libcap-2.26-7.fc32.x86_64", + "libcap-ng-0.7.10-2.fc32.x86_64", + "libcbor-0.5.0-7.fc32.x86_64", + "libcom_err-1.45.5-3.fc32.x86_64", + "libcroco-0.6.13-3.fc32.x86_64", + "libcurl-7.69.1-1.fc32.x86_64", + "libdb-5.3.28-40.fc32.x86_64", + "libdb-utils-5.3.28-40.fc32.x86_64", + "libedit-3.1-32.20191231cvs.fc32.x86_64", + "libell-0.30-1.fc32.x86_64", + "libevent-2.1.8-8.fc32.x86_64", + "libfdisk-2.35.1-7.fc32.x86_64", + "libffi-3.1-24.fc32.x86_64", + "libfido2-1.3.1-1.fc32.x86_64", + "libftdi-1.4-2.fc32.x86_64", + "libgcab1-1.4-2.fc32.x86_64", + "libgcc-10.0.1-0.11.fc32.x86_64", + "libgcrypt-1.8.5-3.fc32.x86_64", + "libgomp-10.0.1-0.11.fc32.x86_64", + "libgpg-error-1.36-3.fc32.x86_64", + "libgpiod-1.5.1-1.fc32.x86_64", + "libgpiod-utils-1.5.1-1.fc32.x86_64", + "libgudev-232-7.fc32.x86_64", + "libgusb-0.3.4-1.fc32.x86_64", + "libidn2-2.3.0-2.fc32.x86_64", + "libjose-10-6.fc32.x86_64", + "libkcapi-1.1.5-2.fc32.x86_64", + "libkcapi-hmaccalc-1.1.5-2.fc32.x86_64", + "libksba-1.3.5-11.fc32.x86_64", + "libluksmeta-9-7.fc32.x86_64", + "libmbim-1.22.0-1.fc32.x86_64", + "libmbim-utils-1.22.0-1.fc32.x86_64", + "libmetalink-0.1.3-10.fc32.x86_64", + "libmnl-1.0.4-11.fc32.x86_64", + "libmodman-2.0.1-21.fc32.x86_64", + "libmodulemd1-1.8.16-2.fc32.x86_64", + "libmount-2.35.1-7.fc32.x86_64", + "libndp-1.7-5.fc32.x86_64", + "libnet-1.1.6-19.fc32.x86_64", + "libnetfilter_conntrack-1.0.7-4.fc32.x86_64", + "libnfnetlink-1.0.1-17.fc32.x86_64", + "libnftnl-1.1.5-2.fc32.x86_64", + "libnghttp2-1.40.0-2.fc32.x86_64", + "libnl3-3.5.0-2.fc32.x86_64", + "libnsl2-1.2.0-6.20180605git4a062cf.fc32.x86_64", + "libpcap-1.9.1-3.fc32.x86_64", + "libpkgconf-1.6.3-3.fc32.x86_64", + "libproxy-0.4.15-17.fc32.x86_64", + "libpsl-0.21.0-4.fc32.x86_64", + "libpwquality-1.4.2-2.fc32.x86_64", + "libqmi-1.24.8-1.fc32.x86_64", + "libqmi-utils-1.24.8-1.fc32.x86_64", + "librepo-1.11.1-4.fc32.x86_64", + "libseccomp-2.4.2-3.fc32.x86_64", + "libsecret-0.20.2-2.fc32.x86_64", + "libselinux-3.0-3.fc32.x86_64", + "libselinux-utils-3.0-3.fc32.x86_64", + "libsemanage-3.0-3.fc32.x86_64", + "libsepol-3.0-3.fc32.x86_64", + "libsigsegv-2.11-10.fc32.x86_64", + "libsmartcols-2.35.1-7.fc32.x86_64", + "libsmbios-2.4.2-7.fc32.x86_64", + "libsolv-0.7.11-2.fc32.x86_64", + "libsoup-2.70.0-1.fc32.x86_64", + "libss-1.45.5-3.fc32.x86_64", + "libssh-0.9.3-2.fc32.x86_64", + "libssh-config-0.9.3-2.fc32.noarch", + "libsss_idmap-2.2.3-13.fc32.x86_64", + "libsss_nss_idmap-2.2.3-13.fc32.x86_64", + "libsss_sudo-2.2.3-13.fc32.x86_64", + "libstdc++-10.0.1-0.11.fc32.x86_64", + "libsysfs-2.1.0-28.fc32.x86_64", + "libtasn1-4.16.0-1.fc32.x86_64", + "libtextstyle-0.20.1-4.fc32.x86_64", + "libtirpc-1.2.5-1.rc2.fc32.x86_64", + "libunistring-0.9.10-7.fc32.x86_64", + "libusbx-1.0.23-1.fc32.x86_64", + "libuser-0.62-24.fc32.x86_64", + "libutempter-1.1.6-18.fc32.x86_64", + "libuuid-2.35.1-7.fc32.x86_64", + "libvarlink-util-18-3.fc32.x86_64", + "libverto-0.3.0-9.fc32.x86_64", + "libxcrypt-4.4.16-1.fc32.x86_64", + "libxcrypt-compat-4.4.16-1.fc32.x86_64", + "libxkbcommon-0.10.0-2.fc32.x86_64", + "libxml2-2.9.10-3.fc32.x86_64", + "libxmlb-0.1.14-2.fc32.x86_64", + "libyaml-0.2.2-3.fc32.x86_64", + "libzstd-1.4.4-2.fc32.x86_64", + "linux-atm-libs-2.5.1-26.fc32.x86_64", + "linux-firmware-20200316-106.fc32.noarch", + "linux-firmware-whence-20200316-106.fc32.noarch", + "lua-libs-5.3.5-7.fc32.x86_64", + "luksmeta-9-7.fc32.x86_64", + "lvm2-2.03.09-1.fc32.x86_64", + "lvm2-libs-2.03.09-1.fc32.x86_64", + "lz4-libs-1.9.1-2.fc32.x86_64", + "lzo-2.10-2.fc32.x86_64", + "microcode_ctl-2.1-35.fc32.x86_64", + "mkpasswd-5.5.6-1.fc32.x86_64", + "mokutil-0.3.0-15.fc32.x86_64", + "mozjs60-60.9.0-5.fc32.x86_64", + "mpfr-4.0.2-3.fc32.x86_64", + "ncurses-6.1-15.20191109.fc32.x86_64", + "ncurses-base-6.1-15.20191109.fc32.noarch", + "ncurses-libs-6.1-15.20191109.fc32.x86_64", + "nettle-3.5.1-5.fc32.x86_64", + "nftables-0.9.3-2.fc32.x86_64", + "nmap-ncat-7.80-3.fc32.x86_64", + "npth-1.6-4.fc32.x86_64", + "nss-altfiles-2.18.1-16.fc32.x86_64", + "openldap-2.4.47-4.fc32.x86_64", + "openssh-8.2p1-2.fc32.x86_64", + "openssh-clients-8.2p1-2.fc32.x86_64", + "openssh-server-8.2p1-2.fc32.x86_64", + "openssl-1.1.1d-7.fc32.x86_64", + "openssl-libs-1.1.1d-7.fc32.x86_64", + "openssl-pkcs11-0.4.10-5.fc32.x86_64", + "os-prober-1.77-4.fc32.x86_64", + "ostree-2020.3-2.fc32.x86_64", + "ostree-libs-2020.3-2.fc32.x86_64", + "p11-kit-0.23.20-1.fc32.x86_64", + "p11-kit-trust-0.23.20-1.fc32.x86_64", + "pam-1.3.1-24.fc32.x86_64", + "passwd-0.80-8.fc32.x86_64", + "pciutils-libs-3.6.4-1.fc32.x86_64", + "pcre-8.44-1.fc32.x86_64", + "pcre2-10.34-9.fc32.x86_64", + "pcre2-syntax-10.34-9.fc32.noarch", + "pigz-2.4-6.fc32.x86_64", + "pinentry-1.1.0-7.fc32.x86_64", + "pkgconf-1.6.3-3.fc32.x86_64", + "pkgconf-m4-1.6.3-3.fc32.noarch", + "pkgconf-pkg-config-1.6.3-3.fc32.x86_64", + "podman-1.8.2-2.fc32.x86_64", + "podman-plugins-1.8.2-2.fc32.x86_64", + "policycoreutils-3.0-2.fc32.x86_64", + "policycoreutils-python-utils-3.0-2.fc32.noarch", + "polkit-0.116-7.fc32.x86_64", + "polkit-libs-0.116-7.fc32.x86_64", + "polkit-pkla-compat-0.1-16.fc32.x86_64", + "popt-1.16-19.fc32.x86_64", + "procps-ng-3.3.15-7.fc32.x86_64", + "protobuf-c-1.3.2-2.fc32.x86_64", + "psmisc-23.3-3.fc32.x86_64", + "publicsuffix-list-dafsa-20190417-3.fc32.noarch", + "python-pip-wheel-19.3.1-2.fc32.noarch", + "python-setuptools-wheel-41.6.0-2.fc32.noarch", + "python-unversioned-command-3.8.2-2.fc32.noarch", + "python3-3.8.2-2.fc32.x86_64", + "python3-audit-3.0-0.19.20191104git1c2f876.fc32.x86_64", + "python3-dbus-1.2.16-1.fc32.x86_64", + "python3-decorator-4.4.0-6.fc32.noarch", + "python3-firewall-0.8.2-2.fc32.noarch", + "python3-gobject-base-3.36.0-2.fc32.x86_64", + "python3-libs-3.8.2-2.fc32.x86_64", + "python3-libselinux-3.0-3.fc32.x86_64", + "python3-libsemanage-3.0-3.fc32.x86_64", + "python3-nftables-0.9.3-2.fc32.x86_64", + "python3-pip-19.3.1-2.fc32.noarch", + "python3-policycoreutils-3.0-2.fc32.noarch", + "python3-setools-4.3.0-1.fc32.x86_64", + "python3-setuptools-41.6.0-2.fc32.noarch", + "python3-six-1.14.0-2.fc32.noarch", + "python3-slip-0.6.4-19.fc32.noarch", + "python3-slip-dbus-0.6.4-19.fc32.noarch", + "qrencode-libs-4.0.2-5.fc32.x86_64", + "readline-8.0-4.fc32.x86_64", + "rng-tools-6.9-3.fc32.x86_64", + "rootfiles-8.1-27.fc32.noarch", + "rpm-4.15.1-2.fc32.1.x86_64", + "rpm-libs-4.15.1-2.fc32.1.x86_64", + "rpm-ostree-2020.1-1.fc32.x86_64", + "rpm-ostree-libs-2020.1-1.fc32.x86_64", + "rpm-plugin-selinux-4.15.1-2.fc32.1.x86_64", + "rsync-3.1.3-11.fc32.x86_64", + "runc-1.0.0-144.dev.gite6555cc.fc32.x86_64", + "screen-4.8.0-2.fc32.x86_64", + "sed-4.5-5.fc32.x86_64", + "selinux-policy-3.14.5-32.fc32.noarch", + "selinux-policy-targeted-3.14.5-32.fc32.noarch", + "setools-console-4.3.0-1.fc32.x86_64", + "setup-2.13.6-2.fc32.noarch", + "shadow-utils-4.8.1-2.fc32.x86_64", + "shared-mime-info-1.15-3.fc32.x86_64", + "shim-x64-15-8.x86_64", + "skopeo-0.1.41-1.fc32.x86_64", + "slirp4netns-0.4.3-6.0.dev.gita8414d1.fc32.x86_64", + "sqlite-libs-3.31.1-1.fc32.x86_64", + "sssd-client-2.2.3-13.fc32.x86_64", + "sudo-1.9.0-0.1.b4.fc32.x86_64", + "systemd-245.4-1.fc32.x86_64", + "systemd-libs-245.4-1.fc32.x86_64", + "systemd-pam-245.4-1.fc32.x86_64", + "systemd-rpm-macros-245.4-1.fc32.noarch", + "systemd-udev-245.4-1.fc32.x86_64", + "tar-1.32-4.fc32.x86_64", + "tmux-3.0a-2.fc32.x86_64", + "tpm2-tools-4.1-2.fc32.x86_64", + "tpm2-tss-2.4.0-1.fc32.x86_64", + "traceroute-2.1.0-10.fc32.x86_64", + "trousers-0.3.13-13.fc31.x86_64", + "trousers-lib-0.3.13-13.fc31.x86_64", + "tss2-1331-4.fc32.x86_64", + "tzdata-2019c-3.fc32.noarch", + "util-linux-2.35.1-7.fc32.x86_64", + "vim-minimal-8.2.525-1.fc32.x86_64", + "which-2.21-19.fc32.x86_64", + "whois-nls-5.5.6-1.fc32.noarch", + "wpa_supplicant-2.9-3.fc32.x86_64", + "wpan-tools-0.9-4.fc32.x86_64", + "xkeyboard-config-2.29-1.fc32.noarch", + "xz-5.2.5-1.fc32.x86_64", + "xz-libs-5.2.5-1.fc32.x86_64", + "yajl-2.1.0-14.fc32.x86_64", + "zchunk-libs-1.1.5-2.fc32.x86_64", + "zlib-1.2.11-21.fc32.x86_64", + "zram-0.4-1.fc32.noarch" + ], + "passwd": [ + "root:x:0:0:root:/root:/bin/bash" + ], + "passwd-system": [ + "adm:x:3:4:adm:/var/adm:/sbin/nologin", + "bin:x:1:1:bin:/bin:/sbin/nologin", + "chrony:x:995:992::/var/lib/chrony:/sbin/nologin", + "clevis:x:999:998:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/sbin/nologin", + "daemon:x:2:2:daemon:/sbin:/sbin/nologin", + "dbus:x:81:81:System message bus:/:/sbin/nologin", + "dnsmasq:x:991:991:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/usr/sbin/nologin", + "ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin", + "games:x:12:100:games:/usr/games:/sbin/nologin", + "halt:x:7:0:halt:/sbin:/sbin/halt", + "lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin", + "mail:x:8:12:mail:/var/spool/mail:/sbin/nologin", + "nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin", + "operator:x:11:0:operator:/root:/sbin/nologin", + "polkitd:x:996:993:User for polkitd:/:/sbin/nologin", + "shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown", + "sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin", + "sync:x:5:0:sync:/sbin:/bin/sync", + "systemd-coredump:x:998:995:systemd Core Dumper:/:/sbin/nologin", + "systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin", + "systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin", + "systemd-timesync:x:997:994:systemd Time Synchronization:/:/sbin/nologin", + "tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin" + ], + "services-disabled": [ + "blk-availability.service", + "bluetooth-mesh.service", + "chrony-dnssrv@.timer", + "chrony-wait.service", + "clevis-luks-askpass.path", + "console-getty.service", + "cpupower.service", + "debug-shell.service", + "dnsmasq.service", + "ead.service", + "exit.target", + "fwupd-refresh.timer", + "greenboot.target", + "halt.target", + "ignition-firstboot-complete.service", + "io.podman.service", + "io.podman.socket", + "iwd.service", + "kexec.target", + "loadmodules.service", + "nftables.service", + "nis-domainname.service", + "ostree-finalize-staged.path", + "podman.service", + "podman.socket", + "poweroff.target", + "proc-sys-fs-binfmt_misc.mount", + "rdisc.service", + "remote-cryptsetup.target", + "rpm-ostree-bootstatus.service", + "rpm-ostreed-automatic.timer", + "runlevel0.target", + "serial-getty@.service", + "sshd-keygen@.service", + "sshd.socket", + "systemd-boot-check-no-failures.service", + "systemd-network-generator.service", + "systemd-networkd-wait-online.service", + "systemd-networkd.service", + "systemd-networkd.socket", + "systemd-pstore.service", + "systemd-resolved.service", + "systemd-time-wait-sync.service", + "systemd-timesyncd.service", + "tcsd.service", + "wpa_supplicant.service" + ], + "services-enabled": [ + "ModemManager.service", + "NetworkManager-dispatcher.service", + "NetworkManager-wait-online.service", + "NetworkManager.service", + "auditd.service", + "autovt@.service", + "bluetooth.service", + "chronyd.service", + "ctrl-alt-del.target", + "dbus-broker.service", + "dbus-org.bluez.service", + "dbus-org.fedoraproject.FirewallD1.service", + "dbus-org.freedesktop.ModemManager1.service", + "dbus-org.freedesktop.nm-dispatcher.service", + "dbus.service", + "dbus.socket", + "dbxtool.service", + "dm-event.socket", + "firewalld.service", + "fstrim.timer", + "getty@.service", + "greenboot-grub2-set-counter.service", + "greenboot-grub2-set-success.service", + "greenboot-healthcheck.service", + "greenboot-rpm-ostree-grub2-check-fallback.service", + "greenboot-status.service", + "greenboot.service", + "import-state.service", + "lvm2-lvmpolld.socket", + "lvm2-monitor.service", + "ostree-remount.service", + "reboot.target", + "redboot-auto-reboot.service", + "redboot.service", + "remote-fs.target", + "rngd.service", + "runlevel6.target", + "selinux-autorelabel-mark.service", + "sshd.service", + "zram-swap.service" + ], + "type": "ostree/commit" + } +} diff --git a/test/data/manifests/fedora_32-x86_64-openstack-boot.json b/test/data/manifests/fedora_32-x86_64-openstack-boot.json index e2abb43..144537a 100644 --- a/test/data/manifests/fedora_32-x86_64-openstack-boot.json +++ b/test/data/manifests/fedora_32-x86_64-openstack-boot.json @@ -9483,10 +9483,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -9505,12 +9502,12 @@ "version": "5.6.6-300.fc32.x86_64" } ], + "default-target": "graphical.target", "firewall-enabled": [ "ssh", "mdns", "dhcpv6-client" ], - "default-target": "graphical.target", "fstab": [ [ "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac", @@ -10081,4 +10078,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-qcow2-boot.json b/test/data/manifests/fedora_32-x86_64-qcow2-boot.json index a9a0aa2..8fd974a 100644 --- a/test/data/manifests/fedora_32-x86_64-qcow2-boot.json +++ b/test/data/manifests/fedora_32-x86_64-qcow2-boot.json @@ -616,6 +616,9 @@ "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libarchive-3.4.2-1.fc32.x86_64.rpm" }, + "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-5.6.6-300.fc32.x86_64.rpm" + }, "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/popt-1.16-19.fc32.x86_64.rpm" }, @@ -805,6 +808,9 @@ "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch.rpm" }, + "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-modules-5.6.6-300.fc32.x86_64.rpm" + }, "sha256:bb154a90c968150172036d86f0c9fc2a24b5799718bc4d835cb10d0758890c67": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnfsidmap-2.4.3-0.fc32.x86_64.rpm" }, @@ -2412,10 +2418,18 @@ "check_gpg": true }, { + "checksum": "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe", + "check_gpg": true + }, + { "checksum": "sha256:a1613e90865db93fb578b8ee1a4ee40bd396c6c9f2fb2a14757acacecb9f23e8", "check_gpg": true }, { + "checksum": "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505", + "check_gpg": true + }, + { "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", "check_gpg": true }, @@ -6693,6 +6707,16 @@ "check_gpg": true }, { + "name": "kernel", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe", + "check_gpg": true + }, + { "name": "kernel-core", "epoch": 0, "version": "5.6.6", @@ -6703,6 +6727,16 @@ "check_gpg": true }, { + "name": "kernel-modules", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-modules-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505", + "check_gpg": true + }, + { "name": "keyutils-libs", "epoch": 0, "version": "1.6", @@ -9092,10 +9126,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -9299,7 +9330,9 @@ "kbd-2.2.0-1.fc32.x86_64", "kbd-legacy-2.2.0-1.fc32.noarch", "kbd-misc-2.2.0-1.fc32.noarch", + "kernel-5.6.6-300.fc32.x86_64", "kernel-core-5.6.6-300.fc32.x86_64", + "kernel-modules-5.6.6-300.fc32.x86_64", "keyutils-libs-1.6-4.fc32.x86_64", "kmod-27-1.fc32.x86_64", "kmod-libs-27-1.fc32.x86_64", @@ -9664,4 +9697,4 @@ "unbound-anchor.timer" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-qcow2-customize.json b/test/data/manifests/fedora_32-x86_64-qcow2-customize.json index 76419be..3fc5904 100644 --- a/test/data/manifests/fedora_32-x86_64-qcow2-customize.json +++ b/test/data/manifests/fedora_32-x86_64-qcow2-customize.json @@ -67,7 +67,7 @@ }, "locale": { "languages": [ - "en_US" + "el_CY.UTF-8" ], "keyboard": "dvorak" }, @@ -668,6 +668,9 @@ "sha256:88f4bd19a6cf6eba5e6f2b5bba80819b5ccddb0476aadc53c8df13f9c45b1e58": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libarchive-3.4.2-1.fc32.x86_64.rpm" }, + "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-5.6.6-300.fc32.x86_64.rpm" + }, "sha256:8a0c00a69f9cb3a9ffacaf1cdc162c38a1faca76c9b976cb177bdc988902f2d4": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/p/popt-1.16-19.fc32.x86_64.rpm" }, @@ -857,6 +860,9 @@ "sha256:b821e9e8bf66abacaed4a386f9ed8ffa17f4f8be3db55e1ac31d52ba2d1faa1b": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/c/crypto-policies-scripts-20191128-5.gitcd267a5.fc32.noarch.rpm" }, + "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505": { + "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-modules-5.6.6-300.fc32.x86_64.rpm" + }, "sha256:bb154a90c968150172036d86f0c9fc2a24b5799718bc4d835cb10d0758890c67": { "url": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/l/libnfsidmap-2.4.3-0.fc32.x86_64.rpm" }, @@ -2464,10 +2470,18 @@ "check_gpg": true }, { + "checksum": "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe", + "check_gpg": true + }, + { "checksum": "sha256:a1613e90865db93fb578b8ee1a4ee40bd396c6c9f2fb2a14757acacecb9f23e8", "check_gpg": true }, { + "checksum": "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505", + "check_gpg": true + }, + { "checksum": "sha256:ccc3cb2dcb7a534361cc911f27ff4e869902a150b68e236cf6eb209a99d4ee22", "check_gpg": true }, @@ -3433,7 +3447,7 @@ { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "el_CY.UTF-8" } }, { @@ -6802,6 +6816,16 @@ "check_gpg": true }, { + "name": "kernel", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:89c972ec7d2ab305c91c23bc248562c76f0ae645a9ed9f94d312e2f57c4d38fe", + "check_gpg": true + }, + { "name": "kernel-core", "epoch": 0, "version": "5.6.6", @@ -6812,6 +6836,16 @@ "check_gpg": true }, { + "name": "kernel-modules", + "epoch": 0, + "version": "5.6.6", + "release": "300.fc32", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/32/Everything/x86_64/os/Packages/k/kernel-modules-5.6.6-300.fc32.x86_64.rpm", + "checksum": "sha256:b98687828b1d222ea73ebb8457450913dac58dd0be2e430a93bb7e98ba816505", + "check_gpg": true + }, + { "name": "keyutils-libs", "epoch": 0, "version": "1.6", @@ -9201,10 +9235,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -9411,7 +9442,9 @@ "kbd-2.2.0-1.fc32.x86_64", "kbd-legacy-2.2.0-1.fc32.noarch", "kbd-misc-2.2.0-1.fc32.noarch", + "kernel-5.6.6-300.fc32.x86_64", "kernel-core-5.6.6-300.fc32.x86_64", + "kernel-modules-5.6.6-300.fc32.x86_64", "keyutils-libs-1.6-4.fc32.x86_64", "kmod-27-1.fc32.x86_64", "kmod-libs-27-1.fc32.x86_64", @@ -9779,4 +9812,4 @@ ], "timezone": "London" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-vhd-boot.json b/test/data/manifests/fedora_32-x86_64-vhd-boot.json index 486ebd7..f59ea1b 100644 --- a/test/data/manifests/fedora_32-x86_64-vhd-boot.json +++ b/test/data/manifests/fedora_32-x86_64-vhd-boot.json @@ -8734,10 +8734,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -8756,12 +8753,12 @@ "version": "5.6.6-300.fc32.x86_64" } ], + "default-target": "graphical.target", "firewall-enabled": [ "ssh", "mdns", "dhcpv6-client" ], - "default-target": "graphical.target", "fstab": [ [ "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac", @@ -9284,4 +9281,4 @@ "waagent.service" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_32-x86_64-vmdk-boot.json b/test/data/manifests/fedora_32-x86_64-vmdk-boot.json index 3f41ad8..80ffc08 100644 --- a/test/data/manifests/fedora_32-x86_64-vmdk-boot.json +++ b/test/data/manifests/fedora_32-x86_64-vmdk-boot.json @@ -8840,10 +8840,7 @@ "checksum": "sha256:c0fff40dc1092e18ed3e608bc6143c89a0d7775b9e0553319bb2caca7d324d80", "check_gpg": true } - ], - "checksums": { - "0": "sha256:c7f7c29a8ca90e226d2efee6d5856f2dea1d64ea758dfd114d75b4b20b56de1c" - } + ] }, "image-info": { "boot-environment": { @@ -8862,12 +8859,12 @@ "version": "5.6.6-300.fc32.x86_64" } ], + "default-target": "graphical.target", "firewall-enabled": [ "ssh", "mdns", "dhcpv6-client" ], - "default-target": "graphical.target", "fstab": [ [ "UUID=76a22bf4-f153-4541-b6c7-0332c0dfaeac", @@ -9398,4 +9395,4 @@ "vmtoolsd.service" ] } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-aarch64-ami-boot.json b/test/data/manifests/fedora_33-aarch64-ami-boot.json index c3c4dbd..c515b9c 100644 --- a/test/data/manifests/fedora_33-aarch64-ami-boot.json +++ b/test/data/manifests/fedora_33-aarch64-ami-boot.json @@ -9795,10 +9795,7 @@ "checksum": "sha256:99e5ac897d4dd06f0d22ddf9bd064c6081ea699a7ebc7d0c3907743128eb59f4", "check_gpg": true } - ], - "checksums": { - "0": "sha256:30f081c69fa61c9bb8f7ba043d73698d1765c8cd62ccf2df5173e26bde458002" - } + ] }, "image-info": { "boot-environment": { @@ -10429,4 +10426,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-ami-boot.json b/test/data/manifests/fedora_33-x86_64-ami-boot.json index 26c838f..f94664d 100644 --- a/test/data/manifests/fedora_33-x86_64-ami-boot.json +++ b/test/data/manifests/fedora_33-x86_64-ami-boot.json @@ -9374,10 +9374,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -9961,4 +9958,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json index ced2ade..038ab6d 100644 --- a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json +++ b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit-boot.json @@ -10571,10 +10571,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "default-target": "graphical.target", diff --git a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit_debug-boot.json b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit_debug-boot.json index a646cc5..29eec9c 100644 --- a/test/data/manifests/fedora_33-x86_64-fedora_iot_commit_debug-boot.json +++ b/test/data/manifests/fedora_33-x86_64-fedora_iot_commit_debug-boot.json @@ -10577,10 +10577,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "default-target": "graphical.target", @@ -11215,4 +11212,4 @@ "timezone": "UTC", "type": "ostree/commit" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-openstack-boot.json b/test/data/manifests/fedora_33-x86_64-openstack-boot.json index ee3ba22..014f08e 100644 --- a/test/data/manifests/fedora_33-x86_64-openstack-boot.json +++ b/test/data/manifests/fedora_33-x86_64-openstack-boot.json @@ -9689,10 +9689,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -10296,4 +10293,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-qcow2-boot.json b/test/data/manifests/fedora_33-x86_64-qcow2-boot.json index a5fe9f9..55885c7 100644 --- a/test/data/manifests/fedora_33-x86_64-qcow2-boot.json +++ b/test/data/manifests/fedora_33-x86_64-qcow2-boot.json @@ -337,6 +337,9 @@ "sha256:495ce50d147bdc637061d21a8dcb3563f3189f0055f8cd7ed87cbd8c1d3f3fac": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/x/xz-5.2.5-3.fc33.x86_64.rpm" }, + "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:4a1227b0a536573cbe71fede072d0bd7ac203e616cf2af1e31889aded6bb8634": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/gnupg2-2.2.23-1.fc33.x86_64.rpm" }, @@ -454,6 +457,9 @@ "sha256:6b5c7c46f0a177bf9c8b89ae3eb251a5e7315424c326cc62871b004bcaed414d": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/w/whois-nls-5.5.7-1.fc33.noarch.rpm" }, + "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm" + }, "sha256:6c235bd211f68e4ed925bc6a03b8b0e5c30f1de41cb7cd1c0c79f9996024eede": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-31.fc33.noarch.rpm" }, @@ -748,6 +754,9 @@ "sha256:af2777ec0c6ee867b5ecad024de55fce1afccb5567cd48501611e073536d332f": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/s/syslinux-extlinux-nonlinux-6.04-0.16.fc33.noarch.rpm" }, + "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:af6c6f788555064ff9c7d3b32b2d4edde5e33e958384a909459ce33940755971": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-10.fc33.x86_64.rpm" }, @@ -2066,6 +2075,10 @@ "check_gpg": true }, { + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "checksum": "sha256:2200dd65dff57b773532153d3626ecb5914bd7826c42c689ca34be3f60ac3fe2", "check_gpg": true }, @@ -2458,10 +2471,18 @@ "check_gpg": true }, { + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "checksum": "sha256:d8f263272b87175ece88f200f6b843c89c4294ee2abf630ff38485abac90fb47", "check_gpg": true }, { + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "checksum": "sha256:e06161a9e1de438d9656e2730239426085a83e9f8ffcbe384df6f7f64254211c", "check_gpg": true }, @@ -5868,6 +5889,16 @@ "check_gpg": true }, { + "name": "alsa-sof-firmware", + "epoch": 0, + "version": "1.5", + "release": "2.fc33", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm", + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "name": "alternatives", "epoch": 0, "version": "1.14", @@ -6848,6 +6879,16 @@ "check_gpg": true }, { + "name": "kernel", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "name": "kernel-core", "epoch": 0, "version": "5.8.15", @@ -6858,6 +6899,16 @@ "check_gpg": true }, { + "name": "kernel-modules", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "name": "keyutils-libs", "epoch": 0, "version": "1.6", @@ -9267,10 +9318,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -9372,6 +9420,7 @@ "NetworkManager-1.26.2-2.fc33.x86_64", "NetworkManager-libnm-1.26.2-2.fc33.x86_64", "acl-2.2.53-9.fc33.x86_64", + "alsa-sof-firmware-1.5-2.fc33.noarch", "alternatives-1.14-3.fc33.x86_64", "audit-3.0-0.21.20191104git1c2f876.fc33.x86_64", "audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_64", @@ -9471,7 +9520,9 @@ "kbd-2.3.0-2.fc33.x86_64", "kbd-legacy-2.3.0-2.fc33.noarch", "kbd-misc-2.3.0-2.fc33.noarch", + "kernel-5.8.15-301.fc33.x86_64", "kernel-core-5.8.15-301.fc33.x86_64", + "kernel-modules-5.8.15-301.fc33.x86_64", "keyutils-libs-1.6-5.fc33.x86_64", "kmod-27-3.fc33.x86_64", "kmod-libs-27-3.fc33.x86_64", @@ -9848,4 +9899,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-qcow2-customize.json b/test/data/manifests/fedora_33-x86_64-qcow2-customize.json index fb99ccb..ea852bb 100644 --- a/test/data/manifests/fedora_33-x86_64-qcow2-customize.json +++ b/test/data/manifests/fedora_33-x86_64-qcow2-customize.json @@ -67,7 +67,7 @@ }, "locale": { "languages": [ - "en_US" + "el_CY.UTF-8" ], "keyboard": "dvorak" }, @@ -389,6 +389,9 @@ "sha256:495ce50d147bdc637061d21a8dcb3563f3189f0055f8cd7ed87cbd8c1d3f3fac": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/x/xz-5.2.5-3.fc33.x86_64.rpm" }, + "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:4a1227b0a536573cbe71fede072d0bd7ac203e616cf2af1e31889aded6bb8634": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/gnupg2-2.2.23-1.fc33.x86_64.rpm" }, @@ -506,6 +509,9 @@ "sha256:6b5c7c46f0a177bf9c8b89ae3eb251a5e7315424c326cc62871b004bcaed414d": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/w/whois-nls-5.5.7-1.fc33.noarch.rpm" }, + "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm" + }, "sha256:6c235bd211f68e4ed925bc6a03b8b0e5c30f1de41cb7cd1c0c79f9996024eede": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-31.fc33.noarch.rpm" }, @@ -800,6 +806,9 @@ "sha256:af2777ec0c6ee867b5ecad024de55fce1afccb5567cd48501611e073536d332f": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/s/syslinux-extlinux-nonlinux-6.04-0.16.fc33.noarch.rpm" }, + "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:af6c6f788555064ff9c7d3b32b2d4edde5e33e958384a909459ce33940755971": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-10.fc33.x86_64.rpm" }, @@ -2118,6 +2127,10 @@ "check_gpg": true }, { + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "checksum": "sha256:2200dd65dff57b773532153d3626ecb5914bd7826c42c689ca34be3f60ac3fe2", "check_gpg": true }, @@ -2510,10 +2523,18 @@ "check_gpg": true }, { + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "checksum": "sha256:d8f263272b87175ece88f200f6b843c89c4294ee2abf630ff38485abac90fb47", "check_gpg": true }, { + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "checksum": "sha256:e06161a9e1de438d9656e2730239426085a83e9f8ffcbe384df6f7f64254211c", "check_gpg": true }, @@ -3483,7 +3504,7 @@ { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "el_CY.UTF-8" } }, { @@ -5966,6 +5987,16 @@ "check_gpg": true }, { + "name": "alsa-sof-firmware", + "epoch": 0, + "version": "1.5", + "release": "2.fc33", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm", + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "name": "alternatives", "epoch": 0, "version": "1.14", @@ -6946,6 +6977,16 @@ "check_gpg": true }, { + "name": "kernel", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "name": "kernel-core", "epoch": 0, "version": "5.8.15", @@ -6956,6 +6997,16 @@ "check_gpg": true }, { + "name": "kernel-modules", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "name": "keyutils-libs", "epoch": 0, "version": "1.6", @@ -9365,10 +9416,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -9472,6 +9520,7 @@ "NetworkManager-1.26.2-2.fc33.x86_64", "NetworkManager-libnm-1.26.2-2.fc33.x86_64", "acl-2.2.53-9.fc33.x86_64", + "alsa-sof-firmware-1.5-2.fc33.noarch", "alternatives-1.14-3.fc33.x86_64", "audit-3.0-0.21.20191104git1c2f876.fc33.x86_64", "audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_64", @@ -9571,7 +9620,9 @@ "kbd-2.3.0-2.fc33.x86_64", "kbd-legacy-2.3.0-2.fc33.noarch", "kbd-misc-2.3.0-2.fc33.noarch", + "kernel-5.8.15-301.fc33.x86_64", "kernel-core-5.8.15-301.fc33.x86_64", + "kernel-modules-5.8.15-301.fc33.x86_64", "keyutils-libs-1.6-5.fc33.x86_64", "kmod-27-3.fc33.x86_64", "kmod-libs-27-3.fc33.x86_64", @@ -9950,4 +10001,4 @@ ], "timezone": "London" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-vhd-boot.json b/test/data/manifests/fedora_33-x86_64-vhd-boot.json index 4d1e985..a87a486 100644 --- a/test/data/manifests/fedora_33-x86_64-vhd-boot.json +++ b/test/data/manifests/fedora_33-x86_64-vhd-boot.json @@ -8975,10 +8975,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -9536,4 +9533,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/fedora_33-x86_64-vmdk-boot.json b/test/data/manifests/fedora_33-x86_64-vmdk-boot.json index 25c40a2..da2926f 100644 --- a/test/data/manifests/fedora_33-x86_64-vmdk-boot.json +++ b/test/data/manifests/fedora_33-x86_64-vmdk-boot.json @@ -1,6 +1,6 @@ { "boot": { - "type": "qemu" + "type": "vmware" }, "compose-request": { "distro": "fedora-33", @@ -337,6 +337,9 @@ "sha256:495ce50d147bdc637061d21a8dcb3563f3189f0055f8cd7ed87cbd8c1d3f3fac": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/x/xz-5.2.5-3.fc33.x86_64.rpm" }, + "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:4a1227b0a536573cbe71fede072d0bd7ac203e616cf2af1e31889aded6bb8634": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/gnupg2-2.2.23-1.fc33.x86_64.rpm" }, @@ -454,6 +457,9 @@ "sha256:6b5c7c46f0a177bf9c8b89ae3eb251a5e7315424c326cc62871b004bcaed414d": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/w/whois-nls-5.5.7-1.fc33.noarch.rpm" }, + "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm" + }, "sha256:6c235bd211f68e4ed925bc6a03b8b0e5c30f1de41cb7cd1c0c79f9996024eede": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/g/grub2-pc-modules-2.04-31.fc33.noarch.rpm" }, @@ -748,6 +754,9 @@ "sha256:af2777ec0c6ee867b5ecad024de55fce1afccb5567cd48501611e073536d332f": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/s/syslinux-extlinux-nonlinux-6.04-0.16.fc33.noarch.rpm" }, + "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69": { + "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm" + }, "sha256:af6c6f788555064ff9c7d3b32b2d4edde5e33e958384a909459ce33940755971": { "url": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/f/fuse-libs-2.9.9-10.fc33.x86_64.rpm" }, @@ -2066,6 +2075,10 @@ "check_gpg": true }, { + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "checksum": "sha256:2200dd65dff57b773532153d3626ecb5914bd7826c42c689ca34be3f60ac3fe2", "check_gpg": true }, @@ -2458,10 +2471,18 @@ "check_gpg": true }, { + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "checksum": "sha256:d8f263272b87175ece88f200f6b843c89c4294ee2abf630ff38485abac90fb47", "check_gpg": true }, { + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "checksum": "sha256:e06161a9e1de438d9656e2730239426085a83e9f8ffcbe384df6f7f64254211c", "check_gpg": true }, @@ -5868,6 +5889,16 @@ "check_gpg": true }, { + "name": "alsa-sof-firmware", + "epoch": 0, + "version": "1.5", + "release": "2.fc33", + "arch": "noarch", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/a/alsa-sof-firmware-1.5-2.fc33.noarch.rpm", + "checksum": "sha256:6bf58da366702e9e7cedf3a1560a623aec008621bfb7776665297bf073b29168", + "check_gpg": true + }, + { "name": "alternatives", "epoch": 0, "version": "1.14", @@ -6848,6 +6879,16 @@ "check_gpg": true }, { + "name": "kernel", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:49cf91c54e6d60bbd479f237a7db40be3b50c7b143a18209ea55e3d2f4c18830", + "check_gpg": true + }, + { "name": "kernel-core", "epoch": 0, "version": "5.8.15", @@ -6858,6 +6899,16 @@ "check_gpg": true }, { + "name": "kernel-modules", + "epoch": 0, + "version": "5.8.15", + "release": "301.fc33", + "arch": "x86_64", + "remote_location": "http://mirrors.kernel.org/fedora/releases/33/Everything/x86_64/os/Packages/k/kernel-modules-5.8.15-301.fc33.x86_64.rpm", + "checksum": "sha256:af378d963906ce5fbd91065c68319f169c078c7623b75cb6613530cb1c027b69", + "check_gpg": true + }, + { "name": "keyutils-libs", "epoch": 0, "version": "1.6", @@ -9267,10 +9318,7 @@ "checksum": "sha256:1ecfd9041524f8dab2eba10eab59c912eeae09acb3c3e8ada018fe13d23dda73", "check_gpg": true } - ], - "checksums": { - "0": "sha256:7a75be2ebd56e44c9d33252a12158c8b7079331e9c73aa62c609414299dabf06" - } + ] }, "image-info": { "boot-environment": { @@ -9372,6 +9420,7 @@ "NetworkManager-1.26.2-2.fc33.x86_64", "NetworkManager-libnm-1.26.2-2.fc33.x86_64", "acl-2.2.53-9.fc33.x86_64", + "alsa-sof-firmware-1.5-2.fc33.noarch", "alternatives-1.14-3.fc33.x86_64", "audit-3.0-0.21.20191104git1c2f876.fc33.x86_64", "audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_64", @@ -9471,7 +9520,9 @@ "kbd-2.3.0-2.fc33.x86_64", "kbd-legacy-2.3.0-2.fc33.noarch", "kbd-misc-2.3.0-2.fc33.noarch", + "kernel-5.8.15-301.fc33.x86_64", "kernel-core-5.8.15-301.fc33.x86_64", + "kernel-modules-5.8.15-301.fc33.x86_64", "keyutils-libs-1.6-5.fc33.x86_64", "kmod-27-3.fc33.x86_64", "kmod-libs-27-3.fc33.x86_64", @@ -9848,4 +9899,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-aarch64-ami-boot.json b/test/data/manifests/rhel_8-aarch64-ami-boot.json index 1556157..551de09 100644 --- a/test/data/manifests/rhel_8-aarch64-ami-boot.json +++ b/test/data/manifests/rhel_8-aarch64-ami-boot.json @@ -8490,11 +8490,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:517831776ae84fa2d1ceb52c043cd0bd50fc06e3761046f60f730b25f02c9519", - "1": "sha256:be9adc924571c59331c75639df3d3dc6c7214954db7ac000c2f06eadff631aa5" - } + ] }, "image-info": { "boot-environment": { @@ -9126,4 +9122,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-aarch64-openstack-boot.json b/test/data/manifests/rhel_8-aarch64-openstack-boot.json index 2f0f479..342b623 100644 --- a/test/data/manifests/rhel_8-aarch64-openstack-boot.json +++ b/test/data/manifests/rhel_8-aarch64-openstack-boot.json @@ -9051,11 +9051,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:517831776ae84fa2d1ceb52c043cd0bd50fc06e3761046f60f730b25f02c9519", - "1": "sha256:be9adc924571c59331c75639df3d3dc6c7214954db7ac000c2f06eadff631aa5" - } + ] }, "image-info": { "boot-environment": { @@ -9732,4 +9728,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-aarch64-qcow2-boot.json b/test/data/manifests/rhel_8-aarch64-qcow2-boot.json index a755721..a74e00c 100644 --- a/test/data/manifests/rhel_8-aarch64-qcow2-boot.json +++ b/test/data/manifests/rhel_8-aarch64-qcow2-boot.json @@ -9508,11 +9508,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:517831776ae84fa2d1ceb52c043cd0bd50fc06e3761046f60f730b25f02c9519", - "1": "sha256:be9adc924571c59331c75639df3d3dc6c7214954db7ac000c2f06eadff631aa5" - } + ] }, "image-info": { "boot-environment": { @@ -10236,4 +10232,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json b/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json index 2769024..fbb9892 100644 --- a/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json +++ b/test/data/manifests/rhel_8-aarch64-rhel_edge_commit-boot.json @@ -8226,11 +8226,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:517831776ae84fa2d1ceb52c043cd0bd50fc06e3761046f60f730b25f02c9519", - "1": "sha256:be9adc924571c59331c75639df3d3dc6c7214954db7ac000c2f06eadff631aa5" - } + ] }, "image-info": { "default-target": "graphical.target", diff --git a/test/data/manifests/rhel_8-aarch64-tar-boot.json b/test/data/manifests/rhel_8-aarch64-tar-boot.json index 5b7e0e8..416c78d 100644 --- a/test/data/manifests/rhel_8-aarch64-tar-boot.json +++ b/test/data/manifests/rhel_8-aarch64-tar-boot.json @@ -5351,11 +5351,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:517831776ae84fa2d1ceb52c043cd0bd50fc06e3761046f60f730b25f02c9519", - "1": "sha256:be9adc924571c59331c75639df3d3dc6c7214954db7ac000c2f06eadff631aa5" - } + ] }, "image-info": { "bootmenu": [], @@ -5651,4 +5647,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json b/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json index 7ede645..106fc7b 100644 --- a/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json +++ b/test/data/manifests/rhel_8-ppc64le-qcow2-boot.json @@ -10245,11 +10245,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-ppc64le-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:1337daffdff55365621a1c7963c0443c62f6f9ca39e9d6600d06a34dbe3eecea", - "1": "sha256:9ba8f3377e00773b22edf4c60b78252d45b777d1291a9913df3325c2aa54525e" - } + ] }, "image-info": { "boot-environment": { @@ -11012,4 +11008,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-ppc64le-tar-boot.json b/test/data/manifests/rhel_8-ppc64le-tar-boot.json index 6ea5d1f..46eb314 100644 --- a/test/data/manifests/rhel_8-ppc64le-tar-boot.json +++ b/test/data/manifests/rhel_8-ppc64le-tar-boot.json @@ -5453,11 +5453,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-ppc64le-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:1337daffdff55365621a1c7963c0443c62f6f9ca39e9d6600d06a34dbe3eecea", - "1": "sha256:9ba8f3377e00773b22edf4c60b78252d45b777d1291a9913df3325c2aa54525e" - } + ] }, "image-info": { "bootmenu": [], @@ -5754,4 +5750,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-s390x-qcow2-boot.json b/test/data/manifests/rhel_8-s390x-qcow2-boot.json index 6fcc2ec..10c012e 100644 --- a/test/data/manifests/rhel_8-s390x-qcow2-boot.json +++ b/test/data/manifests/rhel_8-s390x-qcow2-boot.json @@ -10128,11 +10128,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-s390x-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:46d16db63c077144fb5fb7b18dfec918599e99b02ab7b29dd952eaa6b552a26b", - "1": "sha256:6ba75631f79a77c901ba2aff970179d3dbccc247428dd09543fca08f983f3091" - } + ] }, "image-info": { "bootloader": "unknown", @@ -10858,4 +10854,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-s390x-tar-boot.json b/test/data/manifests/rhel_8-s390x-tar-boot.json index 68849bb..042a45e 100644 --- a/test/data/manifests/rhel_8-s390x-tar-boot.json +++ b/test/data/manifests/rhel_8-s390x-tar-boot.json @@ -5998,11 +5998,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-s390x-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:46d16db63c077144fb5fb7b18dfec918599e99b02ab7b29dd952eaa6b552a26b", - "1": "sha256:6ba75631f79a77c901ba2aff970179d3dbccc247428dd09543fca08f983f3091" - } + ] }, "image-info": { "bootmenu": [], @@ -6326,4 +6322,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-ami-boot.json b/test/data/manifests/rhel_8-x86_64-ami-boot.json index fbc24f1..a8c7da4 100644 --- a/test/data/manifests/rhel_8-x86_64-ami-boot.json +++ b/test/data/manifests/rhel_8-x86_64-ami-boot.json @@ -8486,11 +8486,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -9100,4 +9096,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-openstack-boot.json b/test/data/manifests/rhel_8-x86_64-openstack-boot.json index 0d24a75..55b43a0 100644 --- a/test/data/manifests/rhel_8-x86_64-openstack-boot.json +++ b/test/data/manifests/rhel_8-x86_64-openstack-boot.json @@ -9062,11 +9062,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -9722,4 +9718,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-qcow2-boot.json b/test/data/manifests/rhel_8-x86_64-qcow2-boot.json index d351810..c7ee063 100644 --- a/test/data/manifests/rhel_8-x86_64-qcow2-boot.json +++ b/test/data/manifests/rhel_8-x86_64-qcow2-boot.json @@ -9489,11 +9489,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -10194,4 +10190,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-qcow2-customize.json b/test/data/manifests/rhel_8-x86_64-qcow2-customize.json index 8c00ce2..45c9ac2 100644 --- a/test/data/manifests/rhel_8-x86_64-qcow2-customize.json +++ b/test/data/manifests/rhel_8-x86_64-qcow2-customize.json @@ -10,6 +10,11 @@ { "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/", "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + }, + { + "name": "rt", + "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-rt-8.3.0.r-20210214/", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" } ], "image-type": "qcow2", @@ -70,7 +75,7 @@ }, "locale": { "languages": [ - "en_US" + "el_CY.UTF-8" ], "keyboard": "dvorak" }, @@ -1457,6 +1462,7 @@ "options": { "gpgkeys": [ "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" ], "packages": [ @@ -2133,6 +2139,7 @@ "options": { "gpgkeys": [ "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" ], "packages": [ @@ -3505,7 +3512,7 @@ { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "el_CY.UTF-8" } }, { @@ -9605,11 +9612,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -10315,4 +10318,4 @@ ], "timezone": "London" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json index c057b23..3bad241 100644 --- a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json +++ b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit-boot.json @@ -8518,12 +8518,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811", - "2": "sha256:e8649e5f0a2f970a32fa3bf51e4e6bfb1b43348fd2eb7400358cdf38b62ea313" - } + ] }, "image-info": { "default-target": "graphical.target", @@ -9086,4 +9081,4 @@ "timezone": "UTC", "type": "ostree/commit" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit_rt-boot.json b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit_rt-boot.json index 8a9277a..f35ab2a 100644 --- a/test/data/manifests/rhel_8-x86_64-rhel_edge_commit_rt-boot.json +++ b/test/data/manifests/rhel_8-x86_64-rhel_edge_commit_rt-boot.json @@ -8914,12 +8914,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-rt-8.3.0.r-20210214/Packages/tuned-profiles-realtime-2.14.0-3.el8.noarch.rpm", "checksum": "sha256:e89f32b9da3b4c8cc553ea7d151a3efd2874057611e6fb1cf817cc945add15f1" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811", - "2": "sha256:e8649e5f0a2f970a32fa3bf51e4e6bfb1b43348fd2eb7400358cdf38b62ea313" - } + ] }, "image-info": { "default-target": "graphical.target", @@ -9514,4 +9509,4 @@ "timezone": "UTC", "type": "ostree/commit" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-tar-boot.json b/test/data/manifests/rhel_8-x86_64-tar-boot.json index 8a52ccb..bf0145c 100644 --- a/test/data/manifests/rhel_8-x86_64-tar-boot.json +++ b/test/data/manifests/rhel_8-x86_64-tar-boot.json @@ -5426,11 +5426,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "bootmenu": [], @@ -5726,4 +5722,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-vhd-boot.json b/test/data/manifests/rhel_8-x86_64-vhd-boot.json index ec37c5a..50a5f21 100644 --- a/test/data/manifests/rhel_8-x86_64-vhd-boot.json +++ b/test/data/manifests/rhel_8-x86_64-vhd-boot.json @@ -8973,11 +8973,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -9632,4 +9628,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_8-x86_64-vmdk-boot.json b/test/data/manifests/rhel_8-x86_64-vmdk-boot.json index 30b912a..3db8b41 100644 --- a/test/data/manifests/rhel_8-x86_64-vmdk-boot.json +++ b/test/data/manifests/rhel_8-x86_64-vmdk-boot.json @@ -1,6 +1,6 @@ { "boot": { - "type": "qemu" + "type": "vmware" }, "compose-request": { "distro": "rhel-8", @@ -30,6 +30,11 @@ { "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/", "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + }, + { + "name": "rt", + "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-rt-8.3.0.r-20210214/", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" } ] }, @@ -1234,6 +1239,7 @@ "options": { "gpgkeys": [ "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" ], "packages": [ @@ -1910,6 +1916,7 @@ "options": { "gpgkeys": [ "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" ], "packages": [ @@ -8609,11 +8616,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.3.0.r-20210120/Packages/xmlsec1-openssl-1.2.25-4.el8.x86_64.rpm", "checksum": "sha256:7d07d9055f557acf574e238327f003dc1a77dd119406e2326c844d17b818417c" } - ], - "checksums": { - "0": "sha256:fdf22c6bc4053e18287234376864d67af2fe61714b2984e9f15a1040d6e24929", - "1": "sha256:1d9f1600f53fadeae3ff5d355b4c6bf5821ed08e90f2e4169ba844b46cf2b811" - } + ] }, "image-info": { "boot-environment": { @@ -9241,4 +9244,4 @@ ], "timezone": "UTC" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_84-aarch64-ami-boot.json b/test/data/manifests/rhel_84-aarch64-ami-boot.json index 9861bc4..aa54ffc 100644 --- a/test/data/manifests/rhel_84-aarch64-ami-boot.json +++ b/test/data/manifests/rhel_84-aarch64-ami-boot.json @@ -3213,13 +3213,14 @@ "kernel_opts": "console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto", "uefi": { "vendor": "redhat" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -8901,15 +8902,12 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:d25d98997ea58cab30c2c005c75b3fc0031d86aef77f75715ad645c7ac14c384", - "1": "sha256:fb1b5d5839852eb6ac22b1b695557f94dde0a69e51eae95f0cbe5b531514325c" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=ttyS0,115200n8 console=tty0 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" }, "bootloader": "unknown", "bootmenu": [ @@ -9580,4 +9578,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_84-aarch64-openstack-boot.json b/test/data/manifests/rhel_84-aarch64-openstack-boot.json index 6c74a08..5cddc1e 100644 --- a/test/data/manifests/rhel_84-aarch64-openstack-boot.json +++ b/test/data/manifests/rhel_84-aarch64-openstack-boot.json @@ -3446,13 +3446,14 @@ "kernel_opts": "ro net.ifnames=0", "uefi": { "vendor": "redhat" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -9462,15 +9463,12 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:d25d98997ea58cab30c2c005c75b3fc0031d86aef77f75715ad645c7ac14c384", - "1": "sha256:fb1b5d5839852eb6ac22b1b695557f94dde0a69e51eae95f0cbe5b531514325c" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 ro net.ifnames=0", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" }, "bootloader": "unknown", "bootmenu": [ @@ -10185,4 +10183,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_84-aarch64-qcow2-boot.json b/test/data/manifests/rhel_84-aarch64-qcow2-boot.json index 8e896c3..ddec705 100644 --- a/test/data/manifests/rhel_84-aarch64-qcow2-boot.json +++ b/test/data/manifests/rhel_84-aarch64-qcow2-boot.json @@ -3398,13 +3398,14 @@ "kernel_opts": "console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto", "uefi": { "vendor": "redhat" - } + }, + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" } }, { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -9370,15 +9371,12 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:d25d98997ea58cab30c2c005c75b3fc0031d86aef77f75715ad645c7ac14c384", - "1": "sha256:fb1b5d5839852eb6ac22b1b695557f94dde0a69e51eae95f0cbe5b531514325c" - } + ] }, "image-info": { "boot-environment": { - "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto" + "kernelopts": "root=UUID=0194fdc2-fa2f-4cc0-81d3-ff12045b73c8 console=tty0 console=ttyS0,115200n8 no_timer_check net.ifnames=0 crashkernel=auto", + "saved_entry": "ffffffffffffffffffffffffffffffff-4.18.0-275.el8.aarch64" }, "bootloader": "unknown", "bootmenu": [ @@ -10096,4 +10094,4 @@ }, "timezone": "New_York" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_84-aarch64-rhel_edge_commit-boot.json b/test/data/manifests/rhel_84-aarch64-rhel_edge_commit-boot.json index 3767320..abb66c9 100644 --- a/test/data/manifests/rhel_84-aarch64-rhel_edge_commit-boot.json +++ b/test/data/manifests/rhel_84-aarch64-rhel_edge_commit-boot.json @@ -3015,7 +3015,7 @@ { "name": "org.osbuild.locale", "options": { - "language": "en_US" + "language": "en_US.UTF-8" } }, { @@ -8405,11 +8405,7 @@ "remote_location": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20210120/Packages/xkeyboard-config-2.28-1.el8.noarch.rpm", "checksum": "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" } - ], - "checksums": { - "0": "sha256:d25d98997ea58cab30c2c005c75b3fc0031d86aef77f75715ad645c7ac14c384", - "1": "sha256:fb1b5d5839852eb6ac22b1b695557f94dde0a69e51eae95f0cbe5b531514325c" - } + ] }, "image-info": { "default-target": "graphical.target", @@ -8978,4 +8974,4 @@ "timezone": "New_York", "type": "ostree/commit" } -} \ No newline at end of file +} diff --git a/test/data/manifests/rhel_84-aarch64-rhel_edge_container-boot.json b/test/data/manifests/rhel_84-aarch64-rhel_edge_container-boot.json new file mode 100644 index 0000000..a0f2abc --- /dev/null +++ b/test/data/manifests/rhel_84-aarch64-rhel_edge_container-boot.json @@ -0,0 +1,9104 @@ +{ + "compose-request": { + "distro": "rhel-84", + "arch": "aarch64", + "image-type": "rhel-edge-container", + "repositories": [ + { + "name": "baseos", + "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-baseos-8.4.0.n-20210120/", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + }, + { + "name": "appstream", + "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20210120/", + "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + } + ], + "filename": "rhel84-container.tar", + "blueprint": {} + }, + "manifest": { + "version": "2", + "pipelines": [ + { + "name": "build", + "runner": "org.osbuild.rhel84", + "stages": [ + { + "type": "org.osbuild.rpm", + "inputs": { + "packages": { + "type": "org.osbuild.files", + "origin": "org.osbuild.source", + "references": [ + "sha256:b984d8576520272b1011cc46b03c666cd6abc1bf74b428a8781ca58c6287a007", + "sha256:d9a4628bd8d3e776f626be4cb5edec305c2ff894d7c5cc7e33e212545721053a", + "sha256:b9584e6823ffe9ccf79282bd57ee076a1e3a71c4c1020a20b5e1975141a50f14", + "sha256:8432cb44373e7cdbf1e98dadf0c87c84d6f71c69b6c0dc2ee7c1c63bcd9ae568", + "sha256:14df7263bcc35cb6633321f36149ddadd479ca334798bb33544109a2c61a6213", + "sha256:40096d3516d115e83bc2aa2b5877708f4511961d524e03ce562f9f1872fa27ab", + "sha256:2d84f6765b1645f867527f493b6153470602a80c75f81545bf619aa92127e4da", + "sha256:703f78e932f243ccf2890039ab582176b829f4dfc302a4c9a4e48189eb3a0bd2", + "sha256:6a6aa18217ae72a0b33e4302da927e6ded92520cbf4d48a5030d4a2f95eeb5d8", + "sha256:15c33124ac0479d34f1f58d2bd24cc52db7089b4a8681c276a3fd0d6dfe4fc72", + "sha256:e085cf8bddcf09c908d925688dae077300d2964b40bd060af252d26a963cfe50", + "sha256:5c76dbe73576bfab1276dae50d170f00dae9bdc176db668814a57a0e50b538bd", + "sha256:b7bc10e9947763df6e6177b3dbbe77c21f55ed60d26c4c28bfe14a98f7e06189", + "sha256:acd4674b3fbe01d6cf94eb18a81cdb00beb73bf3d4a25a28e234f31498f5c389", + "sha256:b66c71cf784c46f4040c6cf450dd0c0b1d0f69e3e86714fc7cb6ea0f2f2331ed", + "sha256:6745b40a87d7633509401de65b8690fcb4aba78827476cfb7323454e7c097c33", + "sha256:59fd4b56ed2089601c536ac6fbff68ba90a746845a8c19e653204ead19f7590c", + "sha256:64ebbd2fde4b8287945bd655bfd966c5e3b347e6df64f6621148e6408f067f69", + "sha256:41cc2d507fdfbba939c00164a563e770d466f992cb64d3c51a79aec20b31d6d1", + "sha256:6605f90a788c38571fd9dbd414892d18aeeb63909d2ac06f3d281a7cee190c1e", + "sha256:729c6203f219ae17e161ab85e5f8dd109798ced06da046194bca71945281a660", + "sha256:6b73380798b248fc1bf9435f22bec2269c21f903ebc4af64286ec30be10f3470", + "sha256:2511bdfac0308e244c4c0e3411eacc21398e4efdb7714320a5d44d9096f02f49", + "sha256:0b7385d2636401a97bfd84a7bf6c5c1dffdcc9a9cefcd631955001d24384bbe8", + "sha256:867fbcf3ba717366af26246c3a5ad8e587a7eb1649d8d7e9523e56d4b8763495", + "sha256:5796f803473160831b7049d69d214fdbbd6e2c3bc06fb0cec4ad8a722ad28050", + "sha256:3a684fd5f1b1d417c6c3e9d1f0d5b846138aa06450ff246425d43d4a20bd619e", + "sha256:e381bbfcb84a338d74ab793c99529368708c61b466e222983d50fd7e026970cd", + "sha256:0d7867b42fb1882445ddcce818f1660b10da8873fa33f50432c1e7c3ba4e7f03", + "sha256:2efbfbcce7ef24e433d3c304b6b6b022d1b1b8a972969da1adb1c3c85f9625a7", + "sha256:e51440f9e6be5394b4606930b87bb8548110fe8b76409508617cfd736c477e88", + "sha256:3256e78263462d5d7ab37b696992aedd6f810431641ce8d1e1bc198c797b402b", + "sha256:da4d193d5f0caf7a196f3bd4aa1225072b522521d82fca8edecc6546b5460ac6", + "sha256:670d04bfa35239cd458ae4928db4ebaa5d31a530c0ee78ec6a16968f8d375783", + "sha256:9ea1439174cd8872c315f65e7c6dbc744e5a2df0dadad378a8a41cafdf23c446", + "sha256:02c8f76fd8b13972c541e4fa3bd2101681b7d4baa1320e3101bc4167b5531685", + "sha256:733daabb1422fb8ecfcd589cad45e8359851c40ca6aa82dab2703c6a1842dabe", + "sha256:77b56d825eb31ca191254d17a4c9399e3c4fe8af42a528c2ad4424bfd865b82d", + "sha256:f7ccbe0d7b4a61b5a47253f168f8efcdbf41ad0755e678f9edcd2f6a69c93c7d", + "sha256:3ee66f993ee567b2457a221ed364ae4f8dfe783a5f0e723d9169f95d12f9e696", + "sha256:634a3cbf0b334e901b6887176fa1b98246be7c4010b4c21cb6fd8fa7aa5fdf94", + "sha256:540fa90864b4eb0176b56e0c5e9d7bc6130985288ae297b4c38950381b08a827", + "sha256:0c851bb11d2bce1ccb4804a958d21c1082267b8bc2f7f825e5236857e1f35274", + "sha256:37fe346ef6d0ddec5894cfcf96d04ca41924a16a8199814ce8ae7f125183974d", + "sha256:e08305aecd924631284ddaeae39a83cca85495389d4ddef75410a32af49f946d", + "sha256:2edb367fd27cd2b1a693d53cb40186f1508f7d1fe06a59a25f7f190caee860e3", + "sha256:3f5765cebcac288cc1b5b118acfbc2016eda7b81ad73923f6f9c21e4731eb0d9", + "sha256:8ef2fcbe5a8d6e7d393d28838ff458336d16e006bc7d19921f460eb105b88570", + "sha256:fddf61e9024c41073442ccff0c9990fa004e9b183f391c4e3cf3853e5ae6062c", + "sha256:ce6960fa7831611815e163864a91b70b0ab1ef0f446c2cad1eec13404822cad5", + "sha256:d765eda1544d6120cbed1f4120657e2bef966e57c9962f52a49d3c6ecab05e06", + "sha256:ae1ab5b5cb6ebd690b8e35154dad5efcf0c6c2f10ef0c229ea7c0dacd100a2be", + "sha256:a66237310e1837fa7274d3294af89b472dd76760c2d171a3b9416fb3942365c6", + "sha256:f7b97f487dedc87c7c7c9f0bc0ceccdd4faaa04f292c60e0985e0f8bba576c1c", + "sha256:19efe6f125c00123ccc6d96e51eb61e711f3ea01f32d18cce14d3b614217c58e", + "sha256:f700797810fb2bdbba5a0b31e10c361360a87bac1a282da109273194a25bf6ef", + "sha256:0b4564ad3a799af1a4a0de33b0952f6056d942b0cfa39b73e9375bf0c05b3191", + "sha256:50b64b55c2b3dc5d806e9e2d2b40fdef7d8fb286eabc6f9402af0fcffe5f303b", + "sha256:230f79adc8fd2bbd4c2d32014ceb7337a3195c64f1ff74c4a6e0a3cf9a75761f", + "sha256:81d2e21dad970c08798c0df00bbda21acf165a370f9612e0d14ce69e5dd6c5c3", + "sha256:7b18fb9f4493d06fb9d422688e519e3276a70c8640aa186cefdefc4fb2daa8f5", + "sha256:080d69c44f06d40369ec02a253d76bac481d769a84f61f2aaa3051c8fffc8cc8", + "sha256:e13e2f2bceb048765cae16fc4f93cfe17838a800c42cb5ee2ad06f5a4fc317d6", + "sha256:5eddb5c1febbe6e58491f8e9ee8fc9897298b307e0357c01f49d445cf25283c9", + "sha256:eefbff094f66804c8ec1012a064b013f3ec2560d5f734781ca97f7040d74ff71", + "sha256:fc51460213b3bf5b67f08f2695aae8d728f614adbbacb917a0825e4ebfbc3e68", + "sha256:cf8fdbfcd359aac8bf55500c24e6843baafe8fef35019126c3616806b41415b3", + "sha256:3f7e5e72ab9e18dbca936b40734c91520242a49a9e98a2f2589f397faa6ad8e8", + "sha256:78cfa06fe69c278490efc71591981434d0fcd2d4b24ae4c787c747c9601a1fbd", + "sha256:1011da3289e2cf164607cf56000a5eaad145394f8b275ae4d96a980ba5cc46f7", + "sha256:1143ac623a74d7feaaaf293c18d942d243248f6356628f87216670c10d11687b", + "sha256:10ac3bf7565725a55b0aef56f65befd0d320219fc83adfab6e564c19f8c44bd6", + "sha256:f0cb56a04fa3b27c1a3bb8896372077234123b36fe3461aca8ddc7b912030ce8", + "sha256:a41eef48b706b929464a45a4dbdca5b16201931fe56ff6ada4da0157db5e4b73", + "sha256:e4ec1966f9bc7cbc898fe7550600ae3e9e4f8afbcdd3f6e74afe1965247653ba", + "sha256:80aae995798350ff2527b774b9da7bc562bc27a398d9ee2dbac52feb26f69e84", + "sha256:baacf0e7332f6ec37470e014ba0ea5d24b4d050f2e9385531c0c950c7ab1883d", + "sha256:9e519a05f2890cb6cd436ff1906ce2bf897e8f91083c9dfcd1ad3a7c4b7fcefb", + "sha256:55e93e89826db400efa8410e0170f2b478321ceff5aa2df314398b8d3cc1245e", + "sha256:7c014b54f7929348f614f8f4eb7a1552b8565c0a57f3a75ff6471dc05f30cafe", + "sha256:98f838a9775269a0f796151bd54d52c7ac91d4bf1365186772f243bfafbb136a", + "sha256:a24b42ff8657390a8cfc7c82106a57e9f4e84443096ea32e49d71f41e46d6d69", + "sha256:0f1a02850c102e2a186787504f965c0c10d6432b9f600c18bc2f520e55f04a8c", + "sha256:6f2bfbe0f23d3b233aacb72c153ee133839353325f028321eb5ea38b0dc06c02", + "sha256:3091b70196578286bd75b98b013deb58191a5a4cde6764e89db78bee0f628ddf", + "sha256:2cddadff38ccef2364a7e40af0e1d9b3bf9c06869c15ceeb655f3cfa431c2083", + "sha256:62a2878605ca0415fd60adcff4c7068d855d20737498a968fabc646610ccbe5c", + "sha256:e5f82f102f51d88aa517bbebd170795a571b7ddc3036574b92b498cc13704d98", + "sha256:ff9fc6467a4c2fd0c22c419a9cdb7a524d1c69d0c87aa09f31728bef9f692f76", + "sha256:e58ae3f8143d7fe7247aa9ae03bf0df30e7877e61dbebe727f4b4ff67f2e7395", + "sha256:3a573ee517c0b94992414b6129347d425329f3c0bbd928889f5958c1dba58a54", + "sha256:1892294b56e349d84884bce686e48006b21f0b56d03c7e235f8ea934ac5c8c2d", + "sha256:8b273938591908ea80cd8cf0dc24b8b8e3d275b0db6438c6ad37290a355cd8ef", + "sha256:c3d77f12bc5b1af8b377d37614616768c2c04bbda83b2e1d0f3f844c21e8efb6", + "sha256:058822931f4c34c18675116c1b02b718de4044c1019acb0d5f97417f00a30ba7", + "sha256:3419800de39dd7bae5f5eac74b077e285e031d81abaf7f9597ed6a90a6a29d25", + "sha256:4a40a1538c8a488f32476f96d2461c3b792eb0cf5acb998e397d8a9cef8e5461", + "sha256:1a9d808e6fce4a10f7982e4b1b598d9f9c9f20dbf1d9555e7289120b9dad9e2b", + "sha256:8498846918c7bc7a20553340434cfbfb0d19185adcd0ff52866c6506ab8f747d", + "sha256:114f1c0781e242bcefb3764726368eb97005b3ebbe69fa0cdee5885e9453c91e", + "sha256:5a05f1126ed38f752af247dcdf7c958e738b935b8b6d942fd42f423768f05255", + "sha256:2dc8e2f52451d1a11b16bbb389a24c58b61a1ba804ee777f9d06dbe4e1fcf6e5", + "sha256:83301ca502322e0634173460bf8fa35572c36ab8cc2e6e600bf9980f845fc857", + "sha256:f07b1f40ebb1fbe5c24e68a38b5f768a21e2ec2254d4bd8ff61fb0bde72f64ce", + "sha256:704e1dc996a17815c6dcf7029c0ddb2849d40feaab6e9b9c687af9d95fef825c", + "sha256:fa80a7e82e231dc77b3e44edd2cbf5b3d1657e009e59f15bbe8d50a4290b7c82", + "sha256:ba1364539f16d7c8379d7563fd0634651fa8a05b3f7098a21ba96e1f5641f132", + "sha256:fac72b5b7308a2165a8dd0f40046facc6a4a695c253812ffdc83b9abe41704d7", + "sha256:4874e739ed37bc6a5bfdb6069d4620e5f7efe01d60eb9fd2550c550167c99990", + "sha256:471663fca7e3f609834368d69d8f1f469cfc0d3f3e95dc2b79381722d0368edc", + "sha256:435a2be84a2b38372965dbd60ffed0ed38a616b8100859787a8bb3b19d9fc4d9", + "sha256:6557d001315e85ac123b1378c5aafb81428e2383debcacf3f91c55476cfc48eb", + "sha256:d0dccf816695a9726edd1a67920db97237c61539751f6d27725e58c43009142b", + "sha256:0571b1312316ae09a222185f60c4db69bdfadc80e6da408e29218bf5e1699c1c", + "sha256:d6af0d986b806c10770b85292e07dff2fc5a751d7be309e966a45253b1081b91", + "sha256:ae411345ee8271ad3985d445d728a5f010eec9725f69b7ba5536099d3713b8b0", + "sha256:cc7e751a62f9a28b82df0bce0ecfb050364b8688ef69473f1910909e44c5eb98", + "sha256:c1b5c4668331e8b05a08e7de432cbfb75f8072401bb6651a24e43f64eff8dcc4", + "sha256:abb0876ae8eec548128e5d468e1a4d2f89a4fde54f7b507de8f54f95989c0236", + "sha256:9d81ba497977c81475fc33d99d9f031587703c3ff1513655c5b421dfc48ebd31", + "sha256:80b723a9291b972ef447645e68b23fca5d8913a37231dfa13b7b6b3b0ffe2ef3", + "sha256:f589feab172d6fe2b27a4fa65f2cbefea7e1115be784dc5b9c6d619290614a4a", + "sha256:bf267d9571cf568375e261d593236750f400ac536c1c818513106482ebc3fb10", + "sha256:932a793ac8ed1c6b3670c0664a40a8f2a5b32003ff13a1cd6f3e4beab2a1caa5", + "sha256:d089fcac5f9bdf4dc3eb5ceec2972a664c58c70a065caa18643e24db537cacb3", + "sha256:268d9232f0853037100432e9363c659cf99927e03f759fd4884643b560710cd6", + "sha256:3ee6a4f61935c2f0698ad2c4834a5864920a1e48d55c7800da7c382249895e39", + "sha256:121a18cdc3ff0a1d66b8f9a879ccabffb501468b764d7d285abbcf5c25337bd0", + "sha256:20f5d6e95a5ddcb0f25148460db65e5fd739e500164b18dacae7c80c223dcd1b", + "sha256:ed28e1e31109e27ce1c676914364c9f1dd46b71d00cb4cf13931f0fec6cf6978", + "sha256:481bbd6d73415d437a73eee7977ec370299acdac44b215a026652debba31783d", + "sha256:da4b9bfad26d559485ade669556512acfe93ba23d204f2556bac82c09401b4e7", + "sha256:d6d24a82dfa43d78fece4406366245a3e52bfef69e4217f70e4f940fe4bf56a8", + "sha256:ad07261ff4f478be9511f7ee749bfbe8b2ba8e28696c2f561caa20e35c535134", + "sha256:3a74a74a9e355f2d5c6f3a6ffdd65d12e7dde60529240c40e4bf0e0b63f7b9e7", + "sha256:532d46a4c0e68bd45eabc3e2ba6d570880344044e1034f5f347b37c470d0dced", + "sha256:876ffb285aaeddb2c18ae32527bd4ee202710bd8e18d5b410af22937646dcdec", + "sha256:678730e5be5785e65f820e213ff7b0c6cf16298828f043dbb2208addf31636fb", + "sha256:7864fbc866ae5a3e59b4f0f114b77ff52b55e76c5388a917f82a6097f02a4db7", + "sha256:19d1de27d2f62b4a55735233807f70a1e8ff7551fed97ee8650dbd09c1ef50ea", + "sha256:bc0f9bd34ac6a01dd7272b87e1b7a33045ff8c6793cac02fa639dfc9341e8215", + "sha256:64ac5cb6fd3da1610812795ce17e09648d89c87513d6284b852a3455b0831d3a", + "sha256:a3d6ab413ed56c64f62ff28ca1f5fbfa6e6acc11faedc601a1d5268cc618b2cf", + "sha256:320ced09e242f09047f4fab0a7f66aba6de2e42583f6a2e164eadcc1ffd0b915", + "sha256:8ac1003d722e3d5f383c9b970bf6dfbc905007a624abadb63e520d7a93993747", + "sha256:ec84264c5a188f1e717dcac04fb190869a3e801d54b0e83769e3f42b27fd180b", + "sha256:f99f5edde9ad4574b84264c467420c910b31f78683fbf1b63d106a7e6c9d64a3", + "sha256:e2c4ac0f7abf75cbcc7a6fb35412820c267f1a8ce614f41b60d901918c4616d5", + "sha256:daf36ee86ec6001770ae68bdd82409526faf4b9b1313a6b74fb54cfb98ff571e", + "sha256:f7a64b1cc43949294a02eaec57603a3d9d4d69648f389d146cf887777d595379", + "sha256:2428f4d05aab9c2eddc09e4c5d661409c88ca0066ef8e8f2d40a8171e48878a8", + "sha256:c95781bcb432583821dc43f5ba7b0f28424260761a04b55bf7ff30ef380fd60d", + "sha256:290c83afcd2b0a2b17aab95cf72a85da5f8b9f9a9862857c919a0f43e3fce70e", + "sha256:43ab42c8a58267936a89da99e37d3b9fc56489e958060f600ba047445ca44ee3", + "sha256:8dc165d8cb6f470c50efb88b0e69b73954e017c394b5f88ae7ae74dad2e10276", + "sha256:9a62441377e06065325d9463abfb027b06a4bf02583c8b3cb59e2c703ff60d0c", + "sha256:f48569bc41b0d1ecb15b3a96fe31260b1427c9bdd8fd19cd775f882f45c37b43", + "sha256:fea4eb54fe59451b76fb40b9bd15ff41f0f51bb7371f94b2f5df572ef917d037", + "sha256:ce8c92fa2bef1770f44992db24e1cb8cc850feab03a74cf0ebf741ecb0d160ea", + "sha256:f847957437e7f24844930c4a3ff64c5f7877f083553f48eeadca3c5f5e5c728e", + "sha256:89d3256c268e78b1bc10d4f4eb3e996f4043b1e672b66d02d097cb9c6c76d466", + "sha256:ebabdef0fb8d011b9d51adbb3e2497cb80cb1c5e1ba431ca4994a2dfd9d8f52c", + "sha256:226b4efe6fb8e19d17cf4ffed266a413dac4801ad804887e5e00f7fb8e6c2ef9", + "sha256:b90ce065d5ea98845733ff06e47d385937f6293ebddf52144c80f5fe1f296307", + "sha256:861346b2e683c09a53c9418a9ed08faf7448e066e3111482c70722cb62a6edce", + "sha256:8fe65a44c81c47672f8c60e8a0774d2386e86eca6f2ce917d8826b91b1273b24", + "sha256:ffbd359a18b3e49aa9603e1b7b4975f6b86170ec314aef78359ecdd788c3335e", + "sha256:f8c191d8b952621d10a1055be960bbe07be66f557c5a9d007f8908abcde1b9af", + "sha256:ae590ec0f4e8f7cb01d25168a6f68e54f383b8e5d3fe5676a3f2cd1247051a5d", + "sha256:7fd245efbd8214be4981128cfa05c59000c08b6ec0a9818f6f3c819c140ab7b9", + "sha256:95a9154fb31f6f703066ac47a1d30ec45ca363b8f6c3a31b9fc0be67edafcd7c", + "sha256:9a6eb680e8debcd0b97575a76e9cf0d0655ef7f875b362542e0d129f5e423419", + "sha256:3a3207904e90b42a3fcf474f906e4c1544dbdccafa0d7e6e0406c32fd31e2a63", + "sha256:f5a8c222570915524e2ce7c1afd4b9c9dcbbd4dea0faec823d237b93dd8b36bd", + "sha256:2bbd02a9d82bb0226cd0d1602eeb0eb75351047456e164fd0cfb62e2c3487e07", + "sha256:4702a5969b686f5f12532ba6eb660d704d117b2156d1188a0049114de93b4d62", + "sha256:b5b1f5f7a02f70db056861813ddcf181f2ebba507cd368fbe2c32f262edf7fc6", + "sha256:616b23d84d2c4f85463c1b72cf1fcc2c99eeac38e94ade7318a195072d139641", + "sha256:1ed3940c0466986fa38fe9d3bd5fc6370b5e62edba51f7a8359eab786b4b81ec", + "sha256:932cca0b2aa28d64538fca0401acc35bec34f14bfe99d3e22ea8452b79890eac", + "sha256:c2f286f6b75caf1508829d748c35833ee5fba762e0175b1f5dbb23ab8ab2079e", + "sha256:c478d6ce678a44a573920ceb15ef7a29fa9d0b7374de268d618916ac10a43130", + "sha256:eecc821bee345ce928dbb6d78f625291229b67f3fd89f2fc22d408c325d74b91", + "sha256:47b483c0f556c56f0b1f468603c57834864902ae5a849a18c8a0ca5f76d66c86", + "sha256:c633b98b4dbf96674a69573404819c34d66eb7e19820283fc588f6b10b0e3fc8", + "sha256:d3fb5a473c44cd8ae6b94d6bf3fc552553d8f4ef28eed439658ea38990ab9db5", + "sha256:0a885c6dc6abd969b828bf2fd7063ee884e6d058eaf405b02f3dd6efb6c66bac", + "sha256:0bb7024125ca67119612e55a92da13c989e0306ddd7de7e655a679c963939ef7", + "sha256:125c92f23d87b905c21e9f7669f0ec6e41428ab63c8c13f63db8980f292797d5", + "sha256:07fb749839674b27283c30909e7f8f4e5512f5971b1bfd0b6b06efb5d579bffa", + "sha256:c32b936c825e813045282e44bfc5f5c8ab4adc4f28b5eaa91f7c4aa1f8b0a127", + "sha256:aa4b8463be8bceddb296424e76ddecc80b72ffc8543b6746eadfc4972131b6e2", + "sha256:aa85c77f603c13f1f2154169238d1a2eeac0be423baa5b027f648a74bf030106", + "sha256:19cd894b4154d1a8521c6884cfd2a6eaf1f498b7dec5cc31408f8535b9098f2a", + "sha256:9e2de1bedfd2ddaa28f43e430112e254b19086c1dfadcde9891b89e93a7efc2b", + "sha256:4368bc8c228a4fa797a1cb2b0a70ccb3629d2a785f767a57c24a6321a8309b90", + "sha256:a104fd87c0558f01df4615ec1c13feada77cb066e5d1ba67028f1ef751ad4158", + "sha256:bb97ca006ae977c66b979de0f215eb04d766aa0cc3ab9ddfaec4ee90006930ad", + "sha256:359968cc75af20da87f58537dda67ff4ef28c588c0820bfaa24266604a979f10", + "sha256:ba66a87402ccc8515e164f597f5d254ad9513979fe3ca1ffabf63c915c0daa73", + "sha256:17334b3eab9c115fa356739e551f50ec59c11709d27a3a5e6ccbff783c87988f", + "sha256:bbb25c0afee8c928739801a506a24e54944047b3306498175515544446e7f4f3", + "sha256:5993a1b691dc77ea966c083de8e19c40ada9ea56618df934b2e5c80a12426308", + "sha256:505e415e559abd5995cd31f6fe599b5f5832d344b497ef12e556a515057fd162", + "sha256:0f32d23a6b2b15603d710b0317238ef8dde3de61eda96713e21d86c9fc7a98ed", + "sha256:1ec6bf2e6adfa78688772c6ab4f87acc93d7f8a3b55d293e83ae7c74ee952c74", + "sha256:e426534c59b3a35068877d324dd34d643ad7c84d2c406b2e6502ac6c2a367d39", + "sha256:094eff70081085f87a7ac0dedafa851ad8ac8e03f9f328636df4a0f8301d0e87", + "sha256:3d372ca16c46e471896f6cc4387142f49b5733e6649e7107929387be3117e9a3", + "sha256:a07f96031fbe9507a8d6bb0e14cf0783bc615552e4cfb75131672072f5729de8", + "sha256:3fb70c28bcd40898f3ad02d339c6d7bc26ff7667a0ba356874119fd70cec9170", + "sha256:d2b03b2961b44295e2fe8f5464572ac2225e38c3cf9787198c698acf8da4a3fb", + "sha256:22c0e44318e36e04ad1eb4632dcf25db991f481f9a543387d372e1f2ad92561f", + "sha256:e84ccbbba97c8f00ade8979d22578f30610dbba00f176b22b3a704a6c466b407", + "sha256:eeabe7958b5c845f5985d4d42e7ce3dbe731e96ee012252866acd1e3be7974ed", + "sha256:5996ff948b5874f894c5ce3495652e6de552addf2331fd82193023d77994ef8f", + "sha256:39dcdfe3b69177bada2d3665180e095de832a868fe5797a5c6764118b75e20eb", + "sha256:72af71a936ab0892375825901d18b0de6ba66358282cd1a7e7f8f61804a953ff", + "sha256:770a72662dc3d61cbaa2217a1bab5cb0ec955cb0d587ad0b0aa520414eb571a3", + "sha256:0a6d5020a518723f5bde47066b1de6fbb4554af12369508e68a8de44d0ff8fec", + "sha256:340b3c65becfca3d39f2afeed9659505a33ee870270c4d115d9fefe8929ff806" + ] + } + }, + "options": { + "gpgkeys": [ + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n", + "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\n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\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" + ], + "exclude": { + "docs": true + } + } + }, + { + "type": "org.osbuild.selinux", + "options": { + "file_contexts": "etc/selinux/targeted/contexts/files/file_contexts" + } + } + ] + }, + { + "name": "ostree-tree", + "build": "name:build", + "stages": [ + { + "type": "org.osbuild.rpm", + "inputs": { + "packages": { + "type": "org.osbuild.files", + "origin": "org.osbuild.source", + "references": [ + "sha256:80bc5c2d45224a1948f0101228da989138d4006a77c67560247a6edc17e7c22a", + "sha256:8ccbbfc215ecd95f8774055c44d324eea401a5e22b3d24410d67c7a509aa97ad", + "sha256:ff3912a8eaa7d0159d78b14f09f61063090cb134c41c8d5a0e92c820ba6a2822", + "sha256:499861559c90bd94d41f5ba8d6eb75779cf16f56577b6657f279f1b8d422363e", + "sha256:9be59757e939903e80ba181d43ee4deec36f1094cad429175d13ff61744cff13", + "sha256:95c85f88e8c34775bc5f3112dfc328358680a46f7226b8ea3b170b03f777e45c", + "sha256:b984d8576520272b1011cc46b03c666cd6abc1bf74b428a8781ca58c6287a007", + "sha256:81c075f5e4c2c10ec6ac49a1a4c54ea22318124fbcf4ad5afdbddeb055cf2552", + "sha256:d82c81115472a70d60d2320e254762c76a583ad2190ad45068476c77512588af", + "sha256:d9a4628bd8d3e776f626be4cb5edec305c2ff894d7c5cc7e33e212545721053a", + "sha256:b9584e6823ffe9ccf79282bd57ee076a1e3a71c4c1020a20b5e1975141a50f14", + "sha256:8432cb44373e7cdbf1e98dadf0c87c84d6f71c69b6c0dc2ee7c1c63bcd9ae568", + "sha256:b705e2abbce31768f9dde08b2e3bb4756f2512ad22ac94f4bb6761c530b66f71", + "sha256:095de0e43f814423b761946c689ce3a10bfe9b705186ae3d6030ed76e465d128", + "sha256:14df7263bcc35cb6633321f36149ddadd479ca334798bb33544109a2c61a6213", + "sha256:40096d3516d115e83bc2aa2b5877708f4511961d524e03ce562f9f1872fa27ab", + "sha256:2d84f6765b1645f867527f493b6153470602a80c75f81545bf619aa92127e4da", + "sha256:703f78e932f243ccf2890039ab582176b829f4dfc302a4c9a4e48189eb3a0bd2", + "sha256:adb9e37c63a055bc106a9676c10a85fdedcb4af64ae062249732e158bc0ae9af", + "sha256:6a6aa18217ae72a0b33e4302da927e6ded92520cbf4d48a5030d4a2f95eeb5d8", + "sha256:13f55a1fea88c4720dc704fa19573325ddde8c1c60ed71e96f98a9e5a6508d44", + "sha256:15c33124ac0479d34f1f58d2bd24cc52db7089b4a8681c276a3fd0d6dfe4fc72", + "sha256:e085cf8bddcf09c908d925688dae077300d2964b40bd060af252d26a963cfe50", + "sha256:5c76dbe73576bfab1276dae50d170f00dae9bdc176db668814a57a0e50b538bd", + "sha256:b7bc10e9947763df6e6177b3dbbe77c21f55ed60d26c4c28bfe14a98f7e06189", + "sha256:acd4674b3fbe01d6cf94eb18a81cdb00beb73bf3d4a25a28e234f31498f5c389", + "sha256:b66c71cf784c46f4040c6cf450dd0c0b1d0f69e3e86714fc7cb6ea0f2f2331ed", + "sha256:6745b40a87d7633509401de65b8690fcb4aba78827476cfb7323454e7c097c33", + "sha256:918118ea8fc62fa93c11b0dc12ad8b778ec7bcdc17c0a0887c996e69e7f8d296", + "sha256:59fd4b56ed2089601c536ac6fbff68ba90a746845a8c19e653204ead19f7590c", + "sha256:64ebbd2fde4b8287945bd655bfd966c5e3b347e6df64f6621148e6408f067f69", + "sha256:41cc2d507fdfbba939c00164a563e770d466f992cb64d3c51a79aec20b31d6d1", + "sha256:6605f90a788c38571fd9dbd414892d18aeeb63909d2ac06f3d281a7cee190c1e", + "sha256:729c6203f219ae17e161ab85e5f8dd109798ced06da046194bca71945281a660", + "sha256:6b73380798b248fc1bf9435f22bec2269c21f903ebc4af64286ec30be10f3470", + "sha256:b847207a13bec4b7fcfaaf3668d93bc5ad40a6477f976e6aeb59ab431545d0c5", + "sha256:2511bdfac0308e244c4c0e3411eacc21398e4efdb7714320a5d44d9096f02f49", + "sha256:0b7385d2636401a97bfd84a7bf6c5c1dffdcc9a9cefcd631955001d24384bbe8", + "sha256:867fbcf3ba717366af26246c3a5ad8e587a7eb1649d8d7e9523e56d4b8763495", + "sha256:0eec782945aad8fd019834898ff64d13b68086dc1289a3d3f89cf2ad905f7c54", + "sha256:1257dd5d5972fb1da79739991c735248456452c29ce6488177b42eb5f0495eab", + "sha256:5796f803473160831b7049d69d214fdbbd6e2c3bc06fb0cec4ad8a722ad28050", + "sha256:e85f9621641a76d6766a75b92bb1a472cad8efc3c38c6e349efa8b62947aa94a", + "sha256:ffe62239aab25f7963fb1fab607e36127b7a07ae51edd145821b264d76152110", + "sha256:53ce968a0e3d72c39bd6234153f719703615a7891ad65c71d36be68a0c72f49a", + "sha256:71abfbf9644b3ba2409edc713d0801031919370a5528278839d555df3cb434c9", + "sha256:3a684fd5f1b1d417c6c3e9d1f0d5b846138aa06450ff246425d43d4a20bd619e", + "sha256:2efbfbcce7ef24e433d3c304b6b6b022d1b1b8a972969da1adb1c3c85f9625a7", + "sha256:e51440f9e6be5394b4606930b87bb8548110fe8b76409508617cfd736c477e88", + "sha256:f756e4702f82b14cd152b0be8ac9841107a0de3ac3884aa3db70ce6db98a423b", + "sha256:892298be919e44d33048894c71de9cb2157b02eac45c68ebc2fba41e0a888475", + "sha256:3256e78263462d5d7ab37b696992aedd6f810431641ce8d1e1bc198c797b402b", + "sha256:da4d193d5f0caf7a196f3bd4aa1225072b522521d82fca8edecc6546b5460ac6", + "sha256:8c9c059292e68dfbdec942133c22ef69fb4113166def6ad66903a1973bc9bccb", + "sha256:c321e3a0253fb2691035135b3d3740faa76b8e9c84a0378f480ff85ddd9f16bd", + "sha256:0b1d603aff739cc657fc68cd47435c2467ecf2931739e570126bb1b68cc882d3", + "sha256:670d04bfa35239cd458ae4928db4ebaa5d31a530c0ee78ec6a16968f8d375783", + "sha256:9ea1439174cd8872c315f65e7c6dbc744e5a2df0dadad378a8a41cafdf23c446", + "sha256:02c8f76fd8b13972c541e4fa3bd2101681b7d4baa1320e3101bc4167b5531685", + "sha256:733daabb1422fb8ecfcd589cad45e8359851c40ca6aa82dab2703c6a1842dabe", + "sha256:77b56d825eb31ca191254d17a4c9399e3c4fe8af42a528c2ad4424bfd865b82d", + "sha256:f7ccbe0d7b4a61b5a47253f168f8efcdbf41ad0755e678f9edcd2f6a69c93c7d", + "sha256:3ee66f993ee567b2457a221ed364ae4f8dfe783a5f0e723d9169f95d12f9e696", + "sha256:634a3cbf0b334e901b6887176fa1b98246be7c4010b4c21cb6fd8fa7aa5fdf94", + "sha256:540fa90864b4eb0176b56e0c5e9d7bc6130985288ae297b4c38950381b08a827", + "sha256:7ec815eab4d457890d4270470fb29bde61047d447b32058ef23c593e7ea50aeb", + "sha256:83191486d1de01ec91cfa309c0277efeb47893ac358b91b4868a54f0ae5e8bc7", + "sha256:97705dc5001791a6c1549ef5224f2c561ed96e00ac24fe6de30494a2e0cef1ec", + "sha256:0c851bb11d2bce1ccb4804a958d21c1082267b8bc2f7f825e5236857e1f35274", + "sha256:37fe346ef6d0ddec5894cfcf96d04ca41924a16a8199814ce8ae7f125183974d", + "sha256:e08305aecd924631284ddaeae39a83cca85495389d4ddef75410a32af49f946d", + "sha256:9e1de440fe583d0fe0b000c1d12040b7bcda11fdfed9e05bf54e1935387f8418", + "sha256:a18a228e692988cd11aa0ee7575d620cc20419e51d3bbb9fdbcbdb2e53fe3554", + "sha256:191baea053bbf079685ddd39541cdfc192140175bbba9a260e817373395d907d", + "sha256:2edb367fd27cd2b1a693d53cb40186f1508f7d1fe06a59a25f7f190caee860e3", + "sha256:3f5765cebcac288cc1b5b118acfbc2016eda7b81ad73923f6f9c21e4731eb0d9", + "sha256:8ef2fcbe5a8d6e7d393d28838ff458336d16e006bc7d19921f460eb105b88570", + "sha256:74040f3c930d97f3b4cab1015eaafe922773767d8010dd10b94460ab8a28c8a2", + "sha256:fddf61e9024c41073442ccff0c9990fa004e9b183f391c4e3cf3853e5ae6062c", + "sha256:ce6960fa7831611815e163864a91b70b0ab1ef0f446c2cad1eec13404822cad5", + "sha256:d765eda1544d6120cbed1f4120657e2bef966e57c9962f52a49d3c6ecab05e06", + "sha256:ae1ab5b5cb6ebd690b8e35154dad5efcf0c6c2f10ef0c229ea7c0dacd100a2be", + "sha256:f7b97f487dedc87c7c7c9f0bc0ceccdd4faaa04f292c60e0985e0f8bba576c1c", + "sha256:b8f3274360b953b5d4f29512058ab4647a1a48067db7caf7aa855e90eb9c61f3", + "sha256:19efe6f125c00123ccc6d96e51eb61e711f3ea01f32d18cce14d3b614217c58e", + "sha256:f700797810fb2bdbba5a0b31e10c361360a87bac1a282da109273194a25bf6ef", + "sha256:0b4564ad3a799af1a4a0de33b0952f6056d942b0cfa39b73e9375bf0c05b3191", + "sha256:50b64b55c2b3dc5d806e9e2d2b40fdef7d8fb286eabc6f9402af0fcffe5f303b", + "sha256:e160910d31a37afeea87df306264fb1f727cbca574d2c234cdca856f5311fbd6", + "sha256:230f79adc8fd2bbd4c2d32014ceb7337a3195c64f1ff74c4a6e0a3cf9a75761f", + "sha256:81d2e21dad970c08798c0df00bbda21acf165a370f9612e0d14ce69e5dd6c5c3", + "sha256:7b18fb9f4493d06fb9d422688e519e3276a70c8640aa186cefdefc4fb2daa8f5", + "sha256:54bb364b83f5e494701d36ed0fef9a72dd5beb17f20ff17b0f31ef595c78c29a", + "sha256:080d69c44f06d40369ec02a253d76bac481d769a84f61f2aaa3051c8fffc8cc8", + "sha256:22a7047f37812ca1ac27a9d98c160f00be776632967292076be612ae994844ac", + "sha256:e13e2f2bceb048765cae16fc4f93cfe17838a800c42cb5ee2ad06f5a4fc317d6", + "sha256:5eddb5c1febbe6e58491f8e9ee8fc9897298b307e0357c01f49d445cf25283c9", + "sha256:eefbff094f66804c8ec1012a064b013f3ec2560d5f734781ca97f7040d74ff71", + "sha256:fc51460213b3bf5b67f08f2695aae8d728f614adbbacb917a0825e4ebfbc3e68", + "sha256:7fc33f147b99749fdbae420ed51277cb99d9b6418b7f739fe51c7563945bc0d7", + "sha256:cf8fdbfcd359aac8bf55500c24e6843baafe8fef35019126c3616806b41415b3", + "sha256:3f7e5e72ab9e18dbca936b40734c91520242a49a9e98a2f2589f397faa6ad8e8", + "sha256:025edc805b00f2745ec3829d511bb7fedf80adad62ded895b52238de7bd1f959", + "sha256:21685a7b79484a6d684efd86af6fb23dc13aaadc534cc4c4ae3edc0ceb84051b", + "sha256:62e0e00a485390da8b2b988fcc7c97987fe2463abe559d9fc54f03995f2a98e0", + "sha256:da92fada5920a24577f614e1167e3b339d516ca646346c04c71ef2bd97295653", + "sha256:8ae407fb97bfa1bcd669f4263d0b45dd7fc7e97c1371cc4b8f4360024a56e7bb", + "sha256:1269ac60fc692ef06218f41e2e8a5a7ecc7cb236f33838403555a75923a2eea4", + "sha256:55a2f6c8e3eeef268813fae1e11553770ab7ec3367241b8c29e54ac755ba3343", + "sha256:78cfa06fe69c278490efc71591981434d0fcd2d4b24ae4c787c747c9601a1fbd", + "sha256:3f6a9ff19102d0b243a9c8daa1b741dee0a3989e4188613ad713cc1623cdccf4", + "sha256:1cb0a98a34d2c18104c05460f0fa2563395a2516ea61f86a27e8b7c8bb36f6ec", + "sha256:c0f53020ecdb8eefb21795b0acf589334e89a9ef339a84d42e61999f53c67d18", + "sha256:1011da3289e2cf164607cf56000a5eaad145394f8b275ae4d96a980ba5cc46f7", + "sha256:1143ac623a74d7feaaaf293c18d942d243248f6356628f87216670c10d11687b", + "sha256:10ac3bf7565725a55b0aef56f65befd0d320219fc83adfab6e564c19f8c44bd6", + "sha256:f0cb56a04fa3b27c1a3bb8896372077234123b36fe3461aca8ddc7b912030ce8", + "sha256:a41eef48b706b929464a45a4dbdca5b16201931fe56ff6ada4da0157db5e4b73", + "sha256:a4436185b8b8553003c8329979368651dd3ff371cbcfc61a55827942ce13e73e", + "sha256:168c5e414ed295d703981872eb337296dba1c66abeb010f93d4f97f55ba06e36", + "sha256:029acbf0ac0942e5f78e302d53bdb1e2a5aff6a3ee48aba7505470fc9d24c02c", + "sha256:cddf8fbd1021116ee137a080d50a06ecd9269beb5042aee5782ca68bab62acf3", + "sha256:e4ec1966f9bc7cbc898fe7550600ae3e9e4f8afbcdd3f6e74afe1965247653ba", + "sha256:80aae995798350ff2527b774b9da7bc562bc27a398d9ee2dbac52feb26f69e84", + "sha256:baacf0e7332f6ec37470e014ba0ea5d24b4d050f2e9385531c0c950c7ab1883d", + "sha256:9e519a05f2890cb6cd436ff1906ce2bf897e8f91083c9dfcd1ad3a7c4b7fcefb", + "sha256:55e93e89826db400efa8410e0170f2b478321ceff5aa2df314398b8d3cc1245e", + "sha256:551a506b43e32d21bf7b6333e028733956d5ef3560837a0c84b0d3e598efa046", + "sha256:7c014b54f7929348f614f8f4eb7a1552b8565c0a57f3a75ff6471dc05f30cafe", + "sha256:98f838a9775269a0f796151bd54d52c7ac91d4bf1365186772f243bfafbb136a", + "sha256:a24b42ff8657390a8cfc7c82106a57e9f4e84443096ea32e49d71f41e46d6d69", + "sha256:0f1a02850c102e2a186787504f965c0c10d6432b9f600c18bc2f520e55f04a8c", + "sha256:6f2bfbe0f23d3b233aacb72c153ee133839353325f028321eb5ea38b0dc06c02", + "sha256:3091b70196578286bd75b98b013deb58191a5a4cde6764e89db78bee0f628ddf", + "sha256:2cddadff38ccef2364a7e40af0e1d9b3bf9c06869c15ceeb655f3cfa431c2083", + "sha256:62a2878605ca0415fd60adcff4c7068d855d20737498a968fabc646610ccbe5c", + "sha256:e5f82f102f51d88aa517bbebd170795a571b7ddc3036574b92b498cc13704d98", + "sha256:e58ae3f8143d7fe7247aa9ae03bf0df30e7877e61dbebe727f4b4ff67f2e7395", + "sha256:3a573ee517c0b94992414b6129347d425329f3c0bbd928889f5958c1dba58a54", + "sha256:1892294b56e349d84884bce686e48006b21f0b56d03c7e235f8ea934ac5c8c2d", + "sha256:8b273938591908ea80cd8cf0dc24b8b8e3d275b0db6438c6ad37290a355cd8ef", + "sha256:b93a509fc65dd88761b4f7f21d8a05f1cd22e878ac59eb7d8e1507f5a2376a1e", + "sha256:058822931f4c34c18675116c1b02b718de4044c1019acb0d5f97417f00a30ba7", + "sha256:3419800de39dd7bae5f5eac74b077e285e031d81abaf7f9597ed6a90a6a29d25", + "sha256:4a40a1538c8a488f32476f96d2461c3b792eb0cf5acb998e397d8a9cef8e5461", + "sha256:920a48d33953c8d7f1b47106fa6f3cacddecf3e0954f91454b608af94e81ea7b", + "sha256:1a9d808e6fce4a10f7982e4b1b598d9f9c9f20dbf1d9555e7289120b9dad9e2b", + "sha256:8498846918c7bc7a20553340434cfbfb0d19185adcd0ff52866c6506ab8f747d", + "sha256:114f1c0781e242bcefb3764726368eb97005b3ebbe69fa0cdee5885e9453c91e", + "sha256:5a05f1126ed38f752af247dcdf7c958e738b935b8b6d942fd42f423768f05255", + "sha256:bcd19fd35b5f8535ff5bb15db91e2339c9435908c1123d5e2272fcae15a62260", + "sha256:89bd26efe94889e657c5cedede8b5eede7d4e8833619218753df6ab5ab477d37", + "sha256:2dc8e2f52451d1a11b16bbb389a24c58b61a1ba804ee777f9d06dbe4e1fcf6e5", + "sha256:83301ca502322e0634173460bf8fa35572c36ab8cc2e6e600bf9980f845fc857", + "sha256:f07b1f40ebb1fbe5c24e68a38b5f768a21e2ec2254d4bd8ff61fb0bde72f64ce", + "sha256:704e1dc996a17815c6dcf7029c0ddb2849d40feaab6e9b9c687af9d95fef825c", + "sha256:a681ac2a07ed302c5c3a468f63bf9a447d5f71129dcd74948b5efc51a5e1ba1f", + "sha256:b1c9a4ff3d549dd43b97dd53810cddfabd1d1e2fde2c04d52e95e03f69