mirror of
https://github.com/safing/portmaster
synced 2025-09-01 18:19:12 +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>
121 lines
3.1 KiB
Go
121 lines
3.1 KiB
Go
package navigator
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/safing/portmaster/base/database/record"
|
|
"github.com/safing/portmaster/service/intel"
|
|
"github.com/safing/portmaster/spn/hub"
|
|
)
|
|
|
|
// PinExport is the exportable version of a Pin.
|
|
type PinExport struct {
|
|
record.Base
|
|
sync.Mutex
|
|
|
|
ID string
|
|
Name string
|
|
Map string
|
|
FirstSeen time.Time
|
|
|
|
EntityV4 *intel.Entity
|
|
EntityV6 *intel.Entity
|
|
// TODO: add coords
|
|
|
|
States []string // From pin.State
|
|
VerifiedOwner string
|
|
HopDistance int
|
|
|
|
ConnectedTo map[string]*LaneExport // Key is Hub ID.
|
|
Route []string // Includes Home Hub and this Pin's ID.
|
|
SessionActive bool
|
|
|
|
Info *hub.Announcement
|
|
Status *hub.Status
|
|
}
|
|
|
|
// LaneExport is the exportable version of a Lane.
|
|
type LaneExport struct {
|
|
HubID string
|
|
|
|
// Capacity designates the available bandwidth between these Hubs.
|
|
// It is specified in bit/s.
|
|
Capacity int
|
|
|
|
// Lateny designates the latency between these Hubs.
|
|
// It is specified in nanoseconds.
|
|
Latency time.Duration
|
|
}
|
|
|
|
// Export puts the Pin's information into an exportable format.
|
|
func (pin *Pin) Export() *PinExport {
|
|
pin.Lock()
|
|
defer pin.Unlock()
|
|
|
|
// Shallow copy static values.
|
|
export := &PinExport{
|
|
ID: pin.Hub.ID,
|
|
Name: pin.Hub.Info.Name,
|
|
Map: pin.Hub.Map,
|
|
FirstSeen: pin.Hub.FirstSeen,
|
|
EntityV4: pin.EntityV4,
|
|
EntityV6: pin.EntityV6,
|
|
States: pin.State.Export(),
|
|
VerifiedOwner: pin.VerifiedOwner,
|
|
HopDistance: pin.HopDistance,
|
|
SessionActive: pin.hasActiveTerminal() || pin.State.Has(StateIsHomeHub),
|
|
Info: pin.Hub.Info, // Is updated as a whole, no need to copy.
|
|
Status: pin.Hub.Status, // Is updated as a whole, no need to copy.
|
|
}
|
|
|
|
// Export lanes.
|
|
export.ConnectedTo = make(map[string]*LaneExport, len(pin.ConnectedTo))
|
|
for key, lane := range pin.ConnectedTo {
|
|
export.ConnectedTo[key] = &LaneExport{
|
|
HubID: lane.Pin.Hub.ID,
|
|
Capacity: lane.Capacity,
|
|
Latency: lane.Latency,
|
|
}
|
|
}
|
|
|
|
// Export route to Pin, if connected.
|
|
if pin.Connection != nil && pin.Connection.Route != nil {
|
|
export.Route = make([]string, len(pin.Connection.Route.Path))
|
|
for key, hop := range pin.Connection.Route.Path {
|
|
export.Route[key] = hop.HubID
|
|
}
|
|
}
|
|
|
|
// Create database record metadata.
|
|
export.SetKey(makeDBKey(export.Map, export.ID))
|
|
export.SetMeta(&record.Meta{
|
|
Created: export.FirstSeen.Unix(),
|
|
Modified: time.Now().Unix(),
|
|
})
|
|
|
|
return export
|
|
}
|
|
|
|
// HumanName returns a human-readable version of a Hub's name.
|
|
// This name will likely consist of two parts: the given name and the ending of the ID to make it unique.
|
|
func (h *PinExport) HumanName() string {
|
|
if len(h.ID) < 8 {
|
|
return fmt.Sprintf("<Hub %s>", h.ID)
|
|
}
|
|
|
|
shortenedID := h.ID[len(h.ID)-8:len(h.ID)-4] +
|
|
"-" +
|
|
h.ID[len(h.ID)-4:]
|
|
|
|
// Be more careful, as the Hub name is user input.
|
|
switch {
|
|
case h.Info.Name == "":
|
|
return fmt.Sprintf("<Hub %s>", shortenedID)
|
|
case len(h.Info.Name) > 16:
|
|
return fmt.Sprintf("<Hub %s %s>", h.Info.Name[:16], shortenedID)
|
|
default:
|
|
return fmt.Sprintf("<Hub %s %s>", h.Info.Name, shortenedID)
|
|
}
|
|
}
|