mirror of
https://github.com/lxc/distrobuilder.git
synced 2026-02-05 06:45:19 +01:00
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package sources
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
|
|
"github.com/lxc/distrobuilder/shared"
|
|
)
|
|
|
|
type rpmbootstrap struct {
|
|
common
|
|
}
|
|
|
|
func (s *rpmbootstrap) yumordnf() (cmd string, err error) {
|
|
// check whether yum or dnf command exists
|
|
for _, cmd = range []string{"yum", "dnf"} {
|
|
if err = shared.RunCommand(s.ctx, nil, nil, cmd, "--version"); err == nil {
|
|
return cmd, err
|
|
}
|
|
}
|
|
cmd = ""
|
|
err = fmt.Errorf("Command yum or dnf not found, sudo apt-get install yum or sudo apt-get install dnf and try again")
|
|
return cmd, err
|
|
}
|
|
|
|
func (s *rpmbootstrap) repodirs() (dir string, err error) {
|
|
reposdir := path.Join(s.sourcesDir, "etc", "yum.repos.d")
|
|
err = os.MkdirAll(reposdir, 0o755)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
distribution := s.definition.Image.Distribution
|
|
content := s.definition.Source.URL
|
|
if distribution == "" || content == "" {
|
|
err = fmt.Errorf("No valid distribution and source url specified")
|
|
return "", err
|
|
}
|
|
|
|
err = os.WriteFile(path.Join(reposdir, distribution+".repo"), []byte(content), 0o644)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return reposdir, nil
|
|
}
|
|
|
|
// Run runs yum --installroot.
|
|
func (s *rpmbootstrap) Run() (err error) {
|
|
cmd, err := s.yumordnf()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
repodir, err := s.repodirs()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
release := s.definition.Image.Release
|
|
args := []string{
|
|
fmt.Sprintf("--installroot=%s", s.rootfsDir),
|
|
fmt.Sprintf("--releasever=%s", release),
|
|
fmt.Sprintf("--setopt=reposdir=%s", repodir),
|
|
"install", "-y",
|
|
}
|
|
|
|
os.RemoveAll(s.rootfsDir)
|
|
earlyPackagesRemove := s.definition.GetEarlyPackages("remove")
|
|
|
|
for _, pkg := range earlyPackagesRemove {
|
|
args = append(args, fmt.Sprintf("--exclude=%s", pkg))
|
|
}
|
|
|
|
pkgs := []string{"yum", "dnf"}
|
|
components := s.definition.Source.Components
|
|
|
|
for _, pkg := range components {
|
|
pkg, err = shared.RenderTemplate(pkg, s.definition)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
pkgs = append(pkgs, pkg)
|
|
}
|
|
|
|
earlyPackagesInstall := s.definition.GetEarlyPackages("install")
|
|
pkgs = append(pkgs, earlyPackagesInstall...)
|
|
args = append(args, pkgs...)
|
|
|
|
// Install
|
|
if err = shared.RunCommand(s.ctx, nil, nil, cmd, args...); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|