func copyFile(conn net.Conn, src string, dst string) error { fi, err := os.Stat(src) if err != nil { return err } if fi.IsDir() { fi, err := os.Stat(src) if err != nil { return err } perm := uint64(fi.Mode()) & 0777 cpio.WritePadded(conn, cpio.ToWireFormat(dst, cpio.C_ISDIR|perm, 0)) return nil } if !IsReg(fi.Mode()) { fmt.Println("skipping non-file path " + src) return nil } else { contents, err := ioutil.ReadFile(src) if err != nil { return nil } fi, err := os.Stat(src) if err != nil { return err } perm := uint64(fi.Mode()) & 0777 cpio.WritePadded(conn, cpio.ToWireFormat(dst, cpio.C_ISREG|perm, fi.Size())) cpio.WritePadded(conn, contents) } return nil }
func copyFile(conn net.Conn, src string, dst string) error { fi, err := os.Stat(src) if err != nil { return err } cpio.WritePadded(conn, cpio.ToWireFormat(dst, cpio.C_ISREG, fi.Size())) b, err := ioutil.ReadFile(src) cpio.WritePadded(conn, b) return nil }
func UploadFiles(r *util.Repo, hypervisor string, image string, config *util.Config, verbose bool) error { file := r.ImagePath(hypervisor, image) vmconfig := &VMConfig{ Image: file, Verbose: verbose, Memory: 64, NatRules: []nat.Rule{nat.Rule{GuestPort: "10000", HostPort: "10000"}}, BackingFile: false, } cmd, err := LaunchVM(vmconfig) if err != nil { return err } defer cmd.Process.Kill() time.Sleep(1 * time.Second) conn, err := net.Dial("tcp", "localhost:10000") if err != nil { return err } for key, value := range config.Files { fi, err := os.Stat(value) if err != nil { return err } cpio.WritePadded(conn, cpio.ToWireFormat(key, cpio.C_ISREG, fi.Size())) b, err := ioutil.ReadFile(value) cpio.WritePadded(conn, b) } cpio.WritePadded(conn, cpio.ToWireFormat("TRAILER!!!", 0, 0)) conn.Close() return cmd.Wait() }
func UploadFiles(r *util.Repo, hypervisor string, image string, config *util.Config, verbose bool) error { file := r.ImagePath(hypervisor, image) vmconfig := &VMConfig{ Image: file, Verbose: verbose, Memory: 64, Networking: "nat", NatRules: []nat.Rule{nat.Rule{GuestPort: "10000", HostPort: "10000"}}, BackingFile: false, } cmd, err := LaunchVM(vmconfig) if err != nil { return err } defer cmd.Process.Kill() conn, err := util.ConnectAndWait("tcp", "localhost:10000") if err != nil { return err } if _, err = os.Stat(config.Rootfs); !os.IsNotExist(err) { err = filepath.Walk(config.Rootfs, func(src string, info os.FileInfo, _ error) error { if info.IsDir() { return nil } dst := strings.Replace(src, config.Rootfs, "", -1) if verbose { fmt.Println(src + " --> " + dst) } return copyFile(conn, src, dst) }) } for dst, src := range config.Files { err = copyFile(conn, src, dst) if verbose { fmt.Println(src + " --> " + dst) } if err != nil { return err } } cpio.WritePadded(conn, cpio.ToWireFormat("TRAILER!!!", 0, 0)) conn.Close() return cmd.Wait() }
func UploadFiles(r *util.Repo, hypervisor string, image string, t *core.Template, verbose bool, mem string) error { file := r.ImagePath(hypervisor, image) size, err := util.ParseMemSize(mem) if err != nil { return err } vmconfig := &qemu.VMConfig{ Image: file, Verbose: verbose, Memory: size, Networking: "nat", NatRules: []nat.Rule{nat.Rule{GuestPort: "10000", HostPort: "10000"}}, BackingFile: false, } cmd, err := qemu.VMCommand(vmconfig) if err != nil { return err } stdout, err := cmd.StdoutPipe() if err != nil { return err } if err := cmd.Start(); err != nil { return err } defer cmd.Process.Kill() scanner := bufio.NewScanner(stdout) for scanner.Scan() { text := scanner.Text() if verbose { fmt.Println(text) } if text == "Waiting for connection from host..." { break } } if verbose { go io.Copy(os.Stdout, stdout) } conn, err := util.ConnectAndWait("tcp", "localhost:10000") if err != nil { return err } rootfsFiles := make(map[string]string) if _, err = os.Stat(t.Rootfs); !os.IsNotExist(err) { err = filepath.Walk(t.Rootfs, func(src string, info os.FileInfo, _ error) error { dst := strings.Replace(src, t.Rootfs, "", 1) if dst != "" { rootfsFiles[dst] = src } return nil }) } fmt.Println("Uploading files...") bar := pb.New(len(rootfsFiles) + len(t.Files)) if !verbose { bar.Start() } for dst, src := range rootfsFiles { err = copyFile(conn, src, dst) if verbose { fmt.Println(src + " --> " + dst) } else { bar.Increment() } if err != nil { return err } } for dst, src := range t.Files { err = copyFile(conn, src, dst) if verbose { fmt.Println(src + " --> " + dst) } else { bar.Increment() } if err != nil { return err } } cpio.WritePadded(conn, cpio.ToWireFormat("TRAILER!!!", 0, 0)) conn.Close() return cmd.Wait() }