WIP on rollback, started "gocage console", default values for jail properties to stay compatible with iocage

This commit is contained in:
yo
2022-04-05 20:58:11 +02:00
parent 4aa1c81fea
commit 0053fd6c8b
4 changed files with 255 additions and 3 deletions

View File

@ -1,8 +1,11 @@
package cmd
import (
"os"
"fmt"
"time"
"bufio"
"errors"
"regexp"
"strings"
)
@ -186,3 +189,80 @@ func deleteJailSnapshot(jail Jail) error {
return nil
}
func RollbackJailSnapshot(args []string) error {
var jailNames []string
if len(args) > 0 {
for _, a := range args {
jailNames = append(jailNames, a)
}
}
for _, cj := range gJails {
for _, jn := range jailNames {
if strings.EqualFold(cj.Name, jn) {
rollbackJailSnapshot(cj)
}
}
}
return nil
}
/********************************************************************************
* rollback jail to snapshot gSnapshotName, destroy this snapshots and more
* recents snapshots and bookmarks
*******************************************************************************/
func rollbackJailSnapshot(jail Jail) error {
var snaptorb []string
if jail.Running {
fmt.Printf("Jail should be stoped to rollback, should we stop and rollback? (y/n)\n")
scanr := bufio.NewScanner(os.Stdin)
if scanr.Scan() {
if !strings.EqualFold(scanr.Text(), "y") {
return errors.New("Jail is running")
} else {
err := stopJail(&jail)
if err != nil {
return err
}
}
}
}
// We need to rollback parent and childs
// Get all recursive snapshots
rs := strings.Split(jail.RootPath, "/")
rootDataset := fmt.Sprintf("%s%s", jail.Zpool, strings.Join(rs[:len(rs)-1], "/"))
cmd := fmt.Sprintf("zfs list -r -H -o name -t snapshot %s", rootDataset)
out, err := executeCommand(cmd)
if err != nil {
fmt.Printf("Error: listing snapshots: %s\n", err.Error())
return err
}
for _, line := range strings.Split(out, "\n") {
if len(line) > 0 {
ls := strings.Split(line, "@")
matched, _ := regexp.Match(fmt.Sprintf("^%s(\\/.*)?$", gSnapshotName), []byte(ls[1]))
if matched {
snaptorb = append(snaptorb, strings.Join(ls, "@"))
}
}
}
for _, s := range snaptorb {
cmd := fmt.Sprintf("zfs rollback -r %s", s)
_, err := executeCommand(cmd)
if err != nil {
fmt.Printf("Error rolling back snapshot %s: %s\n", s, err.Error())
return err
}
}
fmt.Printf("Jail is back to %s\n", gSnapshotName)
return nil
}