[lxc-devel] [lxd/master] lxc/init: Add parse of options from stdin

geaaru on Github lxc-bot at linuxcontainers.org
Sat Aug 31 21:11:29 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 626 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190831/72034e69/attachment.bin>
-------------- next part --------------
From a254c122701a7cd8af8c603a037743f8a6a3949e Mon Sep 17 00:00:00 2001
From: Daniele Rondina <geaaru at sabayonlinux.org>
Date: Sat, 31 Aug 2019 23:07:39 +0200
Subject: [PATCH] lxc/init: Add parse of options from stdin

Signed-off-by: Daniele Rondina <geaaru at sabayonlinux.org>
---
 lxc/init.go | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/lxc/init.go b/lxc/init.go
index 9472e68e95..ad07485d67 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -2,10 +2,12 @@ package main
 
 import (
 	"fmt"
+	"io/ioutil"
 	"os"
 	"strings"
 
 	"github.com/spf13/cobra"
+	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
@@ -13,6 +15,7 @@ import (
 	"github.com/lxc/lxd/shared/api"
 	cli "github.com/lxc/lxd/shared/cmd"
 	"github.com/lxc/lxd/shared/i18n"
+	"github.com/lxc/lxd/shared/termios"
 )
 
 type cmdInit struct {
@@ -68,6 +71,22 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
 	var remote string
 	var iremote string
 	var err error
+	var stdinData api.ContainerPut
+	var devicesMap map[string]map[string]string
+	var configMap map[string]string
+
+	// If stdin isn't a terminal, read text from it
+	if !termios.IsTerminal(getStdinFd()) {
+		contents, err := ioutil.ReadAll(os.Stdin)
+		if err != nil {
+			return nil, "", err
+		}
+
+		err = yaml.Unmarshal(contents, &stdinData)
+		if err != nil {
+			return nil, "", err
+		}
+	}
 
 	if len(args) > 0 {
 		iremote, image, err = conf.ParseRemote(args[0])
@@ -129,7 +148,12 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
 		}
 	}
 
-	devicesMap := map[string]map[string]string{}
+	if len(stdinData.Devices) > 0 {
+		devicesMap = stdinData.Devices
+	} else {
+		devicesMap = map[string]map[string]string{}
+	}
+
 	if c.flagNetwork != "" {
 		network, _, err := d.GetNetwork(c.flagNetwork)
 		if err != nil {
@@ -143,7 +167,11 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
 		}
 	}
 
-	configMap := map[string]string{}
+	if len(stdinData.Config) > 0 {
+		configMap = stdinData.Config
+	} else {
+		configMap = map[string]string{}
+	}
 	for _, entry := range c.flagConfig {
 		if !strings.Contains(entry, "=") {
 			return nil, "", fmt.Errorf(i18n.G("Bad key=value pair: %s"), entry)
@@ -174,8 +202,13 @@ func (c *cmdInit) create(conf *config.Config, args []string) (lxd.ContainerServe
 	}
 	req.Config = configMap
 	req.Devices = devicesMap
+
 	if !c.flagNoProfiles && len(profiles) == 0 {
-		req.Profiles = nil
+		if len(stdinData.Profiles) > 0 {
+			req.Profiles = stdinData.Profiles
+		} else {
+			req.Profiles = nil
+		}
 	} else {
 		req.Profiles = profiles
 	}


More information about the lxc-devel mailing list