package cmd import ( "os" "fmt" //"log" "time" ) // Internal usage only func updateJail(jail *Jail) error { // Create default config as temporary file cfgFile, err := os.CreateTemp("", "gocage-jail-update-") if err != nil { return err } cfgFile.Write([]byte(fbsdUpdateConfig)) defer cfgFile.Close() defer os.Remove(cfgFile.Name()) // Folder containing update/uipgrade temporary files. Common so we save bandwith when upgrading multiple jails // TODO: Variabilize /iocage/freebsd-update _, err = os.Stat("/iocage/freebsd-update") if os.IsNotExist(err) { if err := os.Mkdir("/iocage/freebsd-update", 0755); err != nil { return err } } cmd := fmt.Sprintf("/usr/sbin/freebsd-update --not-running-from-cron -f %s -b %s --currently-running %s fetch install", cfgFile.Name(), jail.RootPath, jail.Config.Release) //fmt.Printf("DEBUG: Prepare to execute \"%s\"\n", cmd) err = executeCommandWithOutputToStdout(cmd) if err != nil { return err } // Get and write new release into config.json updateVersion(jail) return nil } func UpdateJail(args []string) { // Current jail were stopping var cj *Jail var err error for _, a := range args { // Check if jail exist and is distinctly named cj, err = getJailFromArray(a, []string{""}, gJails) if err != nil { fmt.Printf("Error getting jail: %s\n", err) continue } fmt.Printf(" > Snapshot jail %s\n", cj.Name) // Set snapshot name dt := time.Now() curDate := fmt.Sprintf("%s", dt.Format("2006-01-02_15-04-05")) gSnapshotName = fmt.Sprintf("goc_update_%s_%s", cj.Config.Release, curDate) err := createJailSnapshot(*cj) if err != nil { fmt.Printf(" > Snapshot jail %s: ERROR: %s\n", cj.Name, err.Error()) return } fmt.Printf(" > Snapshot jail %s: OK\n", cj.Name) fmt.Printf(" > Update jail %s\n", cj.Name) err = updateJail(cj) if err != nil { fmt.Printf("ERROR: %s\n", err.Error()) } else { fmt.Printf(" > Update jail %s: OK\n", cj.Name) } } }