github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/cmd/imagetool/tarImage.go (about)

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"compress/gzip"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/filesystem/tar"
    11  	"github.com/Cloud-Foundations/Dominator/lib/log"
    12  	objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client"
    13  )
    14  
    15  func tarImageSubcommand(args []string, logger log.DebugLogger) error {
    16  	_, objectClient := getClients()
    17  	outputFilename := ""
    18  	if len(args) > 1 {
    19  		outputFilename = args[1]
    20  	}
    21  	err := tarImageAndWrite(objectClient, args[0], outputFilename)
    22  	if err != nil {
    23  		return fmt.Errorf("Error taring image: %s", err)
    24  	}
    25  	return nil
    26  }
    27  
    28  func tarImageAndWrite(objectClient *objectclient.ObjectClient, imageName,
    29  	outputFilename string) error {
    30  	fs, objectsGetter, err := getImageForUnpack(objectClient, imageName)
    31  	if err != nil {
    32  		return err
    33  	}
    34  	deleteOutfile := true
    35  	output := io.Writer(os.Stdout)
    36  	if outputFilename != "" {
    37  		var err error
    38  		file, err := os.Create(outputFilename)
    39  		if err != nil {
    40  			return err
    41  		}
    42  		writer := bufio.NewWriter(file)
    43  		output = writer
    44  		defer func() {
    45  			writer.Flush()
    46  			file.Close()
    47  			if deleteOutfile {
    48  				os.Remove(outputFilename)
    49  			}
    50  		}()
    51  	}
    52  	if *compress {
    53  		zWriter := gzip.NewWriter(output)
    54  		defer zWriter.Close()
    55  		output = zWriter
    56  	}
    57  	if err := tar.Write(output, fs, objectsGetter); err != nil {
    58  		return err
    59  	}
    60  	deleteOutfile = false
    61  	return nil
    62  }