[lxc-devel] [distrobuilder/master] Add copy generator

pablofsf on Github lxc-bot at linuxcontainers.org
Wed Jul 24 21:41:06 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 541 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190724/ad155840/attachment.bin>
-------------- next part --------------
From 4ec3806b1ca4a788eb79a6151885a5d77728b04c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Correa=20G=C3=B3mez?= <ablocorrea at hotmail.com>
Date: Wed, 24 Jul 2019 22:58:23 +0200
Subject: [PATCH] generators: Add copy generator
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Copy any file from the host to the same location inside the
container. The created file keeps the original file permissions
but is always uid and gid 0

Closes #110

Signed-off-by: Pablo Correa Gómez <ablocorrea at hotmail.com>
---
 generators/copy.go       | 68 ++++++++++++++++++++++++++++++++++++++++
 generators/generators.go |  2 ++
 2 files changed, 70 insertions(+)
 create mode 100644 generators/copy.go

diff --git a/generators/copy.go b/generators/copy.go
new file mode 100644
index 0000000..3494885
--- /dev/null
+++ b/generators/copy.go
@@ -0,0 +1,68 @@
+package generators
+
+import (
+	"os"
+	"io"
+	"path/filepath"
+	"fmt"
+
+	"github.com/lxc/distrobuilder/image"
+	"github.com/lxc/distrobuilder/shared"
+)
+
+// CopyGenerator represents the Copy generator.
+type CopyGenerator struct{}
+
+// RunLXC copies a file to the container.
+func (g CopyGenerator) RunLXC(cacheDir, sourceDir string, img *image.LXCImage,
+	defFile shared.DefinitionFile) error {
+	return g.Run(cacheDir, sourceDir, defFile)
+}
+
+// RunLXD copies a file to the container.
+func (g CopyGenerator) RunLXD(cacheDir, sourceDir string, img *image.LXDImage,
+	defFile shared.DefinitionFile) error {
+	return g.Run(cacheDir, sourceDir, defFile)
+}
+
+// Run copies a file to the container.
+func (g CopyGenerator) Run(cacheDir, sourceDir string,
+	defFile shared.DefinitionFile) error {
+	in, err := os.Open(defFile.Path)
+	if err != nil {
+		if os.IsNotExist(err) {
+			fmt.Errorf("File '%s' doesn't exist", defFile.Path)
+		}
+		return err
+	}
+
+	out, err := os.Create(filepath.Join(sourceDir, defFile.Path))
+	if err != nil {
+		return err
+	}
+
+	err := out.Chown(0, 0)
+	if err != nil {
+		return err
+	}
+
+	info, err := in.Stat()
+	if err != nil {
+		return err
+	}
+	err := out.Chmod(info.Mode())
+	if err != nil {
+		return err
+	}
+
+	_, err = io.Copy(out, in)
+	if err != nil {
+		return err
+	}
+
+	err := in.Close()
+	if err != nil {
+		return err
+	}
+	return out.Close()
+}
diff --git a/generators/generators.go b/generators/generators.go
index f4f1ef6..e6c7212 100644
--- a/generators/generators.go
+++ b/generators/generators.go
@@ -29,6 +29,8 @@ func Get(generator string) Generator {
 		return RemoveGenerator{}
 	case "dump":
 		return DumpGenerator{}
+	case "copy":
+		return CopyGenerator{}
 	case "template":
 		return TemplateGenerator{}
 	case "upstart-tty":


More information about the lxc-devel mailing list