func (d *Driver) CopyIsoToMachineDir(isoURL, machineName string) error { b2d := b2d.NewB2dUtils(d.StorePath) mcnutils := mcnutils.NewB2dUtils(d.StorePath) if err := d.UpdateISOCache(isoURL); err != nil { return err } isoPath := filepath.Join(b2d.ImgCachePath, isoFilename) if isoStat, err := os.Stat(isoPath); err == nil { if int(isoStat.Sys().(*syscall.Stat_t).Uid) == 0 { log.Debugf("Fix %s file permission...", isoStat.Name()) os.Chown(isoPath, syscall.Getuid(), syscall.Getegid()) } } // TODO: This is a bit off-color. machineDir := filepath.Join(d.StorePath, "machines", machineName) machineIsoPath := filepath.Join(machineDir, isoFilename) // By default just copy the existing "cached" iso to the machine's directory... defaultISO := filepath.Join(b2d.ImgCachePath, defaultISOFilename) if isoURL == "" { log.Infof("Copying %s to %s...", defaultISO, machineIsoPath) return CopyFile(defaultISO, machineIsoPath) } // if ISO is specified, check if it matches a github releases url or fallback to a direct download downloadURL, err := b2d.GetReleaseURL(isoURL) if err != nil { return err } return mcnutils.DownloadISO(machineDir, b2d.Filename(), downloadURL) }
func (d *Driver) UpdateISOCache(isoURL string) error { b2d := b2d.NewB2dUtils(d.StorePath) mcnutils := mcnutils.NewB2dUtils(d.StorePath) // recreate the cache dir if it has been manually deleted if _, err := os.Stat(b2d.ImgCachePath); os.IsNotExist(err) { log.Infof("Image cache directory does not exist, creating it at %s...", b2d.ImgCachePath) if err := os.Mkdir(b2d.ImgCachePath, 0700); err != nil { return err } } // Check owner of storage cache directory cacheStat, _ := os.Stat(b2d.ImgCachePath) if int(cacheStat.Sys().(*syscall.Stat_t).Uid) == 0 { log.Debugf("Fix %s directory permission...", cacheStat.Name()) os.Chown(b2d.ImgCachePath, syscall.Getuid(), syscall.Getegid()) } if isoURL != "" { // Non-default B2D are not cached return nil } exists := b2d.Exists() if !exists { log.Info("No default Boot2Docker ISO found locally, downloading the latest release...") return mcnutils.DownloadLatestBoot2Docker("") } latest := b2d.IsLatest() if !latest { log.Info("Default Boot2Docker ISO is out-of-date, downloading the latest release...") return mcnutils.DownloadLatestBoot2Docker("") } return nil }