// updatable func updatable() (bool, error) { // path, err := osext.Executable() if err != nil { return false, err } // check the md5 of the current executing cli against the remote md5; // os.Args[0] is used as the final interpolation to determine standard/dev versions match, err := util.MD5sMatch(path, fmt.Sprintf("https://s3.amazonaws.com/tools.nanobox.io/cli/%s/%s/%s.md5", config.OS, config.ARCH, filepath.Base(os.Args[0]))) if err != nil { return false, err } // if the MD5's DONT match we want to update return !match, nil }
// runUpdate attemtps to update using the updater; if it's not available nanobox // will download it and then run it. func runUpdate() error { // path, err := osext.Executable() if err != nil { return err } // get the directory of the current executing cli dir := filepath.Dir(path) // see if the updater is available on PATH if _, err := exec.LookPath("nanobox-update"); err != nil { tmpFile := filepath.Join(config.TmpDir, "nanobox-update") // create a tmp updater in tmp dir f, err := os.Create(tmpFile) if err != nil { return err } defer f.Close() // the updateder is not available and needs to be downloaded dl := fmt.Sprintf("https://s3.amazonaws.com/tools.nanobox.io/updaters/%s/%s/nanobox-update", config.OS, config.ARCH) fmt.Printf("'nanobox-update' not found. Downloading from %s\n", dl) fileutil.Progress(dl, f) // ensure updater download matches the remote md5; if the download fails for any // reason this md5 should NOT match. md5 := fmt.Sprintf("https://s3.amazonaws.com/tools.nanobox.io/updaters/%s/%s/nanobox-udpate.md5", config.OS, config.ARCH) if _, err = util.MD5sMatch(tmpFile, md5); err != nil { return err } // make new updater executable if err := os.Chmod(tmpFile, 0755); err != nil { return err } // move updater to the same location as the cli if err = os.Rename(tmpFile, filepath.Join(dir, "nanobox-update")); err != nil { return err } } cmd := exec.Command(filepath.Join(dir, "nanobox-update"), "-o", filepath.Base(path)) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr // run the updater if err := cmd.Run(); err != nil { config.Fatal("[commands/update] exec.Command().Run() failed", err.Error()) } // update the .update file return touchUpdate() }