diff --git a/cmd/properties.go b/cmd/properties.go index 670e0b8..962a5f2 100644 --- a/cmd/properties.go +++ b/cmd/properties.go @@ -118,6 +118,7 @@ func SetJailProperties(args []string) { gJails[i].ConfigUpdated = true } } + WriteConfigToDisk(&gJails[i], false) } } } diff --git a/cmd/root.go b/cmd/root.go index c86b305..32ea3b5 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -15,7 +15,7 @@ import ( ) const ( - gVersion = "0.36a" + gVersion = "0.36b" // TODO : Get from $jail_zpool/defaults.json MIN_DYN_DEVFS_RULESET = 1000 @@ -137,7 +137,6 @@ ex: gocage list srv-db srv-web`, } else { StartJail(args) } - WriteConfigToDisk("", false, false) }, } @@ -149,7 +148,6 @@ ex: gocage list srv-db srv-web`, ListJails(args, false) StopJail(args) StartJail(args) - WriteConfigToDisk("", false, false) }, } @@ -172,7 +170,6 @@ Multiples properties can be specified, separated with space (Ex: gocage set allo // Load inventory ListJails(args, false) SetJailProperties(args) - WriteConfigToDisk("", true, false) }, } @@ -254,7 +251,6 @@ You can specify multiple jails.`, // Load inventory ListJails(args, false) MigrateJail(args) - WriteConfigToDisk("", false, false) }, } @@ -491,58 +487,48 @@ func initConfig() { * default route, so if route change on jailhost this will reflect on jail next * start) *******************************************************************************/ -func WriteConfigToDisk(jailName string, changeauto bool, forceWrite bool) { - for _, j := range gJails { - if len(jailName) > 0 && j.Name == jailName || len(jailName) == 0 { - if j.ConfigUpdated || forceWrite { - log.Debug("%s config has changed, write changes to disk\n", j.Name) +func WriteConfigToDisk(j *Jail, changeauto bool) { + // we will manipulate properties so get a copy + jc := j.Config - // we will manipulate properties so get a copy - jc := j.Config + if changeauto == false { + // Overwrite "auto" properties + ondiskjc, err := getJailConfig(j.ConfigPath) + if err != nil { + panic(err) + } + // TODO : List all fields, then call getStructFieldValue to compare value with "auto" + // If "auto" then keep it that way before writing ondiskjc to disk + var properties []string + properties = getStructFieldNames(ondiskjc, properties, "") - if changeauto == false { - // Overwrite "auto" properties - ondiskjc, err := getJailConfig(j.ConfigPath) - if err != nil { - panic(err) - } - // TODO : List all fields, then call getStructFieldValue to compare value with "auto" - // If "auto" then keep it that way before writing ondiskjc to disk - var properties []string - properties = getStructFieldNames(ondiskjc, properties, "") - - for _, p := range properties { - v, _, err := getStructFieldValue(ondiskjc, p) - if err != nil { - panic(err) - } - if v.String() == "auto" { - err = setStructFieldValue(&jc, p, "auto") - if err != nil { - fmt.Printf("ERROR sanitizing config: %s\n", err.Error()) - os.Exit(1) - } - } - } - } - - marshaled, err := json.MarshalIndent(jc, "", " ") + for _, p := range properties { + v, _, err := getStructFieldValue(ondiskjc, p) + if err != nil { + panic(err) + } + if v.String() == "auto" { + err = setStructFieldValue(&jc, p, "auto") if err != nil { - fmt.Printf("ERROR marshaling config: %s\n", err.Error()) - } - - //fmt.Printf("DEBUG: Will write config to disk, with content:\n") - //fmt.Printf(string(marshaled)) - fmt.Printf("DEBUG: Will write config to disk, Config.Release=%s\n", jc.Release) - fmt.Printf("DEBUG: Will write config to disk, Config.Last_started=%s\n", jc.Last_started) - - if os.WriteFile(j.ConfigPath, []byte(marshaled), 0644); err != nil { - fmt.Printf("Error writing config file %s: %v\n", j.ConfigPath, err) + fmt.Printf("ERROR sanitizing config: %s\n", err.Error()) os.Exit(1) } } } } + + marshaled, err := json.MarshalIndent(jc, "", " ") + if err != nil { + fmt.Printf("ERROR marshaling config: %s\n", err.Error()) + } + + //fmt.Printf("DEBUG: Will write config to disk, with content:\n") + //fmt.Printf(string(marshaled)) + + if os.WriteFile(j.ConfigPath, []byte(marshaled), 0644); err != nil { + fmt.Printf("Error writing config file %s: %v\n", j.ConfigPath, err) + os.Exit(1) + } } diff --git a/cmd/start.go b/cmd/start.go index a59d5f3..34b40a9 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -1365,7 +1365,7 @@ func StartJail(args []string) { } // Synchronize jail config to disk - WriteConfigToDisk(cj.Name, false, false) + WriteConfigToDisk(cj, false) start_cmd := fmt.Sprintf("/usr/sbin/jail -f /var/run/jail.%s.conf -c", cj.InternalName) @@ -1512,10 +1512,11 @@ func StartJail(args []string) { // TODO: Apply rctl // Update last_started + // 23/07/2023 : This is not working, when writing to disk the old value is used dt := time.Now() curDate := fmt.Sprintf("%s", dt.Format("2006-01-02 15:04:05")) - fmt.Sprintf(cj.Config.Last_started, curDate) - WriteConfigToDisk(cj.Name, false, true) + cj.Config.Last_started = curDate + WriteConfigToDisk(cj, false) /* diff --git a/cmd/stop.go b/cmd/stop.go index 026fcd8..34a704b 100644 --- a/cmd/stop.go +++ b/cmd/stop.go @@ -290,16 +290,8 @@ func StopJail(args []string) { return } cvers = strings.TrimRight(cvers, "\n") - - //fmt.Sprintf(cj.Config.Release, cvers) - //cj.Config.Release = cvers - //cj.ConfigUpdated = true - - // This is working in this context, but value is not available in WriteConfigToDisk context :/ - setStructFieldValue(cj, "Config.Release", cvers) - //fmt.Printf("DEBUG: release was set, now is : %s\n", cj.Config.Release) - - // We need to get the real Config object, not a copy of it + cj.Config.Release = cvers + WriteConfigToDisk(cj, false) out, err := executeCommand(fmt.Sprintf("rctl jail:%s", cj.InternalName)) if err == nil && len(out) > 0 { @@ -429,7 +421,7 @@ func StopJail(args []string) { fmt.Printf(" > Umount mountpoints from %s: OK\n", fstab) } } - + // TODO: Execute poststop if len(cj.Config.Exec_poststop) > 0 { fmt.Printf(" > Execute post-stop:\n") @@ -440,13 +432,13 @@ func StopJail(args []string) { fmt.Printf(" > Execute post-stop: OK\n") } } - + // Remove parameter file pfile := fmt.Sprintf("/var/run/jail.%s.conf", cj.InternalName) if err = os.Remove(pfile); err != nil { fmt.Printf("Error deleting parameter file %s\n", pfile) } - + // We need this to get a reference to cj.Running (bc cj.Running is just a copy of value in the scope of StopJail()) for i, j := range gJails { if strings.EqualFold(j.Name, cj.Name) && strings.EqualFold(j.Datastore, cj.Datastore) { @@ -464,9 +456,7 @@ func StopJail(args []string) { } } } - - //fmt.Printf("DEBUG: release = %s\n", cj.Config.Release) - WriteConfigToDisk(cj.Name, false, true) + WriteConfigToDisk(cj, false) } }