[lxc-devel] [lxd/master] Implement symlink transfer

stgraber on Github lxc-bot at linuxcontainers.org
Sun Jul 2 05:08:02 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170702/7bc874ff/attachment.bin>
-------------- next part --------------
From 3b0886f3af0d69f89c417d372475db0c7709b09e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sun, 2 Jul 2017 01:06:58 -0400
Subject: [PATCH 1/2] Implement support for symlinks in file API
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #3335

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client/lxd_containers.go |  6 ++++++
 doc/api-extensions.md    |  4 ++++
 doc/rest-api.md          |  2 +-
 lxc/file.go              | 55 ++++++++++++++++++++++++++----------------------
 lxd/api_1.0.go           |  1 +
 lxd/container.go         |  2 +-
 lxd/container_file.go    | 15 +++++++++++--
 lxd/container_lxc.go     |  5 +++--
 lxd/main_nsexec.go       | 40 ++++++++++++++++++++++++++++++-----
 test/suites/filemanip.sh |  2 ++
 10 files changed, 96 insertions(+), 36 deletions(-)

diff --git a/client/lxd_containers.go b/client/lxd_containers.go
index e8d03a144..24a7f2d11 100644
--- a/client/lxd_containers.go
+++ b/client/lxd_containers.go
@@ -538,6 +538,12 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg
 		}
 	}
 
