The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2264
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === This also adds some validation: namely that ip addresses are valid and that any block device specified as a ZFS pool is indeed an actual block device. Closes #1933 Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com>
From 0e2bc7a45db13073f855914dd6b0d33f3e3f24e2 Mon Sep 17 00:00:00 2001 From: Tycho Andersen <tycho.ander...@canonical.com> Date: Thu, 4 Aug 2016 14:19:11 -0600 Subject: [PATCH] add some reasonable defaults to `lxd init` This also adds some validation: namely that ip addresses are valid and that any block device specified as a ZFS pool is indeed an actual block device. Closes #1933 Signed-off-by: Tycho Andersen <tycho.ander...@canonical.com> --- lxd/main.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/lxd/main.go b/lxd/main.go index 5749177..d022013 100644 --- a/lxd/main.go +++ b/lxd/main.go @@ -621,11 +621,14 @@ func cmdInit() error { reader := bufio.NewReader(os.Stdin) - askBool := func(question string) bool { + askBool := func(question string, default_ string) bool { for { fmt.Printf(question) input, _ := reader.ReadString('\n') input = strings.TrimSuffix(input, "\n") + if input == "" { + input = default_ + } if shared.StringInSlice(strings.ToLower(input), []string{"yes", "y"}) { return true } else if shared.StringInSlice(strings.ToLower(input), []string{"no", "n"}) { @@ -636,11 +639,14 @@ func cmdInit() error { } } - askChoice := func(question string, choices []string) string { + askChoice := func(question string, choices []string, default_ string) string { for { fmt.Printf(question) input, _ := reader.ReadString('\n') input = strings.TrimSuffix(input, "\n") + if input == "" { + input = default_ + } if shared.StringInSlice(input, choices) { return input } @@ -649,11 +655,14 @@ func cmdInit() error { } } - askInt := func(question string, min int64, max int64) int64 { + askInt := func(question string, min int64, max int64, default_ string) int64 { for { fmt.Printf(question) input, _ := reader.ReadString('\n') input = strings.TrimSuffix(input, "\n") + if input == "" { + input = default_ + } intInput, err := strconv.ParseInt(input, 10, 64) if err == nil && (min == -1 || intInput >= min) && (max == -1 || intInput <= max) { @@ -664,11 +673,21 @@ func cmdInit() error { } } - askString := func(question string) string { + askString := func(question string, default_ string, validate func(string) string) string { for { fmt.Printf(question) input, _ := reader.ReadString('\n') input = strings.TrimSuffix(input, "\n") + if input == "" { + input = default_ + } + if validate != nil { + result := validate(input) + if result != "" { + fmt.Printf("Invalid input: %s\n\n", result) + continue + } + } if len(input) != 0 { return input } @@ -780,7 +799,7 @@ func cmdInit() error { return fmt.Errorf("Init configuration is only valid with --auto") } - storageBackend = askChoice("Name of the storage backend to use (dir or zfs): ", backendsSupported) + storageBackend = askChoice("Name of the storage backend to use (dir or zfs) [default=zfs]: ", backendsSupported, "zfs") if !shared.StringInSlice(storageBackend, backendsSupported) { return fmt.Errorf("The requested backend '%s' isn't supported by lxd init.", storageBackend) @@ -791,17 +810,23 @@ func cmdInit() error { } if storageBackend == "zfs" { - if askBool("Create a new ZFS pool (yes/no)? ") { - storagePool = askString("Name of the new ZFS pool: ") - if askBool("Would you like to use an existing block device (yes/no)? ") { - storageDevice = askString("Path to the existing block device: ") + if askBool("Create a new ZFS pool (yes/no) [defualt=yes]? ", "yes") { + storagePool = askString("Name of the new ZFS pool [default=lxd]: ", "lxd", nil) + if askBool("Would you like to use an existing block device (yes/no) [default=no]? ", "no") { + deviceExists := func(path string) string { + if !shared.IsBlockdevPath(path) { + return fmt.Sprintf("'%s' is not a block device", path) + } + return "" + } + storageDevice = askString("Path to the existing block device: ", "", deviceExists) storageMode = "device" } else { - storageLoopSize = askInt("Size in GB of the new loop device (1GB minimum): ", 1, -1) + storageLoopSize = askInt("Size in GB of the new loop device (1GB minimum) [default=10GB]: ", 1, -1, "10") storageMode = "loop" } } else { - storagePool = askString("Name of the existing ZFS pool or dataset: ") + storagePool = askString("Name of the existing ZFS pool or dataset: ", "", nil) storageMode = "existing" } } @@ -818,16 +843,23 @@ in theory attack their parent container and gain more privileges than they otherwise would. `) - if askBool("Would you like to have your containers share their parent's allocation (yes/no)? ") { + if askBool("Would you like to have your containers share their parent's allocation (yes/no) [default=yes]? ", "yes") { defaultPrivileged = 1 } else { defaultPrivileged = 0 } } - if askBool("Would you like LXD to be available over the network (yes/no)? ") { - networkAddress = askString("Address to bind LXD to (not including port): ") - networkPort = askInt("Port to bind LXD to (8443 recommended): ", 1, 65535) + if askBool("Would you like LXD to be available over the network (yes/no) [default=no]? ", "no") { + isIPAddress := func(s string) string { + if net.ParseIP(s) == nil { + return fmt.Sprintf("'%s' is not an IP address", s) + } + return "" + } + + networkAddress = askString("Address to bind LXD to (not including port) [default=0.0.0.0]: ", "0.0.0.0", isIPAddress) + networkPort = askInt("Port to bind LXD to [default=8443]: ", 1, 65535, "8443") trustPassword = askPassword("Trust password for new clients: ") } }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel