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  }