Derive release channel by index presence, remove unused indexes from core

This commit is contained in:
Daniel 2022-01-26 16:42:23 +01:00
parent f0799bf2e7
commit a7a94bf067
4 changed files with 59 additions and 39 deletions

View file

@ -4,7 +4,6 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"io/ioutil"
"log" "log"
"os" "os"
"os/signal" "os/signal"
@ -14,8 +13,6 @@ import (
"github.com/safing/portmaster/updates/helper" "github.com/safing/portmaster/updates/helper"
"github.com/tidwall/gjson"
"github.com/safing/portbase/dataroot" "github.com/safing/portbase/dataroot"
"github.com/safing/portbase/info" "github.com/safing/portbase/info"
portlog "github.com/safing/portbase/log" portlog "github.com/safing/portbase/log"
@ -188,11 +185,11 @@ func ensureLoggingDir() error {
} }
func updateRegistryIndex(mustLoadIndex bool) error { func updateRegistryIndex(mustLoadIndex bool) error {
// Get release channel from config.
releaseChannel := getReleaseChannel(dataRoot)
// Set indexes based on the release channel. // Set indexes based on the release channel.
helper.SetIndexes(registry, releaseChannel) warning := helper.SetIndexes(registry, "", false)
if warning != nil {
log.Printf("WARNING: %s\n", warning)
}
// Load indexes from disk or network, if needed and desired. // Load indexes from disk or network, if needed and desired.
err := registry.LoadIndexes(context.Background()) err := registry.LoadIndexes(context.Background())
@ -232,26 +229,3 @@ func detectInstallationDir() string {
return parent return parent
} }
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\n", err)
}
return helper.ReleaseChannelStable
}
// 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,
helper.ReleaseChannelSupport:
return channel
default:
log.Printf("WARNING: config.json has unknown release channel %q, falling back to stable channel\n", channel)
return helper.ReleaseChannelStable
}
}

View file

@ -123,7 +123,10 @@ func updateRegistryConfig(_ context.Context, _ interface{}) error {
if releaseChannel() != previousReleaseChannel { if releaseChannel() != previousReleaseChannel {
previousReleaseChannel = releaseChannel() previousReleaseChannel = releaseChannel()
helper.SetIndexes(registry, releaseChannel()) warning := helper.SetIndexes(registry, releaseChannel(), true)
if warning != nil {
log.Warningf("updates: %s", warning)
}
changed = true changed = true
} }

View file

@ -1,6 +1,10 @@
package helper package helper
import ( import (
"fmt"
"os"
"path/filepath"
"github.com/safing/portbase/updater" "github.com/safing/portbase/updater"
) )
@ -15,7 +19,7 @@ const (
// SetIndexes sets the update registry indexes and also configures the registry // SetIndexes sets the update registry indexes and also configures the registry
// to use pre-releases based on the channel. // to use pre-releases based on the channel.
func SetIndexes(registry *updater.ResourceRegistry, releaseChannel string) { func SetIndexes(registry *updater.ResourceRegistry, releaseChannel string, deleteUnusedIndexes bool) (warning error) {
usePreReleases := false usePreReleases := false
// Be reminded that the order is important, as indexes added later will // Be reminded that the order is important, as indexes added later will
@ -30,29 +34,50 @@ func SetIndexes(registry *updater.ResourceRegistry, releaseChannel string) {
}) })
// Add beta index if in beta or staging channel. // Add beta index if in beta or staging channel.
indexPath := ReleaseChannelBeta + ".json"
if releaseChannel == ReleaseChannelBeta || if releaseChannel == ReleaseChannelBeta ||
releaseChannel == ReleaseChannelStaging { releaseChannel == ReleaseChannelStaging ||
(releaseChannel == "" && indexExists(registry, indexPath)) {
registry.AddIndex(updater.Index{ registry.AddIndex(updater.Index{
Path: ReleaseChannelBeta + ".json", Path: indexPath,
PreRelease: true, PreRelease: true,
}) })
usePreReleases = true usePreReleases = true
} else if deleteUnusedIndexes {
err := deleteIndex(registry, indexPath)
if err != nil {
warning = fmt.Errorf("failed to delete unused index %s: %w", indexPath, err)
}
} }
// Add staging index if in staging channel. // Add staging index if in staging channel.
if releaseChannel == ReleaseChannelStaging { indexPath = ReleaseChannelStaging + ".json"
if releaseChannel == ReleaseChannelStaging ||
(releaseChannel == "" && indexExists(registry, indexPath)) {
registry.AddIndex(updater.Index{ registry.AddIndex(updater.Index{
Path: ReleaseChannelStaging + ".json", Path: indexPath,
PreRelease: true, PreRelease: true,
}) })
usePreReleases = true usePreReleases = true
} else if deleteUnusedIndexes {
err := deleteIndex(registry, indexPath)
if err != nil {
warning = fmt.Errorf("failed to delete unused index %s: %w", indexPath, err)
}
} }
// Add support index if in support channel. // Add support index if in support channel.
if releaseChannel == ReleaseChannelSupport { indexPath = ReleaseChannelSupport + ".json"
if releaseChannel == ReleaseChannelSupport ||
(releaseChannel == "" && indexExists(registry, indexPath)) {
registry.AddIndex(updater.Index{ registry.AddIndex(updater.Index{
Path: ReleaseChannelSupport + ".json", Path: indexPath,
}) })
} else if deleteUnusedIndexes {
err := deleteIndex(registry, indexPath)
if err != nil {
warning = fmt.Errorf("failed to delete unused index %s: %w", indexPath, err)
}
} }
// Add the intel index last, as it updates the fastest and should not be // Add the intel index last, as it updates the fastest and should not be
@ -64,4 +89,19 @@ func SetIndexes(registry *updater.ResourceRegistry, releaseChannel string) {
// Set pre-release usage. // Set pre-release usage.
registry.SetUsePreReleases(usePreReleases) registry.SetUsePreReleases(usePreReleases)
return
}
func indexExists(registry *updater.ResourceRegistry, indexPath string) bool {
_, err := os.Stat(filepath.Join(registry.StorageDir().Path, indexPath))
return err == nil
}
func deleteIndex(registry *updater.ResourceRegistry, indexPath string) error {
err := os.Remove(filepath.Join(registry.StorageDir().Path, indexPath))
if err != nil && !os.IsNotExist(err) {
return err
}
return nil
} }

View file

@ -114,7 +114,10 @@ func start() error {
} }
// Set indexes based on the release channel. // Set indexes based on the release channel.
helper.SetIndexes(registry, initialReleaseChannel) warning := helper.SetIndexes(registry, initialReleaseChannel, true)
if warning != nil {
log.Warningf("updates: %s", warning)
}
err = registry.LoadIndexes(module.Ctx) err = registry.LoadIndexes(module.Ctx)
if err != nil { if err != nil {