Reload indexes when restarting with portmaster-start
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
2
go.mod
2
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
|
||||
|
||||
Reference in New Issue
Block a user