@@ -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}
0 commit comments