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

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/filesystem"
     9  	"github.com/Cloud-Foundations/Dominator/lib/fsutil"
    10  	"github.com/Cloud-Foundations/Dominator/lib/log"
    11  	objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client"
    12  )
    13  
    14  func getFileInImageSubcommand(args []string, logger log.DebugLogger) error {
    15  	_, objectClient := getClients()
    16  	var outFileName string
    17  	if len(args) > 2 {
    18  		outFileName = args[2]
    19  	}
    20  	err := getFileInImage(objectClient, args[0], args[1], outFileName)
    21  	if err != nil {
    22  		return fmt.Errorf("Error getting file in image: %s", err)
    23  	}
    24  	return nil
    25  }
    26  
    27  func getFileInImage(objectClient *objectclient.ObjectClient, imageName,
    28  	imageFile, outFileName string) error {
    29  	fs, err := getTypedImage(imageName)
    30  	if err != nil {
    31  		return err
    32  	}
    33  	filenameToInodeTable := fs.FilenameToInodeTable()
    34  	if inum, ok := filenameToInodeTable[imageFile]; !ok {
    35  		return fmt.Errorf("file: \"%s\" not present in image", imageFile)
    36  	} else if inode, ok := fs.InodeTable[inum]; !ok {
    37  		return fmt.Errorf("inode: %d not present in image", inum)
    38  	} else if inode, ok := inode.(*filesystem.RegularInode); !ok {
    39  		return fmt.Errorf("file: \"%s\" is not a regular file", imageFile)
    40  	} else {
    41  		size, reader, err := objectClient.GetObject(inode.Hash)
    42  		if err != nil {
    43  			return err
    44  		}
    45  		defer reader.Close()
    46  		if outFileName == "" {
    47  			_, err := io.Copy(os.Stdout, reader)
    48  			return err
    49  		} else {
    50  			return fsutil.CopyToFile(outFileName, filePerms, reader, size)
    51  		}
    52  	}
    53  }