2015-08-18 14:07:00 +00:00
|
|
|
package control
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
|
|
|
|
log "github.com/Sirupsen/logrus"
|
|
|
|
|
|
|
|
"github.com/codegangsta/cli"
|
2015-10-12 11:50:17 +00:00
|
|
|
"github.com/rancher/os/cmd/power"
|
|
|
|
"github.com/rancher/os/config"
|
|
|
|
"github.com/rancher/os/util"
|
2015-08-18 14:07:00 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var installCommand = cli.Command{
|
|
|
|
Name: "install",
|
|
|
|
Usage: "install RancherOS to disk",
|
|
|
|
HideHelp: true,
|
|
|
|
Action: installAction,
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "image, i",
|
|
|
|
Usage: "install from a certain image",
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "install-type, t",
|
|
|
|
Usage: `generic: (Default) Creates 1 ext4 partition and installs RancherOS
|
|
|
|
amazon-ebs: Installs RancherOS and sets up PV-GRUB`,
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "cloud-config, c",
|
|
|
|
Usage: "cloud-config yml file - needed for SSH authorized keys",
|
|
|
|
},
|
|
|
|
cli.StringFlag{
|
|
|
|
Name: "device, d",
|
|
|
|
Usage: "storage device",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "force, f",
|
|
|
|
Usage: "[ DANGEROUS! Data loss can happen ] partition/format without prompting",
|
|
|
|
},
|
|
|
|
cli.BoolFlag{
|
|
|
|
Name: "no-reboot",
|
|
|
|
Usage: "do not reboot after install",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2016-05-17 03:36:08 +00:00
|
|
|
func installAction(c *cli.Context) error {
|
2015-08-18 14:07:00 +00:00
|
|
|
if c.Args().Present() {
|
|
|
|
log.Fatalf("invalid arguments %v", c.Args())
|
|
|
|
}
|
|
|
|
device := c.String("device")
|
|
|
|
if device == "" {
|
|
|
|
log.Fatal("Can not proceed without -d <dev> specified")
|
|
|
|
}
|
|
|
|
|
|
|
|
image := c.String("image")
|
2016-06-02 01:41:55 +00:00
|
|
|
cfg := config.LoadConfig()
|
2015-08-18 14:07:00 +00:00
|
|
|
if image == "" {
|
2016-03-28 20:50:29 +00:00
|
|
|
image = cfg.Rancher.Upgrade.Image + ":" + config.VERSION + config.SUFFIX
|
2015-08-18 14:07:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
installType := c.String("install-type")
|
|
|
|
if installType == "" {
|
|
|
|
log.Info("No install type specified...defaulting to generic")
|
|
|
|
installType = "generic"
|
|
|
|
}
|
|
|
|
|
|
|
|
cloudConfig := c.String("cloud-config")
|
|
|
|
if cloudConfig == "" {
|
|
|
|
log.Warn("Cloud-config not provided: you might need to provide cloud-config on boot with ssh_authorized_keys")
|
|
|
|
} else {
|
|
|
|
uc := "/opt/user_config.yml"
|
|
|
|
if err := util.FileCopy(cloudConfig, uc); err != nil {
|
|
|
|
log.WithFields(log.Fields{"cloudConfig": cloudConfig}).Fatal("Failed to copy cloud-config")
|
|
|
|
}
|
|
|
|
cloudConfig = uc
|
|
|
|
}
|
|
|
|
|
|
|
|
force := c.Bool("force")
|
|
|
|
reboot := !c.Bool("no-reboot")
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
if err := runInstall(image, installType, cloudConfig, device, force, reboot); err != nil {
|
2015-08-18 14:07:00 +00:00
|
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to run install")
|
|
|
|
}
|
2016-05-17 03:36:08 +00:00
|
|
|
|
|
|
|
return nil
|
2015-08-18 14:07:00 +00:00
|
|
|
}
|
|
|
|
|
2015-09-23 11:36:28 +00:00
|
|
|
func runInstall(image, installType, cloudConfig, device string, force, reboot bool) error {
|
2015-08-18 14:07:00 +00:00
|
|
|
in := bufio.NewReader(os.Stdin)
|
|
|
|
|
|
|
|
fmt.Printf("Installing from %s\n", image)
|
|
|
|
|
|
|
|
if !force {
|
|
|
|
if !yes(in, "Continue") {
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if installType == "generic" {
|
|
|
|
cmd := exec.Command("system-docker", "run", "--net=host", "--privileged", "--volumes-from=all-volumes",
|
|
|
|
"--entrypoint=/scripts/set-disk-partitions", image, device)
|
|
|
|
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
cmd := exec.Command("system-docker", "run", "--net=host", "--privileged", "--volumes-from=user-volumes", image,
|
|
|
|
"-d", device, "-t", installType, "-c", cloudConfig)
|
|
|
|
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2016-08-24 22:51:33 +00:00
|
|
|
if reboot && (force || yes(in, "Continue with reboot")) {
|
2015-08-18 14:07:00 +00:00
|
|
|
log.Info("Rebooting")
|
|
|
|
power.Reboot()
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|