WIP on rollback, started "gocage console", default values for jail properties to stay compatible with iocage
This commit is contained in:
@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user