Skip to content
Snippets Groups Projects
Select Git revision
  • 83114af2685848a2a3644aea3a9f3a910e8792e3
  • live_exam_os_ubuntu default protected
2 results

Guestfish.go

Blame
  • Guestfish.go 1.70 KiB
    package exec
    
    import (
    	"fmt"
    	"os/exec"
    	"strings"
    	"errors"
    )
    
    const (
    	guestfishBinary = "guestfish"
    )
    
    // Checks guestfish is available.
    func CheckGuestfish() error {
    	output, err := exec.Command(guestfishBinary, "--version").Output()
        if err != nil {
            return errors.New(guestfishBinary+" is required but not found. On Ubuntu/Debian, it can be installed with \"sudo apt-get install guestfish\".")
    	}
    	out := string(output)
    	lines := strings.Split(out, "\n")
    	fields := strings.Split(lines[0], " ")
    	if len(fields) < 2 {
    		return errors.New("Failed extracting "+guestfishBinary+" version number!")
    	}
    	cmd := fields[0]
    	if cmd != guestfishBinary {
    		return errors.New(guestfishBinary+" is required, but not found.")
    	}
    	return nil
    }
    
    // Copies and unarchives a local archive into a directory (vmDir) inside the VM's filesystem.
    func CopyToVM(vmDiskFile, tarFile, vmDir string) error {
    	cmd := exec.Command(guestfishBinary, "--rw", "-i", "tar-in", "-a", vmDiskFile, tarFile, vmDir)
    	stdoutStderr, err := cmd.CombinedOutput()
    	if err != nil {
    		output := fmt.Sprintf("[%s]", stdoutStderr)
    		msg := "Failed writing to \""+vmDir+"\" in qcow ("+vmDiskFile+")"
    		log.Error(msg+": "+output)
    		return errors.New(msg)
    	}
    	return nil
    }
    
    // Recursively copies a directory in the VM's filesystem (vmDir) into a compressed archive.
    func CopyFromVM(vmDiskFile, vmDir, tarFile string) error {
    	cmd := exec.Command(guestfishBinary, "--ro", "-i", "tar-out",  "-a", vmDiskFile, vmDir, tarFile, "compress:gzip")
    	stdoutStderr, err := cmd.CombinedOutput()
    	if err != nil {
    		output := fmt.Sprintf("[%s]", stdoutStderr)
    		msg := "Failed reading \""+vmDir+"\" in qcow ("+vmDiskFile+"): "+output
    		log.Error(msg)
    		return errors.New(msg)
    	}
    	return nil
    }