[lxc-devel] [distrobuilder/master] Add Funtoo
MoritzMaxeiner on Github
lxc-bot at linuxcontainers.org
Fri Jul 26 15:00:13 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 352 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190726/0fd392e7/attachment.bin>
-------------- next part --------------
From aa35c11f17c04abd6952b1b968f0e8441fb557c9 Mon Sep 17 00:00:00 2001
From: Moritz Maxeiner <mm at ucw.sh>
Date: Fri, 26 Jul 2019 16:57:38 +0200
Subject: [PATCH] Add Funtoo
Signed-off-by: Moritz Maxeiner <mm at ucw.sh>
---
doc/examples/funtoo | 74 ++++++++++++++++++++++++++++++++++++++
managers/egoportage.go | 31 ++++++++++++++++
managers/manager.go | 2 ++
shared/definition.go | 3 ++
shared/osarch.go | 8 +++++
sources/funtoo-http.go | 80 ++++++++++++++++++++++++++++++++++++++++++
sources/source.go | 2 ++
7 files changed, 200 insertions(+)
create mode 100644 doc/examples/funtoo
create mode 100644 managers/egoportage.go
create mode 100644 sources/funtoo-http.go
diff --git a/doc/examples/funtoo b/doc/examples/funtoo
new file mode 100644
index 0000000..1dd81ab
--- /dev/null
+++ b/doc/examples/funtoo
@@ -0,0 +1,74 @@
+image:
+ distribution: funtoo
+ description: Funtoo
+ expiry: 30d
+ release: 1.3
+ architecture: x86_64
+
+source:
+ downloader: funtoo-http
+ url: http://build.funtoo.org
+ keys:
+ - 30737D12308C9D0C882FC34B57CB0A121BAECB2E
+
+targets:
+ lxc:
+ create-message: |
+ You just created a Funtoo container (arch={{ image.architecture }})
+
+ config:
+ - type: all
+ before: 5
+ content: |-
+ lxc.include = LXC_TEMPLATE_CONFIG/gentoo.common.conf
+
+ - type: user
+ before: 5
+ content: |-
+ lxc.include = LXC_TEMPLATE_CONFIG/gentoo.userns.conf
+
+ - type: all
+ after: 4
+ content: |-
+ lxc.include = LXC_TEMPLATE_CONFIG/common.conf
+
+ - type: user
+ after: 4
+ content: |-
+ lxc.include = LXC_TEMPLATE_CONFIG/userns.conf
+
+ - type: all
+ content: |-
+ lxc.arch = {{ image.architecture_kernel }}
+
+files:
+ - path: /etc/hostname
+ generator: hostname
+
+ - path: /etc/hosts
+ generator: hosts
+
+packages:
+ manager: egoportage
+
+ update: true
+ cleanup: true
+
+actions:
+ - trigger: post-packages
+ action: |-
+ #! /bin/sh
+ set -eux
+
+ rm -rf /boot/*
+ rm -rf /usr/src/*
+ rm -rf /var/git/meta-repo
+ rm -rf /var/cache/portage
+
+ cd /etc/init.d
+ ln -s netif.tmpl net.eth0
+ rc-update add net.eth0 default
+ echo template=dhcpcd > /etc/conf.d/net.eth0
+
+mappings:
+ architecture_map: funtoo
diff --git a/managers/egoportage.go b/managers/egoportage.go
new file mode 100644
index 0000000..4a6778e
--- /dev/null
+++ b/managers/egoportage.go
@@ -0,0 +1,31 @@
+package managers
+
+// NewEgoPortage creates a new Manager instance.
+func NewEgoPortage() *Manager {
+ return &Manager{
+ commands: ManagerCommands{
+ clean: "emerge",
+ install: "emerge",
+ refresh: "ego",
+ remove: "emerge",
+ update: "emerge",
+ },
+ flags: ManagerFlags{
+ global: []string{},
+ clean: []string{},
+ install: []string{
+ "--autounmask-continue",
+ "--quiet-build=y",
+ },
+ remove: []string{
+ "--unmerge",
+ },
+ refresh: []string{
+ "sync",
+ },
+ update: []string{
+ "--update", "@world",
+ },
+ },
+ }
+}
diff --git a/managers/manager.go b/managers/manager.go
index 39a2393..86ea8fd 100644
--- a/managers/manager.go
+++ b/managers/manager.go
@@ -43,6 +43,8 @@ func Get(name string) *Manager {
return NewApt()
case "dnf":
return NewDnf()
+ case "egoportage":
+ return NewEgoPortage()
case "opkg":
return NewOpkg()
case "pacman":
diff --git a/shared/definition.go b/shared/definition.go
index d9ab154..dce7831 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -263,6 +263,7 @@ func (d *Definition) Validate() error {
"openwrt-http",
"plamolinux-http",
"voidlinux-http",
+ "funtoo-http",
}
if !shared.StringInSlice(strings.TrimSpace(d.Source.Downloader), validDownloaders) {
return fmt.Errorf("source.downloader must be one of %v", validDownloaders)
@@ -273,6 +274,7 @@ func (d *Definition) Validate() error {
"apk",
"apt",
"dnf",
+ "egoportage",
"opkg",
"pacman",
"portage",
@@ -339,6 +341,7 @@ func (d *Definition) Validate() error {
"gentoo",
"plamolinux",
"voidlinux",
+ "funtoo",
}
architectureMap := strings.TrimSpace(d.Mappings.ArchitectureMap)
diff --git a/shared/osarch.go b/shared/osarch.go
index b178ee9..d7e0e37 100644
--- a/shared/osarch.go
+++ b/shared/osarch.go
@@ -58,6 +58,13 @@ var voidLinuxArchitectureNames = map[int]string{
osarch.ARCH_64BIT_ARMV8_LITTLE_ENDIAN: "aarch64",
}
+var funtooArchitectureNames = map[int]string{
+ osarch.ARCH_32BIT_INTEL_X86: "generic_32",
+ osarch.ARCH_64BIT_INTEL_X86: "generic_64",
+ osarch.ARCH_32BIT_ARMV7_LITTLE_ENDIAN: "armv7a_vfpv3_hardfp",
+ osarch.ARCH_64BIT_ARMV8_LITTLE_ENDIAN: "arm64_generic",
+}
+
var distroArchitecture = map[string]map[int]string{
"alpinelinux": alpineLinuxArchitectureNames,
"altlinux": altLinuxArchitectureNames,
@@ -67,6 +74,7 @@ var distroArchitecture = map[string]map[int]string{
"gentoo": gentooArchitectureNames,
"plamolinux": plamoLinuxArchitectureNames,
"voidlinux": voidLinuxArchitectureNames,
+ "funtoo": funtooArchitectureNames,
}
// GetArch returns the correct architecture name used by the specified
diff --git a/sources/funtoo-http.go b/sources/funtoo-http.go
new file mode 100644
index 0000000..b8ac969
--- /dev/null
+++ b/sources/funtoo-http.go
@@ -0,0 +1,80 @@
+package sources
+
+import (
+ "errors"
+ "fmt"
+ "net/url"
+ "path/filepath"
+
+ lxd "github.com/lxc/lxd/shared"
+
+ "github.com/lxc/distrobuilder/shared"
+)
+
+// FuntooHTTP represents the Funtoo downloader.
+type FuntooHTTP struct{}
+
+// NewFuntooHTTP creates a new FuntooHTTP instance.
+func NewFuntooHTTP() *FuntooHTTP {
+ return &FuntooHTTP{}
+}
+
+// Run downloads a Funtoo stage3 tarball.
+func (s *FuntooHTTP) Run(definition shared.Definition, rootfsDir string) error {
+ topLevelArch := definition.Image.ArchitectureMapped
+ if topLevelArch == "generic_32" {
+ topLevelArch = "x86-32bit"
+ } else if topLevelArch == "generic_64" {
+ topLevelArch = "x86-64bit"
+ } else if topLevelArch == "armv7a_vfpv3_hardfp" {
+ topLevelArch = "arm-32bit"
+ } else if topLevelArch == "arm64_generic" {
+ topLevelArch = "arm-64bit"
+ }
+
+ fname := "stage3-latest.tar.xz"
+ tarball := fmt.Sprintf("%s/%s-release-std/%s/%s/%s",
+ definition.Source.URL, definition.Image.Release,
+ topLevelArch, definition.Image.ArchitectureMapped, fname)
+
+ url, err := url.Parse(tarball)
+ if err != nil {
+ return err
+ }
+
+ if !definition.Source.SkipVerification && url.Scheme != "https" &&
+ len(definition.Source.Keys) == 0 {
+ return errors.New("GPG keys are required if downloading from HTTP")
+ }
+
+ var fpath string
+
+ fpath, err = shared.DownloadHash(definition.Image, tarball, "", nil)
+ if err != nil {
+ return err
+ }
+
+ // Force gpg checks when using http
+ if !definition.Source.SkipVerification && url.Scheme != "https" {
+ shared.DownloadHash(definition.Image, tarball+".gpg", "", nil)
+ valid, err := shared.VerifyFile(
+ filepath.Join(fpath, fname),
+ filepath.Join(fpath, fname+".gpg"),
+ definition.Source.Keys,
+ definition.Source.Keyserver)
+ if err != nil {
+ return err
+ }
+ if !valid {
+ return errors.New("Failed to verify tarball")
+ }
+ }
+
+ // Unpack
+ err = lxd.Unpack(filepath.Join(fpath, fname), rootfsDir, false, false, nil)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/sources/source.go b/sources/source.go
index 4c953e7..b2ea519 100644
--- a/sources/source.go
+++ b/sources/source.go
@@ -40,6 +40,8 @@ func Get(name string) Downloader {
return NewPlamoLinuxHTTP()
case "voidlinux-http":
return NewVoidLinuxHTTP()
+ case "funtoo-http":
+ return NewFuntooHTTP()
}
return nil
More information about the lxc-devel
mailing list