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  }