mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-25 05:49:06 +01:00
Add peer operation
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
|
"github.com/netbirdio/netbird/management/server/event"
|
||||||
httpapi "github.com/netbirdio/netbird/management/server/http"
|
httpapi "github.com/netbirdio/netbird/management/server/http"
|
||||||
"github.com/netbirdio/netbird/management/server/metrics"
|
"github.com/netbirdio/netbird/management/server/metrics"
|
||||||
"github.com/netbirdio/netbird/management/server/telemetry"
|
"github.com/netbirdio/netbird/management/server/telemetry"
|
||||||
@@ -142,7 +143,12 @@ var (
|
|||||||
if disableSingleAccMode {
|
if disableSingleAccMode {
|
||||||
mgmtSingleAccModeDomain = ""
|
mgmtSingleAccModeDomain = ""
|
||||||
}
|
}
|
||||||
accountManager, err := server.BuildManager(store, peersUpdateManager, idpManager, mgmtSingleAccModeDomain, dnsDomain)
|
eventStore, err := event.NewSQLiteStore(config.Datadir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
accountManager, err := server.BuildManager(store, peersUpdateManager, idpManager, mgmtSingleAccModeDomain,
|
||||||
|
dnsDomain, eventStore)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to build default manager: %v", err)
|
return fmt.Errorf("failed to build default manager: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/eko/gocache/v3/cache"
|
"github.com/eko/gocache/v3/cache"
|
||||||
cacheStore "github.com/eko/gocache/v3/store"
|
cacheStore "github.com/eko/gocache/v3/store"
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
|
"github.com/netbirdio/netbird/management/server/event"
|
||||||
"github.com/netbirdio/netbird/management/server/idp"
|
"github.com/netbirdio/netbird/management/server/idp"
|
||||||
"github.com/netbirdio/netbird/management/server/jwtclaims"
|
"github.com/netbirdio/netbird/management/server/jwtclaims"
|
||||||
"github.com/netbirdio/netbird/management/server/status"
|
"github.com/netbirdio/netbird/management/server/status"
|
||||||
@@ -99,6 +100,7 @@ type DefaultAccountManager struct {
|
|||||||
idpManager idp.Manager
|
idpManager idp.Manager
|
||||||
cacheManager cache.CacheInterface[[]*idp.UserData]
|
cacheManager cache.CacheInterface[[]*idp.UserData]
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
|
eventStore event.Store
|
||||||
|
|
||||||
// singleAccountMode indicates whether the instance has a single account.
|
// singleAccountMode indicates whether the instance has a single account.
|
||||||
// If true, then every new user will end up under the same account.
|
// If true, then every new user will end up under the same account.
|
||||||
@@ -390,7 +392,7 @@ func (a *Account) GetGroupAll() (*Group, error) {
|
|||||||
|
|
||||||
// BuildManager creates a new DefaultAccountManager with a provided Store
|
// BuildManager creates a new DefaultAccountManager with a provided Store
|
||||||
func BuildManager(store Store, peersUpdateManager *PeersUpdateManager, idpManager idp.Manager,
|
func BuildManager(store Store, peersUpdateManager *PeersUpdateManager, idpManager idp.Manager,
|
||||||
singleAccountModeDomain string, dnsDomain string) (*DefaultAccountManager, error) {
|
singleAccountModeDomain string, dnsDomain string, eventStore event.Store) (*DefaultAccountManager, error) {
|
||||||
am := &DefaultAccountManager{
|
am := &DefaultAccountManager{
|
||||||
Store: store,
|
Store: store,
|
||||||
peersUpdateManager: peersUpdateManager,
|
peersUpdateManager: peersUpdateManager,
|
||||||
@@ -399,6 +401,7 @@ func BuildManager(store Store, peersUpdateManager *PeersUpdateManager, idpManage
|
|||||||
cacheMux: sync.Mutex{},
|
cacheMux: sync.Mutex{},
|
||||||
cacheLoading: map[string]chan struct{}{},
|
cacheLoading: map[string]chan struct{}{},
|
||||||
dnsDomain: dnsDomain,
|
dnsDomain: dnsDomain,
|
||||||
|
eventStore: eventStore,
|
||||||
}
|
}
|
||||||
allAccounts := store.GetAllAccounts()
|
allAccounts := store.GetAllAccounts()
|
||||||
// enable single account mode only if configured by user and number of existing accounts is not grater than 1
|
// enable single account mode only if configured by user and number of existing accounts is not grater than 1
|
||||||
|
|||||||
@@ -9,9 +9,22 @@ const (
|
|||||||
ManagementEvent Type = "management"
|
ManagementEvent Type = "management"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
AddPeerByUserOperation Operation = iota
|
||||||
|
AddPeerWithKeyOperation
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
AddPeerByUserOperationMessage string = "Add new peer"
|
||||||
|
AddPeerWithKeyOperationMessage string = AddPeerByUserOperationMessage
|
||||||
|
)
|
||||||
|
|
||||||
// Type of the Event
|
// Type of the Event
|
||||||
type Type string
|
type Type string
|
||||||
|
|
||||||
|
// Operation is an action that triggered an Event
|
||||||
|
type Operation int
|
||||||
|
|
||||||
// Store provides an interface to store or stream events.
|
// Store provides an interface to store or stream events.
|
||||||
type Store interface {
|
type Store interface {
|
||||||
// Save an event in the store
|
// Save an event in the store
|
||||||
@@ -28,6 +41,8 @@ type Event struct {
|
|||||||
Timestamp time.Time
|
Timestamp time.Time
|
||||||
// Operation that was performed during the event
|
// Operation that was performed during the event
|
||||||
Operation string
|
Operation string
|
||||||
|
// OperationCode that was performed during the event
|
||||||
|
OperationCode Operation
|
||||||
// ID of the event (can be empty, meaning that it wasn't yet generated)
|
// ID of the event (can be empty, meaning that it wasn't yet generated)
|
||||||
ID uint64
|
ID uint64
|
||||||
// Type of the event
|
// Type of the event
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const (
|
|||||||
SQLiteEventSinkDB = "events.db"
|
SQLiteEventSinkDB = "events.db"
|
||||||
createTableQuery = "CREATE TABLE IF NOT EXISTS events " +
|
createTableQuery = "CREATE TABLE IF NOT EXISTS events " +
|
||||||
"(id INTEGER PRIMARY KEY AUTOINCREMENT, account TEXT NOT NULL, " +
|
"(id INTEGER PRIMARY KEY AUTOINCREMENT, account TEXT NOT NULL, " +
|
||||||
"operation TEXT, " +
|
"operation INTEGER, " +
|
||||||
"type TEXT, " +
|
"type TEXT, " +
|
||||||
"timestamp DATETIME, " +
|
"timestamp DATETIME, " +
|
||||||
"modifier TEXT," +
|
"modifier TEXT," +
|
||||||
@@ -98,7 +98,7 @@ func (store *SQLiteStore) Save(event Event) (*Event, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := stmt.Exec(event.Operation, event.Timestamp, event.ModifierID, event.TargetID, event.AccountID, event.Type)
|
result, err := stmt.Exec(event.OperationCode, event.Timestamp, event.ModifierID, event.TargetID, event.AccountID, event.Type)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ func TestNewSQLiteStore(t *testing.T) {
|
|||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
for i := 0; i < 10; i++ {
|
||||||
_, err = store.Save(Event{
|
_, err = store.Save(Event{
|
||||||
Timestamp: time.Now(),
|
Timestamp: time.Now(),
|
||||||
Operation: "cool_operation_" + fmt.Sprint(i),
|
OperationCode: AddPeerByUserOperation,
|
||||||
Type: ManagementEvent,
|
Type: ManagementEvent,
|
||||||
ModifierID: "user_" + fmt.Sprint(i),
|
ModifierID: "user_" + fmt.Sprint(i),
|
||||||
TargetID: "peer_" + fmt.Sprint(i),
|
TargetID: "peer_" + fmt.Sprint(i),
|
||||||
AccountID: accountID,
|
AccountID: accountID,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
nbdns "github.com/netbirdio/netbird/dns"
|
nbdns "github.com/netbirdio/netbird/dns"
|
||||||
|
"github.com/netbirdio/netbird/management/server/event"
|
||||||
"github.com/netbirdio/netbird/management/server/status"
|
"github.com/netbirdio/netbird/management/server/status"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -340,6 +341,7 @@ func (am *DefaultAccountManager) AddPeer(setupKey, userID string, peer *Peer) (*
|
|||||||
var account *Account
|
var account *Account
|
||||||
var err error
|
var err error
|
||||||
addedByUser := false
|
addedByUser := false
|
||||||
|
|
||||||
if len(userID) > 0 {
|
if len(userID) > 0 {
|
||||||
addedByUser = true
|
addedByUser = true
|
||||||
account, err = am.Store.GetAccountByUser(userID)
|
account, err = am.Store.GetAccountByUser(userID)
|
||||||
@@ -359,6 +361,12 @@ func (am *DefaultAccountManager) AddPeer(setupKey, userID string, peer *Peer) (*
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opEvent := event.Event{
|
||||||
|
Timestamp: time.Now(),
|
||||||
|
Type: event.ManagementEvent,
|
||||||
|
AccountID: account.Id,
|
||||||
|
}
|
||||||
|
|
||||||
if !addedByUser {
|
if !addedByUser {
|
||||||
// validate the setup key if adding with a key
|
// validate the setup key if adding with a key
|
||||||
sk, err := account.FindSetupKey(upperKey)
|
sk, err := account.FindSetupKey(upperKey)
|
||||||
@@ -371,6 +379,11 @@ func (am *DefaultAccountManager) AddPeer(setupKey, userID string, peer *Peer) (*
|
|||||||
}
|
}
|
||||||
|
|
||||||
account.SetupKeys[sk.Key] = sk.IncrementUsage()
|
account.SetupKeys[sk.Key] = sk.IncrementUsage()
|
||||||
|
opEvent.ModifierID = sk.Id
|
||||||
|
opEvent.OperationCode = event.AddPeerWithKeyOperation
|
||||||
|
} else {
|
||||||
|
opEvent.ModifierID = userID
|
||||||
|
opEvent.OperationCode = event.AddPeerByUserOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
takenIps := account.getTakenIPs()
|
takenIps := account.getTakenIPs()
|
||||||
@@ -436,6 +449,12 @@ func (am *DefaultAccountManager) AddPeer(setupKey, userID string, peer *Peer) (*
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
opEvent.TargetID = newPeer.IP.String()
|
||||||
|
_, err = am.eventStore.Save(opEvent)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return newPeer, nil
|
return newPeer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user