Skip to content

Commit 4bc6f2d

Browse files
committed
chore(workflow-cli): use containerd console
1 parent 8b66965 commit 4bc6f2d

3 files changed

Lines changed: 32 additions & 28 deletions

File tree

cmd/ps.go

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,16 @@ import (
66
"fmt"
77
"io"
88
"log"
9-
"os"
109
"regexp"
1110
"strconv"
1211
"strings"
1312
"time"
1413

14+
"github.com/containerd/console"
1515
drycc "github.com/drycc/controller-sdk-go"
1616
"github.com/drycc/controller-sdk-go/api"
1717
"github.com/drycc/controller-sdk-go/ps"
1818
"github.com/gorilla/websocket"
19-
"golang.org/x/term"
2019
)
2120

2221
// PsList lists an app's processes.
@@ -52,7 +51,7 @@ func (d *DryccCmd) PsExec(appID, podID string, tty, stdin bool, command []string
5251
}
5352
defer conn.Close()
5453
if stdin {
55-
streamExec(conn)
54+
streamExec(conn, tty)
5655
} else {
5756
printExec(d, conn)
5857
}
@@ -158,41 +157,43 @@ func printExec(d *DryccCmd, conn *websocket.Conn) error {
158157
return nil
159158
}
160159

161-
func streamExec(conn *websocket.Conn) error {
162-
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
163-
if err != nil {
164-
panic(err)
160+
func streamExec(conn *websocket.Conn, tty bool) error {
161+
c := console.Current()
162+
defer c.Reset()
163+
if tty {
164+
if err := c.SetRaw(); err != nil {
165+
return err
166+
}
165167
}
166-
defer term.Restore(int(os.Stdin.Fd()), oldState)
167-
168-
t := term.NewTerminal(os.Stdin, "")
169168

169+
recvQueue := make(chan []byte)
170+
defer close(recvQueue)
170171
ctx, cancel := context.WithCancel(context.Background())
171-
172-
stdin := make(chan string)
173-
defer close(stdin)
174172
go func() {
175173
for {
176-
line, err := t.ReadLine()
177-
if err != nil {
174+
messageType, message, err := conn.ReadMessage()
175+
if err != nil || messageType == websocket.CloseMessage {
178176
cancel()
179177
break
178+
} else {
179+
recvQueue <- message
180180
}
181-
stdin <- line
182181
}
183182
}()
184183

184+
sendQueue := make(chan []byte)
185+
defer close(sendQueue)
185186
go func() {
187+
buf := make([]byte, 1024)
186188
for {
187-
messageType, message, err := conn.ReadMessage()
188-
if err != nil || messageType == websocket.CloseMessage {
189-
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure) {
190-
log.Printf("error: %v", err)
191-
}
189+
size, err := c.Read(buf)
190+
if err == io.EOF {
192191
cancel()
193192
break
193+
} else if err != nil {
194+
continue
194195
} else {
195-
t.Write(message)
196+
sendQueue <- buf[:size]
196197
}
197198
}
198199
}()
@@ -201,10 +202,12 @@ func streamExec(conn *websocket.Conn) error {
201202
select {
202203
case <-ctx.Done():
203204
return nil
204-
case line := <-stdin:
205-
if err := conn.WriteMessage(websocket.TextMessage, []byte(line+"\n")); err != nil {
206-
return nil
205+
case message := <-sendQueue:
206+
if err := conn.WriteMessage(websocket.TextMessage, message); err != nil {
207+
return err
207208
}
209+
case message := <-recvQueue:
210+
c.Write(message)
208211
}
209212
}
210213
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ module github.com/drycc/workflow-cli
33
go 1.19
44

55
require (
6+
github.com/containerd/console v1.0.3
67
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
78
github.com/drycc/controller-sdk-go v0.0.0-20220830032209-a334918d2242
89
github.com/drycc/pkg v0.0.0-20220830031116-26c11ff8667c
910
github.com/gorilla/websocket v1.5.0
1011
github.com/olekukonko/tablewriter v0.0.5
1112
github.com/stretchr/testify v1.8.0
1213
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91
13-
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035
1414
gopkg.in/yaml.v3 v3.0.1
1515
)
1616

go.sum

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
22
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
33
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
44
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
5+
github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
6+
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
57
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
68
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
79
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -31,10 +33,9 @@ golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p
3133
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
3234
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
3335
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
36+
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3437
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
3538
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
36-
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc=
37-
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
3839
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
3940
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
4041
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=

0 commit comments

Comments
 (0)