Select Git revision
Guestfish.go

Florent Gluck authored
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
}