github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/connectToVmSerialPort.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 8 "github.com/Cloud-Foundations/Dominator/lib/errors" 9 "github.com/Cloud-Foundations/Dominator/lib/log" 10 terminalclient "github.com/Cloud-Foundations/Dominator/lib/net/terminal/client" 11 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 12 ) 13 14 func connectToVmSerialPortSubcommand(args []string, 15 logger log.DebugLogger) error { 16 if err := connectToVmSerialPort(args[0], logger); err != nil { 17 return fmt.Errorf("Error connecting to VM serial port: %s", err) 18 } 19 return nil 20 } 21 22 func connectToVmSerialPort(vmHostname string, logger log.DebugLogger) error { 23 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 24 return err 25 } else { 26 return connectToVmSerialPortOnHypervisor(hypervisor, vmIP, logger) 27 } 28 } 29 30 func connectToVmSerialPortOnHypervisor(hypervisor string, ipAddr net.IP, 31 logger log.DebugLogger) error { 32 client, err := dialHypervisor(hypervisor) 33 if err != nil { 34 return err 35 } 36 defer client.Close() 37 conn, err := client.Call("Hypervisor.ConnectToVmSerialPort") 38 if err != nil { 39 return err 40 } 41 defer conn.Close() 42 request := proto.ConnectToVmSerialPortRequest{ 43 IpAddress: ipAddr, 44 PortNumber: *serialPort, 45 } 46 if err := conn.Encode(request); err != nil { 47 return err 48 } 49 if err := conn.Flush(); err != nil { 50 return err 51 } 52 var response proto.ConnectToVmSerialPortResponse 53 if err := conn.Decode(&response); err != nil { 54 return err 55 } 56 if err := errors.New(response.Error); err != nil { 57 return err 58 } 59 if err := terminalclient.StartTerminal(conn); err != nil { 60 fmt.Fprintln(os.Stderr, err) 61 os.Exit(1) 62 } 63 fmt.Fprint(os.Stderr, "\r") 64 return nil 65 }