From 737eee67e061fa0e138848b3697344c8e0466f5a Mon Sep 17 00:00:00 2001 From: Mikhail Klementev Date: Sat, 22 Sep 2018 12:16:42 +0000 Subject: [PATCH] Implements copying files from host machine to qemu --- qemu-kernel.go | 17 +++++++++++++++++ qemu-kernel_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/qemu-kernel.go b/qemu-kernel.go index 98b4be2..bc18ac2 100644 --- a/qemu-kernel.go +++ b/qemu-kernel.go @@ -13,6 +13,7 @@ import ( "os" "os/exec" "runtime" + "strings" "syscall" "time" @@ -262,3 +263,19 @@ func (q *QemuSystem) Command(user, cmd string) (output string, err error) { output = string(bytesOutput) return } + +// CopyFile is copy file from local machine to remote through ssh/scp +func (q *QemuSystem) CopyFile(user, localPath, remotePath string) (err error) { + addrPort := strings.Split(q.sshAddrPort, ":") + addr := addrPort[0] + port := addrPort[1] + + cmd := exec.Command("scp", "-P", port, "-o", "StrictHostKeyChecking=no", + localPath, user+"@"+addr+":"+remotePath) + output, err := cmd.CombinedOutput() + if err != nil { + return errors.New(string(output)) + } + + return +} diff --git a/qemu-kernel_test.go b/qemu-kernel_test.go index e950e7a..f7fa3fb 100644 --- a/qemu-kernel_test.go +++ b/qemu-kernel_test.go @@ -5,6 +5,9 @@ package qemukernel import ( + "crypto/sha512" + "fmt" + "io/ioutil" "net" "strings" "testing" @@ -137,3 +140,35 @@ func TestQemuSystemCommand(t *testing.T) { t.Fatal("User have rights for /etc/shadow. WAT?!") } } + +func TestQemuSystemCopyFile(t *testing.T) { + qemu, err := startTestQemu() + if err != nil { + t.Fatal(err) + } + defer qemu.Stop() + + localPath := "/bin/sh" + + content, err := ioutil.ReadFile(localPath) + if err != nil { + return + } + + sha_local := fmt.Sprintf("%x", sha512.Sum512(content)) + + err = qemu.CopyFile("user", localPath, "/tmp/test") + if err != nil { + t.Fatal(err) + } + + sha_remote, err := qemu.Command("user", "sha512sum /tmp/test") + if err != nil { + t.Fatal(err) + } + sha_remote = strings.Split(sha_remote, " ")[0] + + if sha_local != sha_remote { + t.Fatal(fmt.Sprintf("Broken file (%s instead of %s)", sha_remote, sha_local)) + } +}