Add parameters to the api responses that while not displayed by cockpit-composer are used in props validation or blueprint updates.
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package rpmmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os/exec"
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
type RepoConfig struct {
|
|
Id string `json:"id"`
|
|
Name string `json:"name"`
|
|
BaseURL string `json:"baseurl,omitempty"`
|
|
Metalink string `json:"metalink,omitempty"`
|
|
MirrorList string `json:"mirrorlist,omitempty"`
|
|
}
|
|
|
|
type PackageList []Package
|
|
|
|
type Package struct {
|
|
Name string
|
|
Summary string
|
|
Description string
|
|
URL string
|
|
Epoch uint
|
|
Version string
|
|
Release string
|
|
Arch string
|
|
BuildTime time.Time
|
|
License string
|
|
}
|
|
|
|
type PackageSpec struct {
|
|
Name string `json:"name"`
|
|
Epoch uint `json:"epoch"`
|
|
Version string `json:"version,omitempty"`
|
|
Release string `json:"release,omitempty"`
|
|
Arch string `json:"arch,omitempty"`
|
|
}
|
|
|
|
func runDNF(command string, arguments []string, result interface{}) error {
|
|
argv := append([]string{"dnf-json", command}, arguments...)
|
|
|
|
cmd := exec.Command("python3", argv...)
|
|
stdout, err := cmd.StdoutPipe()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = cmd.Start()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = json.NewDecoder(stdout).Decode(result)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return cmd.Wait()
|
|
}
|
|
|
|
func FetchPackageList(repo RepoConfig) (PackageList, error) {
|
|
var packages PackageList
|
|
err := runDNF("dump", nil, &packages)
|
|
return packages, err
|
|
}
|
|
|
|
func Depsolve(specs ...string) ([]PackageSpec, error) {
|
|
var dependencies []PackageSpec
|
|
err := runDNF("depsolve", specs, &dependencies)
|
|
return dependencies, err
|
|
}
|
|
|
|
func (packages PackageList) Search(name string) (int, int) {
|
|
first := sort.Search(len(packages), func(i int) bool {
|
|
return packages[i].Name >= name
|
|
})
|
|
|
|
if first == len(packages) || packages[first].Name != name {
|
|
return first, 0
|
|
}
|
|
|
|
last := first + 1
|
|
for last < len(packages) && packages[last].Name == name {
|
|
last++
|
|
}
|
|
|
|
return first, last - first
|
|
}
|