The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/58

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) ===

From b6cb7c915006a23ecc0b0fae377bffb0f134f279 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 13 Mar 2018 16:55:06 -0400
Subject: [PATCH 1/4] generators: Add upstart-tty generator
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 generators/generators.go  |   2 +
 generators/upstart_tty.go | 126 ++++++++++++++++++++++++++++++++++++++++++++++
 shared/definition.go      |   3 +-
 3 files changed, 130 insertions(+), 1 deletion(-)
 create mode 100644 generators/upstart_tty.go

diff --git a/generators/generators.go b/generators/generators.go
index 4ffb064..7c8de66 100644
--- a/generators/generators.go
+++ b/generators/generators.go
@@ -30,6 +30,8 @@ func Get(generator string) Generator {
                return RemoveGenerator{}
        case "dump":
                return DumpGenerator{}
+       case "upstart-tty":
+               return UpstartTTYGenerator{}
        }
 
        return nil
diff --git a/generators/upstart_tty.go b/generators/upstart_tty.go
new file mode 100644
index 0000000..45e31ba
--- /dev/null
+++ b/generators/upstart_tty.go
@@ -0,0 +1,126 @@
+package generators
+
+import (
+       "fmt"
+       "os"
+       "path/filepath"
+
+       lxd "github.com/lxc/lxd/shared"
+       "github.com/lxc/lxd/shared/api"
+
+       "github.com/lxc/distrobuilder/image"
+       "github.com/lxc/distrobuilder/shared"
+)
+
+var upstartTTYJob = `start on starting tty1 or starting tty2 or starting tty3 
or starting tty4 or starting tty5 or starting tty6
+instance $JOB
+
+script
+    set -eu
+
+    # Check that we're inside a container
+    [ -e "/run/container_type" ] || exit 0
+    [ "$(cat /run/container_type)" = "lxc" ] || exit 0
+
+    # Load PID1's environment
+    LXC_TTY=$(tr '\0' '\n' < /proc/1/environ | grep ^container_ttys= | cut -d= 
-f2-)
+
+    # Check if we have any consoles setup
+    if [ -z "${LXC_TTY}" ]; then
+        # No TTYs setup in this container
+        stop "${JOB}" >/dev/null 2>&1
+        exit 0
+    fi
+
+    TTY_COUNT=$(echo ${LXC_TTY} | wc -w)
+    JOB_ID="${JOB#tty}"
+
+    if [ "${JOB_ID}" -gt "${TTY_COUNT}" ]; then
+        # This console isn't available in the container
+        stop "${JOB}" >/dev/null 2>&1
+        exit 0
+    fi
+
+    # Allow the tty to start
+    exit 0
+end script
+`
+
+// UpstartTTYGenerator represents the UpstartTTY generator.
+type UpstartTTYGenerator struct{}
+
+// RunLXC creates a hostname template.
+func (g UpstartTTYGenerator) RunLXC(cacheDir, sourceDir string, img 
*image.LXCImage,
+       defFile shared.DefinitionFile) error {
+
+       // Skip if the file exists
+       if lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
+       // Store original file
+       err := StoreFile(cacheDir, sourceDir, defFile.Path)
+       if err != nil {
+               return err
+       }
+
+       // Create new hostname file
+       file, err := os.Create(filepath.Join(sourceDir, defFile.Path))
+       if err != nil {
+               return err
+       }
+       defer file.Close()
+
+       // Write LXC specific string to the hostname file
+       _, err = file.WriteString(upstartTTYJob)
+       if err != nil {
+               return fmt.Errorf("Failed to write to upstart job file: %s", 
err)
+       }
+
+       // Add hostname path to LXC's templates file
+       return img.AddTemplate(defFile.Path)
+}
+
+// RunLXD creates a hostname template.
+func (g UpstartTTYGenerator) RunLXD(cacheDir, sourceDir string, img 
*image.LXDImage,
+       defFile shared.DefinitionFile) error {
+
+       // Skip if the file exists
+       if lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
+       templateDir := filepath.Join(cacheDir, "templates")
+
+       err := os.MkdirAll(templateDir, 0755)
+       if err != nil {
+               return err
+       }
+
+       file, err := os.Create(filepath.Join(templateDir, "upstart-tty.tpl"))
+       if err != nil {
+               return err
+       }
+       defer file.Close()
+
+       _, err = file.WriteString(upstartTTYJob)
+       if err != nil {
+               return fmt.Errorf("Failed to write to upstart job file: %s", 
err)
+       }
+
+       // Add to LXD templates
+       img.Metadata.Templates[defFile.Path] = &api.ImageMetadataTemplate{
+               Template: "upstart-tty.tpl",
+               When: []string{
+                       "create",
+               },
+       }
+
+       return err
+}
+
+// Run does nothing.
+func (g UpstartTTYGenerator) Run(cacheDir, sourceDir string,
+       defFile shared.DefinitionFile) error {
+       return nil
+}
diff --git a/shared/definition.go b/shared/definition.go
index 1cecf79..2256495 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -159,10 +159,11 @@ func ValidateDefinition(def Definition) error {
        }
 
        validGenerators := []string{
+               "dump",
                "hostname",
                "hosts",
                "remove",
-               "dump",
+               "upstart-tty",
        }
 
        for _, file := range def.Files {

From cd307cdec48bad2aab992957e922ad15726d7fa4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 13 Mar 2018 16:55:27 -0400
Subject: [PATCH 2/4] chroot: Setup policy.rc.d to prevent daemon startup
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 distrobuilder/chroot.go | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/distrobuilder/chroot.go b/distrobuilder/chroot.go
index 5ca4f22..8fae569 100644
--- a/distrobuilder/chroot.go
+++ b/distrobuilder/chroot.go
@@ -2,12 +2,15 @@ package main
 
 import (
        "fmt"
+       "io/ioutil"
        "os"
        "path/filepath"
        "regexp"
        "strconv"
        "syscall"
 
+       lxd "github.com/lxc/lxd/shared"
+
        "github.com/lxc/distrobuilder/managers"
        "github.com/lxc/distrobuilder/shared"
 )
@@ -223,9 +226,30 @@ func setupChroot(rootfs string) (func() error, error) {
                        },
                })
 
