github.com/Cloud-Foundations/Dominator@v0.3.4/cmd/imagetool/makeRawImage.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"syscall"
     9  
    10  	"github.com/Cloud-Foundations/Dominator/lib/filesystem/util"
    11  	"github.com/Cloud-Foundations/Dominator/lib/log"
    12  	objectclient "github.com/Cloud-Foundations/Dominator/lib/objectserver/client"
    13  )
    14  
    15  const filePerms = syscall.S_IRUSR | syscall.S_IWUSR | syscall.S_IRGRP |
    16  	syscall.S_IROTH
    17  
    18  func makeRawImageSubcommand(args []string, logger log.DebugLogger) error {
    19  	_, objectClient := getClients()
    20  	if err := makeRawImage(objectClient, args[0], args[1]); err != nil {
    21  		return fmt.Errorf("error making raw image: %s", err)
    22  	}
    23  	return nil
    24  }
    25  
    26  func loadOverlayFiles() (map[string][]byte, error) {
    27  	if *overlayDirectory == "" {
    28  		return nil, nil
    29  	}
    30  	overlayFiles := make(map[string][]byte)
    31  	err := filepath.Walk(*overlayDirectory,
    32  		func(path string, info os.FileInfo, err error) error {
    33  			if err != nil {
    34  				return err
    35  			}
    36  			if info.IsDir() {
    37  				return nil
    38  			}
    39  			data, err := ioutil.ReadFile(path)
    40  			if err != nil {
    41  				return err
    42  			}
    43  			overlayFiles[path[len(*overlayDirectory):]] = data
    44  			return nil
    45  		})
    46  	return overlayFiles, err
    47  }
    48  
    49  func makeRawImage(objectClient *objectclient.ObjectClient, name,
    50  	rawFilename string) error {
    51  	fs, objectsGetter, err := getImageForUnpack(objectClient, name)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	options := util.WriteRawOptions{
    56  		AllocateBlocks:    *allocateBlocks,
    57  		InitialImageName:  name,
    58  		InstallBootloader: *makeBootable,
    59  		MinimumFreeBytes:  *minFreeBytes,
    60  		WriteFstab:        *makeBootable,
    61  		RootLabel:         *rootLabel,
    62  		RoundupPower:      *roundupPower,
    63  	}
    64  	if overlayFiles, err := loadOverlayFiles(); err != nil {
    65  		return err
    66  	} else {
    67  		options.OverlayFiles = overlayFiles
    68  	}
    69  	return util.WriteRawWithOptions(fs, objectsGetter, rawFilename, filePerms,
    70  		tableType, options, logger)
    71  }