1
0
mirror of https://github.com/rancher/os.git synced 2025-07-15 15:51:36 +00:00
os/pkg/install/ask.go
2021-10-02 16:08:48 -07:00

191 lines
3.5 KiB
Go

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
}