+	if args.Type == "symlink" {
+		if !r.HasExtension("file_symlinks") {
+			return fmt.Errorf("The server is missing the required \"file_symlinks\" API extension")
+		}
+	}
+
 	if args.WriteMode == "append" {
 		if !r.HasExtension("file_append") {
 			return fmt.Errorf("The server is missing the required \"file_append\" API extension")
diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index a54b4d101..4590b3eab 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -284,3 +284,7 @@ property in the containers root disk device.
 This introduces a new security.idmap.base allowing the user to skip the
 map auto-selection process for isolated containers and specify what host
 uid/gid to use as the base.
+
+## file\_symlinks
+This adds support for transfering symlinks through the file API.
+X-LXD-type can now be "symlink" with the request content being the target path.
diff --git a/doc/rest-api.md b/doc/rest-api.md
index f35873419..3728dfa50 100644
--- a/doc/rest-api.md
+++ b/doc/rest-api.md
@@ -839,7 +839,7 @@ The following headers may be set by the client:
  * X-LXD-uid: 0
  * X-LXD-gid: 0
  * X-LXD-mode: 0700
- * X-LXD-type: one of "directory" or "file"
+ * X-LXD-type: one of "directory", "file" or "symlink"
  * X-LXD-write: overwrite (or append, introduced with API extension "file\_append")
 
 This is designed to be easily usable from the command line or even a web
diff --git a/lxc/file.go b/lxc/file.go
index 52cc12ce4..8373ca7e6 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+	"bytes"
 	"fmt"
 	"io"
 	"io/ioutil"
@@ -124,38 +125,42 @@ func (c *fileCmd) recursivePushFile(d lxd.ContainerServer, container string, sou
 			return fmt.Errorf(i18n.G("Failed to walk path for %s: %s"), p, err)
 		}
 
-		// Detect symlinks
-		if !fInfo.Mode().IsRegular() && !fInfo.Mode().IsDir() {
-			return fmt.Errorf(i18n.G("'%s' isn't a regular file or directory."), p)
+		// Detect unsupported files
+		if !fInfo.Mode().IsRegular() && !fInfo.Mode().IsDir() && fInfo.Mode()&os.ModeSymlink != os.ModeSymlink {
+			return fmt.Errorf(i18n.G("'%s' isn't a supported file type."), p)
 		}
 
+		// Prepare for file transfer
 		targetPath := path.Join(target, filepath.ToSlash(p[sourceLen:]))
-		if fInfo.IsDir() {
-			mode, uid, gid := shared.GetOwnerMode(fInfo)
-			args := lxd.ContainerFileArgs{
-				UID:  int64(uid),
-				GID:  int64(gid),
-				Mode: int(mode.Perm()),
-				Type: "directory",
-			}
-
-			return d.CreateContainerFile(container, targetPath, args)
+		mode, uid, gid := shared.GetOwnerMode(fInfo)
+		args := lxd.ContainerFileArgs{
+			UID:  int64(uid),
+			GID:  int64(gid),
+			Mode: int(mode.Perm()),
 		}
 
-		f, err := os.Open(p)
-		if err != nil {
-			return err
-		}
-		defer f.Close()
+		if fInfo.IsDir() {
+			// Directory handling
+			args.Type = "directory"
+		} else if fInfo.Mode()&os.ModeSymlink == os.ModeSymlink {
+			// Symlink handling
+			symlinkTarget, err := os.Readlink(p)
+			if err != nil {
+				return err
+			}
 
-		mode, uid, gid := shared.GetOwnerMode(fInfo)
+			args.Type = "symlink"
+			args.Content = bytes.NewReader([]byte(symlinkTarget))
+		} else {
+			// File handling
+			f, err := os.Open(p)
+			if err != nil {
+				return err
+			}
+			defer f.Close()
 
-		args := lxd.ContainerFileArgs{
-			Content: f,
-			UID:     int64(uid),
-			GID:     int64(gid),
-			Mode:    int(mode.Perm()),
-			Type:    "file",
+			args.Type = "file"
+			args.Content = f
 		}
 
 		return d.CreateContainerFile(container, targetPath, args)
diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index 743cb2ce2..0c0ad691b 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -110,6 +110,7 @@ func api10Get(d *Daemon, r *http.Request) Response {
 			"image_force_refresh",
 			"storage_lvm_lv_resizing",
 			"id_map_base",
+			"file_symlinks",
 		},
 		APIStatus:  "stable",
 		APIVersion: version.APIVersion,
diff --git a/lxd/container.go b/lxd/container.go
index 0ad88b3f6..3baea4595 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -447,7 +447,7 @@ type container interface {
 	// File handling
 	FileExists(path string) error
 	FilePull(srcpath string, dstpath string) (int64, int64, os.FileMode, string, []string, error)
-	FilePush(srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error
+	FilePush(type_ string, srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error
 	FileRemove(path string) error
 
 	/* Command execution:
diff --git a/lxd/container_file.go b/lxd/container_file.go
index eb443a354..ea97ac8e6 100644
--- a/lxd/container_file.go
+++ b/lxd/container_file.go
@@ -107,14 +107,25 @@ func containerFilePut(c container, path string, r *http.Request) Response {
 		}
 
 		// Transfer the file into the container
-		err = c.FilePush(temp.Name(), path, uid, gid, mode, write)
+		err = c.FilePush("file", temp.Name(), path, uid, gid, mode, write)
 		if err != nil {
 			return InternalError(err)
 		}
 
 		return EmptySyncResponse
+	} else if type_ == "symlink" {
+		target, err := ioutil.ReadAll(r.Body)
+		if err != nil {
+			return InternalError(err)
+		}
+
+		err = c.FilePush("symlink", string(target), path, uid, gid, mode, write)
+		if err != nil {
+			return InternalError(err)
+		}
+		return EmptySyncResponse
 	} else if type_ == "directory" {
-		err := c.FilePush("", path, uid, gid, mode, write)
+		err := c.FilePush("directory", "", path, uid, gid, mode, write)
 		if err != nil {
 			return InternalError(err)
 		}
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 46ce11030..7484a3319 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -4722,7 +4722,7 @@ func (c *containerLXC) FilePull(srcpath string, dstpath string) (int64, int64, o
 	return uid, gid, os.FileMode(mode), type_, dirEnts, nil
 }
 
-func (c *containerLXC) FilePush(srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error {
+func (c *containerLXC) FilePush(type_ string, srcpath string, dstpath string, uid int64, gid int64, mode int, write string) error {
 	var rootUid int64
 	var rootGid int64
 	var errStr string
@@ -4751,7 +4751,7 @@ func (c *containerLXC) FilePush(srcpath string, dstpath string, uid int64, gid i
 	}
 
 	defaultMode := 0640
-	if srcpath == "" {
+	if type_ == "directory" {
 		defaultMode = 0750
 	}
 
@@ -4763,6 +4763,7 @@ func (c *containerLXC) FilePush(srcpath string, dstpath string, uid int64, gid i
 		fmt.Sprintf("%d", c.InitPID()),
 		srcpath,
 		dstpath,
+		type_,
 		fmt.Sprintf("%d", uid),
 		fmt.Sprintf("%d", gid),
 		fmt.Sprintf("%d", mode),
diff --git a/lxd/main_nsexec.go b/lxd/main_nsexec.go
index 67c3c146e..dde8b3d23 100644
--- a/lxd/main_nsexec.go
+++ b/lxd/main_nsexec.go
@@ -180,15 +180,16 @@ void attach_userns(int pid) {
 	}
 }
 
-int manip_file_in_ns(char *rootfs, int pid, char *host, char *container, bool is_put, uid_t uid, gid_t gid, mode_t mode, uid_t defaultUid, gid_t defaultGid, mode_t defaultMode, bool append) {
+int manip_file_in_ns(char *rootfs, int pid, char *host, char *container, bool is_put, char *type, uid_t uid, gid_t gid, mode_t mode, uid_t defaultUid, gid_t defaultGid, mode_t defaultMode, bool append) {
 	int host_fd = -1, container_fd = -1;
 	int ret = -1;
 	int container_open_flags;
 	struct stat st;
 	int exists = 1;
-	bool is_dir_manip = !strcmp(host, "");
+	bool is_dir_manip = type != NULL && !strcmp(type, "directory");
+	bool is_symlink_manip = type != NULL && !strcmp(type, "symlink");
 
-	if (!is_dir_manip) {
+	if (!is_dir_manip && !is_symlink_manip) {
 		host_fd = open(host, O_RDWR);
 		if (host_fd < 0) {
 			error("error: open");
@@ -241,6 +242,32 @@ int manip_file_in_ns(char *rootfs, int pid, char *host, char *container, bool is
 		return 0;
 	}
 
+	if (is_put && is_symlink_manip) {
+		if (mode == -1) {
+			mode = defaultMode;
+		}
+
+		if (uid == -1) {
+			uid = defaultUid;
+		}
+
+		if (gid == -1) {
+			gid = defaultGid;
+		}
+
+		if (symlink(host, container) < 0 && errno != EEXIST) {
+			error("error: symlink");
+			return -1;
+		}
+
+		if (fchownat(0, container, uid, gid, AT_SYMLINK_NOFOLLOW) < 0) {
+			error("error: chown");
+			return -1;
+		}
+
+		return 0;
+	}
+
 	if (stat(container, &st) < 0)
 		exists = 0;
 
@@ -502,7 +529,7 @@ void forkdofile(char *buf, char *cur, bool is_put, ssize_t size) {
 	uid_t defaultUid = 0;
 	gid_t defaultGid = 0;
 	mode_t defaultMode = 0;
-	char *command = cur, *rootfs = NULL, *source = NULL, *target = NULL, *writeMode = NULL;
+	char *command = cur, *rootfs = NULL, *source = NULL, *target = NULL, *writeMode = NULL, *type = NULL;
 	pid_t pid;
 	bool append = false;
 
@@ -520,6 +547,9 @@ void forkdofile(char *buf, char *cur, bool is_put, ssize_t size) {
 
 	if (is_put) {
 		ADVANCE_ARG_REQUIRED();
+		type = cur;
+
+		ADVANCE_ARG_REQUIRED();
 		uid = atoi(cur);
 
 		ADVANCE_ARG_REQUIRED();
@@ -543,7 +573,7 @@ void forkdofile(char *buf, char *cur, bool is_put, ssize_t size) {
 		}
 	}
 
-	_exit(manip_file_in_ns(rootfs, pid, source, target, is_put, uid, gid, mode, defaultUid, defaultGid, defaultMode, append));
+	_exit(manip_file_in_ns(rootfs, pid, source, target, is_put, type, uid, gid, mode, defaultUid, defaultGid, defaultMode, append));
 }
 
 void forkcheckfile(char *buf, char *cur, bool is_put, ssize_t size) {
diff --git a/test/suites/filemanip.sh b/test/suites/filemanip.sh
index 1eb6f2847..d1e8e58c2 100644
--- a/test/suites/filemanip.sh
+++ b/test/suites/filemanip.sh
@@ -23,6 +23,7 @@ test_filemanip() {
   chown 1000:1000 "${TEST_DIR}"/source/another_level
   echo "foo" > "${TEST_DIR}"/source/foo
   echo "bar" > "${TEST_DIR}"/source/bar
+  ln -s bar "${TEST_DIR}"/source/baz
 
   lxc file push -p -r "${TEST_DIR}"/source filemanip/tmp/ptest
 
@@ -31,6 +32,7 @@ test_filemanip() {
   [ "$(lxc exec filemanip -- stat -c "%u" /tmp/ptest/source/another_level)" = "1000" ]
   [ "$(lxc exec filemanip -- stat -c "%g" /tmp/ptest/source/another_level)" = "1000" ]
   [ "$(lxc exec filemanip -- stat -c "%a" /tmp/ptest/source)" = "755" ]
+  [ "$(lxc exec filemanip -- readlink /tmp/ptest/source/baz)" = "bar" ]
 
   lxc exec filemanip -- rm -rf /tmp/ptest/source
 

From 964aa972dbea6e041ad9ec8f95b29a20a4a5c29b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sun, 2 Jul 2017 01:07:28 -0400
Subject: [PATCH 2/2] i18n: Update templates
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 po/de.po   | 38 +++++++++++++++++++-------------------
 po/el.po   | 38 +++++++++++++++++++-------------------
 po/fr.po   | 38 +++++++++++++++++++-------------------
 po/it.po   | 38 +++++++++++++++++++-------------------
 po/ja.po   | 38 +++++++++++++++++++-------------------
 po/lxd.pot | 38 +++++++++++++++++++-------------------
 po/nl.po   | 38 +++++++++++++++++++-------------------
 po/ru.po   | 38 +++++++++++++++++++-------------------
 po/sr.po   | 38 +++++++++++++++++++-------------------
 po/sv.po   | 38 +++++++++++++++++++-------------------
 po/tr.po   | 38 +++++++++++++++++++-------------------
 11 files changed, 209 insertions(+), 209 deletions(-)

diff --git a/po/de.po b/po/de.po
index 5e3bd2a00..62c8e425b 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-02-14 17:11+0000\n"
 "Last-Translator: Tim Rose <tim at netlope.de>\n"
 "Language-Team: German <https://hosted.weblate.org/projects/linux-containers/"
@@ -213,7 +213,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -223,9 +223,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -307,7 +307,7 @@ msgstr " Prozessorauslastung:"
 msgid "CREATED AT"
 msgstr "ERSTELLT AM"
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -394,7 +394,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr "Kann Verzeichnis für Zertifikate auf dem Server nicht erstellen"
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -521,7 +521,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -621,17 +621,17 @@ msgstr "Akzeptiere Zertifikat"
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, fuzzy, c-format
 msgid "Invalid path %s"
 msgstr "Ungültiges Ziel %s"
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr "Ungültige Quelle %s"
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr "Ungültiges Ziel %s"
@@ -698,7 +698,7 @@ msgstr "Fehlende Zusammenfassung."
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "Mehr als eine Datei herunterzuladen, aber das Ziel ist kein Verzeichnis"
@@ -919,7 +919,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr "Öffentlich: %s\n"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -1002,15 +1002,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr "Setzt die gid der Datei beim Übertragen"
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr "Setzt die Dateiberechtigungen beim Übertragen"
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr "Setzt die uid der Datei beim Übertragen"
 
@@ -1239,7 +1239,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, fuzzy, c-format
 msgid "Unknown file type '%s'"
 msgstr "Unbekannter Befehl %s für Abbild"
@@ -1418,7 +1418,7 @@ msgstr ""
 "\n"
 "lxc exec <Container> [--env EDITOR=/usr/bin/vim]... <Befehl>\n"
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 #, fuzzy
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
@@ -2200,7 +2200,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -2244,7 +2244,7 @@ msgstr "OK (y/n)? "
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/el.po b/po/el.po
index 30af00369..164d6eaf9 100644
--- a/po/el.po
+++ b/po/el.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-02-14 08:00+0000\n"
 "Last-Translator: Simos Xenitellis <simos.65 at gmail.com>\n"
 "Language-Team: Greek <https://hosted.weblate.org/projects/linux-containers/"
@@ -127,7 +127,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -137,9 +137,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -219,7 +219,7 @@ msgstr "  Χρήση CPU:"
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -304,7 +304,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -427,7 +427,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -523,17 +523,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -600,7 +600,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -810,7 +810,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -890,15 +890,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1117,7 +1117,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1244,7 +1244,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1915,7 +1915,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1958,7 +1958,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/fr.po b/po/fr.po
index ff103db94..7e6a0d43d 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-06-07 15:24+0000\n"
 "Last-Translator: Stéphane Graber <stgraber at stgraber.org>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -204,7 +204,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr "%s (%d de plus)"
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -214,9 +214,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -296,7 +296,7 @@ msgstr "CPU utilisé :"
 msgid "CREATED AT"
 msgstr "CRÉÉ À"
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 #, fuzzy
 msgid "Can't pull a directory without --recursive"
 msgstr "impossible de récupérer un répertoire sans --recursive"
@@ -385,7 +385,7 @@ msgstr "Copie de l'image : %s"
 msgid "Could not create server cert dir"
 msgstr "Impossible de créer le dossier de stockage des certificats serveurs"
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr "Créer tous répertoires nécessaires"
 
@@ -509,7 +509,7 @@ msgstr "Échec lors de la génération de 'lxc.1': %v"
 msgid "Failed to get the new container name"
 msgstr "Profil à appliquer au nouveau conteneur"
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -611,17 +611,17 @@ msgstr "Certificat invalide"
 msgid "Invalid configuration key"
 msgstr "Clé de configuration invalide"
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, fuzzy, c-format
 msgid "Invalid path %s"
 msgstr "Cible invalide %s"
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr "Source invalide %s"
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr "Cible invalide %s"
@@ -688,7 +688,7 @@ msgstr "Résumé manquant."
 msgid "More than one device matches, specify the device name."
 msgstr "Plus d'un périphérique correspond, spécifier le nom du périphérique."
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "Plusieurs fichiers à télécharger, mais la destination n'est pas un dossier"
@@ -902,7 +902,7 @@ msgstr "Serveur d'images public"
 msgid "Public: %s"
 msgstr "Public : %s"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr "Pousser ou récupérer des fichiers récursivement"
 
@@ -985,15 +985,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "Protocole du serveur (lxd ou simplestreams)"
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr "Définir le gid du fichier lors de l'envoi"
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr "Définir les permissions du fichier lors de l'envoi"
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr "Définir l'uid du fichier lors de l'envoi"
 
@@ -1226,7 +1226,7 @@ msgstr "Impossible de trouver help2man"
 msgid "Unable to read remote TLS certificate"
 msgstr "Impossible de lire le certificat TLS distant"
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1435,7 +1435,7 @@ msgstr ""
 "sélectionné si à la fois stdin et stdout sont des terminaux (stderr\n"
 "est ignoré)."
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 #, fuzzy
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
@@ -2482,7 +2482,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "impossible de spécifier uid/gid/mode en mode récursif"
 
@@ -2525,7 +2525,7 @@ msgstr "ok (y/n) ?"
 msgid "processing aliases failed %s\n"
 msgstr "l'analyse des alias a échoué %s\n"
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr "l'édition récursive ne fait aucun sens :("
 
diff --git a/po/it.po b/po/it.po
index d29d4132c..d930f1707 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-06-15 22:46+0000\n"
 "Last-Translator: Alberto Donato <alberto.donato at gmail.com>\n"
 "Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -148,7 +148,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr "%s (altri %d)"
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -158,9 +158,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -239,7 +239,7 @@ msgstr "Utilizzo CPU:"
 msgid "CREATED AT"
 msgstr "CREATO IL"
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -324,7 +324,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -446,7 +446,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -542,17 +542,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -618,7 +618,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -827,7 +827,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -907,15 +907,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1135,7 +1135,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1262,7 +1262,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1934,7 +1934,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1977,7 +1977,7 @@ msgstr "ok (y/n)?"
 msgid "processing aliases failed %s\n"
 msgstr "errore di processamento degli alias %s\n"
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/ja.po b/po/ja.po
index 7f1470496..2ecec99bb 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-03-23 12:03+0000\n"
 "Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -127,7 +127,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -137,9 +137,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -218,7 +218,7 @@ msgstr "CPU使用量:"
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 #, fuzzy
 msgid "Can't pull a directory without --recursive"
 msgstr ""
@@ -306,7 +306,7 @@ msgstr "イメージのコピー中: %s"
 msgid "Could not create server cert dir"
 msgstr "サーバ証明書格納用のディレクトリを作成できません"
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr "必要なディレクトリをすべて作成します"
 
@@ -429,7 +429,7 @@ msgstr "'lxc.1' の生成が失敗しました: %v"
 msgid "Failed to get the new container name"
 msgstr "新しいコンテナに適用するプロファイル"
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -528,17 +528,17 @@ msgstr "不正な証明書です"
 msgid "Invalid configuration key"
 msgstr "正しくない設定項目 (key) です"
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr "不正なパス %s"
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr "不正なソース %s"
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr "不正な送り先 %s"
@@ -604,7 +604,7 @@ msgstr "サマリーはありません。"
 msgid "More than one device matches, specify the device name."
 msgstr "複数のデバイスとマッチします。デバイス名を指定してください。"
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "ダウンロード対象のファイルが複数ありますが、コピー先がディレクトリではありま"
@@ -816,7 +816,7 @@ msgstr "Public なイメージサーバとして設定します"
 msgid "Public: %s"
 msgstr "パブリック: %s"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr "再帰的にファイルをpush/pullします"
 
@@ -897,15 +897,15 @@ msgstr "サーバが我々の証明書を追加した後我々を信頼してい
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "サーバのプロトコル (lxd or simplestreams)"
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr "プッシュ時にファイルのgidを設定します"
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr "プッシュ時にファイルのパーミションを設定します"
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr "プッシュ時にファイルのuidを設定します"
 
@@ -1138,7 +1138,7 @@ msgstr "help2man が見つかりません。"
 msgid "Unable to read remote TLS certificate"
 msgstr "リモートの TLS 証明書を読めません"
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, fuzzy, c-format
 msgid "Unknown file type '%s'"
 msgstr "未知の設定コマンド %s"
@@ -1345,7 +1345,7 @@ msgstr ""
 "デフォルトのモードは non-interactive です。もし標準入出力が両方ともターミナル"
 "の場合は interactive モードが選択されます (標準エラー出力は無視されます)。"
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -2543,7 +2543,7 @@ msgstr "`lxc config profile` は廃止されました。`lxc profile` を使っ
 msgid "can't remove the default remote"
 msgstr "デフォルトのリモートは削除できません"
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません"
 
@@ -2588,7 +2588,7 @@ msgstr "ok (y/n)?"
 msgid "processing aliases failed %s\n"
 msgstr "エイリアスの処理が失敗しました %s\n"
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr "再帰的な edit は意味がありません :("
 
diff --git a/po/lxd.pot b/po/lxd.pot
index b68743b4b..6fad005cf 100644
--- a/po/lxd.pot
+++ b/po/lxd.pot
@@ -7,7 +7,7 @@
 msgid   ""
 msgstr  "Project-Id-Version: lxd\n"
         "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-        "POT-Creation-Date: 2017-07-01 16:31-0400\n"
+        "POT-Creation-Date: 2017-07-02 01:07-0400\n"
         "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
         "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
         "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -118,7 +118,7 @@ msgstr  ""
 msgid   "%s (%d more)"
 msgstr  ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid   "%s is not a directory"
 msgstr  ""
@@ -128,9 +128,9 @@ msgstr  ""
 msgid   "%v (interrupt two more times to force)"
 msgstr  ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid   "'%s' isn't a regular file or directory."
+msgid   "'%s' isn't a supported file type."
 msgstr  ""
 
 #: lxc/snapshot.go:53
@@ -209,7 +209,7 @@ msgstr  ""
 msgid   "CREATED AT"
 msgstr  ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid   "Can't pull a directory without --recursive"
 msgstr  ""
 
@@ -293,7 +293,7 @@ msgstr  ""
 msgid   "Could not create server cert dir"
 msgstr  ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid   "Create any directories necessary"
 msgstr  ""
 
@@ -414,7 +414,7 @@ msgstr  ""
 msgid   "Failed to get the new container name"
 msgstr  ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid   "Failed to walk path for %s: %s"
 msgstr  ""
@@ -510,17 +510,17 @@ msgstr  ""
 msgid   "Invalid configuration key"
 msgstr  ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid   "Invalid path %s"
 msgstr  ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid   "Invalid source %s"
 msgstr  ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid   "Invalid target %s"
 msgstr  ""
@@ -586,7 +586,7 @@ msgstr  ""
 msgid   "More than one device matches, specify the device name."
 msgstr  ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid   "More than one file to download, but target is not a directory"
 msgstr  ""
 
@@ -794,7 +794,7 @@ msgstr  ""
 msgid   "Public: %s"
 msgstr  ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid   "Recursively push or pull files"
 msgstr  ""
 
@@ -874,15 +874,15 @@ msgstr  ""
 msgid   "Server protocol (lxd or simplestreams)"
 msgstr  ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid   "Set the file's gid on push"
 msgstr  ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid   "Set the file's perms on push"
 msgstr  ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid   "Set the file's uid on push"
 msgstr  ""
 
@@ -1097,7 +1097,7 @@ msgstr  ""
 msgid   "Unable to read remote TLS certificate"
 msgstr  ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid   "Unknown file type '%s'"
 msgstr  ""
@@ -1212,7 +1212,7 @@ msgid   "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|inte
         "Mode defaults to non-interactive, interactive mode is selected if both stdin AND stdout are terminals (stderr is ignored)."
 msgstr  ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid   "Usage: lxc file <subcommand> [options]\n"
         "\n"
         "Manage files in containers.\n"
@@ -1815,7 +1815,7 @@ msgstr  ""
 msgid   "can't remove the default remote"
 msgstr  ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid   "can't supply uid/gid/mode in recursive mode"
 msgstr  ""
 
@@ -1858,7 +1858,7 @@ msgstr  ""
 msgid   "processing aliases failed %s\n"
 msgstr  ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid   "recursive edit doesn't make sense :("
 msgstr  ""
 
diff --git a/po/nl.po b/po/nl.po
index 35477cc5e..bb3e48383 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -124,7 +124,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -134,9 +134,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -215,7 +215,7 @@ msgstr ""
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -300,7 +300,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -422,7 +422,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -518,17 +518,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -594,7 +594,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -803,7 +803,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -883,15 +883,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1110,7 +1110,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1237,7 +1237,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1908,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1951,7 +1951,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/ru.po b/po/ru.po
index 3cea0d8a4..92efd04c0 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: 2017-06-06 13:55+0000\n"
 "Last-Translator: Александр Киль <shorrey at gmail.com>\n"
 "Language-Team: Russian <https://hosted.weblate.org/projects/linux-containers/"
@@ -195,7 +195,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -205,9 +205,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -288,7 +288,7 @@ msgstr " Использование ЦП:"
 msgid "CREATED AT"
 msgstr "СОЗДАН"
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -373,7 +373,7 @@ msgstr "Копирование образа: %s"
 msgid "Could not create server cert dir"
 msgstr "Не удалось создать каталог сертификата сервера"
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -496,7 +496,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -592,17 +592,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -669,7 +669,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -879,7 +879,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -959,15 +959,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1186,7 +1186,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1321,7 +1321,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1992,7 +1992,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -2035,7 +2035,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/sr.po b/po/sr.po
index 6c552b1c7..85948cab1 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -124,7 +124,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -134,9 +134,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -215,7 +215,7 @@ msgstr ""
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -300,7 +300,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -422,7 +422,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -518,17 +518,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -594,7 +594,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -803,7 +803,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -883,15 +883,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1110,7 +1110,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1237,7 +1237,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1908,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1951,7 +1951,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/sv.po b/po/sv.po
index 4d04435cf..ae9b32ceb 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -124,7 +124,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -134,9 +134,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -215,7 +215,7 @@ msgstr ""
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -300,7 +300,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -422,7 +422,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -518,17 +518,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -594,7 +594,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -803,7 +803,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -883,15 +883,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1110,7 +1110,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1237,7 +1237,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1908,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1951,7 +1951,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
diff --git a/po/tr.po b/po/tr.po
index d87b5907f..b41cc8a37 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-01 16:31-0400\n"
+"POT-Creation-Date: 2017-07-02 01:07-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -124,7 +124,7 @@ msgstr ""
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/file.go:187
+#: lxc/file.go:192
 #, c-format
 msgid "%s is not a directory"
 msgstr ""
@@ -134,9 +134,9 @@ msgstr ""
 msgid "%v (interrupt two more times to force)"
 msgstr ""
 
-#: lxc/file.go:129
+#: lxc/file.go:130
 #, c-format
-msgid "'%s' isn't a regular file or directory."
+msgid "'%s' isn't a supported file type."
 msgstr ""
 
 #: lxc/snapshot.go:53
@@ -215,7 +215,7 @@ msgstr ""
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/file.go:480
+#: lxc/file.go:485
 msgid "Can't pull a directory without --recursive"
 msgstr ""
 
@@ -300,7 +300,7 @@ msgstr ""
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:69 lxc/file.go:70
+#: lxc/file.go:70 lxc/file.go:71
 msgid "Create any directories necessary"
 msgstr ""
 
@@ -422,7 +422,7 @@ msgstr ""
 msgid "Failed to get the new container name"
 msgstr ""
 
-#: lxc/file.go:124
+#: lxc/file.go:125
 #, c-format
 msgid "Failed to walk path for %s: %s"
 msgstr ""
@@ -518,17 +518,17 @@ msgstr ""
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:523
+#: lxc/file.go:528
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:452
+#: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:229
+#: lxc/file.go:234
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -594,7 +594,7 @@ msgstr ""
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:439
+#: lxc/file.go:444
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
@@ -803,7 +803,7 @@ msgstr ""
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:68 lxc/file.go:69
 msgid "Recursively push or pull files"
 msgstr ""
 
@@ -883,15 +883,15 @@ msgstr ""
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:65
+#: lxc/file.go:66
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:66
+#: lxc/file.go:67
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:65
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -1110,7 +1110,7 @@ msgstr ""
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/file.go:111
+#: lxc/file.go:112
 #, c-format
 msgid "Unknown file type '%s'"
 msgstr ""
@@ -1237,7 +1237,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:38
+#: lxc/file.go:39
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1908,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:277
+#: lxc/file.go:282
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
@@ -1951,7 +1951,7 @@ msgstr ""
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:551
+#: lxc/file.go:556
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 


More information about the lxc-devel mailing list