mirror of
https://github.com/rancher/os.git
synced 2025-09-15 22:49:08 +00:00
Refactor build
This commit is contained in:
190
pkg/install/ask.go
Normal file
190
pkg/install/ask.go
Normal file
@@ -0,0 +1,190 @@
|
||||
package install
|
||||
|
||||
import (
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/rancher/os/pkg/config"
|
||||
"github.com/rancher/os/pkg/questions"
|
||||
"github.com/rancher/os/pkg/util"
|
||||
)
|
||||
|
||||
func Ask(cfg *config.Config) error {
|
||||
if cfg.Elemental.Install.Silent {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := AskInstallDevice(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := AskConfigURL(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if cfg.Elemental.Install.ConfigURL == "" {
|
||||
if err := AskGithub(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := AskPassword(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := AskServerAgent(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func AskInstallDevice(cfg *config.Config) error {
|
||||
if cfg.Elemental.Install.Device != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
output, err := exec.Command("/bin/sh", "-c", "lsblk -r -o NAME,TYPE | grep -w disk | grep -v fd0 | awk '{print $1}'").CombinedOutput()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fields := strings.Fields(string(output))
|
||||
i, err := questions.PromptFormattedOptions("Installation target. Device will be formatted", -1, fields...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cfg.Elemental.Install.Device = "/dev/" + fields[i]
|
||||
return nil
|
||||
}
|
||||
|
||||
func AskToken(cfg *config.Config, server bool) error {
|
||||
var (
|
||||
token string
|
||||
err error
|
||||
)
|
||||
|
||||
if cfg.Elemental.Install.Token != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
msg := "Token or cluster secret"
|
||||
if server {
|
||||
msg += " (optional)"
|
||||
}
|
||||
if server {
|
||||
token, err = questions.PromptOptional(msg+": ", "")
|
||||
} else {
|
||||
token, err = questions.Prompt(msg+": ", "")
|
||||
}
|
||||
cfg.Elemental.Install.Token = token
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func isServer(cfg *config.Config) (bool, error) {
|
||||
opts := []string{"server", "agent"}
|
||||
i, err := questions.PromptFormattedOptions("Run as server or agent?", 0, opts...)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return i == 0, nil
|
||||
}
|
||||
|
||||
func AskServerAgent(cfg *config.Config) error {
|
||||
if cfg.Elemental.Install.ServerURL != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
server, err := isServer(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if server {
|
||||
return AskToken(cfg, true)
|
||||
}
|
||||
|
||||
url, err := questions.Prompt("URL of server: ", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
cfg.Elemental.Install.ServerURL = url
|
||||
|
||||
return AskToken(cfg, false)
|
||||
}
|
||||
|
||||
func AskPassword(cfg *config.Config) error {
|
||||
if cfg.Elemental.Install.Silent || cfg.Elemental.Install.Password != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
ok = false
|
||||
err error
|
||||
pass string
|
||||
)
|
||||
|
||||
for !ok {
|
||||
pass, ok, err = util.PromptPassword()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if pass != "" {
|
||||
pass, err = util.GetEncryptedPasswd(pass)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
cfg.Elemental.Install.Password = pass
|
||||
return nil
|
||||
}
|
||||
|
||||
func AskGithub(cfg *config.Config) error {
|
||||
if len(cfg.SSHAuthorizedKeys) > 0 || cfg.Elemental.Install.Password != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
ok, err := questions.PromptBool("Authorize GitHub users to root SSH?", false)
|
||||
if !ok || err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
str, err := questions.Prompt("Comma separated list of GitHub users to authorize: ", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, s := range strings.Split(str, ",") {
|
||||
cfg.SSHAuthorizedKeys = append(cfg.SSHAuthorizedKeys, "github:"+strings.TrimSpace(s))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func AskConfigURL(cfg *config.Config) error {
|
||||
if cfg.Elemental.Install.ConfigURL != "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
ok, err := questions.PromptBool("Configure system using an Elemental config file?", false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
|
||||
str, err := questions.Prompt("Elemental config file location (file path or http URL): ", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cfg.Elemental.Install.ConfigURL = str
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user