[lxc-devel] [lxd/master] Bugfixes and minor improvements

stgraber on Github lxc-bot at linuxcontainers.org
Sat Jul 1 20:32:58 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/20170701/1848acc2/attachment.bin>
-------------- next part --------------
From 4b2fe61854d6e8a825b0a9c8f02f7d2f48c35b3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:58:51 -0400
Subject: [PATCH 1/8] tests: Add a test for read-only disks
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>
---
 test/suites/config.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/test/suites/config.sh b/test/suites/config.sh
index 0f053ba64..e39455d30 100644
--- a/test/suites/config.sh
+++ b/test/suites/config.sh
@@ -160,6 +160,7 @@ test_config_profiles() {
 
   # test live-adding a nic
   lxc start foo
+  lxc exec foo -- cat /proc/self/mountinfo | grep -q "/mnt1.*ro,"
   ! lxc config show foo | grep -q "raw.lxc"
   lxc config show foo --expanded | grep -q "raw.lxc"
   ! lxc config show foo | grep -v "volatile.eth0" | grep -q "eth0"
@@ -174,6 +175,7 @@ test_config_profiles() {
   mkdir "${TEST_DIR}/mnt2"
   touch "${TEST_DIR}/mnt2/hosts"
   lxc config device add foo mnt2 disk source="${TEST_DIR}/mnt2" path=/mnt2 readonly=true
+  lxc exec foo -- cat /proc/self/mountinfo | grep -q "/mnt2.*ro,"
   lxc exec foo -- ls /mnt2/hosts
   lxc stop foo --force
   lxc start foo

From f81dba94cce6cd77c96eeabd06b2713f04c3d216 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:49:53 -0400
Subject: [PATCH 2/8] shared/cancel: Fix return value ordering
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>
---
 client/util.go            | 2 +-
 lxd/daemon_images.go      | 2 +-
 shared/cancel/canceler.go | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/client/util.go b/client/util.go
index 1a166787d..de5073628 100644
--- a/client/util.go
+++ b/client/util.go
@@ -97,7 +97,7 @@ func downloadFileSha256(httpClient *http.Client, useragent string, progress func
 	}
 
 	// Perform the request
-	r, err, doneCh := cancel.CancelableDownload(canceler, httpClient, req)
+	r, doneCh, err := cancel.CancelableDownload(canceler, httpClient, req)
 	if err != nil {
 		return -1, err
 	}
diff --git a/lxd/daemon_images.go b/lxd/daemon_images.go
index 3931de54a..ee6244dc6 100644
--- a/lxd/daemon_images.go
+++ b/lxd/daemon_images.go
@@ -433,7 +433,7 @@ func (d *Daemon) ImageDownload(op *operation, server string, protocol string, ce
 		req.Header.Set("User-Agent", version.UserAgent)
 
 		// Make the request
-		raw, err, doneCh := cancel.CancelableDownload(canceler, httpClient, req)
+		raw, doneCh, err := cancel.CancelableDownload(canceler, httpClient, req)
 		defer close(doneCh)
 		if err != nil {
 			return nil, err
diff --git a/shared/cancel/canceler.go b/shared/cancel/canceler.go
index 79f60dbf9..c978c6936 100644
--- a/shared/cancel/canceler.go
+++ b/shared/cancel/canceler.go
@@ -24,7 +24,7 @@ func (c *Canceler) Cancel() error {
 	return nil
 }
 
-func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*http.Response, error, chan bool) {
+func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*http.Response, chan bool, error) {
 	chDone := make(chan bool)
 
 	go func() {
@@ -47,5 +47,5 @@ func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*h
 	}()
 
 	resp, err := client.Do(req)
-	return resp, err, chDone
+	return resp, chDone, err
 }

From 56816d12e38616fe6b5c8dee78ec7614fe675213 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:53:14 -0400
Subject: [PATCH 3/8] client: Allow canceling image download from LXDs
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>
---
 client/lxd_images.go | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/client/lxd_images.go b/client/lxd_images.go
index e17b1d29e..0ba289f34 100644
--- a/client/lxd_images.go
+++ b/client/lxd_images.go
@@ -14,6 +14,7 @@ import (
 
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
+	"github.com/lxc/lxd/shared/cancel"
 	"github.com/lxc/lxd/shared/ioprogress"
 )
 
@@ -117,11 +118,12 @@ func (r *ProtocolLXD) GetPrivateImageFile(fingerprint string, secret string, req
 	}
 
 	// Start the request
-	response, err := r.http.Do(request)
+	response, doneCh, err := cancel.CancelableDownload(req.Canceler, r.http, request)
 	if err != nil {
 		return nil, err
 	}
 	defer response.Body.Close()
+	defer close(doneCh)
 
 	if response.StatusCode != http.StatusOK {
 		_, _, err := r.parseResponse(response)

From ea3466464a0d9b3c615f061b8bea86a4d2e74db1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 16:26:28 -0400
Subject: [PATCH 4/8] shared/cancel: Use request Cancel channel
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>
---
 shared/cancel/canceler.go | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/shared/cancel/canceler.go b/shared/cancel/canceler.go
index c978c6936..83c58992f 100644
--- a/shared/cancel/canceler.go
+++ b/shared/cancel/canceler.go
@@ -7,7 +7,7 @@ import (
 
 // A struct to track canceleation
 type Canceler struct {
-	chCancel chan bool
+	chCancel chan struct{}
 }
 
 func (c *Canceler) Cancelable() bool {
@@ -26,21 +26,14 @@ func (c *Canceler) Cancel() error {
 
 func CancelableDownload(c *Canceler, client *http.Client, req *http.Request) (*http.Response, chan bool, error) {
 	chDone := make(chan bool)
+	chCancel := make(chan struct{})
+	if c != nil {
+		c.chCancel = chCancel
+	}
+	req.Cancel = chCancel
 
 	go func() {
-		chCancel := make(chan bool)
-		if c != nil {
-			c.chCancel = chCancel
-		}
-
-		select {
-		case <-chCancel:
-			if transport, ok := client.Transport.(*http.Transport); ok {
-				transport.CancelRequest(req)
-			}
-		case <-chDone:
-		}
-
+		<-chDone
 		if c != nil {
 			c.chCancel = nil
 		}

From fea5cffb4cd6ff5adfcb0b23b7314758b68f57e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:41:52 -0400
Subject: [PATCH 5/8] client: Add CancelTarget to RemoteOperation
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>
---
 client/operations.go | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/client/operations.go b/client/operations.go
index 7bf1cbd60..0c0db3808 100644
--- a/client/operations.go
+++ b/client/operations.go
@@ -267,6 +267,15 @@ func (op *RemoteOperation) AddHandler(function func(api.Operation)) (*EventTarge
 	return target, nil
 }
 
+// CancelTarget attempts to cancel the target operation
+func (op *RemoteOperation) CancelTarget() error {
+	if op.targetOp == nil {
+		return fmt.Errorf("No associated target operation")
+	}
+
+	return op.targetOp.Cancel()
+}
+
 // GetTarget returns the target operation
 func (op *RemoteOperation) GetTarget() (*api.Operation, error) {
 	if op.targetOp == nil {

From 8f1568b9fadd6888ea2d5db5a89b6d5cc6fb8873 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:53:50 -0400
Subject: [PATCH 6/8] lxc: Add plumbing for operation cancelation
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>
---
 lxc/utils.go | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/lxc/utils.go b/lxc/utils.go
index 4900ca0ac..c7fd4f4a7 100644
--- a/lxc/utils.go
+++ b/lxc/utils.go
@@ -5,8 +5,10 @@ import (
 	"net"
 	"net/url"
 	"os"
+	"os/signal"
 	"strings"
 	"syscall"
+	"time"
 
 	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/shared/api"
@@ -26,6 +28,7 @@ type ProgressRenderer struct {
 	Format string
 
 	maxLength int
+	wait      time.Time
 }
 
 func (p *ProgressRenderer) Done(msg string) {
@@ -44,6 +47,11 @@ func (p *ProgressRenderer) Done(msg string) {
 }
 
 func (p *ProgressRenderer) Update(status string) {
+	timeout := time.Until(p.wait)
+	if timeout.Seconds() > 0 {
+		time.Sleep(timeout)
+	}
+
 	msg := "%s"
 	if p.Format != "" {
 		msg = p.Format
@@ -60,6 +68,19 @@ func (p *ProgressRenderer) Update(status string) {
 	fmt.Print(msg)
 }
 
+func (p *ProgressRenderer) Warn(status string, timeout time.Duration) {
+	p.wait = time.Now().Add(timeout)
+	msg := fmt.Sprintf("\r%s", status)
+
+	if len(msg) > p.maxLength {
+		p.maxLength = len(msg)
+	} else {
+		fmt.Printf("\r%s", strings.Repeat(" ", p.maxLength))
+	}
+
+	fmt.Print(msg)
+}
+
 func (p *ProgressRenderer) UpdateProgress(progress lxd.ProgressData) {
 	p.Update(progress.Text)
 }
@@ -282,3 +303,42 @@ func profileDeviceAdd(client lxd.ContainerServer, name string, devName string, d
 
 	return nil
 }
+
+// Wait for an operation and cancel it on SIGINT/SIGTERM
+func cancelableWait(op *lxd.RemoteOperation, progress *ProgressRenderer) error {
+	// Signal handling
+	chSignal := make(chan os.Signal)
+	signal.Notify(chSignal, os.Interrupt)
+
+	// Operation handling
+	chOperation := make(chan error)
+	go func() {
+		chOperation <- op.Wait()
+		close(chOperation)
+	}()
+
+	count := 0
+	for {
+		select {
+		case err := <-chOperation:
+			return err
+		case <-chSignal:
+			err := op.CancelTarget()
+			if err == nil {
+				return fmt.Errorf(i18n.G("Remote operation canceled by user"))
+			} else {
+				count++
+
+				if count == 3 {
+					return fmt.Errorf(i18n.G("User signaled us three times, exiting. The remote operation will keep running."))
+				}
+
+				if progress != nil {
+					progress.Warn(fmt.Sprintf(i18n.G("%v (interrupt two more times to force)"), err), time.Second*5)
+				}
+			}
+		}
+	}
+
+	return nil
+}

From 73ac97bdc1e40e7d411a55dbe309a0068e735a3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 15:54:09 -0400
Subject: [PATCH 7/8] lxc: Make it possible to cancel image downloads
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #2294

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/image.go | 2 +-
 lxc/init.go  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxc/image.go b/lxc/image.go
index 8cc78dd3b..8985a4571 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -427,7 +427,7 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 		}
 
 		// Wait for operation to finish
-		err = op.Wait()
+		err = cancelableWait(op, &progress)
 		if err != nil {
 			progress.Done("")
 			return err
diff --git a/lxc/init.go b/lxc/init.go
index 254da6952..fb483b70b 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -290,7 +290,7 @@ func (c *initCmd) create(conf *config.Config, args []string) (lxd.ContainerServe
 		return nil, "", err
 	}
 
-	err = op.Wait()
+	err = cancelableWait(op, &progress)
 	if err != nil {
 		progress.Done("")
 		return nil, "", err

From 90ace9716e6d0d106d1615466540a79c848f3b96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Jul 2017 16:32:05 -0400
Subject: [PATCH 8/8] i18n: Update translations
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   | 26 +++++++++++++++++++++-----
 po/el.po   | 25 ++++++++++++++++++++-----
 po/fr.po   | 26 +++++++++++++++++++++-----
 po/it.po   | 25 ++++++++++++++++++++-----
 po/ja.po   | 26 +++++++++++++++++++++-----
 po/lxd.pot | 23 ++++++++++++++++++-----
 po/nl.po   | 25 ++++++++++++++++++++-----
 po/ru.po   | 25 ++++++++++++++++++++-----
 po/sr.po   | 25 ++++++++++++++++++++-----
 po/sv.po   | 25 ++++++++++++++++++++-----
 po/tr.po   | 25 ++++++++++++++++++++-----
 11 files changed, 221 insertions(+), 55 deletions(-)

diff --git a/po/de.po b/po/de.po
index 3eb0f51c1..5e3bd2a00 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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/"
@@ -218,6 +218,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -431,7 +436,7 @@ msgstr "Gerät %s wurde zu %s hinzugefügt\n"
 msgid "Device %s removed from %s"
 msgstr "Gerät %s wurde von %s entfernt\n"
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, fuzzy, c-format
 msgid "Device already exists: %s"
 msgstr "entfernte Instanz %s existiert bereits"
@@ -626,7 +631,7 @@ msgstr "Ungültiges Ziel %s"
 msgid "Invalid source %s"
 msgstr "Ungültige Quelle %s"
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr "Ungültiges Ziel %s"
@@ -685,7 +690,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr "Fehlende Zusammenfassung."
 
@@ -927,6 +932,11 @@ msgstr ""
 msgid "Remote admin password"
 msgstr "Entferntes Administrator Passwort"
 
+#: lxc/utils.go:328
+#, fuzzy
+msgid "Remote operation canceled by user"
+msgstr "Server Zertifikat vom Benutzer nicht akzeptiert"
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -2146,6 +2156,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -2184,7 +2200,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/el.po b/po/el.po
index fd895d9ac..30af00369 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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/"
@@ -132,6 +132,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -340,7 +345,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -528,7 +533,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -587,7 +592,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr "  Χρήση μνήμης:"
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -818,6 +823,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1866,6 +1875,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1900,7 +1915,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/fr.po b/po/fr.po
index 8cfa72c0e..ff103db94 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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/"
@@ -209,6 +209,11 @@ msgstr "%s (%d de plus)"
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -421,7 +426,7 @@ msgstr "Périphérique %s ajouté à %s"
 msgid "Device %s removed from %s"
 msgstr "Périphérique %s retiré de %s"
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, fuzzy, c-format
 msgid "Device already exists: %s"
 msgstr "le serveur distant %s existe déjà"
@@ -616,7 +621,7 @@ msgstr "Cible invalide %s"
 msgid "Invalid source %s"
 msgstr "Source invalide %s"
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr "Cible invalide %s"
@@ -675,7 +680,7 @@ msgstr "Mémoire (pointe)"
 msgid "Memory usage:"
 msgstr "  Mémoire utilisée :"
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr "Résumé manquant."
 
@@ -910,6 +915,11 @@ msgstr "Récupération de l'image : %s"
 msgid "Remote admin password"
 msgstr "Mot de passe de l'administrateur distant"
 
+#: lxc/utils.go:328
+#, fuzzy
+msgid "Remote operation canceled by user"
+msgstr "Certificat serveur rejeté par l'utilisateur"
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -2426,6 +2436,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr "L'utilisateur a annulé l'opération de suppression."
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -2466,7 +2482,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "impossible de spécifier uid/gid/mode en mode récursif"
 
diff --git a/po/it.po b/po/it.po
index 3e7baaca7..d29d4132c 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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/"
@@ -153,6 +153,11 @@ msgstr "%s (altri %d)"
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -360,7 +365,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, fuzzy, c-format
 msgid "Device already exists: %s"
 msgstr "il remote %s esiste già"
@@ -547,7 +552,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -605,7 +610,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -835,6 +840,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1884,6 +1893,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1919,7 +1934,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/ja.po b/po/ja.po
index a02a4f630..7f1470496 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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-"
@@ -132,6 +132,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -342,7 +347,7 @@ msgstr "デバイス %s が %s に追加されました"
 msgid "Device %s removed from %s"
 msgstr "デバイス %s が %s から削除されました"
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, fuzzy, c-format
 msgid "Device already exists: %s"
 msgstr "リモート %s は既に存在します"
@@ -533,7 +538,7 @@ msgstr "不正なパス %s"
 msgid "Invalid source %s"
 msgstr "不正なソース %s"
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr "不正な送り先 %s"
@@ -591,7 +596,7 @@ msgstr "メモリ (ピーク)"
 msgid "Memory usage:"
 msgstr "メモリ消費量:"
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr "サマリーはありません。"
 
@@ -824,6 +829,11 @@ msgstr "イメージの取得中: %s"
 msgid "Remote admin password"
 msgstr "リモートの管理者パスワード"
 
+#: lxc/utils.go:328
+#, fuzzy
+msgid "Remote operation canceled by user"
+msgstr "ユーザによりサーバ証明書が拒否されました"
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -2491,6 +2501,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr "ユーザが削除操作を中断しました。"
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -2527,7 +2543,7 @@ msgstr "`lxc config profile` は廃止されました。`lxc profile` を使っ
 msgid "can't remove the default remote"
 msgstr "デフォルトのリモートは削除できません"
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません"
 
diff --git a/po/lxd.pot b/po/lxd.pot
index 0363f2799..b68743b4b 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-06-30 17:03-0400\n"
+        "POT-Creation-Date: 2017-07-01 16:31-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"
@@ -123,6 +123,11 @@ msgstr  ""
 msgid   "%s is not a directory"
 msgstr  ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid   "%v (interrupt two more times to force)"
+msgstr  ""
+
 #: lxc/file.go:129
 #, c-format
 msgid   "'%s' isn't a regular file or directory."
@@ -328,7 +333,7 @@ msgstr  ""
 msgid   "Device %s removed from %s"
 msgstr  ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid   "Device already exists: %s"
 msgstr  ""
@@ -515,7 +520,7 @@ msgstr  ""
 msgid   "Invalid source %s"
 msgstr  ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid   "Invalid target %s"
 msgstr  ""
@@ -573,7 +578,7 @@ msgstr  ""
 msgid   "Memory usage:"
 msgstr  ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid   "Missing summary."
 msgstr  ""
 
@@ -802,6 +807,10 @@ msgstr  ""
 msgid   "Remote admin password"
 msgstr  ""
 
+#: lxc/utils.go:328
+msgid   "Remote operation canceled by user"
+msgstr  ""
+
 #: lxc/info.go:101
 #, c-format
 msgid   "Remote: %s"
@@ -1770,6 +1779,10 @@ msgstr  ""
 msgid   "User aborted delete operation."
 msgstr  ""
 
+#: lxc/utils.go:333
+msgid   "User signaled us three times, exiting. The remote operation will keep running."
+msgstr  ""
+
 #: lxc/restore.go:38
 msgid   "Whether or not to restore the container's running state from snapshot (if available)"
 msgstr  ""
@@ -1802,7 +1815,7 @@ msgstr  ""
 msgid   "can't remove the default remote"
 msgstr  ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid   "can't supply uid/gid/mode in recursive mode"
 msgstr  ""
 
diff --git a/po/nl.po b/po/nl.po
index 035d87772..35477cc5e 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -129,6 +129,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -336,7 +341,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -523,7 +528,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -581,7 +586,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -811,6 +816,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1859,6 +1868,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1893,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/ru.po b/po/ru.po
index 8a13ea3df..3cea0d8a4 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-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/"
@@ -200,6 +200,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -409,7 +414,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -597,7 +602,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -656,7 +661,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr " Использование памяти:"
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -887,6 +892,10 @@ msgstr "Копирование образа: %s"
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1943,6 +1952,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1977,7 +1992,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/sr.po b/po/sr.po
index 78e89175e..6c552b1c7 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -129,6 +129,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -336,7 +341,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -523,7 +528,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -581,7 +586,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -811,6 +816,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1859,6 +1868,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1893,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/sv.po b/po/sv.po
index 931812b87..4d04435cf 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -129,6 +129,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -336,7 +341,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -523,7 +528,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -581,7 +586,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -811,6 +816,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1859,6 +1868,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1893,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
diff --git a/po/tr.po b/po/tr.po
index 543d2cf85..d87b5907f 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-06-30 17:03-0400\n"
+"POT-Creation-Date: 2017-07-01 16:31-0400\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -129,6 +129,11 @@ msgstr ""
 msgid "%s is not a directory"
 msgstr ""
 
+#: lxc/utils.go:337
+#, c-format
+msgid "%v (interrupt two more times to force)"
+msgstr ""
+
 #: lxc/file.go:129
 #, c-format
 msgid "'%s' isn't a regular file or directory."
@@ -336,7 +341,7 @@ msgstr ""
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/utils.go:248 lxc/utils.go:272
+#: lxc/utils.go:269 lxc/utils.go:293
 #, c-format
 msgid "Device already exists: %s"
 msgstr ""
@@ -523,7 +528,7 @@ msgstr ""
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:225
+#: lxc/file.go:229
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
@@ -581,7 +586,7 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/utils.go:199
+#: lxc/utils.go:220
 msgid "Missing summary."
 msgstr ""
 
@@ -811,6 +816,10 @@ msgstr ""
 msgid "Remote admin password"
 msgstr ""
 
+#: lxc/utils.go:328
+msgid "Remote operation canceled by user"
+msgstr ""
+
 #: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
@@ -1859,6 +1868,12 @@ msgstr ""
 msgid "User aborted delete operation."
 msgstr ""
 
+#: lxc/utils.go:333
+msgid ""
+"User signaled us three times, exiting. The remote operation will keep "
+"running."
+msgstr ""
+
 #: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
@@ -1893,7 +1908,7 @@ msgstr ""
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:273
+#: lxc/file.go:277
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 


More information about the lxc-devel mailing list