The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/246
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This adds `early` to package sets, and removes `apt_sources` in favor of `repositories`.
From 55c499a0bda1fd202163be79f8d8f1e445442c7b Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 16:24:46 +0200 Subject: [PATCH 1/6] Move EarlyPackages to Package sets Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- shared/definition.go | 29 ++++++++++++++++++++++++++++- sources/debootstrap.go | 11 +++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/shared/definition.go b/shared/definition.go index 5699c20..25390df 100644 --- a/shared/definition.go +++ b/shared/definition.go @@ -25,6 +25,7 @@ type DefinitionPackagesSet struct { DefinitionFilter `yaml:",inline"` Packages []string `yaml:"packages"` Action string `yaml:"action"` + Early bool `yaml:"early,omitempty"` } // A DefinitionPackagesRepository contains data of a specific repository @@ -90,7 +91,6 @@ type DefinitionSource struct { SameAs string `yaml:"same_as,omitempty"` AptSources string `yaml:"apt_sources,omitempty"` SkipVerification bool `yaml:"skip_verification,omitempty"` - EarlyPackages []string `yaml:"early_packages,omitempty"` } // A DefinitionTargetLXCConfig represents the config part of the metadata. @@ -440,6 +440,33 @@ func (d *Definition) GetRunnableActions(trigger string) []DefinitionAction { return out } +// GetEarlyPackages returns a list of packages which are to be installed or removed earlier than the actual package handling. +func (d *Definition) GetEarlyPackages(action string) []string { + var out []string + + for _, set := range d.Packages.Sets { + if set.Action != action || !set.Early { + continue + } + + if len(set.Releases) > 0 && !shared.StringInSlice(d.Image.Release, set.Releases) { + continue + } + + if len(set.Architectures) > 0 && !shared.StringInSlice(d.Image.ArchitectureMapped, set.Architectures) { + continue + } + + if len(set.Variants) > 0 && !shared.StringInSlice(d.Image.Variant, set.Variants) { + continue + } + + out = append(out, set.Packages...) + } + + return out +} + func (d *Definition) getMappedArchitecture() (string, error) { var arch string diff --git a/sources/debootstrap.go b/sources/debootstrap.go index 8e880c9..acc71c6 100644 --- a/sources/debootstrap.go +++ b/sources/debootstrap.go @@ -38,8 +38,15 @@ func (s *Debootstrap) Run(definition shared.Definition, rootfsDir string) error args = append(args, "--no-check-gpg") } - if len(definition.Source.EarlyPackages) > 0 { - args = append(args, fmt.Sprintf("--include=%s", strings.Join(definition.Source.EarlyPackages, ","))) + earlyPackagesInstall := definition.GetEarlyPackages("install") + earlyPackagesRemove := definition.GetEarlyPackages("remove") + + if len(earlyPackagesInstall) > 0 { + args = append(args, fmt.Sprintf("--include=%s", strings.Join(earlyPackagesInstall, ","))) + } + + if len(earlyPackagesRemove) > 0 { + args = append(args, fmt.Sprintf("--exclude=%s", strings.Join(earlyPackagesRemove, ","))) } if len(definition.Source.Keys) > 0 { From 13ba2fc9be2f77db463f0743d91d9dcbf977a15a Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 18:22:50 +0200 Subject: [PATCH 2/6] distrobuilder: Run template on repo.URL Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- distrobuilder/chroot.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/distrobuilder/chroot.go b/distrobuilder/chroot.go index f24adfc..43912db 100644 --- a/distrobuilder/chroot.go +++ b/distrobuilder/chroot.go @@ -42,6 +42,12 @@ func managePackages(def shared.DefinitionPackages, actions []shared.DefinitionAc continue } + // Run template on repo.URL + repo.URL, err = shared.RenderTemplate(repo.URL, def) + if err != nil { + return err + } + err = manager.RepoHandler(repo) if err != nil { return fmt.Errorf("Error for repository %s: %s", repo.Name, err) From e3e5bf551bd55c46b7750529c02d4327bda33df3 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 18:21:18 +0200 Subject: [PATCH 3/6] managers/apt: Add RepoHandler Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- managers/apt.go | 77 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/managers/apt.go b/managers/apt.go index 22d7659..e7106e7 100644 --- a/managers/apt.go +++ b/managers/apt.go @@ -1,5 +1,17 @@ package managers +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + + lxd "github.com/lxc/lxd/shared" + + "github.com/lxc/distrobuilder/shared" +) + // NewApt creates a new Manager instance. func NewApt() *Manager { return &Manager{ @@ -30,5 +42,70 @@ func NewApt() *Manager { "dist-upgrade", }, }, + RepoHandler: func(repoAction shared.DefinitionPackagesRepository) error { + var targetFile string + + if repoAction.Name == "sources.list" { + targetFile = filepath.Join("/etc/apt", repoAction.Name) + } else { + targetFile = filepath.Join("/etc/apt/sources.list.d", repoAction.Name) + + if !strings.HasSuffix(targetFile, ".list") { + targetFile = fmt.Sprintf("%s.list", targetFile) + } + + } + + if !lxd.PathExists(filepath.Dir(targetFile)) { + err := os.MkdirAll(filepath.Dir(targetFile), 0755) + if err != nil { + return err + } + } + + f, err := os.OpenFile(targetFile, os.O_CREATE|os.O_RDWR, 0644) + if err != nil { + return err + } + defer f.Close() + + content, err := ioutil.ReadAll(f) + if err != nil { + return err + } + + // Truncate file if it's not generated by distrobuilder + if !strings.HasPrefix(string(content), "# Generated by distrobuilder\n") { + err = f.Truncate(0) + if err != nil { + return err + } + + _, err = f.Seek(0, 0) + if err != nil { + return err + } + + _, err = f.WriteString("# Generated by distrobuilder\n") + if err != nil { + return err + } + } + + _, err = f.WriteString(repoAction.URL) + if err != nil { + return err + } + + // Append final new line if missing + if !strings.HasSuffix(repoAction.URL, "\n") { + _, err = f.WriteString("\n") + if err != nil { + return err + } + } + + return nil + }, } } From 90e58e2359b364309cd31016d5210a23335dec3b Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 18:22:07 +0200 Subject: [PATCH 4/6] sources: Stop using definition.Source.AptSources Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- sources/debootstrap.go | 29 +---------------------------- sources/ubuntu-http.go | 29 +---------------------------- 2 files changed, 2 insertions(+), 56 deletions(-) diff --git a/sources/debootstrap.go b/sources/debootstrap.go index acc71c6..acf48f3 100644 --- a/sources/debootstrap.go +++ b/sources/debootstrap.go @@ -84,32 +84,5 @@ func (s *Debootstrap) Run(definition shared.Definition, rootfsDir string) error defer os.Remove(scriptPath) } - err := shared.RunCommand("debootstrap", args...) - if err != nil { - return err - } - - if definition.Source.AptSources != "" { - // Run the template - out, err := shared.RenderTemplate(definition.Source.AptSources, definition) - if err != nil { - return err - } - - // Append final new line if missing - if !strings.HasSuffix(out, "\n") { - out += "\n" - } - - // Replace content of sources.list with the templated content. - file, err := os.Create(filepath.Join(rootfsDir, "etc", "apt", "sources.list")) - if err != nil { - return err - } - defer file.Close() - - file.WriteString(out) - } - - return nil + return shared.RunCommand("debootstrap", args...) } diff --git a/sources/ubuntu-http.go b/sources/ubuntu-http.go index 2b6ff6d..b82042a 100644 --- a/sources/ubuntu-http.go +++ b/sources/ubuntu-http.go @@ -48,34 +48,7 @@ func (s *UbuntuHTTP) Run(definition shared.Definition, rootfsDir string) error { } func (s *UbuntuHTTP) runDefaultVariant(definition shared.Definition, rootfsDir string) error { - err := s.unpack(filepath.Join(s.fpath, s.fname), rootfsDir) - if err != nil { - return err - } - - if definition.Source.AptSources != "" { - // Run the template - out, err := shared.RenderTemplate(definition.Source.AptSources, definition) - if err != nil { - return err - } - - // Append final new line if missing - if !strings.HasSuffix(out, "\n") { - out += "\n" - } - - // Replace content of sources.list with the templated content. - file, err := os.Create(filepath.Join(rootfsDir, "etc", "apt", "sources.list")) - if err != nil { - return err - } - defer file.Close() - - file.WriteString(out) - } - - return nil + return s.unpack(filepath.Join(s.fpath, s.fname), rootfsDir) } func (s *UbuntuHTTP) runCoreVariant(definition shared.Definition, rootfsDir string) error { From 5c4abe45a865d5671845de585b97b361bb2daa9e Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 18:33:01 +0200 Subject: [PATCH 5/6] shared: Remove AptSources Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- shared/definition.go | 1 - 1 file changed, 1 deletion(-) diff --git a/shared/definition.go b/shared/definition.go index 25390df..9d3180a 100644 --- a/shared/definition.go +++ b/shared/definition.go @@ -89,7 +89,6 @@ type DefinitionSource struct { Variant string `yaml:"variant,omitempty"` Suite string `yaml:"suite,omitempty"` SameAs string `yaml:"same_as,omitempty"` - AptSources string `yaml:"apt_sources,omitempty"` SkipVerification bool `yaml:"skip_verification,omitempty"` } From db981259c73a908f6e2c19d28d454025adbace88 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Mon, 14 Oct 2019 18:42:27 +0200 Subject: [PATCH 6/6] doc/examples: Update schema.yaml Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- doc/examples/scheme.yaml | 42 +++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/doc/examples/scheme.yaml b/doc/examples/scheme.yaml index df114ce..ab54080 100644 --- a/doc/examples/scheme.yaml +++ b/doc/examples/scheme.yaml @@ -13,18 +13,14 @@ image: source: downloader: ubuntu-http - URL: http://archive.ubuntu.com + url: http://archive.ubuntu.com keys: - 0xdeadbeaf keyserver: http://keyserver.ubuntu.com variant: default suite: suite same_as: xenial - apt_sources: |- - deb http://archive.ubuntu.com/ubuntu {{ image.release }}-updates main restricted universe multiverse skip_verification: false - early_packages: - - gnupg targets: lxc: @@ -118,7 +114,12 @@ packages: cleanup: false sets: - packages: - - vim + - gnupg + action: install + early: true + + - packages: + - vim action: install releases: - a @@ -130,11 +131,12 @@ packages: - packages: - grub - actionn: remove + action: remove repositories: - name: reponame - url: http://example.com + url: |- + deb http://archive.ubuntu.com/ubuntu {{ image.release }}-updates main restricted universe multiverse type: type key: 0xdeadbeaf releases: @@ -145,16 +147,30 @@ packages: variants: - default - - packages: - - grub - actionn: remove - actions: + - trigger: post-unpack + action: |- + #!/bin/sh + + do something after the rootfs has been unpacked + + - trigger: post-files + action: |- + #!/bin/sh + + do something after the files section has been processed + + - trigger: post-update + action: |- + #!/bin/sh + + do something after packages have been processed + - trigger: post-packages action: |- #!/bin/sh - echo do something + do something after the packages section has been processed releases: - a
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel