"gocage migrate jail -d destination_dataset" working for cold migrations
This commit is contained in:
64
cmd/utils.go
64
cmd/utils.go
@ -1,17 +1,18 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"fmt"
|
||||
"log"
|
||||
"sort"
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"reflect"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -214,6 +215,59 @@ func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
|
||||
return string(out), err
|
||||
}
|
||||
|
||||
func zfsSnapshot(dataset string, snapname string) error {
|
||||
cmd := fmt.Sprintf("zfs snapshot %s@%s", dataset, snapname)
|
||||
out, err := executeCommand(cmd)
|
||||
if err != nil {
|
||||
return errors.New(fmt.Sprintf("%v; command returned \"%s\"", err, out))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func zfsCopy(src string, dest string) error {
|
||||
// First, declare sending process & pipe
|
||||
cmd_send := exec.Command("zfs", "send", src)
|
||||
stdout_send, err := cmd_send.StdoutPipe()
|
||||
if err != nil {
|
||||
//fmt.Printf("Error executing command \"zfs send %s\": %v\n", fmt.Sprintf("%s@gocage_mig_init", dsconf), err)
|
||||
return errors.New(fmt.Sprintf("Error: %v\n", err))
|
||||
}
|
||||
|
||||
// then declare receiving process & pipe
|
||||
cmd_recv := exec.Command("zfs", "receive", dest)
|
||||
stdin_recv, err := cmd_recv.StdinPipe()
|
||||
if err != nil {
|
||||
//fmt.Printf("Error executing command \"zfs receive %s\": %v\n", dest, err)
|
||||
return errors.New(fmt.Sprintf("Error: %v\n", err))
|
||||
}
|
||||
|
||||
// Copy data in a go routine
|
||||
go io.Copy(stdin_recv, stdout_send)
|
||||
|
||||
// then start processes and wait for finish
|
||||
if err := cmd_recv.Start(); err != nil {
|
||||
//fmt.Printf("Error: %v\n", err)
|
||||
return errors.New(fmt.Sprintf("Error starting receive process: %v\n", err))
|
||||
}
|
||||
//fmt.Printf("DEBUG: Start \"zfs send %s\"\n", dsconf)
|
||||
if err := cmd_send.Start(); err != nil {
|
||||
//fmt.Printf("Error: %v\n", err)
|
||||
return errors.New(fmt.Sprintf("Error starting send process: %v\n", err))
|
||||
}
|
||||
|
||||
//fmt.Printf("DEBUG: Wait for zfs send to finish\n")
|
||||
if err := cmd_send.Wait(); err != nil {
|
||||
//fmt.Printf("Error: zfs send halted with %v\n", err)
|
||||
return errors.New(fmt.Sprintf("send halted with: %v\n", err))
|
||||
}
|
||||
//fmt.Printf("DEBUG: Wait for zfs recv to finish\n")
|
||||
if err := cmd_recv.Wait(); err != nil {
|
||||
//fmt.Printf("Error: zfs recv halted with %v\n", err)
|
||||
return errors.New(fmt.Sprintf("receive halted with: %v\n", err))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* rc.conf management
|
||||
|
Reference in New Issue
Block a user