func kbfsPlist(context Context, kbfsBinPath string, label string) (plist launchd.Plist, err error) { mountDir, err := context.GetMountDir() if err != nil { return } logFile := filepath.Join(context.GetLogDir(), libkb.KBFSLogFileName) startLogFile := filepath.Join(context.GetLogDir(), libkb.StartLogFileName) err = libkb.MakeParentDirs(startLogFile) if err != nil { return } // TODO: Remove debug flag when doing real release plistArgs := []string{ "-debug", fmt.Sprintf("-log-file=%s", logFile), fmt.Sprintf("-runtime-dir=%s", context.GetRuntimeDir()), } if context.GetRunMode() == libkb.DevelRunMode { plistArgs = append(plistArgs, fmt.Sprintf("-server-root=%s", context.GetRuntimeDir())) } plistArgs = append(plistArgs, mountDir) envVars := DefaultLaunchdEnvVars(label) envVars = append(envVars, launchd.NewEnvVar("KEYBASE_RUN_MODE", string(context.GetRunMode()))) plist = launchd.NewPlist(label, kbfsBinPath, plistArgs, envVars, startLogFile, defaultPlistComment) _, err = os.Stat(mountDir) if err != nil { return } return }
func updaterPlist(context Context, label string, serviceBinPath string, keybaseBinPath string) (launchd.Plist, error) { plistArgs := []string{fmt.Sprintf("-path-to-keybase=%s", keybaseBinPath)} envVars := DefaultLaunchdEnvVars(label) comment := "It's not advisable to edit this plist, it may be overwritten" logFile := filepath.Join(context.GetLogDir(), libkb.UpdaterLogFileName) err := libkb.MakeParentDirs(logFile) if err != nil { return launchd.Plist{}, err } return launchd.NewPlist(label, serviceBinPath, plistArgs, envVars, logFile, comment), nil }
func keybasePlist(context Context, binPath string, label string, log Log) (launchd.Plist, error) { // TODO: Remove -d when doing real release logFile := filepath.Join(context.GetLogDir(), libkb.ServiceLogFileName) startLogFile := filepath.Join(context.GetLogDir(), libkb.StartLogFileName) err := libkb.MakeParentDirs(startLogFile) if err != nil { return launchd.Plist{}, err } plistArgs := []string{"-d", fmt.Sprintf("--log-file=%s", logFile), "service"} envVars := DefaultLaunchdEnvVars(label) envVars = append(envVars, launchd.NewEnvVar("KEYBASE_RUN_MODE", string(context.GetRunMode()))) return launchd.NewPlist(label, binPath, plistArgs, envVars, startLogFile, defaultPlistComment), nil }
// Install will install the launchd service func (s Service) Install(p Plist) error { if _, ferr := os.Stat(p.binPath); os.IsNotExist(ferr) { return fmt.Errorf("%s doesn't exist", p.binPath) } plist := p.plistXML() plistDest := s.plistDestination() // See GH issue: https://github.com/keybase/client/pull/1399#issuecomment-164810645 if err := libkb.MakeParentDirs(plistDest); err != nil { return err } s.info("Saving %s", plistDest) file := libkb.NewFile(plistDest, []byte(plist), 0644) if err := file.Save(); err != nil { return err } return s.Start() }
func (s Service) install(p Plist, plistDest string, wait time.Duration) error { if _, ferr := os.Stat(p.binPath); os.IsNotExist(ferr) { return fmt.Errorf("%s doesn't exist", p.binPath) } plist := p.plistXML() // Plist directory (~/Library/LaunchAgents/) might not exist on clean OS installs // See GH issue: https://github.com/keybase/client/pull/1399#issuecomment-164810645 if err := libkb.MakeParentDirs(plistDest); err != nil { return err } s.log.Info("Saving %s", plistDest) file := libkb.NewFile(plistDest, []byte(plist), 0644) if err := file.Save(); err != nil { return err } return s.Start(wait) }
func (u *Updater) apply(src string, dest string) (tmpPath string, err error) { if _, sterr := os.Stat(dest); sterr == nil { tmpFileName, terr := libkb.TempFileName(fmt.Sprintf("%s.", filepath.Base(dest))) if terr != nil { err = terr return } tmpPath = filepath.Join(backupDir(), tmpFileName) err = libkb.MakeParentDirs(tmpPath) if err != nil { return } u.log.Info("Moving (existing) %s to %s", dest, tmpPath) err = os.Rename(dest, tmpPath) if err != nil { return } } u.log.Info("Moving (update) %s to %s", src, dest) err = os.Rename(src, dest) return }
func (u *Updater) downloadAsset(asset keybase1.Asset) (fpath string, cached bool, err error) { url, err := url.Parse(asset.Url) if err != nil { return } filename := asset.Name fpath = pathForUpdaterFilename(filename) err = libkb.MakeParentDirs(fpath) if err != nil { return } if url.Scheme == "file" { // This is only used for testing, where "file://" is hardcoded. // "file:\\" doesn't work on Windows here. localpath := asset.Url[7:] err = copyFile(localpath, fpath) if err != nil { return } if derr := u.checkDigest(asset.Digest, fpath); derr != nil { err = derr return } u.log.Info("Using local path: %s", fpath) return } etag := "" if _, err = os.Stat(fpath); err == nil { etag, err = computeEtag(fpath) if err != nil { return } } req, _ := http.NewRequest("GET", url.String(), nil) if etag != "" { u.log.Info("Using etag: %s", etag) req.Header.Set("If-None-Match", etag) } timeout := time.Duration(20 * time.Minute) client := &http.Client{ Timeout: timeout, } u.log.Info("Request %s", url.String()) resp, err := client.Do(req) if err != nil { return } if resp == nil { err = fmt.Errorf("No response") return } defer resp.Body.Close() if resp.StatusCode == http.StatusNotModified { u.log.Info("Using cached file: %s", fpath) cached = true return } if resp.StatusCode != http.StatusOK { err = fmt.Errorf("Responded with %s", resp.Status) return } savePath := fmt.Sprintf("%s.download", fpath) if _, ferr := os.Stat(savePath); ferr == nil { u.log.Info("Removing existing partial download: %s", savePath) err = os.Remove(savePath) if err != nil { return } } err = u.save(savePath, *resp) if err != nil { return } if derr := u.checkDigest(asset.Digest, savePath); derr != nil { err = derr return } if _, err = os.Stat(fpath); err == nil { u.log.Info("Removing existing download: %s", fpath) err = os.Remove(fpath) if err != nil { return } } u.log.Info("Moving %s to %s", filepath.Base(savePath), filepath.Base(fpath)) err = os.Rename(savePath, fpath) return }