Skip to content
This repository was archived by the owner on Aug 30, 2024. It is now read-only.

Commit a781eda

Browse files
authored
Merge pull request #13 from cdr/restore-term
Restore term state on exit
2 parents 209ec24 + b93d650 commit a781eda

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

cmd/coder/shell.go

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"time"
99

1010
"github.com/spf13/pflag"
11-
"go.coder.com/cli"
12-
"go.coder.com/flog"
1311
"golang.org/x/crypto/ssh/terminal"
1412
"golang.org/x/sys/unix"
1513
"golang.org/x/time/rate"
14+
"golang.org/x/xerrors"
15+
16+
"go.coder.com/cli"
17+
"go.coder.com/flog"
1618

1719
client "cdr.dev/coder-cli/internal/entclient"
1820
"cdr.dev/coder-cli/wush"
@@ -30,14 +32,20 @@ func (cmd *shellCmd) Spec() cli.CommandSpec {
3032
}
3133
}
3234

33-
func enableTerminal(fd int) {
34-
_, err := terminal.MakeRaw(fd)
35+
func enableTerminal(fd int) (restore func(), err error) {
36+
state, err := terminal.MakeRaw(fd)
3537
if err != nil {
36-
flog.Fatal("make raw term: %v", err)
38+
return restore, xerrors.Errorf("make raw term: %w", err)
3739
}
40+
return func() {
41+
err := terminal.Restore(fd, state)
42+
if err != nil {
43+
flog.Error("restore term state: %v", err)
44+
}
45+
}, nil
3846
}
3947

40-
func (cmd *shellCmd) sendResizeEvents(termfd int, client *wush.Client) {
48+
func sendResizeEvents(termfd int, client *wush.Client) {
4149
sigs := make(chan os.Signal, 16)
4250
signal.Notify(sigs, unix.SIGWINCH)
4351

@@ -83,6 +91,14 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
8391
args = []string{"-c", "exec $(getent passwd $(whoami) | awk -F: '{ print $7 }')"}
8492
}
8593

94+
exitCode, err := runCommand(envName, command, args)
95+
if err != nil {
96+
flog.Fatal("run command: %v", err)
97+
}
98+
os.Exit(exitCode)
99+
}
100+
101+
func runCommand(envName string, command string, args []string) (int, error) {
86102
var (
87103
entClient = requireAuth()
88104
env = findEnv(entClient, envName)
@@ -92,7 +108,11 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
92108

93109
tty := terminal.IsTerminal(termfd)
94110
if tty {
95-
enableTerminal(termfd)
111+
restore, err := enableTerminal(termfd)
112+
if err != nil {
113+
return -1, err
114+
}
115+
defer restore()
96116
}
97117

98118
conn, err := entClient.DialWush(
@@ -102,16 +122,16 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
102122
Stdin: true,
103123
}, command, args...)
104124
if err != nil {
105-
flog.Fatal("dial wush: %v", err)
125+
return -1, err
106126
}
107127
ctx := context.Background()
108128

109129
wc := wush.NewClient(ctx, conn)
110130
if tty {
111-
go cmd.sendResizeEvents(termfd, wc)
131+
go sendResizeEvents(termfd, wc)
112132
}
113133

114-
go func(){
134+
go func() {
115135
defer wc.Stdin.Close()
116136
io.Copy(wc.Stdin, os.Stdin)
117137
}()
@@ -120,7 +140,8 @@ func (cmd *shellCmd) Run(fl *pflag.FlagSet) {
120140

121141
exitCode, err := wc.Wait()
122142
if err != nil {
123-
flog.Fatal("wush error: %v", err)
143+
return -1, err
124144
}
125-
os.Exit(int(exitCode))
145+
146+
return int(exitCode), nil
126147
}

0 commit comments

Comments
 (0)