github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/vm-control/scanVmRoot.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "encoding/gob" 6 "fmt" 7 "net" 8 9 hyperclient "github.com/Cloud-Foundations/Dominator/hypervisor/client" 10 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 _ "github.com/Cloud-Foundations/Dominator/proto/sub" 13 ) 14 15 func scanVmRootSubcommand(args []string, logger log.DebugLogger) error { 16 if err := scanVmRoot(args[0], logger); err != nil { 17 return fmt.Errorf("Error scanning VM root: %s", err) 18 } 19 return nil 20 } 21 22 func scanVmRoot(vmHostname string, logger log.DebugLogger) error { 23 if vmIP, hypervisor, err := lookupVmAndHypervisor(vmHostname); err != nil { 24 return err 25 } else { 26 return scanVmRootOnHypervisor(hypervisor, vmIP, logger) 27 } 28 } 29 30 func scanVmRootOnHypervisor(hypervisor string, ipAddr net.IP, 31 logger log.DebugLogger) error { 32 if *scanFilename == "" { 33 return fmt.Errorf("no scanFilename specified") 34 } 35 client, err := dialHypervisor(hypervisor) 36 if err != nil { 37 return err 38 } 39 defer client.Close() 40 fs, err := hyperclient.ScanVmRoot(client, ipAddr, nil) 41 if err != nil { 42 return err 43 } 44 file, err := fsutil.CreateRenamingWriter(*scanFilename, 45 fsutil.PublicFilePerms) 46 if err != nil { 47 return err 48 } 49 defer file.Close() 50 writer := bufio.NewWriter(file) 51 defer writer.Flush() 52 if err := gob.NewEncoder(writer).Encode(fs); err != nil { 53 file.Abort() 54 return err 55 } 56 return writer.Flush() 57 }