// serviced service shell [--saveas SAVEAS] [--interactive, -i] SERVICEID [COMMAND] func (c *ServicedCli) cmdServiceShell(ctx *cli.Context) error { args := ctx.Args() if len(args) < 1 { if !ctx.Bool("help") { fmt.Fprintf(os.Stderr, "Incorrect Usage.\n\n") } cli.ShowSubcommandHelp(ctx) return c.exit(1) } var ( command string argv []string isTTY bool ) svc, err := c.searchForService(args[0]) if err != nil { fmt.Fprintln(os.Stderr, err) return c.exit(1) } if len(args) < 2 { command = "/bin/bash" isTTY = true } else { command = args[1] isTTY = ctx.GlobalBool("interactive") } if len(args) > 2 { argv = args[2:] } config := api.ShellConfig{ ServiceID: svc.ID, Command: command, Args: argv, SaveAs: ctx.GlobalString("saveas"), IsTTY: isTTY, Mounts: ctx.GlobalStringSlice("mount"), ServicedEndpoint: fmt.Sprintf("localhost:%s", api.GetOptionsRPCPort()), } if err := c.driver.StartShell(config); err != nil { fmt.Fprintln(os.Stderr, err) if exitErr, ok := err.(*exec.ExitError); ok { if exitErr != nil && exitErr.ProcessState != nil && exitErr.ProcessState.Sys() != nil { if status, ok := exitErr.ProcessState.Sys().(syscall.WaitStatus); ok { return c.exit(status.ExitStatus()) } } } return c.exit(1) } else { return c.exit(0) } }
// serviced service run SERVICEID [COMMAND [ARGS ...]] func (c *ServicedCli) cmdServiceRun(ctx *cli.Context) error { args := ctx.Args() if len(args) < 1 { if !ctx.Bool("help") { fmt.Fprintf(os.Stderr, "Incorrect Usage.\n\n") } cli.ShowSubcommandHelp(ctx) return c.exit(1) } if len(args) < 2 { for _, s := range c.serviceRuns(args[0]) { fmt.Println(s) } fmt.Fprintf(os.Stderr, "serviced service run") return c.exit(1) } var ( command string argv []string ) svc, err := c.searchForService(args[0]) if err != nil { fmt.Fprintln(os.Stderr, err) return c.exit(1) } command = args[1] if len(args) > 2 { argv = args[2:] } config := api.ShellConfig{ ServiceID: svc.ID, Command: command, Username: ctx.GlobalString("user"), Args: argv, SaveAs: dfs.NewLabel(svc.ID), IsTTY: ctx.GlobalBool("interactive"), Mounts: ctx.GlobalStringSlice("mount"), ServicedEndpoint: fmt.Sprintf("localhost:%s", api.GetOptionsRPCPort()), LogToStderr: ctx.GlobalBool("logtostderr"), } config.LogStash.Enable = ctx.GlobalBool("logstash") config.LogStash.SettleTime = ctx.GlobalString("logstash-settle-time") config.LogStash.IdleFlushTime = ctx.GlobalString("logstash-idle-flush-time") if err := c.driver.RunShell(config); err != nil { fmt.Fprintln(os.Stderr, err) return c.exit(1) } return c.exit(0) }