|
Packit |
63bb0d |
package main
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"encoding/json"
|
|
Packit |
63bb0d |
"flag"
|
|
Packit |
63bb0d |
"fmt"
|
|
Packit |
63bb0d |
"io"
|
|
Packit |
63bb0d |
"io/ioutil"
|
|
Packit |
63bb0d |
"os"
|
|
Packit |
63bb0d |
"path"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/osbuild/osbuild-composer/internal/distro/fedora32"
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/distro/fedora33"
|
|
Packit |
63bb0d |
"github.com/osbuild/osbuild-composer/internal/distro/rhel8"
|
|
Packit Service |
509fd4 |
"github.com/osbuild/osbuild-composer/internal/distro/rhel84"
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
"github.com/osbuild/osbuild-composer/internal/blueprint"
|
|
Packit |
63bb0d |
"github.com/osbuild/osbuild-composer/internal/distro"
|
|
Packit |
63bb0d |
"github.com/osbuild/osbuild-composer/internal/rpmmd"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type repository struct {
|
|
Packit |
63bb0d |
BaseURL string `json:"baseurl,omitempty"`
|
|
Packit |
63bb0d |
Metalink string `json:"metalink,omitempty"`
|
|
Packit |
63bb0d |
MirrorList string `json:"mirrorlist,omitempty"`
|
|
Packit |
63bb0d |
GPGKey string `json:"gpgkey,omitempty"`
|
|
Packit |
63bb0d |
CheckGPG bool `json:"check_gpg,omitempty"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type composeRequest struct {
|
|
Packit |
63bb0d |
Distro string `json:"distro"`
|
|
Packit |
63bb0d |
Arch string `json:"arch"`
|
|
Packit |
63bb0d |
ImageType string `json:"image-type"`
|
|
Packit |
63bb0d |
Blueprint blueprint.Blueprint `json:"blueprint"`
|
|
Packit |
63bb0d |
Repositories []repository `json:"repositories"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type rpmMD struct {
|
|
Packit |
63bb0d |
BuildPackages []rpmmd.PackageSpec `json:"build-packages"`
|
|
Packit |
63bb0d |
Packages []rpmmd.PackageSpec `json:"packages"`
|
|
Packit |
63bb0d |
Checksums map[string]string `json:"checksums"`
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func main() {
|
|
Packit |
63bb0d |
var rpmmdArg bool
|
|
Packit |
63bb0d |
flag.BoolVar(&rpmmdArg, "rpmmd", false, "output rpmmd struct instead of pipeline manifest")
|
|
Packit Service |
509fd4 |
var seedArg int64
|
|
Packit Service |
509fd4 |
flag.Int64Var(&seedArg, "seed", 0, "seed for generating manifests (default: 0)")
|
|
Packit |
63bb0d |
flag.Parse()
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// Path to composeRequet or '-' for stdin
|
|
Packit |
63bb0d |
composeRequestArg := flag.Arg(0)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
composeRequest := &composeRequest{}
|
|
Packit |
63bb0d |
if composeRequestArg != "" {
|
|
Packit |
63bb0d |
var reader io.Reader
|
|
Packit |
63bb0d |
if composeRequestArg == "-" {
|
|
Packit |
63bb0d |
reader = os.Stdin
|
|
Packit |
63bb0d |
} else {
|
|
Packit |
63bb0d |
var err error
|
|
Packit |
63bb0d |
reader, err = os.Open(composeRequestArg)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("Could not open compose request: " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
file, err := ioutil.ReadAll(reader)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("Could not read compose request: " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
err = json.Unmarshal(file, &composeRequest)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("Could not parse blueprint: " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit Service |
bcdfb1 |
distros, err := distro.NewRegistry(fedora32.New(), fedora33.New(), rhel8.New(), rhel84.New(), rhel84.NewCentos())
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic(err)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
d := distros.GetDistro(composeRequest.Distro)
|
|
Packit |
63bb0d |
if d == nil {
|
|
Packit |
63bb0d |
_, _ = fmt.Fprintf(os.Stderr, "The provided distribution '%s' is not supported. Use one of these:\n", composeRequest.Distro)
|
|
Packit |
63bb0d |
for _, d := range distros.List() {
|
|
Packit |
63bb0d |
_, _ = fmt.Fprintln(os.Stderr, " *", d)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
arch, err := d.GetArch(composeRequest.Arch)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
fmt.Fprintf(os.Stderr, "The provided architecture '%s' is not supported by %s. Use one of these:\n", composeRequest.Arch, d.Name())
|
|
Packit |
63bb0d |
for _, a := range d.ListArches() {
|
|
Packit |
63bb0d |
_, _ = fmt.Fprintln(os.Stderr, " *", a)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
imageType, err := arch.GetImageType(composeRequest.ImageType)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
fmt.Fprintf(os.Stderr, "The provided image type '%s' is not supported by %s for %s. Use one of these:\n", composeRequest.ImageType, d.Name(), arch.Name())
|
|
Packit |
63bb0d |
for _, t := range arch.ListImageTypes() {
|
|
Packit |
63bb0d |
_, _ = fmt.Fprintln(os.Stderr, " *", t)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
repos := make([]rpmmd.RepoConfig, len(composeRequest.Repositories))
|
|
Packit |
63bb0d |
for i, repo := range composeRequest.Repositories {
|
|
Packit |
63bb0d |
repos[i] = rpmmd.RepoConfig{
|
|
Packit |
63bb0d |
Name: fmt.Sprintf("repo-%d", i),
|
|
Packit |
63bb0d |
BaseURL: repo.BaseURL,
|
|
Packit |
63bb0d |
Metalink: repo.Metalink,
|
|
Packit |
63bb0d |
MirrorList: repo.MirrorList,
|
|
Packit |
63bb0d |
GPGKey: repo.GPGKey,
|
|
Packit |
63bb0d |
CheckGPG: repo.CheckGPG,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
packages, excludePkgs := imageType.Packages(composeRequest.Blueprint)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
home, err := os.UserHomeDir()
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("os.UserHomeDir(): " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
rpmmd := rpmmd.NewRPMMD(path.Join(home, ".cache/osbuild-composer/rpmmd"), "/usr/libexec/osbuild-composer/dnf-json")
|
|
Packit |
63bb0d |
packageSpecs, checksums, err := rpmmd.Depsolve(packages, excludePkgs, repos, d.ModulePlatformID(), arch.Name())
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("Could not depsolve: " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
buildPkgs := imageType.BuildPackages()
|
|
Packit |
63bb0d |
buildPackageSpecs, _, err := rpmmd.Depsolve(buildPkgs, nil, repos, d.ModulePlatformID(), arch.Name())
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic("Could not depsolve build packages: " + err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var bytes []byte
|
|
Packit |
63bb0d |
if rpmmdArg {
|
|
Packit |
63bb0d |
rpmMDInfo := rpmMD{
|
|
Packit |
63bb0d |
BuildPackages: buildPackageSpecs,
|
|
Packit |
63bb0d |
Packages: packageSpecs,
|
|
Packit |
63bb0d |
Checksums: checksums,
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
bytes, err = json.Marshal(rpmMDInfo)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic(err)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
} else {
|
|
Packit |
63bb0d |
manifest, err := imageType.Manifest(composeRequest.Blueprint.Customizations,
|
|
Packit |
63bb0d |
distro.ImageOptions{
|
|
Packit |
63bb0d |
Size: imageType.Size(0),
|
|
Packit |
63bb0d |
},
|
|
Packit |
63bb0d |
repos,
|
|
Packit |
63bb0d |
packageSpecs,
|
|
Packit Service |
509fd4 |
buildPackageSpecs,
|
|
Packit Service |
509fd4 |
seedArg)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic(err.Error())
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
bytes, err = json.Marshal(manifest)
|
|
Packit |
63bb0d |
if err != nil {
|
|
Packit |
63bb0d |
panic(err)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
os.Stdout.Write(bytes)
|
|
Packit |
63bb0d |
}
|