github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/hyper-control/netbootMachine.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "net" 7 8 "github.com/Cloud-Foundations/Dominator/lib/errors" 9 "github.com/Cloud-Foundations/Dominator/lib/log" 10 "github.com/Cloud-Foundations/Dominator/lib/srpc" 11 proto "github.com/Cloud-Foundations/Dominator/proto/hypervisor" 12 ) 13 14 func netbootMachineSubcommand(args []string, logger log.DebugLogger) error { 15 var hostname string 16 if len(args) > 2 { 17 hostname = args[2] 18 } 19 err := netbootMachine(args[0], args[1], hostname, logger) 20 if err != nil { 21 return fmt.Errorf("Error netbooting machine: %s", err) 22 } 23 return nil 24 } 25 26 func netbootMachine(macAddr, ipAddr, hostname string, 27 logger log.DebugLogger) error { 28 request := proto.NetbootMachineRequest{ 29 Address: proto.Address{ 30 MacAddress: macAddr, 31 IpAddress: net.ParseIP(ipAddr), 32 }, 33 Files: make(map[string][]byte, 34 len(netbootFiles)), 35 FilesExpiration: *netbootFilesTimeout, 36 Hostname: hostname, 37 NumAcknowledgementsToWaitFor: *numAcknowledgementsToWaitFor, 38 OfferExpiration: *offerTimeout, 39 WaitTimeout: *netbootTimeout, 40 } 41 for tftpFilename, localFilename := range netbootFiles { 42 if data, err := ioutil.ReadFile(localFilename); err != nil { 43 return err 44 } else { 45 request.Files[tftpFilename] = data 46 } 47 } 48 var reply proto.NetbootMachineResponse 49 clientName := fmt.Sprintf("%s:%d", *hypervisorHostname, *hypervisorPortNum) 50 client, err := srpc.DialHTTP("tcp", clientName, 0) 51 if err != nil { 52 return err 53 } 54 defer client.Close() 55 err = client.RequestReply("Hypervisor.NetbootMachine", request, &reply) 56 if err != nil { 57 return err 58 } 59 return errors.New(reply.Error) 60 }