func NewCmdLaunchdInstall(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command { return cli.Command{ Name: "install", ArgumentHelp: "<label> <path/to/keybase> <args>", Usage: "Install a launchd service", Action: func(c *cli.Context) { // TODO: Use ChooseCommand args := c.Args() if len(args) < 1 { g.Log.Fatalf("No label specified.") } if len(args) < 2 { g.Log.Fatalf("No path to keybase executable specified.") } label := args[0] binPath := args[1] plistArgs := args[2:] envVars := defaultLaunchdEnvVars(g, label) plist := launchd.NewPlist(label, binPath, plistArgs, envVars) err := launchd.Install(plist, os.Stdout) if err != nil { g.Log.Fatalf("%v", err) } os.Exit(0) }, } }
func NewCmdLaunchdInstall(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command { return cli.Command{ Name: "install", Usage: "Install a launchd service", ArgumentHelp: "<label> <executable> <logfilename> <args>", Action: func(c *cli.Context) { // TODO: Use ChooseCommand args := c.Args() if len(args) < 1 { g.Log.Fatalf("No label specified.") } if len(args) < 2 { g.Log.Fatalf("No executable specified.") } if len(args) < 3 { g.Log.Fatalf("No log file name specified.") } label := args[0] binPath := args[1] logFileName := args[2] plistArgs := args[3:] envVars := install.DefaultLaunchdEnvVars(label) plist := launchd.NewPlist(label, binPath, plistArgs, envVars, logFileName, "") err := launchd.Install(plist, defaultLaunchdWait, g.Log) if err != nil { g.Log.Fatalf("%v", err) } os.Exit(0) }, } }
func NewCmdLaunchdInstall(cl *libcmdline.CommandLine) cli.Command { return cli.Command{ Name: "install", ArgumentHelp: "<label> <path/to/keybase> <args>", Usage: "Install a launchd service", Action: func(c *cli.Context) { args := c.Args() if len(args) < 1 { G.Log.Fatalf("No label specified.") } if len(args) < 2 { G.Log.Fatalf("No path to keybase executable specified.") } label := args[0] binPath := args[1] plistArgs := args[2:] envVars := make(map[string]string) envVars["PATH"] = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin" envVars["KEYBASE_LABEL"] = label envVars["KEYBASE_LOG_FORMAT"] = "file" plist := launchd.NewPlist(label, binPath, plistArgs, envVars) err := launchd.Install(plist) if err != nil { G.Log.Fatalf("%v", err) } os.Exit(0) }, } }
func installKBFSService(g *libkb.GlobalContext, binPath string) (*keybase1.ServiceStatus, error) { runMode := g.Env.GetRunMode() label := defaultKBFSLabel(runMode) kbfsBinPath, err := kbfsBinPath(runMode, binPath) if err != nil { return nil, err } mountPath := kbfsMountPath(g.Env.GetHome(), runMode) // Create mount dir if it doesn't exist if _, err := os.Stat(mountPath); os.IsNotExist(err) { // TODO Make dir hidden so it only shows when mounted? err := os.MkdirAll(mountPath, libkb.PermDir) if err != nil { return nil, err } } plistArgs := []string{mountPath} envVars := defaultLaunchdEnvVars(g, label) plist := launchd.NewPlist(label, kbfsBinPath, plistArgs, envVars) err = launchd.Install(plist, os.Stdout) if err != nil { return nil, err } kbfsService := launchd.NewService(label) st, _ := serviceStatusFromLaunchd(kbfsService, "") return &st, nil }
func installKBFSService(g *libkb.GlobalContext, binPath string) (*keybase1.ServiceStatus, error) { runMode := g.Env.GetRunMode() label := defaultKBFSLabel(runMode) kbfsBinPath, err := kbfsBinPath(runMode, binPath) if err != nil { return nil, err } mountPath := kbfsMountPath(runMode) _, err = os.Stat(mountPath) if err != nil { return nil, err } // TODO: Remove when doing real release plistArgs := []string{"-debug", mountPath} envVars := DefaultLaunchdEnvVars(g, label) plist := launchd.NewPlist(label, kbfsBinPath, plistArgs, envVars) err = launchd.Install(plist, g.Log) if err != nil { return nil, err } kbfsService := launchd.NewService(label) st, err := serviceStatusFromLaunchd(kbfsService, "") return &st, err }
func installKBFSService(g *libkb.GlobalContext, service launchd.Service, plist launchd.Plist) (*keybase1.ServiceStatus, error) { err := launchd.Install(plist, g.Log) if err != nil { return nil, err } st, err := serviceStatusFromLaunchd(g, service, "") return &st, err }
func installUpdaterService(service launchd.Service, plist launchd.Plist, wait time.Duration, log Log) (*keybase1.ServiceStatus, error) { err := launchd.Install(plist, defaultLaunchdWait, log) if err != nil { return nil, err } st, err := serviceStatusFromLaunchd(service, "", wait, log) return &st, err }
func installKeybaseService(context Context, service launchd.Service, plist launchd.Plist, wait time.Duration, log Log) (*keybase1.ServiceStatus, error) { err := launchd.Install(plist, defaultLaunchdWait, log) if err != nil { return nil, err } st, err := serviceStatusFromLaunchd(service, context.GetServiceInfoPath(), wait, log) return &st, err }
func installKeybaseService(g *libkb.GlobalContext, binPath string) (*keybase1.ServiceStatus, error) { label := defaultServiceLabel(g.Env.GetRunMode()) plistArgs := []string{"service"} envVars := DefaultLaunchdEnvVars(g, label) plist := launchd.NewPlist(label, binPath, plistArgs, envVars) err := launchd.Install(plist, g.Log) if err != nil { return nil, err } kbService := launchd.NewService(label) st, err := serviceStatusFromLaunchd(kbService, serviceInfoPath(g)) return &st, err }
func installKeybaseService(g *libkb.GlobalContext, binPath string) (*keybase1.ServiceStatus, error) { label := DefaultServiceLabel(g.Env.GetRunMode()) // TODO: Remove -d when doing real release plistArgs := []string{"-d", "service"} envVars := DefaultLaunchdEnvVars(g, label) plist := launchd.NewPlist(label, binPath, plistArgs, envVars, libkb.ServiceLogFileName) err := launchd.Install(plist, g.Log) if err != nil { return nil, err } kbService := launchd.NewService(label) st, err := serviceStatusFromLaunchd(g, kbService, serviceInfoPath(g)) return &st, err }
func NewCmdLaunchdInstall(cl *libcmdline.CommandLine) cli.Command { return cli.Command{ Name: "install", ArgumentHelp: "<label> <path/to/keybase> <args>", Usage: "Install a launchd service", Action: func(c *cli.Context) { args := c.Args() if len(args) < 1 { G.Log.Fatalf("No label specified.") } if len(args) < 2 { G.Log.Fatalf("No path to keybase executable specified.") } label := args[0] binPath := args[1] plistArgs := args[2:] homeDir := os.Getenv("HOME") home := libkb.NewHomeFinder("keybase", func() string { return homeDir }, runtime.GOOS, func() libkb.RunMode { return libkb.DefaultRunMode }) envVars := make(map[string]string) envVars["PATH"] = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin" envVars["KEYBASE_LABEL"] = label envVars["KEYBASE_LOG_FORMAT"] = "file" envVars["KEYBASE_RUNTIME_DIR"] = home.RuntimeDir() plist := launchd.NewPlist(label, binPath, plistArgs, envVars) err := launchd.Install(plist) if err != nil { G.Log.Fatalf("%v", err) } os.Exit(0) }, } }
func BrewAutoInstall(g *libkb.GlobalContext) (newProc bool, err error) { g.Log.Debug("+ BrewAutoInstall for launchd") defer func() { g.Log.Debug("- BrewAutoInstall -> %v, %v", newProc, err) }() label := defaultBrewServiceLabel(g.Env.GetRunMode()) if label == "" { err = fmt.Errorf("No service label to install") return newProc, err } // Check if plist is installed. If so we're already installed and return. plistPath := launchd.PlistDestination(label) if _, err := os.Stat(plistPath); err == nil { g.Log.Debug("| already installed at %s", plistPath) return newProc, nil } // Get the full path to this executable using the brew opt bin directory. binName := filepath.Base(os.Args[0]) binPath := filepath.Join("/usr/local/opt", binName, "bin", binName) g.Log.Debug("| assembled binPath = %s", binPath) plistArgs := []string{"service"} envVars := defaultEnvVars(g, label) plist := launchd.NewPlist(label, binPath, plistArgs, envVars) err = launchd.Install(plist, ioutil.Discard) if err != nil { return newProc, err } // Get service install status. This causes us to pause (with timeout) until // the service is up. kbService := launchd.NewService(label) ServiceStatusFromLaunchd(kbService, path.Join(g.Env.GetRuntimeDir(), "keybased.info")) newProc = true return newProc, nil }