コード例 #1
0
ファイル: install_darwin.go プロジェクト: carriercomm/dlite
func (c *InstallCommand) Execute(args []string) error {
	versionMsg := "the latest version"
	if c.Version != "" {
		versionMsg = "version " + c.Version
	}

	fmt.Printf(`
The install command will make the following changes to your system:
- Create a '.dlite' directory in your home
- Create a %d GiB sparse disk image in the '.dlite' directory
- Download %s of DhyveOS to the '.dlite' directory
- Create a 'config.json' file in the '.dlite' directory
- Create a new SSH key pair in the '.dlite' directory for the vm
- Create a launchd agent in '/Library/LaunchDaemons' used to run the privileged daemon
- Store logs from the daemon in '/Library/Logs'
- Create a launchd agent in '~/Library/LaunchAgents' used to start the privileged daemon under this user's context

`, c.Disk, versionMsg)

	fmt.Print("Would you like to continue? (Y/n): ")
	reader := bufio.NewReader(os.Stdin)
	response, err := reader.ReadString('\n')
	if err != nil {
		return err
	}

	response = strings.ToLower(strings.TrimSpace(response))
	if response == "n" || response == "no" {
		return fmt.Errorf("Aborted install due to user input")
	}

	if response != "" && response != "y" && response != "yes" {
		return fmt.Errorf("Aborted install due to invalid user input")
	}

	var cfg *config.Config
	steps := Steps{
		{
			"Creating configuration",
			func() error {
				cfg, err := config.New(os.ExpandEnv("$USER"))
				if err != nil {
					return err
				}

				if c.DockerVersion == "" {
					latest, err := docker.Latest()
					if err != nil {
						return err
					}
					c.DockerVersion = latest
				}

				if c.Cpus == 0 {
					c.Cpus = runtime.NumCPU()
				}

				cfg.CpuCount = c.Cpus
				cfg.DockerVersion = c.DockerVersion
				cfg.Uuid = uuid.NewV1().String()
				cfg.Memory = c.Memory
				cfg.Hostname = c.Hostname
				cfg.DockerVersion = c.DockerVersion
				cfg.Extra = c.Extra
				cfg.DNSServer = c.DNSServer
				cfg.DiskSize = c.Disk
				cfg.Route = c.Route

				return cfg.Save()
			},
		},
		{
			"Building disk image",
			func() error {
				d := disk.New(cfg)
				d.Detach()

				return d.Create()
			},
		},
		{
			"Downloading OS",
			func() error {
				var vers dliteos.Version
				var err error

				if c.Version == "" {
					vers, err = dliteos.Latest()
				} else {
					vers, err = dliteos.Specific(c.Version)
				}
				if err != nil {
					return err
				}

				return dliteos.Download(cfg.Dir, vers)
			},
		},
		{
			"Generating SSH key",
			func() error {
				s := ssh.New(cfg)
				return s.Generate()
			},
		},
	}

	return Spin(steps)
}