func cmdExec(c *cli.Context) { fd := os.Stdin.Fd() stdinState, err := terminal.GetState(int(fd)) defer terminal.Restore(int(fd), stdinState) _, app, err := stdcli.DirApp(c, ".") if err != nil { stdcli.Error(err) return } if len(c.Args()) < 2 { stdcli.Usage(c, "exec") return } ps := c.Args()[0] code, err := rackClient(c).ExecProcessAttached(app, ps, strings.Join(c.Args()[1:], " "), os.Stdin, os.Stdout) terminal.Restore(int(fd), stdinState) if err != nil { stdcli.Error(err) return } os.Exit(code) }
func runAttached(c *cli.Context, app string, ps string, args string) (int, error) { fd := os.Stdin.Fd() if terminal.IsTerminal(int(fd)) { stdinState, err := terminal.GetState(int(fd)) if err != nil { return -1, err } defer terminal.Restore(int(fd), stdinState) } w, h, err := terminal.GetSize(int(fd)) if err != nil { return -1, err } code, err := rackClient(c).RunProcessAttached(app, ps, args, h, w, os.Stdin, os.Stdout) if err != nil { return -1, err } return code, nil }
func sshWithRestore(c *cli.Context, id, cmd string) (int, error) { fd := os.Stdin.Fd() isTerm := terminal.IsTerminal(int(fd)) var h, w int if isTerm { stdinState, err := terminal.GetState(int(fd)) if err != nil { return -1, err } h, w, err = terminal.GetSize(int(fd)) if err != nil { return -1, err } defer terminal.Restore(int(fd), stdinState) } return rackClient(c).SSHInstance(id, cmd, h, w, isTerm, os.Stdin, os.Stdout) }