diff --git a/src/exec/Guestfish.go b/src/exec/Guestfish.go new file mode 100644 index 0000000000000000000000000000000000000000..75974944bb0a14470c4c04da75b8498452b5363d --- /dev/null +++ b/src/exec/Guestfish.go @@ -0,0 +1,57 @@ +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 tar archive. +func CopyFromVM(vmDiskFile, vmDir, tarFile string) error { + cmd := exec.Command(guestfishBinary, "--ro", "-i", "tar-out", "-a", vmDiskFile, vmDir, tarFile) + 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 +} diff --git a/src/exec/VirtTarIn.go b/src/exec/VirtTarIn.go deleted file mode 100644 index 733f3af778f00225b693308bfcbb66e8f6471d14..0000000000000000000000000000000000000000 --- a/src/exec/VirtTarIn.go +++ /dev/null @@ -1,44 +0,0 @@ -package exec - -import ( - "fmt" - "os/exec" - "strings" - "errors" -) - -const ( - virtTarInBinary = "virt-tar-in" -) - -// Checks virt-tar-in is available. -func CheckVirtTarIn() error { - output, err := exec.Command(virtTarInBinary, "--version").Output() - if err != nil { - return errors.New(virtTarInBinary+" 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 "+virtTarInBinary+" version number!") - } - cmd := fields[0] - if cmd != virtTarInBinary { - return errors.New(virtTarInBinary+" is required, but not found.") - } - return nil -} - -// Runs virt-tar-in which unarchive a local archive into a directory (vmDir) inside the VM disk. -func CopyToVM(vmDiskFile, tarFile, vmDir string) error { - cmd := exec.Command(virtTarInBinary, "-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 -} diff --git a/src/exec/VirtTarOut.go b/src/exec/VirtTarOut.go deleted file mode 100644 index b8eaac7bdee12bc1e10d42d19d8f9c314b64bca7..0000000000000000000000000000000000000000 --- a/src/exec/VirtTarOut.go +++ /dev/null @@ -1,47 +0,0 @@ -package exec - -import ( - "fmt" - "os/exec" - "strings" - "errors" -) - -const ( - virtTarOutBinary = "virt-tar-out" -) - -// Checks virt-tar-out is available. -func CheckVirtCopyOut() error { - output, err := exec.Command(virtTarOutBinary, "--version").Output() - if err != nil { - return errors.New(virtTarOutBinary+" 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 "+virtTarOutBinary+" version number!") - } - cmd := fields[0] - if cmd != virtTarOutBinary { - return errors.New(virtTarOutBinary+" is required, but not found.") - } - return nil -} - -// Runs virt-tar-in which unarchive a local archive into a directory (vmDir) inside the VM disk. - -// Runs virt-copy-out which recursively extract a directory from the VM's -// filesystem (vmDir) into a tar archive. -func CopyFromVM(vmDiskFile, vmDir, tarFile string) error { - cmd := exec.Command(virtTarOutBinary, "-a", vmDiskFile, vmDir, tarFile) - 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 -} diff --git a/src/nexus-server.go b/src/nexus-server.go index e40c13ab31d3049c07f27b6aedfc8c00791887dc..279e3997f164e241fd25a19a07011cc2ae098c8f 100644 --- a/src/nexus-server.go +++ b/src/nexus-server.go @@ -34,12 +34,9 @@ func main() { if err := exec.CheckQemuImg(); err != nil { log.Fatal(err) } - if err := exec.CheckVirtCopyOut(); err != nil { + if err := exec.CheckGuestfish(); err != nil { log.Fatal(err) } - // if err := exec.CheckVirtCopyIn(); err != nil { - // log.Fatal(err) - // } usage := func() { fmt.Println("Usage of "+path.Base(os.Args[0])+":") diff --git a/src/router/routerVMs.go b/src/router/routerVMs.go index 6a30eff51ec185524c7163bf308059422b3f6730..5aa34e2690b969260f3e9f5c55d1a961b72523a1 100644 --- a/src/router/routerVMs.go +++ b/src/router/routerVMs.go @@ -208,12 +208,6 @@ func (r *RouterVMs)DeleteVMByID(c echo.Context) error { // curl --cacert ca.pem -X PUT https://localhost:1077/vms/e41f3556-ca24-4658-bd79-8c85bd6bff59/start -H "Authorization: Bearer <AccessToken>" func (r *RouterVMs)StartVM(c echo.Context) error { return r.performVMAction(c, caps.CAP_VM_START_ANY, caps.CAP_VM_START, func(c echo.Context, vm *vms.VM) error { - // port, pwd, err := r.vms.StartVM(vm.ID) - // if err != nil { - // return echo.NewHTTPError(http.StatusNotFound, err.Error()) - // } - // return c.JSONPretty(http.StatusOK, echo.Map{"port": port, "pwd": pwd}, " ") - _, _, err := r.vms.StartVM(vm.ID) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, err.Error())