debian-forge-composer/cmd/osbuild-koji/main.go
Ondřej Budai 05fd221bd4 upload/koji: add support for GSSAPI/Kerberos auth
Prior this commit we only had support for username/password authentication
in the koji integration. This wasn't particularly useful because this
auth type isn't used in any production instance.

This commit adds the support for GSSAPI/Kerberos authentication.
The implementation uses kerby library which is very lightweight wrapper
around C gssapi library.

Also, the koji unit test and the run-koji-container script were modified
so the GSSAPI auth is fully tested.
2020-08-27 17:29:57 +01:00

111 lines
2.3 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"path"
"time"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/upload/koji"
)
func main() {
var server, user, password, name, version, release, arch, filename string
flag.StringVar(&server, "server", "", "url to API")
flag.StringVar(&user, "user", "", "koji username")
flag.StringVar(&password, "password", "", "koji password")
flag.StringVar(&name, "name", "", "image name")
flag.StringVar(&version, "version", "", "image verison")
flag.StringVar(&release, "release", "", "image release")
flag.StringVar(&arch, "arch", "", "image architecture")
flag.StringVar(&filename, "filename", "", "filename")
flag.Parse()
id, err := uuid.NewRandom()
if err != nil {
println(err.Error())
return
}
dir := fmt.Sprintf("osbuild-%v", id)
file, err := os.Open(filename)
if err != nil {
println(err.Error())
return
}
defer file.Close()
k, err := koji.NewFromPlain(server, "osbuild", "osbuildpass", http.DefaultTransport)
if err != nil {
println(err.Error())
return
}
defer func() {
err := k.Logout()
if err != nil {
log.Print("logging out of koji failed ", err)
}
}()
hash, length, err := k.Upload(file, dir, path.Base(filename))
if err != nil {
println(err.Error())
return
}
build := koji.Build{
Name: name,
Version: version,
Release: release,
StartTime: time.Now().Unix(),
EndTime: time.Now().Unix(),
}
buildRoots := []koji.BuildRoot{
{
ID: 1,
Host: koji.Host{
Os: "RHEL8",
Arch: arch,
},
ContentGenerator: koji.ContentGenerator{
Name: "osbuild",
Version: "1",
},
Container: koji.Container{
Type: "nspawn",
Arch: arch,
},
Tools: []koji.Tool{},
Components: []koji.Component{},
},
}
output := []koji.Output{
{
BuildRootID: 1,
Filename: path.Base(filename),
FileSize: length,
Arch: arch,
ChecksumType: "md5",
MD5: hash,
Type: "image",
Components: []koji.Component{},
Extra: koji.OutputExtra{
Image: koji.OutputExtraImageInfo{
Arch: arch,
},
},
},
}
result, err := k.CGImport(build, buildRoots, output, dir)
if err != nil {
println(err.Error())
return
}
fmt.Printf("Success, build id: %d\n", result.BuildID)
}