+       // Setup policy-rc.d override
+       policyCleanup := false
+       if lxd.PathExists("/usr/sbin/") && 
!lxd.PathExists("/usr/sbin/policy-rc.d") {
+               err = ioutil.WriteFile("/usr/sbin/policy-rc.d", 
[]byte(`#!/bin/sh
+exit 101
+`), 0755)
+               if err != nil {
+                       return nil, err
+               }
+
+               policyCleanup = true
+       }
+
        return func() error {
                defer root.Close()
 
+               // Cleanup policy-rc.d
+               if policyCleanup {
+                       err = os.Remove("/usr/sbin/policy-rc.d")
+                       if err != nil {
+                               return err
+                       }
+               }
+
                // Reset old environment variables
                shared.SetEnvVariables(oldEnvVariables)
 

From d248b6782d9dc3e3fc913df81a875c7ad99c03ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 13 Mar 2018 17:59:15 -0400
Subject: [PATCH 3/4] generators: Make more robust
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 distrobuilder/main_lxc.go |  2 +-
 generators/generators.go  | 36 +++++++++++++++++++++++++++---------
 2 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/distrobuilder/main_lxc.go b/distrobuilder/main_lxc.go
index ba3a201..b3d57a9 100644
--- a/distrobuilder/main_lxc.go
+++ b/distrobuilder/main_lxc.go
@@ -63,7 +63,7 @@ func (c *cmdLXC) run(cmd *cobra.Command, args []string) error 
{
                err := generator.RunLXC(c.global.flagCacheDir, 
c.global.sourceDir, img,
                        file)
                if err != nil {
-                       continue
+                       return err
                }
        }
 
diff --git a/generators/generators.go b/generators/generators.go
index 7c8de66..60f2995 100644
--- a/generators/generators.go
+++ b/generators/generators.go
@@ -4,7 +4,6 @@ import (
        "os"
        p "path"
        "path/filepath"
-       "strings"
 
        lxd "github.com/lxc/lxd/shared"
 
@@ -37,30 +36,49 @@ func Get(generator string) Generator {
        return nil
 }
 
+var storedFiles = map[string]string{}
+
 // StoreFile caches a file which can be restored with the RestoreFiles 
function.
 func StoreFile(cacheDir, sourceDir, path string) error {
+       // Record newly created files
+       if !lxd.PathExists(filepath.Join(sourceDir, path)) {
+               storedFiles[filepath.Join(sourceDir, path)] = ""
+               return nil
+       }
+
        // create temporary directory containing old files
        err := os.MkdirAll(filepath.Join(cacheDir, "tmp", p.Dir(path)), 0755)
        if err != nil {
                return err
        }
 
+       storedFiles[filepath.Join(sourceDir, path)] = filepath.Join(cacheDir, 
"tmp", path)
+
        return lxd.FileCopy(filepath.Join(sourceDir, path),
                filepath.Join(cacheDir, "tmp", path))
 }
 
 // RestoreFiles restores original files which were cached by StoreFile.
 func RestoreFiles(cacheDir, sourceDir string) error {
-       f := func(path string, info os.FileInfo, err error) error {
-               if info.IsDir() {
-                       // We don't care about directories. They should be 
present so there's
-                       // no need to create them.
-                       return nil
+       for origPath, tmpPath := range storedFiles {
+               // Deal with newly created files
+               if tmpPath == "" {
+                       err := os.Remove(origPath)
+                       if err != nil {
+                               return err
+                       }
+
+                       continue
                }
 
-               return lxd.FileCopy(path, filepath.Join(sourceDir,
-                       strings.TrimPrefix(path, filepath.Join(cacheDir, 
"tmp"))))
+               err := lxd.FileCopy(tmpPath, origPath)
+               if err != nil {
+                       return err
+               }
        }
 
-       return filepath.Walk(filepath.Join(cacheDir, "tmp"), f)
+       // Reset the list of stored files
+       storedFiles = map[string]string{}
+
+       return nil
 }

From 6ac3777f9681cda46d83aa60dc9180a19122c3d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 13 Mar 2018 18:05:59 -0400
Subject: [PATCH 4/4] image: Avoid trailing whiteline in excludes-user
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 image/lxc.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/image/lxc.go b/image/lxc.go
index d91fed0..a8e2e3f 100644
--- a/image/lxc.go
+++ b/image/lxc.go
@@ -163,7 +163,7 @@ func (l *LXCImage) createMetadata() error {
                }
        }
 
-       err = l.writeMetadata(filepath.Join(metaDir, "excludes-user"), 
excludesUser,
+       err = l.writeMetadata(filepath.Join(metaDir, "excludes-user"), 
strings.TrimSuffix(excludesUser, "\n"),
                false)
        if err != nil {
                return fmt.Errorf("Error writing 'excludes-user': %s", err)
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to