better handling of version/patch especiallly for snapshots, use updateWorkDir
This commit is contained in:
parent
fb4010378f
commit
6acea0d25b
@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"golang.org/x/net/route"
|
"golang.org/x/net/route"
|
||||||
@ -190,34 +189,17 @@ func getArch() (string, error) {
|
|||||||
|
|
||||||
func getFreeBSDVersion() (FreeBSDVersion, error) {
|
func getFreeBSDVersion() (FreeBSDVersion, error) {
|
||||||
var version FreeBSDVersion
|
var version FreeBSDVersion
|
||||||
regex := `([0-9]{1,2})(\.)?([0-9]{1,2})?\-([^\-]*)(\-)?(p[0-9]{1,2})?`
|
|
||||||
|
|
||||||
re := regexp.MustCompile(regex)
|
|
||||||
|
|
||||||
out, err := executeCommand("/bin/freebsd-version")
|
out, err := executeCommand("/bin/freebsd-version")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return version, fmt.Errorf("Error executing \"/bin/freebsd-version\": %v", err)
|
return version, fmt.Errorf("Error executing \"/bin/freebsd-version\": %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if re.MatchString(out) {
|
version, err = freebsdVersionToStruct(out)
|
||||||
version.major, err = strconv.Atoi(re.FindStringSubmatch(out)[1])
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return version, err
|
return version, err
|
||||||
}
|
}
|
||||||
version.minor, err = strconv.Atoi(re.FindStringSubmatch(out)[3])
|
|
||||||
if err != nil {
|
|
||||||
return version, err
|
|
||||||
}
|
|
||||||
version.flavor = strings.Trim(re.FindStringSubmatch(out)[4], "\n")
|
|
||||||
|
|
||||||
// Skip the 'p' starting patch level
|
|
||||||
if len(re.FindStringSubmatch(out)[6]) > 0 {
|
|
||||||
version.patchLevel, err = strconv.Atoi(re.FindStringSubmatch(out)[6][1:])
|
|
||||||
if err != nil {
|
|
||||||
return version, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return version, nil
|
return version, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
gVersion = "0.42d"
|
gVersion = "0.42g"
|
||||||
|
|
||||||
// TODO : Get from $jail_zpool/defaults.json
|
// TODO : Get from $jail_zpool/defaults.json
|
||||||
MIN_DYN_DEVFS_RULESET = 1000
|
MIN_DYN_DEVFS_RULESET = 1000
|
||||||
@ -99,7 +99,11 @@ It support iocage jails and can coexist with iocage.`,
|
|||||||
Long: `Let this show you how much fail I had to get this *cough* perfect`,
|
Long: `Let this show you how much fail I had to get this *cough* perfect`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
fv, _ := getFreeBSDVersion()
|
fv, _ := getFreeBSDVersion()
|
||||||
|
if fv.patchLevel > 0 {
|
||||||
|
fmt.Printf("GoCage v.%s on FreeBSD %d.%d-%s-p%d\n", gVersion, fv.major, fv.minor, fv.flavor, fv.patchLevel)
|
||||||
|
} else {
|
||||||
fmt.Printf("GoCage v.%s on FreeBSD %d.%d-%s\n", gVersion, fv.major, fv.minor, fv.flavor)
|
fmt.Printf("GoCage v.%s on FreeBSD %d.%d-%s\n", gVersion, fv.major, fv.minor, fv.flavor)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,16 +78,23 @@ func UpdateJail(args []string) {
|
|||||||
}
|
}
|
||||||
fakeJail.Config.Release = v
|
fakeJail.Config.Release = v
|
||||||
|
|
||||||
|
// Remove patch level from Release
|
||||||
|
fv, err := freebsdVersionToStruct(fakeJail.Config.Release)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Error converting release %s: %v\n", fakeJail.Config.Release, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
release := fmt.Sprintf("%d.%d-%s", fv.major, fv.minor, fv.flavor)
|
||||||
// Snapshot before updating
|
// Snapshot before updating
|
||||||
dt := time.Now()
|
dt := time.Now()
|
||||||
curDate := fmt.Sprintf("%s", dt.Format("2006-01-02_15-04-05"))
|
curDate := fmt.Sprintf("%s", dt.Format("2006-01-02_15-04-05"))
|
||||||
snapshotName := fmt.Sprintf("gocage_update_%s_%s", v, curDate)
|
snapshotName := fmt.Sprintf("gocage_update_%s_%s", v, curDate)
|
||||||
err = zfsSnapshot(fmt.Sprintf("%s/releases/%s", ds.ZFSDataset, fakeJail.Config.Release), snapshotName)
|
err = zfsSnapshot(fmt.Sprintf("%s/releases/%s", ds.ZFSDataset, release), snapshotName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error snapshoting release %s: %v\n", gUpdateRelease, err)
|
fmt.Printf("Error snapshoting release %s: %v\n", gUpdateRelease, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = zfsSnapshot(fmt.Sprintf("%s/releases/%s/root", ds.ZFSDataset, fakeJail.Config.Release), snapshotName)
|
err = zfsSnapshot(fmt.Sprintf("%s/releases/%s/root", ds.ZFSDataset, release), snapshotName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("Error snapshoting release %s: %v\n", gUpdateRelease, err)
|
fmt.Printf("Error snapshoting release %s: %v\n", gUpdateRelease, err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
//"log"
|
//"log"
|
||||||
"time"
|
"time"
|
||||||
"strings"
|
"strings"
|
||||||
|
"github.com/spf13/viper"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Internal usage only
|
// Internal usage only
|
||||||
@ -18,19 +19,20 @@ func upgradeJail(jail *Jail, version string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
cfgFile.Write([]byte(fbsdUpdateConfig))
|
// Folder containing update/upgrade temporary files. Mutualized so we save bandwith when upgrading multiple jails
|
||||||
|
uwd := viper.GetString("updateWorkDir")
|
||||||
defer cfgFile.Close()
|
if len(uwd) == 0 {
|
||||||
defer os.Remove(cfgFile.Name())
|
return fmt.Errorf("updateWorkDir not set in configuration")
|
||||||
|
}
|
||||||
// Folder containing update/uipgrade temporary files. Common so we save bandwith when upgrading multiple jails
|
_, err = os.Stat(uwd)
|
||||||
// TODO: Variabilize /iocage/freebsd-update
|
|
||||||
_, err = os.Stat("/iocage/freebsd-update")
|
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
if err := os.Mkdir("/iocage/freebsd-update", 0755); err != nil {
|
if err := os.Mkdir(uwd, 0755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cfgFile.Write([]byte(strings.Replace(fbsdUpdateConfig, "TO-BE-REPLACED-WITH-UPDATEWORKDIR", uwd, 1)))
|
||||||
|
defer cfgFile.Close()
|
||||||
|
defer os.Remove(cfgFile.Name())
|
||||||
|
|
||||||
// Get current version. Won't work on stopped jail.
|
// Get current version. Won't work on stopped jail.
|
||||||
fbsdvers, err := executeCommandInJail(jail, "/bin/freebsd-version")
|
fbsdvers, err := executeCommandInJail(jail, "/bin/freebsd-version")
|
||||||
@ -39,7 +41,6 @@ func upgradeJail(jail *Jail, version string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fbsdvers = strings.TrimRight(fbsdvers, "\n")
|
fbsdvers = strings.TrimRight(fbsdvers, "\n")
|
||||||
//fbsdvers := jail.Config.Release
|
|
||||||
|
|
||||||
cmd := fmt.Sprintf("/usr/sbin/freebsd-update -f %s -b %s --currently-running %s -r %s upgrade",
|
cmd := fmt.Sprintf("/usr/sbin/freebsd-update -f %s -b %s --currently-running %s -r %s upgrade",
|
||||||
cfgFile.Name(), jail.RootPath, fbsdvers, version)
|
cfgFile.Name(), jail.RootPath, fbsdvers, version)
|
||||||
|
36
cmd/utils.go
36
cmd/utils.go
@ -8,6 +8,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
|
"regexp"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -1110,13 +1111,10 @@ func getDevfsRuleset(ruleset int) []string {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return []string{}
|
return []string{}
|
||||||
}
|
}
|
||||||
// Get rid of the last "\n"
|
return strings.Split(out, "\n")[:len(strings.Split(out, "\n"))]
|
||||||
return strings.Split(out, "\n")[:len(strings.Split(out, "\n"))-1]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func copyDevfsRuleset(ruleset int, srcrs int) error {
|
func copyDevfsRuleset(ruleset int, srcrs int) error {
|
||||||
// Resulting ruleset as an array of line
|
|
||||||
//var result []string
|
|
||||||
out := getDevfsRuleset(srcrs)
|
out := getDevfsRuleset(srcrs)
|
||||||
for _, line := range out {
|
for _, line := range out {
|
||||||
//fields := strings.Fields(line)
|
//fields := strings.Fields(line)
|
||||||
@ -1287,6 +1285,36 @@ func setJailConfigUpdated(jail *Jail) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func freebsdVersionToStruct(rawVersion string) (FreeBSDVersion, error) {
|
||||||
|
var version FreeBSDVersion
|
||||||
|
var err error
|
||||||
|
|
||||||
|
regex := `([0-9]{1,2})(\.)?([0-9]{1,2})?\-([^\-]*)(\-)?(p[0-9]{1,2})?`
|
||||||
|
|
||||||
|
re := regexp.MustCompile(regex)
|
||||||
|
|
||||||
|
if re.MatchString(rawVersion) {
|
||||||
|
version.major, err = strconv.Atoi(re.FindStringSubmatch(rawVersion)[1])
|
||||||
|
if err != nil {
|
||||||
|
return version, err
|
||||||
|
}
|
||||||
|
version.minor, err = strconv.Atoi(re.FindStringSubmatch(rawVersion)[3])
|
||||||
|
if err != nil {
|
||||||
|
return version, err
|
||||||
|
}
|
||||||
|
version.flavor = strings.Trim(re.FindStringSubmatch(rawVersion)[4], "\n")
|
||||||
|
|
||||||
|
// Skip the 'p' starting patch level
|
||||||
|
if len(re.FindStringSubmatch(rawVersion)[6]) > 0 {
|
||||||
|
version.patchLevel, err = strconv.Atoi(re.FindStringSubmatch(rawVersion)[6][1:])
|
||||||
|
if err != nil {
|
||||||
|
return version, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return version, nil
|
||||||
|
}
|
||||||
|
|
||||||
func getVersion(jail *Jail) (string, error) {
|
func getVersion(jail *Jail) (string, error) {
|
||||||
cvers, err := executeCommand(fmt.Sprintf("%s/bin/freebsd-version", jail.RootPath))
|
cvers, err := executeCommand(fmt.Sprintf("%s/bin/freebsd-version", jail.RootPath))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user