From 18d35b9224a65874b76d6a1cccab6bbe8263e101 Mon Sep 17 00:00:00 2001 From: yo Date: Sat, 20 Apr 2024 20:35:17 +0200 Subject: [PATCH] v0.40: basejail now created from NN.N-RELEASE --- cmd/create.go | 36 ++++++++++++++++++++---------------- cmd/root.go | 6 +++--- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 3b36f72..2cb5a8e 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -16,6 +16,11 @@ func CreateJail(args []string) { var err error var jtype []string + if gCreateArgs.BaseJail && gCreateArgs.Release == "" { + fmt.Println("Release should be set when creating basejail") + os.Exit(1) + } + if len(gCreateArgs.JailType) > 0 { jtype = []string{gCreateArgs.JailType} } @@ -50,21 +55,20 @@ func CreateJail(args []string) { } // Get base template if specified - if len(gCreateArgs.BaseTemplate) > 0 { + if gCreateArgs.BaseJail { /************************************************************************** * Create based jail from a template */ - log.Debugf("Jail will be created from a base template\n") - bj, err := getJailFromArray(gCreateArgs.BaseTemplate, []string{"template"}, gJails) - if err != nil { - if strings.EqualFold(err.Error(), "Jail not found") { - fmt.Printf("Template not found\n") - return - } else { - fmt.Printf("ERROR: %s\n", err.Error()) - return - } + log.Debugf("Jail will be created read-only from release %s\n", gCreateArgs.Release) + + // First check if we got release on the same datastore + releasePath := fmt.Sprintf("%s/releases/%s/root", ds.Mountpoint, gCreateArgs.Release) + _, err := os.Stat(releasePath) + if os.IsNotExist(err) { + fmt.Printf("ERROR: Release locally not available. Run \"gocage fetch\"\n") + return } + // Create jail datasets dstDset := fmt.Sprintf("%s/jails/%s", ds.ZFSDataset, jname) fmt.Printf(" > Initialize dataset %s\n", dstDset) @@ -87,7 +91,7 @@ func CreateJail(args []string) { dstRootDir := fmt.Sprintf("%s/jails/%s/root", ds.Mountpoint, jname) for _, d := range append(gBaseDirs, gEmptyDirs...) { dstPath := dstRootDir - srcPath := bj.RootPath + srcPath := releasePath for _, cd := range strings.Split(d, "/") { srcPath = fmt.Sprintf("%s/%s", srcPath, cd) dstPath = fmt.Sprintf("%s/%s", dstPath, cd) @@ -110,9 +114,9 @@ func CreateJail(args []string) { // Copy these from basejail fmt.Printf(" > Create base writable directories\n") for _, d := range gCopyDirs { - err := cp.Copy(fmt.Sprintf("%s/%s", bj.RootPath, d), fmt.Sprintf("%s/%s", dstRootDir, d)) + err := cp.Copy(fmt.Sprintf("%s/%s", releasePath, d), fmt.Sprintf("%s/%s", dstRootDir, d)) if err != nil { - fmt.Printf("ERROR copying %s to %s: %s\n", fmt.Sprintf("%s/%s", bj.RootPath, d), + fmt.Printf("ERROR copying %s to %s: %s\n", fmt.Sprintf("%s/%s", releasePath, d), fmt.Sprintf("%s/%s", dstRootDir, d), err.Error()) return } @@ -150,7 +154,7 @@ func CreateJail(args []string) { // 2. Add a json item to config ("basejail_template" p.e.), but iocage would delete it once jail is started from iocage // 3. Add a gocage specific config ("config.gocage.json" p.e.) j.Config.Jailtype = "basejail" - j.Config.Origin = bj.Name + j.Config.Origin = gCreateArgs.Release j.Config.Host_hostname = jname j.Config.Host_hostuuid = jname @@ -166,7 +170,7 @@ func CreateJail(args []string) { defer fstabHandle.Close() for _, d := range gBaseDirs { - fmt.Fprintf(fstabHandle, "%s\t%s\tnullfs\tro\t0\t0\n", fmt.Sprintf("%s/%s", bj.RootPath, d), fmt.Sprintf("%s/%s", dstRootDir, d)) + fmt.Fprintf(fstabHandle, "%s\t%s\tnullfs\tro\t0\t0\n", fmt.Sprintf("%s/%s", releasePath, d), fmt.Sprintf("%s/%s", dstRootDir, d)) } fmt.Printf(" > Jail created!\n") diff --git a/cmd/root.go b/cmd/root.go index c7f5421..ec2b6cf 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -14,7 +14,7 @@ import ( ) const ( - gVersion = "0.39" + gVersion = "0.40" // TODO : Get from $jail_zpool/defaults.json MIN_DYN_DEVFS_RULESET = 1000 @@ -22,7 +22,7 @@ const ( type createArgs struct { Release string - BaseTemplate string + BaseJail bool Datastore string JailType string } @@ -420,7 +420,7 @@ func init() { upgradeCmd.MarkFlagRequired("release") createCmd.Flags().StringVarP(&gCreateArgs.Release, "release", "r", "", "Release for the jail (e.g.: \"13.1-RELEASE\"") - createCmd.Flags().StringVarP(&gCreateArgs.BaseTemplate, "basetpl", "b", "", "Base template. This will create a jail based on basetpl, so every up(date|grade) made to basetpl will immediately propagate to new jail\n") + createCmd.Flags().BoolVarP(&gCreateArgs.BaseJail, "basejail", "b", false, "Basejail. This will create a jail mounted read only from a release, so every up(date|grade) made to this release will immediately propagate to new jail.\n") createCmd.Flags().StringVarP(&gCreateArgs.Datastore, "datastore", "d", "", "Datastore to create the jail on. Defaults to first declared in config.") // Now declare commands