134 lines
2.5 KiB
Go
134 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/checkpoint-restore/go-criu"
|
|
"github.com/checkpoint-restore/go-criu/rpc"
|
|
"github.com/golang/protobuf/proto"
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// TestNfy struct
|
|
type TestNfy struct {
|
|
criu.NoNotify
|
|
}
|
|
|
|
// PreDump test function
|
|
func (c TestNfy) PreDump() error {
|
|
fmt.Printf("TEST PRE DUMP\n")
|
|
return nil
|
|
}
|
|
|
|
func doDump(c *criu.Criu, pidS string, imgDir string, pre bool, prevImg string) error {
|
|
fmt.Printf("Dumping\n")
|
|
pid, _ := strconv.Atoi(pidS)
|
|
img, err := os.Open(imgDir)
|
|
if err != nil {
|
|
return fmt.Errorf("can't open image dir (%s)", err)
|
|
}
|
|
defer img.Close()
|
|
|
|
opts := rpc.CriuOpts{
|
|
Pid: proto.Int32(int32(pid)),
|
|
ImagesDirFd: proto.Int32(int32(img.Fd())),
|
|
LogLevel: proto.Int32(4),
|
|
LogFile: proto.String("dump.log"),
|
|
}
|
|
|
|
if prevImg != "" {
|
|
opts.ParentImg = proto.String(prevImg)
|
|
opts.TrackMem = proto.Bool(true)
|
|
}
|
|
|
|
if pre {
|
|
err = c.PreDump(opts, TestNfy{})
|
|
} else {
|
|
err = c.Dump(opts, TestNfy{})
|
|
}
|
|
if err != nil {
|
|
return fmt.Errorf("dump fail (%s)", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Usage: test $act $pid $images_dir
|
|
func main() {
|
|
c := criu.MakeCriu()
|
|
// Read out CRIU version
|
|
version, err := c.GetCriuVersion()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
fmt.Println("CRIU version", version)
|
|
// Check if version at least 3.2
|
|
result, err := c.IsCriuAtLeast(30200)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
if !result {
|
|
fmt.Println("CRIU too old")
|
|
os.Exit(1)
|
|
}
|
|
act := os.Args[1]
|
|
switch act {
|
|
case "dump":
|
|
err := doDump(c, os.Args[2], os.Args[3], false, "")
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
case "dump2":
|
|
err := c.Prepare()
|
|
if err != nil {
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
err = doDump(c, os.Args[2], os.Args[3]+"/pre", true, "")
|
|
if err != nil {
|
|
fmt.Printf("pre-dump failed")
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
err = doDump(c, os.Args[2], os.Args[3], false, "./pre")
|
|
if err != nil {
|
|
fmt.Printf("dump failed")
|
|
fmt.Print(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
c.Cleanup()
|
|
case "restore":
|
|
fmt.Printf("Restoring\n")
|
|
img, err := os.Open(os.Args[2])
|
|
if err != nil {
|
|
fmt.Printf("can't open image dir")
|
|
os.Exit(1)
|
|
}
|
|
defer img.Close()
|
|
|
|
opts := rpc.CriuOpts{
|
|
ImagesDirFd: proto.Int32(int32(img.Fd())),
|
|
LogLevel: proto.Int32(4),
|
|
LogFile: proto.String("restore.log"),
|
|
}
|
|
|
|
err = c.Restore(opts, nil)
|
|
if err != nil {
|
|
fmt.Printf("Error:")
|
|
fmt.Print(err)
|
|
fmt.Printf("\n")
|
|
os.Exit(1)
|
|
}
|
|
default:
|
|
fmt.Printf("unknown action\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Printf("Success\n")
|
|
}
|