github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/hypervisor/rpcd/connectToVmConsole.go (about) 1 package rpcd 2 3 import ( 4 "io" 5 6 "github.com/Cloud-Foundations/Dominator/lib/bufwriter" 7 "github.com/Cloud-Foundations/Dominator/lib/errors" 8 "github.com/Cloud-Foundations/Dominator/lib/srpc" 9 "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 10 ) 11 12 func (t *srpcType) ConnectToVmConsole(conn *srpc.Conn) error { 13 var request hypervisor.ConnectToVmConsoleRequest 14 if err := conn.Decode(&request); err != nil { 15 return err 16 } 17 console, err := t.manager.ConnectToVmConsole(request.IpAddress, 18 conn.GetAuthInformation()) 19 if console != nil { 20 defer console.Close() 21 } 22 e := conn.Encode(hypervisor.ConnectToVmConsoleResponse{ 23 Error: errors.ErrorToString(err)}) 24 if e != nil { 25 return e 26 } 27 if e := conn.Flush(); e != nil { 28 return e 29 } 30 if err != nil { 31 return nil 32 } 33 closed := false 34 go func() { // Read from console and write to connection until EOF. 35 _, err := io.Copy(bufwriter.NewAutoFlushWriter(conn), console) 36 if err != nil && !closed { 37 t.logger.Println(err) 38 } 39 closed = true 40 }() 41 // Read from connection and write to console. 42 _, err = io.Copy(console, conn) 43 if err != nil && !closed { 44 return err 45 } 46 closed = true 47 return srpc.ErrorCloseClient 48 }