diff --git a/cmds/portmaster-start/main.go b/cmds/portmaster-start/main.go index fd83d94c..35f69482 100644 --- a/cmds/portmaster-start/main.go +++ b/cmds/portmaster-start/main.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "io/ioutil" "log" "os" "os/signal" @@ -11,6 +12,10 @@ import ( "strings" "syscall" + "github.com/safing/portmaster/updates/helper" + + "github.com/tidwall/gjson" + "github.com/safing/portbase/dataroot" "github.com/safing/portbase/info" portlog "github.com/safing/portbase/log" @@ -33,7 +38,6 @@ var ( UpdateURLs: []string{ "https://updates.safing.io", }, - Beta: false, DevMode: false, Online: true, // is disabled later based on command } @@ -65,7 +69,7 @@ func init() { { flags.StringVar(&dataDir, "data", "", "Configures the data directory. Alternatively, this can also be set via the environment variable PORTMASTER_DATA.") flags.StringVar(®istry.UserAgent, "update-agent", "Start", "Sets the user agent for requests to the update server") - flags.BoolVar(&staging, "staging", false, "Use staging update channel (for testing only)") + flags.BoolVar(&staging, "staging", false, "Deprecated, configure in settings instead.") flags.IntVar(&maxRetries, "max-retries", 5, "Maximum number of retries when starting a Portmaster component") flags.BoolVar(&stdinSignals, "input-signals", false, "Emulate signals using stdin.") _ = rootCmd.MarkPersistentFlagDirname("data") @@ -164,32 +168,6 @@ func configureRegistry(mustLoadIndex bool) error { return err } - registry.AddIndex(updater.Index{ - Path: "stable.json", - Stable: true, - Beta: false, - }) - - // TODO: enable loading beta versions - // registry.AddIndex(updater.Index{ - // Path: "beta.json", - // Stable: false, - // Beta: true, - // }) - - if stagingActive() { - // Set flag no matter how staging was activated. - staging = true - - log.Println("WARNING: staging environment is active.") - - registry.AddIndex(updater.Index{ - Path: "staging.json", - Stable: true, - Beta: true, - }) - } - return updateRegistryIndex(mustLoadIndex) } @@ -210,6 +188,16 @@ func configureLogging() error { } func updateRegistryIndex(mustLoadIndex bool) error { + // Get release channel from config. + releaseChannel := getReleaseChannel(dataRoot) + + // Set indexes based on the release channel. + helper.SetIndexes(registry, releaseChannel) + + // Update registry to use pre-releases or not. + registry.SetUsePreReleases(releaseChannel != helper.ReleaseChannelStable) + + // Load indexes from disk or network, if needed and desired. err := registry.LoadIndexes(context.Background()) if err != nil { log.Printf("WARNING: error loading indexes: %s\n", err) @@ -218,6 +206,7 @@ func updateRegistryIndex(mustLoadIndex bool) error { } } + // Load versions from disk to know which others we have and which are available. err = registry.ScanStorage("") if err != nil { log.Printf("WARNING: error during storage scan: %s\n", err) @@ -247,13 +236,23 @@ func detectInstallationDir() string { return parent } -func stagingActive() bool { - // Check flag and env variable. - if staging || os.Getenv("PORTMASTER_STAGING") == "enabled" { - return true +func getReleaseChannel(dataRoot *utils.DirStructure) string { + configData, err := ioutil.ReadFile(filepath.Join(dataRoot.Path, "config.json")) + if err != nil { + if !os.IsNotExist(err) { + log.Printf("WARNING: failed to read config.json to get release channel: %s", err) + } + return helper.ReleaseChannelStable } - // Check if staging index is present and acessible. - _, err := os.Stat(filepath.Join(registry.StorageDir().Path, "staging.json")) - return err == nil + // Get release channel from config, validate and return it. + channel := gjson.GetBytes(configData, helper.ReleaseChannelJSONKey).String() + switch channel { + case helper.ReleaseChannelStable, + helper.ReleaseChannelBeta, + helper.ReleaseChannelStaging: + return channel + default: + return helper.ReleaseChannelStable + } } diff --git a/cmds/portmaster-start/update.go b/cmds/portmaster-start/update.go index 1b89b113..69c26e2c 100644 --- a/cmds/portmaster-start/update.go +++ b/cmds/portmaster-start/update.go @@ -40,8 +40,7 @@ var ( func indexRequired(cmd *cobra.Command) bool { switch cmd { - case updateCmd, - purgeCmd: + case updateCmd, purgeCmd: return true default: return false @@ -49,35 +48,9 @@ func indexRequired(cmd *cobra.Command) bool { } func downloadUpdates() error { - // mark required updates - if onWindows { - registry.MandatoryUpdates = []string{ - helper.PlatformIdentifier("core/portmaster-core.exe"), - helper.PlatformIdentifier("kext/portmaster-kext.dll"), - helper.PlatformIdentifier("kext/portmaster-kext.sys"), - helper.PlatformIdentifier("start/portmaster-start.exe"), - helper.PlatformIdentifier("notifier/portmaster-notifier.exe"), - helper.PlatformIdentifier("notifier/portmaster-snoretoast.exe"), - } - } else { - registry.MandatoryUpdates = []string{ - helper.PlatformIdentifier("core/portmaster-core"), - helper.PlatformIdentifier("start/portmaster-start"), - helper.PlatformIdentifier("notifier/portmaster-notifier"), - } - } - - // add updates that we require on all platforms. - registry.MandatoryUpdates = append( - registry.MandatoryUpdates, - helper.PlatformIdentifier("app/portmaster-app.zip"), - "all/ui/modules/portmaster.zip", - ) - - // Add assets that need unpacking. - registry.AutoUnpack = []string{ - helper.PlatformIdentifier("app/portmaster-app.zip"), - } + // Set required updates. + registry.MandatoryUpdates = helper.MandatoryUpdates() + registry.AutoUnpack = helper.AutoUnpackUpdates() // logging is configured as a persistent pre-run method inherited from // the root command but since we don't use run.Run() we need to start @@ -100,8 +73,8 @@ func downloadUpdates() error { return fmt.Errorf("failed to create update dir: %w", err) } - // Reset registry state. - registry.Reset() + // Reset registry resources. + registry.ResetResources() } // Update all indexes. diff --git a/go.mod b/go.mod index 9a0f387b..da6f30f1 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/templexxx/cpufeat v0.0.0-20180724012125-cef66df7f161 // indirect github.com/templexxx/xor v0.0.0-20191217153810-f85b25db303b // indirect github.com/tevino/abool v1.2.0 - github.com/tidwall/gjson v1.7.5 // indirect + github.com/tidwall/gjson v1.7.5 github.com/tidwall/sjson v1.1.6 // indirect github.com/tjfoc/gmsm v1.4.0 // indirect github.com/tklauser/go-sysconf v0.3.5 // indirect