1
0
mirror of https://github.com/rancher/os.git synced 2025-09-08 18:20:32 +00:00
Files
os/pkg/install/ask.go

193 lines
3.7 KiB
Go
Raw Normal View History

2021-08-31 11:14:03 -07:00
package install
import (
"os/exec"
"strings"
2021-10-20 12:19:44 -07:00
"github.com/rancher/os2/pkg/config"
"github.com/rancher/os2/pkg/questions"
"github.com/rancher/os2/pkg/util"
2021-08-31 11:14:03 -07:00
)
func Ask(cfg *config.Config) error {
if err := AskInstallDevice(cfg); err != nil {
return err
}
if err := AskConfigURL(cfg); err != nil {
return err
}
2021-10-13 16:00:29 -07:00
if cfg.RancherOS.Install.ConfigURL == "" {
2021-08-31 11:14:03 -07:00
if err := AskGithub(cfg); err != nil {
return err
}
if err := AskPassword(cfg); err != nil {
return err
}
2021-10-22 23:22:09 -07:00
if err := AskServerAgent(cfg); err != nil {
return err
}
2021-08-31 11:14:03 -07:00
}
return nil
}
func AskInstallDevice(cfg *config.Config) error {
2021-10-13 16:00:29 -07:00
if cfg.RancherOS.Install.Device != "" {
2021-08-31 11:14:03 -07:00
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
}
2021-10-13 16:00:29 -07:00
cfg.RancherOS.Install.Device = "/dev/" + fields[i]
2021-08-31 11:14:03 -07:00
return nil
}
2021-10-22 23:22:09 -07:00
func AskToken(cfg *config.Config, server bool) error {
var (
token string
err error
)
if cfg.RancherOS.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.RancherOS.Install.Token = token
return err
}
func isServer() (bool, bool, error) {
2021-10-13 16:00:29 -07:00
opts := []string{"server", "agent", "none"}
2021-10-22 23:22:09 -07:00
i, err := questions.PromptFormattedOptions("Run as server or agent (Choose none if building an image)?", 0, opts...)
2021-08-31 11:14:03 -07:00
if err != nil {
2021-10-13 16:00:29 -07:00
return false, false, err
2021-08-31 11:14:03 -07:00
}
2021-10-13 16:00:29 -07:00
return i == 0, i == 1, nil
2021-08-31 11:14:03 -07:00
}
2021-10-22 23:22:09 -07:00
func AskServerAgent(cfg *config.Config) error {
2021-10-24 17:07:48 -07:00
if cfg.RancherOS.Install.ServerURL != "" || cfg.RancherOS.Install.Automatic {
2021-10-22 23:22:09 -07:00
return nil
}
server, agent, err := isServer()
if err != nil {
return err
}
if !server && !agent {
return nil
}
if server {
cfg.RancherOS.Install.Role = "server"
return AskToken(cfg, true)
}
cfg.RancherOS.Install.Role = "agent"
url, err := questions.Prompt("URL of server: ", "")
if err != nil {
return err
}
cfg.RancherOS.Install.ServerURL = url
return AskToken(cfg, false)
}
2021-08-31 11:14:03 -07:00
func AskPassword(cfg *config.Config) error {
2021-10-24 17:07:48 -07:00
if cfg.RancherOS.Install.Automatic || cfg.RancherOS.Install.Password != "" {
2021-08-31 11:14:03 -07:00
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
}
}
2021-10-13 16:00:29 -07:00
cfg.RancherOS.Install.Password = pass
2021-08-31 11:14:03 -07:00
return nil
}
func AskGithub(cfg *config.Config) error {
2021-10-24 17:07:48 -07:00
if len(cfg.SSHAuthorizedKeys) > 0 || cfg.RancherOS.Install.Password != "" || cfg.RancherOS.Install.Automatic {
2021-08-31 11:14:03 -07:00
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 {
2021-10-24 17:07:48 -07:00
if cfg.RancherOS.Install.ConfigURL != "" || cfg.RancherOS.Install.Automatic {
2021-08-31 11:14:03 -07:00
return nil
}
2021-10-02 22:27:31 -07:00
ok, err := questions.PromptBool("Configure system using an cloud-config file?", false)
2021-08-31 11:14:03 -07:00
if err != nil {
return err
}
if !ok {
return nil
}
2021-10-02 22:27:31 -07:00
str, err := questions.Prompt("cloud-config file location (file path or http URL): ", "")
2021-08-31 11:14:03 -07:00
if err != nil {
return err
}
2021-10-13 16:00:29 -07:00
cfg.RancherOS.Install.ConfigURL = str
2021-08-31 11:14:03 -07:00
return nil
}