99 lines
2.4 KiB
Go
99 lines
2.4 KiB
Go
package navigator
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/safing/portbase/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
|
|
}
|