mirror of
https://github.com/safing/portmaster
synced 2025-09-05 03:59:11 +00:00
Merge pull request #227 from safing/fix/filterlist-index-updating
Fix filterlist index updating
This commit is contained in:
commit
9efa4f4ad8
2 changed files with 60 additions and 17 deletions
|
@ -1,14 +1,17 @@
|
||||||
package filterlists
|
package filterlists
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/safing/portbase/database"
|
"github.com/safing/portbase/database"
|
||||||
"github.com/safing/portbase/database/record"
|
"github.com/safing/portbase/database/record"
|
||||||
"github.com/safing/portbase/formats/dsd"
|
"github.com/safing/portbase/formats/dsd"
|
||||||
"github.com/safing/portbase/log"
|
"github.com/safing/portbase/log"
|
||||||
|
"github.com/safing/portbase/updater"
|
||||||
"github.com/safing/portmaster/updates"
|
"github.com/safing/portmaster/updates"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -159,34 +162,68 @@ func getListIndexFromCache() (*ListIndexFile, error) {
|
||||||
return index, nil
|
return index, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
// listIndexUpdate must only be used by updateListIndex
|
||||||
|
listIndexUpdate *updater.File
|
||||||
|
listIndexUpdateLock sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
func updateListIndex() error {
|
func updateListIndex() error {
|
||||||
index, err := updates.GetFile(listIndexFilePath)
|
listIndexUpdateLock.Lock()
|
||||||
|
defer listIndexUpdateLock.Unlock()
|
||||||
|
|
||||||
|
// Check if an update is needed.
|
||||||
|
switch {
|
||||||
|
case listIndexUpdate == nil:
|
||||||
|
// This is the first time this function is run, get updater file for index.
|
||||||
|
var err error
|
||||||
|
listIndexUpdate, err = updates.GetFile(listIndexFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the version in the cache is current.
|
||||||
|
index, err := getListIndexFromCache()
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, database.ErrNotFound):
|
||||||
|
log.Info("filterlists: index not in cache, starting update")
|
||||||
|
case err != nil:
|
||||||
|
log.Warningf("filterlists: failed to load index from cache, starting update: %s", err)
|
||||||
|
case strings.TrimPrefix(index.Version, "v") != listIndexUpdate.Version():
|
||||||
|
log.Infof(
|
||||||
|
"filterlists: index from cache is outdated, starting update (%s != %s)",
|
||||||
|
strings.TrimPrefix(index.Version, "v"),
|
||||||
|
listIndexUpdate.Version(),
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
log.Debug("filterlists: index is up to date")
|
||||||
|
// List is in cache and current, there is nothing to do.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
case listIndexUpdate.UpgradeAvailable():
|
||||||
|
log.Info("filterlists: index update available, starting update")
|
||||||
|
default:
|
||||||
|
// Index is loaded and no update is available, there is nothing to do.
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update list index from updates.
|
||||||
|
blob, err := ioutil.ReadFile(listIndexUpdate.Path())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
blob, err := ioutil.ReadFile(index.Path())
|
index := &ListIndexFile{}
|
||||||
|
_, err = dsd.Load(blob, index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
index.SetKey(filterListIndexKey)
|
||||||
|
|
||||||
res, err := dsd.Load(blob, &ListIndexFile{})
|
if err := cache.Put(index); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
log.Debugf("intel/filterlists: updated list index in cache to %s", index.Version)
|
||||||
content, ok := res.(*ListIndexFile)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("unexpected format in list index")
|
|
||||||
}
|
|
||||||
|
|
||||||
content.SetKey(filterListIndexKey)
|
|
||||||
|
|
||||||
if err := cache.Put(content); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("intel/filterlists: updated cache record for list index with version %s", content.Version)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,12 @@ func performUpdate(ctx context.Context) error {
|
||||||
|
|
||||||
module.Hint(filterlistsUpdateInProgress, filterlistsUpdateInProgressDescr)
|
module.Hint(filterlistsUpdateInProgress, filterlistsUpdateInProgressDescr)
|
||||||
|
|
||||||
|
// First, update the list index.
|
||||||
|
err := updateListIndex()
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("intel/filterlists: failed update list index: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
upgradables, err := getUpgradableFiles()
|
upgradables, err := getUpgradableFiles()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Add table
Reference in a new issue