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

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) ===
Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From b233e6a315b064de23354846efd578886592a37d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Tue, 13 Mar 2018 12:22:36 -0400
Subject: [PATCH] Improve /etc/hosts 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>
---
 distrobuilder/main.go       |  8 ++++++-
 generators/hostname.go      | 13 ++++++++++++
 generators/hostname_test.go |  2 ++
 generators/hosts.go         | 52 ++++++++++++++++++++++++++++++++-------------
 generators/hosts_test.go    |  8 +++----
 5 files changed, 63 insertions(+), 20 deletions(-)

diff --git a/distrobuilder/main.go b/distrobuilder/main.go
index f623027..cae2fa8 100644
--- a/distrobuilder/main.go
+++ b/distrobuilder/main.go
@@ -20,11 +20,17 @@ __attribute__((constructor)) void init(void) {
        }
 
        // Unshare a new mntns so our mounts don't leak
-       if (unshare(CLONE_NEWNS | CLONE_NEWPID) < 0) {
+       if (unshare(CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWUTS) < 0) {
                fprintf(stderr, "Failed to unshare namespaces: %s\n", 
strerror(errno));
                _exit(1);
        }
 
+       // Hardcode the hostname to "distrobuilder"
+       if (sethostname("distrobuilder", 13) < 0) {
+               fprintf(stderr, "Failed to set hostname: %s\n", 
strerror(errno));
+               _exit(1);
+       }
+
        // Prevent mount propagation back to initial namespace
        if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL) < 0) {
                fprintf(stderr, "Failed to mark / private: %s\n", 
strerror(errno));
diff --git a/generators/hostname.go b/generators/hostname.go
index a227532..9ec4949 100644
--- a/generators/hostname.go
+++ b/generators/hostname.go
@@ -5,6 +5,7 @@ import (
        "os"
        "path/filepath"
 
+       lxd "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
 
        "github.com/lxc/distrobuilder/image"
@@ -17,6 +18,12 @@ type HostnameGenerator struct{}
 // RunLXC creates a hostname template.
 func (g HostnameGenerator) RunLXC(cacheDir, sourceDir string, img 
*image.LXCImage,
        defFile shared.DefinitionFile) error {
+
+       // Skip if the file doesn't exist
+       if !lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
        // Store original file
        err := StoreFile(cacheDir, sourceDir, defFile.Path)
        if err != nil {
@@ -43,6 +50,12 @@ func (g HostnameGenerator) RunLXC(cacheDir, sourceDir 
string, img *image.LXCImag
 // RunLXD creates a hostname template.
 func (g HostnameGenerator) RunLXD(cacheDir, sourceDir string, img 
*image.LXDImage,
        defFile shared.DefinitionFile) error {
+
+       // Skip if the file doesn't exist
+       if !lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
        templateDir := filepath.Join(cacheDir, "templates")
 
        err := os.MkdirAll(templateDir, 0755)
diff --git a/generators/hostname_test.go b/generators/hostname_test.go
index 446ae36..fc59c66 100644
--- a/generators/hostname_test.go
+++ b/generators/hostname_test.go
@@ -76,6 +76,8 @@ func TestHostnameGeneratorRunLXD(t *testing.T) {
                t.Fatalf("Unexpected error: %s", err)
        }
 
+       createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hostname"), 
"hostname")
+
        err = generator.RunLXD(cacheDir, rootfsDir, image,
                shared.DefinitionFile{Path: "/etc/hostname"})
        if err != nil {
diff --git a/generators/hosts.go b/generators/hosts.go
index 3cdc4c7..7d5d26e 100644
--- a/generators/hosts.go
+++ b/generators/hosts.go
@@ -1,12 +1,14 @@
 package generators
 
 import (
-       "io"
+       "io/ioutil"
        "os"
        "path/filepath"
+       "strings"
 
        "github.com/lxc/distrobuilder/image"
        "github.com/lxc/distrobuilder/shared"
+       lxd "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
 )
 
@@ -16,21 +18,37 @@ type HostsGenerator struct{}
 // RunLXC creates a LXC specific entry in the hosts file.
 func (g HostsGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage,
        defFile shared.DefinitionFile) error {
+
+       // Skip if the file doesn't exist
+       if !lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
        // Store original file
        err := StoreFile(cacheDir, sourceDir, defFile.Path)
        if err != nil {
                return err
        }
 
-       file, err := os.OpenFile(filepath.Join(sourceDir, defFile.Path),
-               os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+       // Read the current content
+       content, err := ioutil.ReadFile(filepath.Join(sourceDir, defFile.Path))
        if err != nil {
                return err
        }
-       defer file.Close()
 
-       // Append hosts entry
-       file.WriteString("127.0.0.1\tLXC_NAME\n")
+       // Replace hostname with placeholder
+       content = []byte(strings.Replace(string(content), "distrobuilder", 
"LXC_NAME", -1))
+
+       // Add a new line if needed
+       if !strings.Contains(string(content), "LXC_NAME") {
+               content = append([]byte("127.0.1.1\tLXC_NAME\n"), content...)
+       }
+
+       // Overwrite the file
+       err = ioutil.WriteFile(filepath.Join(sourceDir, defFile.Path), content, 
0644)
+       if err != nil {
+               return err
+       }
 
        // Add hostname path to LXC's templates file
        return img.AddTemplate(defFile.Path)
@@ -39,6 +57,12 @@ func (g HostsGenerator) RunLXC(cacheDir, sourceDir string, 
img *image.LXCImage,
 // RunLXD creates a hosts template.
 func (g HostsGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage,
        defFile shared.DefinitionFile) error {
+
+       // Skip if the file doesn't exist
+       if !lxd.PathExists(filepath.Join(sourceDir, defFile.Path)) {
+               return nil
+       }
+
        templateDir := filepath.Join(cacheDir, "templates")
 
        // Create templates path
@@ -47,22 +71,20 @@ func (g HostsGenerator) RunLXD(cacheDir, sourceDir string, 
img *image.LXDImage,
                return err
        }
 
-       // Create hosts template
-       file, err := os.Create(filepath.Join(templateDir, "hosts.tpl"))
+       // Read the current content
+       content, err := ioutil.ReadFile(filepath.Join(sourceDir, defFile.Path))
        if err != nil {
                return err
        }
-       defer file.Close()
 
-       hostsFile, err := os.Open(filepath.Join(sourceDir, defFile.Path))
+       // Replace hostname with placeholder
+       content = []byte(strings.Replace(string(content), "distrobuilder", "{{ 
container.name }}", -1))
+
+       // Write the template
+       err = ioutil.WriteFile(filepath.Join(templateDir, "hosts.tpl"), 
content, 0644)
        if err != nil {
                return err
        }
-       defer hostsFile.Close()
-
-       // Copy old content, and append LXD specific entry
-       io.Copy(file, hostsFile)
-       file.WriteString("127.0.0.1\t{{ container.name }}\n")
 
        img.Metadata.Templates[defFile.Path] = &api.ImageMetadataTemplate{
                Template: "hosts.tpl",
diff --git a/generators/hosts_test.go b/generators/hosts_test.go
index 318243f..e848be3 100644
--- a/generators/hosts_test.go
+++ b/generators/hosts_test.go
@@ -34,7 +34,7 @@ func TestHostsGeneratorRunLXC(t *testing.T) {
        }
 
        createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
-               "127.0.0.1\tlocalhost\n")
+               "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
 
        err = generator.RunLXC(cacheDir, rootfsDir, image,
                shared.DefinitionFile{Path: "/etc/hosts"})
@@ -43,7 +43,7 @@ func TestHostsGeneratorRunLXC(t *testing.T) {
        }
 
        validateTestFile(t, filepath.Join(cacheDir, "tmp", "etc", "hosts"),
-               "127.0.0.1\tlocalhost\n")
+               "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
        validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
                "127.0.0.1\tlocalhost\n127.0.0.1\tLXC_NAME\n")
 
@@ -53,7 +53,7 @@ func TestHostsGeneratorRunLXC(t *testing.T) {
        }
 
        validateTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
-               "127.0.0.1\tlocalhost\n")
+               "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
 }
 
 func TestHostsGeneratorRunLXD(t *testing.T) {
@@ -81,7 +81,7 @@ func TestHostsGeneratorRunLXD(t *testing.T) {
        }
 
        createTestFile(t, filepath.Join(cacheDir, "rootfs", "etc", "hosts"),
-               "127.0.0.1\tlocalhost\n")
+               "127.0.0.1\tlocalhost\n127.0.0.1\tdistrobuilder\n")
 
        err = generator.RunLXD(cacheDir, rootfsDir, image,
                shared.DefinitionFile{Path: "/etc/hosts"})
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to