mirror of
https://github.com/rancher/os.git
synced 2025-07-15 15:51:36 +00:00
191 lines
3.5 KiB
Go
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
|
|
}
|