mirror of
https://github.com/safing/portmaster
synced 2025-04-23 20:39:10 +00:00
* Move portbase into monorepo * Add new simple module mgr * [WIP] Switch to new simple module mgr * Add StateMgr and more worker variants * [WIP] Switch more modules * [WIP] Switch more modules * [WIP] swtich more modules * [WIP] switch all SPN modules * [WIP] switch all service modules * [WIP] Convert all workers to the new module system * [WIP] add new task system to module manager * [WIP] Add second take for scheduling workers * [WIP] Add FIXME for bugs in new scheduler * [WIP] Add minor improvements to scheduler * [WIP] Add new worker scheduler * [WIP] Fix more bug related to new module system * [WIP] Fix start handing of the new module system * [WIP] Improve startup process * [WIP] Fix minor issues * [WIP] Fix missing subsystem in settings * [WIP] Initialize managers in constructor * [WIP] Move module event initialization to constrictors * [WIP] Fix setting for enabling and disabling the SPN module * [WIP] Move API registeration into module construction * [WIP] Update states mgr for all modules * [WIP] Add CmdLine operation support * Add state helper methods to module group and instance * Add notification and module status handling to status package * Fix starting issues * Remove pilot widget and update security lock to new status data * Remove debug logs * Improve http server shutdown * Add workaround for cleanly shutting down firewall+netquery * Improve logging * Add syncing states with notifications for new module system * Improve starting, stopping, shutdown; resolve FIXMEs/TODOs * [WIP] Fix most unit tests * Review new module system and fix minor issues * Push shutdown and restart events again via API * Set sleep mode via interface * Update example/template module * [WIP] Fix spn/cabin unit test * Remove deprecated UI elements * Make log output more similar for the logging transition phase * Switch spn hub and observer cmds to new module system * Fix log sources * Make worker mgr less error prone * Fix tests and minor issues * Fix observation hub * Improve shutdown and restart handling * Split up big connection.go source file * Move varint and dsd packages to structures repo * Improve expansion test * Fix linter warnings * Fix interception module on windows * Fix linter errors --------- Co-authored-by: Vladimir Stoilov <vladimir@safing.io>
98 lines
2.6 KiB
Go
98 lines
2.6 KiB
Go
package cabin
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/safing/portmaster/base/database"
|
|
"github.com/safing/portmaster/base/database/record"
|
|
"github.com/safing/portmaster/spn/hub"
|
|
)
|
|
|
|
var db = database.NewInterface(nil)
|
|
|
|
// LoadIdentity loads an identify with the given key.
|
|
func LoadIdentity(key string) (id *Identity, changed bool, err error) {
|
|
r, err := db.Get(key)
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
id, err = EnsureIdentity(r)
|
|
if err != nil {
|
|
return nil, false, fmt.Errorf("failed to parse identity: %w", err)
|
|
}
|
|
|
|
// Check if required fields are present.
|
|
switch {
|
|
case id.Hub == nil:
|
|
return nil, false, errors.New("missing id.Hub")
|
|
case id.Signet == nil:
|
|
return nil, false, errors.New("missing id.Signet")
|
|
case id.Hub.Info == nil:
|
|
return nil, false, errors.New("missing hub.Info")
|
|
case id.Hub.Status == nil:
|
|
return nil, false, errors.New("missing hub.Status")
|
|
case id.ID != id.Hub.ID:
|
|
return nil, false, errors.New("hub.ID mismatch")
|
|
case id.ID != id.Hub.Info.ID:
|
|
return nil, false, errors.New("hub.Info.ID mismatch")
|
|
case id.Map == "":
|
|
return nil, false, errors.New("invalid id.Map")
|
|
case id.Hub.Map == "":
|
|
return nil, false, errors.New("invalid hub.Map")
|
|
case id.Hub.FirstSeen.IsZero():
|
|
return nil, false, errors.New("missing hub.FirstSeen")
|
|
case id.Hub.Info.Timestamp == 0:
|
|
return nil, false, errors.New("missing hub.Info.Timestamp")
|
|
case id.Hub.Status.Timestamp == 0:
|
|
return nil, false, errors.New("missing hub.Status.Timestamp")
|
|
}
|
|
|
|
// Run a initial maintenance routine.
|
|
infoChanged, err := id.MaintainAnnouncement(nil, true)
|
|
if err != nil {
|
|
return nil, false, fmt.Errorf("failed to initialize announcement: %w", err)
|
|
}
|
|
statusChanged, err := id.MaintainStatus(nil, nil, nil, true)
|
|
if err != nil {
|
|
return nil, false, fmt.Errorf("failed to initialize status: %w", err)
|
|
}
|
|
|
|
// Ensure the Measurements reset the values.
|
|
measurements := id.Hub.GetMeasurements()
|
|
measurements.SetLatency(0)
|
|
measurements.SetCapacity(0)
|
|
measurements.SetCalculatedCost(hub.MaxCalculatedCost)
|
|
|
|
return id, infoChanged || statusChanged, nil
|
|
}
|
|
|
|
// EnsureIdentity makes sure a database record is an Identity.
|
|
func EnsureIdentity(r record.Record) (*Identity, error) {
|
|
// unwrap
|
|
if r.IsWrapped() {
|
|
// only allocate a new struct, if we need it
|
|
id := &Identity{}
|
|
err := record.Unwrap(r, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
// or adjust type
|
|
id, ok := r.(*Identity)
|
|
if !ok {
|
|
return nil, fmt.Errorf("record not of type *Identity, but %T", r)
|
|
}
|
|
return id, nil
|
|
}
|
|
|
|
// Save saves the Identity to the database.
|
|
func (id *Identity) Save() error {
|
|
if !id.KeyIsSet() {
|
|
return errors.New("no key set")
|
|
}
|
|
|
|
return db.Put(id)
|
|
}
|