github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/objecttool/getObject.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "syscall" 8 9 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 10 "github.com/Cloud-Foundations/Dominator/lib/hash" 11 "github.com/Cloud-Foundations/Dominator/lib/log" 12 "github.com/Cloud-Foundations/Dominator/lib/objectcache" 13 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 14 ) 15 16 const filePerms = syscall.S_IRUSR | syscall.S_IWUSR | syscall.S_IRGRP 17 18 func getObjectSubcommand(args []string, logger log.DebugLogger) error { 19 hash, err := objectcache.FilenameToHash(args[0]) 20 if err != nil { 21 return fmt.Errorf("Error parsing hash: %s", err) 22 } 23 if err = getObject(getObjectServer(), hash, args[1]); err != nil { 24 return fmt.Errorf("Error getting object: %s", err) 25 } 26 return nil 27 } 28 29 func getObject(objSrv objectserver.ObjectServer, hashVal hash.Hash, 30 baseOutputFilename string) error { 31 hashes := make([]hash.Hash, 1) 32 hashes[0] = hashVal 33 objectsReader, err := objSrv.GetObjects(hashes) 34 if err != nil { 35 return err 36 } 37 defer objectsReader.Close() 38 size, reader, err := objectsReader.NextObject() 39 if err != nil { 40 return err 41 } 42 defer reader.Close() 43 if baseOutputFilename == "-" { 44 _, err := io.Copy(os.Stdout, reader) 45 return err 46 } else { 47 filename := fmt.Sprintf("%s.%x", baseOutputFilename, hashVal) 48 return fsutil.CopyToFile(filename, filePerms, reader, size) 49 } 50 }