mirror of
https://github.com/netbirdio/netbird.git
synced 2025-08-21 11:41:02 +02:00
[client] Add full sync response to debug bundle (#4287)
This commit is contained in:
@@ -77,11 +77,11 @@ var forCmd = &cobra.Command{
|
|||||||
|
|
||||||
var persistenceCmd = &cobra.Command{
|
var persistenceCmd = &cobra.Command{
|
||||||
Use: "persistence [on|off]",
|
Use: "persistence [on|off]",
|
||||||
Short: "Set network map memory persistence",
|
Short: "Set sync response memory persistence",
|
||||||
Long: `Configure whether the latest network map should persist in memory. When enabled, the last known network map will be kept in memory.`,
|
Long: `Configure whether the latest sync response should persist in memory. When enabled, the last known sync response will be kept in memory.`,
|
||||||
Example: " netbird debug persistence on",
|
Example: " netbird debug persistence on",
|
||||||
Args: cobra.ExactArgs(1),
|
Args: cobra.ExactArgs(1),
|
||||||
RunE: setNetworkMapPersistence,
|
RunE: setSyncResponsePersistence,
|
||||||
}
|
}
|
||||||
|
|
||||||
func debugBundle(cmd *cobra.Command, _ []string) error {
|
func debugBundle(cmd *cobra.Command, _ []string) error {
|
||||||
@@ -206,11 +206,11 @@ func runForDuration(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
// Enable network map persistence before bringing the service up
|
// Enable sync response persistence before bringing the service up
|
||||||
if _, err := client.SetNetworkMapPersistence(cmd.Context(), &proto.SetNetworkMapPersistenceRequest{
|
if _, err := client.SetSyncResponsePersistence(cmd.Context(), &proto.SetSyncResponsePersistenceRequest{
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return fmt.Errorf("failed to enable network map persistence: %v", status.Convert(err).Message())
|
return fmt.Errorf("failed to enable sync response persistence: %v", status.Convert(err).Message())
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := client.Up(cmd.Context(), &proto.UpRequest{}); err != nil {
|
if _, err := client.Up(cmd.Context(), &proto.UpRequest{}); err != nil {
|
||||||
@@ -273,7 +273,7 @@ func runForDuration(cmd *cobra.Command, args []string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func setNetworkMapPersistence(cmd *cobra.Command, args []string) error {
|
func setSyncResponsePersistence(cmd *cobra.Command, args []string) error {
|
||||||
conn, err := getClient(cmd)
|
conn, err := getClient(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -290,14 +290,14 @@ func setNetworkMapPersistence(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
client := proto.NewDaemonServiceClient(conn)
|
client := proto.NewDaemonServiceClient(conn)
|
||||||
_, err = client.SetNetworkMapPersistence(cmd.Context(), &proto.SetNetworkMapPersistenceRequest{
|
_, err = client.SetSyncResponsePersistence(cmd.Context(), &proto.SetSyncResponsePersistenceRequest{
|
||||||
Enabled: persistence == "on",
|
Enabled: persistence == "on",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to set network map persistence: %v", status.Convert(err).Message())
|
return fmt.Errorf("failed to set sync response persistence: %v", status.Convert(err).Message())
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Printf("Network map persistence set to: %s\n", persistence)
|
cmd.Printf("Sync response persistence set to: %s\n", persistence)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,13 +357,13 @@ func formatDuration(d time.Duration) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func generateDebugBundle(config *profilemanager.Config, recorder *peer.Status, connectClient *internal.ConnectClient, logFilePath string) {
|
func generateDebugBundle(config *profilemanager.Config, recorder *peer.Status, connectClient *internal.ConnectClient, logFilePath string) {
|
||||||
var networkMap *mgmProto.NetworkMap
|
var syncResponse *mgmProto.SyncResponse
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if connectClient != nil {
|
if connectClient != nil {
|
||||||
networkMap, err = connectClient.GetLatestNetworkMap()
|
syncResponse, err = connectClient.GetLatestSyncResponse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Failed to get latest network map: %v", err)
|
log.Warnf("Failed to get latest sync response: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,7 +371,7 @@ func generateDebugBundle(config *profilemanager.Config, recorder *peer.Status, c
|
|||||||
debug.GeneratorDependencies{
|
debug.GeneratorDependencies{
|
||||||
InternalConfig: config,
|
InternalConfig: config,
|
||||||
StatusRecorder: recorder,
|
StatusRecorder: recorder,
|
||||||
NetworkMap: networkMap,
|
SyncResponse: syncResponse,
|
||||||
LogFile: logFilePath,
|
LogFile: logFilePath,
|
||||||
},
|
},
|
||||||
debug.BundleConfig{
|
debug.BundleConfig{
|
||||||
|
@@ -43,7 +43,7 @@ type ConnectClient struct {
|
|||||||
engine *Engine
|
engine *Engine
|
||||||
engineMutex sync.Mutex
|
engineMutex sync.Mutex
|
||||||
|
|
||||||
persistNetworkMap bool
|
persistSyncResponse bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConnectClient(
|
func NewConnectClient(
|
||||||
@@ -270,7 +270,7 @@ func (c *ConnectClient) run(mobileDependency MobileDependency, runningChan chan
|
|||||||
|
|
||||||
c.engineMutex.Lock()
|
c.engineMutex.Lock()
|
||||||
c.engine = NewEngine(engineCtx, cancel, signalClient, mgmClient, relayManager, engineConfig, mobileDependency, c.statusRecorder, checks)
|
c.engine = NewEngine(engineCtx, cancel, signalClient, mgmClient, relayManager, engineConfig, mobileDependency, c.statusRecorder, checks)
|
||||||
c.engine.SetNetworkMapPersistence(c.persistNetworkMap)
|
c.engine.SetSyncResponsePersistence(c.persistSyncResponse)
|
||||||
c.engineMutex.Unlock()
|
c.engineMutex.Unlock()
|
||||||
|
|
||||||
if err := c.engine.Start(); err != nil {
|
if err := c.engine.Start(); err != nil {
|
||||||
@@ -349,23 +349,23 @@ func (c *ConnectClient) Engine() *Engine {
|
|||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLatestNetworkMap returns the latest network map from the engine.
|
// GetLatestSyncResponse returns the latest sync response from the engine.
|
||||||
func (c *ConnectClient) GetLatestNetworkMap() (*mgmProto.NetworkMap, error) {
|
func (c *ConnectClient) GetLatestSyncResponse() (*mgmProto.SyncResponse, error) {
|
||||||
engine := c.Engine()
|
engine := c.Engine()
|
||||||
if engine == nil {
|
if engine == nil {
|
||||||
return nil, errors.New("engine is not initialized")
|
return nil, errors.New("engine is not initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
networkMap, err := engine.GetLatestNetworkMap()
|
syncResponse, err := engine.GetLatestSyncResponse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("get latest network map: %w", err)
|
return nil, fmt.Errorf("get latest sync response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if networkMap == nil {
|
if syncResponse == nil {
|
||||||
return nil, errors.New("network map is not available")
|
return nil, errors.New("sync response is not available")
|
||||||
}
|
}
|
||||||
|
|
||||||
return networkMap, nil
|
return syncResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Status returns the current client status
|
// Status returns the current client status
|
||||||
@@ -398,18 +398,18 @@ func (c *ConnectClient) Stop() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNetworkMapPersistence enables or disables network map persistence.
|
// SetSyncResponsePersistence enables or disables sync response persistence.
|
||||||
// When enabled, the last received network map will be stored and can be retrieved
|
// When enabled, the last received sync response will be stored and can be retrieved
|
||||||
// through the Engine's getLatestNetworkMap method. When disabled, any stored
|
// through the Engine's GetLatestSyncResponse method. When disabled, any stored
|
||||||
// network map will be cleared.
|
// sync response will be cleared.
|
||||||
func (c *ConnectClient) SetNetworkMapPersistence(enabled bool) {
|
func (c *ConnectClient) SetSyncResponsePersistence(enabled bool) {
|
||||||
c.engineMutex.Lock()
|
c.engineMutex.Lock()
|
||||||
c.persistNetworkMap = enabled
|
c.persistSyncResponse = enabled
|
||||||
c.engineMutex.Unlock()
|
c.engineMutex.Unlock()
|
||||||
|
|
||||||
engine := c.Engine()
|
engine := c.Engine()
|
||||||
if engine != nil {
|
if engine != nil {
|
||||||
engine.SetNetworkMapPersistence(enabled)
|
engine.SetSyncResponsePersistence(enabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -46,7 +46,7 @@ iptables.txt: Anonymized iptables rules with packet counters, if --system-info f
|
|||||||
nftables.txt: Anonymized nftables rules with packet counters, if --system-info flag was provided.
|
nftables.txt: Anonymized nftables rules with packet counters, if --system-info flag was provided.
|
||||||
resolved_domains.txt: Anonymized resolved domain IP addresses from the status recorder.
|
resolved_domains.txt: Anonymized resolved domain IP addresses from the status recorder.
|
||||||
config.txt: Anonymized configuration information of the NetBird client.
|
config.txt: Anonymized configuration information of the NetBird client.
|
||||||
network_map.json: Anonymized network map containing peer configurations, routes, DNS settings, and firewall rules.
|
network_map.json: Anonymized sync response containing peer configurations, routes, DNS settings, and firewall rules.
|
||||||
state.json: Anonymized client state dump containing netbird states.
|
state.json: Anonymized client state dump containing netbird states.
|
||||||
mutex.prof: Mutex profiling information.
|
mutex.prof: Mutex profiling information.
|
||||||
goroutine.prof: Goroutine profiling information.
|
goroutine.prof: Goroutine profiling information.
|
||||||
@@ -73,7 +73,7 @@ Domains
|
|||||||
All domain names (except for the netbird domains) are replaced with randomly generated strings ending in ".domain". Anonymized domains are consistent across all files in the bundle.
|
All domain names (except for the netbird domains) are replaced with randomly generated strings ending in ".domain". Anonymized domains are consistent across all files in the bundle.
|
||||||
Reoccuring domain names are replaced with the same anonymized domain.
|
Reoccuring domain names are replaced with the same anonymized domain.
|
||||||
|
|
||||||
Network Map
|
Sync Response
|
||||||
The network_map.json file contains the following anonymized information:
|
The network_map.json file contains the following anonymized information:
|
||||||
- Peer configurations (addresses, FQDNs, DNS settings)
|
- Peer configurations (addresses, FQDNs, DNS settings)
|
||||||
- Remote and offline peer information (allowed IPs, FQDNs)
|
- Remote and offline peer information (allowed IPs, FQDNs)
|
||||||
@@ -81,7 +81,7 @@ The network_map.json file contains the following anonymized information:
|
|||||||
- DNS configuration (nameservers, domains, custom zones)
|
- DNS configuration (nameservers, domains, custom zones)
|
||||||
- Firewall rules (peer IPs, source/destination ranges)
|
- Firewall rules (peer IPs, source/destination ranges)
|
||||||
|
|
||||||
SSH keys in the network map are replaced with a placeholder value. All IP addresses and domains in the network map follow the same anonymization rules as described above.
|
SSH keys in the sync response are replaced with a placeholder value. All IP addresses and domains in the sync response follow the same anonymization rules as described above.
|
||||||
|
|
||||||
State File
|
State File
|
||||||
The state.json file contains anonymized internal state information of the NetBird client, including:
|
The state.json file contains anonymized internal state information of the NetBird client, including:
|
||||||
@@ -201,7 +201,7 @@ type BundleGenerator struct {
|
|||||||
// deps
|
// deps
|
||||||
internalConfig *profilemanager.Config
|
internalConfig *profilemanager.Config
|
||||||
statusRecorder *peer.Status
|
statusRecorder *peer.Status
|
||||||
networkMap *mgmProto.NetworkMap
|
syncResponse *mgmProto.SyncResponse
|
||||||
logFile string
|
logFile string
|
||||||
|
|
||||||
anonymize bool
|
anonymize bool
|
||||||
@@ -222,7 +222,7 @@ type BundleConfig struct {
|
|||||||
type GeneratorDependencies struct {
|
type GeneratorDependencies struct {
|
||||||
InternalConfig *profilemanager.Config
|
InternalConfig *profilemanager.Config
|
||||||
StatusRecorder *peer.Status
|
StatusRecorder *peer.Status
|
||||||
NetworkMap *mgmProto.NetworkMap
|
SyncResponse *mgmProto.SyncResponse
|
||||||
LogFile string
|
LogFile string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +238,7 @@ func NewBundleGenerator(deps GeneratorDependencies, cfg BundleConfig) *BundleGen
|
|||||||
|
|
||||||
internalConfig: deps.InternalConfig,
|
internalConfig: deps.InternalConfig,
|
||||||
statusRecorder: deps.StatusRecorder,
|
statusRecorder: deps.StatusRecorder,
|
||||||
networkMap: deps.NetworkMap,
|
syncResponse: deps.SyncResponse,
|
||||||
logFile: deps.LogFile,
|
logFile: deps.LogFile,
|
||||||
|
|
||||||
anonymize: cfg.Anonymize,
|
anonymize: cfg.Anonymize,
|
||||||
@@ -311,8 +311,8 @@ func (g *BundleGenerator) createArchive() error {
|
|||||||
log.Errorf("failed to add profiles to debug bundle: %v", err)
|
log.Errorf("failed to add profiles to debug bundle: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := g.addNetworkMap(); err != nil {
|
if err := g.addSyncResponse(); err != nil {
|
||||||
return fmt.Errorf("add network map: %w", err)
|
return fmt.Errorf("add sync response: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := g.addStateFile(); err != nil {
|
if err := g.addStateFile(); err != nil {
|
||||||
@@ -526,15 +526,15 @@ func (g *BundleGenerator) addResolvedDomains() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *BundleGenerator) addNetworkMap() error {
|
func (g *BundleGenerator) addSyncResponse() error {
|
||||||
if g.networkMap == nil {
|
if g.syncResponse == nil {
|
||||||
log.Debugf("skipping empty network map in debug bundle")
|
log.Debugf("skipping empty sync response in debug bundle")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if g.anonymize {
|
if g.anonymize {
|
||||||
if err := anonymizeNetworkMap(g.networkMap, g.anonymizer); err != nil {
|
if err := anonymizeSyncResponse(g.syncResponse, g.anonymizer); err != nil {
|
||||||
return fmt.Errorf("anonymize network map: %w", err)
|
return fmt.Errorf("anonymize sync response: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -545,13 +545,13 @@ func (g *BundleGenerator) addNetworkMap() error {
|
|||||||
AllowPartial: true,
|
AllowPartial: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
jsonBytes, err := options.Marshal(g.networkMap)
|
jsonBytes, err := options.Marshal(g.syncResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("generate json: %w", err)
|
return fmt.Errorf("generate json: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := g.addFileToZip(bytes.NewReader(jsonBytes), "network_map.json"); err != nil {
|
if err := g.addFileToZip(bytes.NewReader(jsonBytes), "network_map.json"); err != nil {
|
||||||
return fmt.Errorf("add network map to zip: %w", err)
|
return fmt.Errorf("add sync response to zip: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -921,6 +921,88 @@ func anonymizeNetworkMap(networkMap *mgmProto.NetworkMap, anonymizer *anonymize.
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func anonymizeNetbirdConfig(config *mgmProto.NetbirdConfig, anonymizer *anonymize.Anonymizer) {
|
||||||
|
for _, stun := range config.Stuns {
|
||||||
|
if stun.Uri != "" {
|
||||||
|
stun.Uri = anonymizer.AnonymizeURI(stun.Uri)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, turn := range config.Turns {
|
||||||
|
if turn.HostConfig != nil && turn.HostConfig.Uri != "" {
|
||||||
|
turn.HostConfig.Uri = anonymizer.AnonymizeURI(turn.HostConfig.Uri)
|
||||||
|
}
|
||||||
|
if turn.User != "" {
|
||||||
|
turn.User = "turn-user-placeholder"
|
||||||
|
}
|
||||||
|
if turn.Password != "" {
|
||||||
|
turn.Password = "turn-password-placeholder"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.Signal != nil && config.Signal.Uri != "" {
|
||||||
|
config.Signal.Uri = anonymizer.AnonymizeURI(config.Signal.Uri)
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.Relay != nil {
|
||||||
|
for i, url := range config.Relay.Urls {
|
||||||
|
config.Relay.Urls[i] = anonymizer.AnonymizeURI(url)
|
||||||
|
}
|
||||||
|
if config.Relay.TokenPayload != "" {
|
||||||
|
config.Relay.TokenPayload = "relay-token-payload-placeholder"
|
||||||
|
}
|
||||||
|
if config.Relay.TokenSignature != "" {
|
||||||
|
config.Relay.TokenSignature = "relay-token-signature-placeholder"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if config.Flow != nil {
|
||||||
|
if config.Flow.Url != "" {
|
||||||
|
config.Flow.Url = anonymizer.AnonymizeURI(config.Flow.Url)
|
||||||
|
}
|
||||||
|
if config.Flow.TokenPayload != "" {
|
||||||
|
config.Flow.TokenPayload = "flow-token-payload-placeholder"
|
||||||
|
}
|
||||||
|
if config.Flow.TokenSignature != "" {
|
||||||
|
config.Flow.TokenSignature = "flow-token-signature-placeholder"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func anonymizeSyncResponse(syncResponse *mgmProto.SyncResponse, anonymizer *anonymize.Anonymizer) error {
|
||||||
|
if syncResponse.NetbirdConfig != nil {
|
||||||
|
anonymizeNetbirdConfig(syncResponse.NetbirdConfig, anonymizer)
|
||||||
|
}
|
||||||
|
|
||||||
|
if syncResponse.PeerConfig != nil {
|
||||||
|
anonymizePeerConfig(syncResponse.PeerConfig, anonymizer)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, p := range syncResponse.RemotePeers {
|
||||||
|
anonymizeRemotePeer(p, anonymizer)
|
||||||
|
}
|
||||||
|
|
||||||
|
if syncResponse.NetworkMap != nil {
|
||||||
|
if err := anonymizeNetworkMap(syncResponse.NetworkMap, anonymizer); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, check := range syncResponse.Checks {
|
||||||
|
for i, file := range check.Files {
|
||||||
|
check.Files[i] = anonymizer.AnonymizeString(file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func anonymizeSSHConfig(sshConfig *mgmProto.SSHConfig) {
|
||||||
|
if sshConfig != nil && len(sshConfig.SshPubKey) > 0 {
|
||||||
|
sshConfig.SshPubKey = []byte("ssh-placeholder-key")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func anonymizePeerConfig(config *mgmProto.PeerConfig, anonymizer *anonymize.Anonymizer) {
|
func anonymizePeerConfig(config *mgmProto.PeerConfig, anonymizer *anonymize.Anonymizer) {
|
||||||
if config == nil {
|
if config == nil {
|
||||||
return
|
return
|
||||||
@@ -930,9 +1012,7 @@ func anonymizePeerConfig(config *mgmProto.PeerConfig, anonymizer *anonymize.Anon
|
|||||||
config.Address = anonymizer.AnonymizeIP(addr).String()
|
config.Address = anonymizer.AnonymizeIP(addr).String()
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.SshConfig != nil && len(config.SshConfig.SshPubKey) > 0 {
|
anonymizeSSHConfig(config.SshConfig)
|
||||||
config.SshConfig.SshPubKey = []byte("ssh-placeholder-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
config.Dns = anonymizer.AnonymizeString(config.Dns)
|
config.Dns = anonymizer.AnonymizeString(config.Dns)
|
||||||
config.Fqdn = anonymizer.AnonymizeDomain(config.Fqdn)
|
config.Fqdn = anonymizer.AnonymizeDomain(config.Fqdn)
|
||||||
@@ -954,9 +1034,7 @@ func anonymizeRemotePeer(peer *mgmProto.RemotePeerConfig, anonymizer *anonymize.
|
|||||||
|
|
||||||
peer.Fqdn = anonymizer.AnonymizeDomain(peer.Fqdn)
|
peer.Fqdn = anonymizer.AnonymizeDomain(peer.Fqdn)
|
||||||
|
|
||||||
if peer.SshConfig != nil && len(peer.SshConfig.SshPubKey) > 0 {
|
anonymizeSSHConfig(peer.SshConfig)
|
||||||
peer.SshConfig.SshPubKey = []byte("ssh-placeholder-key")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func anonymizeRoute(route *mgmProto.Route, anonymizer *anonymize.Anonymizer) {
|
func anonymizeRoute(route *mgmProto.Route, anonymizer *anonymize.Anonymizer) {
|
||||||
|
@@ -189,9 +189,9 @@ type Engine struct {
|
|||||||
stateManager *statemanager.Manager
|
stateManager *statemanager.Manager
|
||||||
srWatcher *guard.SRWatcher
|
srWatcher *guard.SRWatcher
|
||||||
|
|
||||||
// Network map persistence
|
// Sync response persistence
|
||||||
persistNetworkMap bool
|
persistSyncResponse bool
|
||||||
latestNetworkMap *mgmProto.NetworkMap
|
latestSyncResponse *mgmProto.SyncResponse
|
||||||
connSemaphore *semaphoregroup.SemaphoreGroup
|
connSemaphore *semaphoregroup.SemaphoreGroup
|
||||||
flowManager nftypes.FlowManager
|
flowManager nftypes.FlowManager
|
||||||
}
|
}
|
||||||
@@ -697,10 +697,10 @@ func (e *Engine) handleSync(update *mgmProto.SyncResponse) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store network map if persistence is enabled
|
// Store sync response if persistence is enabled
|
||||||
if e.persistNetworkMap {
|
if e.persistSyncResponse {
|
||||||
e.latestNetworkMap = nm
|
e.latestSyncResponse = update
|
||||||
log.Debugf("network map persisted with serial %d", nm.GetSerial())
|
log.Debugf("sync response persisted with serial %d", nm.GetSerial())
|
||||||
}
|
}
|
||||||
|
|
||||||
// only apply new changes and ignore old ones
|
// only apply new changes and ignore old ones
|
||||||
@@ -1765,44 +1765,43 @@ func (e *Engine) stopDNSServer() {
|
|||||||
e.statusRecorder.UpdateDNSStates(nsGroupStates)
|
e.statusRecorder.UpdateDNSStates(nsGroupStates)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNetworkMapPersistence enables or disables network map persistence
|
// SetSyncResponsePersistence enables or disables sync response persistence
|
||||||
func (e *Engine) SetNetworkMapPersistence(enabled bool) {
|
func (e *Engine) SetSyncResponsePersistence(enabled bool) {
|
||||||
e.syncMsgMux.Lock()
|
e.syncMsgMux.Lock()
|
||||||
defer e.syncMsgMux.Unlock()
|
defer e.syncMsgMux.Unlock()
|
||||||
|
|
||||||
if enabled == e.persistNetworkMap {
|
if enabled == e.persistSyncResponse {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
e.persistNetworkMap = enabled
|
e.persistSyncResponse = enabled
|
||||||
log.Debugf("Network map persistence is set to %t", enabled)
|
log.Debugf("Sync response persistence is set to %t", enabled)
|
||||||
|
|
||||||
if !enabled {
|
if !enabled {
|
||||||
e.latestNetworkMap = nil
|
e.latestSyncResponse = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetLatestNetworkMap returns the stored network map if persistence is enabled
|
// GetLatestSyncResponse returns the stored sync response if persistence is enabled
|
||||||
func (e *Engine) GetLatestNetworkMap() (*mgmProto.NetworkMap, error) {
|
func (e *Engine) GetLatestSyncResponse() (*mgmProto.SyncResponse, error) {
|
||||||
e.syncMsgMux.Lock()
|
e.syncMsgMux.Lock()
|
||||||
defer e.syncMsgMux.Unlock()
|
defer e.syncMsgMux.Unlock()
|
||||||
|
|
||||||
if !e.persistNetworkMap {
|
if !e.persistSyncResponse {
|
||||||
return nil, errors.New("network map persistence is disabled")
|
return nil, errors.New("sync response persistence is disabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
if e.latestNetworkMap == nil {
|
if e.latestSyncResponse == nil {
|
||||||
//nolint:nilnil
|
//nolint:nilnil
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("Retrieving latest network map with size %d bytes", proto.Size(e.latestNetworkMap))
|
log.Debugf("Retrieving latest sync response with size %d bytes", proto.Size(e.latestSyncResponse))
|
||||||
nm, ok := proto.Clone(e.latestNetworkMap).(*mgmProto.NetworkMap)
|
sr, ok := proto.Clone(e.latestSyncResponse).(*mgmProto.SyncResponse)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("failed to clone sync response")
|
||||||
return nil, fmt.Errorf("failed to clone network map")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nm, nil
|
return sr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetWgAddr returns the wireguard address
|
// GetWgAddr returns the wireguard address
|
||||||
|
@@ -2959,27 +2959,27 @@ func (x *DeleteStateResponse) GetDeletedStates() int32 {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetNetworkMapPersistenceRequest struct {
|
type SetSyncResponsePersistenceRequest struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceRequest) Reset() {
|
func (x *SetSyncResponsePersistenceRequest) Reset() {
|
||||||
*x = SetNetworkMapPersistenceRequest{}
|
*x = SetSyncResponsePersistenceRequest{}
|
||||||
mi := &file_daemon_proto_msgTypes[42]
|
mi := &file_daemon_proto_msgTypes[42]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceRequest) String() string {
|
func (x *SetSyncResponsePersistenceRequest) String() string {
|
||||||
return protoimpl.X.MessageStringOf(x)
|
return protoimpl.X.MessageStringOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*SetNetworkMapPersistenceRequest) ProtoMessage() {}
|
func (*SetSyncResponsePersistenceRequest) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceRequest) ProtoReflect() protoreflect.Message {
|
func (x *SetSyncResponsePersistenceRequest) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_daemon_proto_msgTypes[42]
|
mi := &file_daemon_proto_msgTypes[42]
|
||||||
if x != nil {
|
if x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
@@ -2991,38 +2991,38 @@ func (x *SetNetworkMapPersistenceRequest) ProtoReflect() protoreflect.Message {
|
|||||||
return mi.MessageOf(x)
|
return mi.MessageOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Use SetNetworkMapPersistenceRequest.ProtoReflect.Descriptor instead.
|
// Deprecated: Use SetSyncResponsePersistenceRequest.ProtoReflect.Descriptor instead.
|
||||||
func (*SetNetworkMapPersistenceRequest) Descriptor() ([]byte, []int) {
|
func (*SetSyncResponsePersistenceRequest) Descriptor() ([]byte, []int) {
|
||||||
return file_daemon_proto_rawDescGZIP(), []int{42}
|
return file_daemon_proto_rawDescGZIP(), []int{42}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceRequest) GetEnabled() bool {
|
func (x *SetSyncResponsePersistenceRequest) GetEnabled() bool {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.Enabled
|
return x.Enabled
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetNetworkMapPersistenceResponse struct {
|
type SetSyncResponsePersistenceResponse struct {
|
||||||
state protoimpl.MessageState `protogen:"open.v1"`
|
state protoimpl.MessageState `protogen:"open.v1"`
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceResponse) Reset() {
|
func (x *SetSyncResponsePersistenceResponse) Reset() {
|
||||||
*x = SetNetworkMapPersistenceResponse{}
|
*x = SetSyncResponsePersistenceResponse{}
|
||||||
mi := &file_daemon_proto_msgTypes[43]
|
mi := &file_daemon_proto_msgTypes[43]
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
ms.StoreMessageInfo(mi)
|
ms.StoreMessageInfo(mi)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceResponse) String() string {
|
func (x *SetSyncResponsePersistenceResponse) String() string {
|
||||||
return protoimpl.X.MessageStringOf(x)
|
return protoimpl.X.MessageStringOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*SetNetworkMapPersistenceResponse) ProtoMessage() {}
|
func (*SetSyncResponsePersistenceResponse) ProtoMessage() {}
|
||||||
|
|
||||||
func (x *SetNetworkMapPersistenceResponse) ProtoReflect() protoreflect.Message {
|
func (x *SetSyncResponsePersistenceResponse) ProtoReflect() protoreflect.Message {
|
||||||
mi := &file_daemon_proto_msgTypes[43]
|
mi := &file_daemon_proto_msgTypes[43]
|
||||||
if x != nil {
|
if x != nil {
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
@@ -3034,8 +3034,8 @@ func (x *SetNetworkMapPersistenceResponse) ProtoReflect() protoreflect.Message {
|
|||||||
return mi.MessageOf(x)
|
return mi.MessageOf(x)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: Use SetNetworkMapPersistenceResponse.ProtoReflect.Descriptor instead.
|
// Deprecated: Use SetSyncResponsePersistenceResponse.ProtoReflect.Descriptor instead.
|
||||||
func (*SetNetworkMapPersistenceResponse) Descriptor() ([]byte, []int) {
|
func (*SetSyncResponsePersistenceResponse) Descriptor() ([]byte, []int) {
|
||||||
return file_daemon_proto_rawDescGZIP(), []int{43}
|
return file_daemon_proto_rawDescGZIP(), []int{43}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4727,10 +4727,10 @@ const file_daemon_proto_rawDesc = "" +
|
|||||||
"state_name\x18\x01 \x01(\tR\tstateName\x12\x10\n" +
|
"state_name\x18\x01 \x01(\tR\tstateName\x12\x10\n" +
|
||||||
"\x03all\x18\x02 \x01(\bR\x03all\"<\n" +
|
"\x03all\x18\x02 \x01(\bR\x03all\"<\n" +
|
||||||
"\x13DeleteStateResponse\x12%\n" +
|
"\x13DeleteStateResponse\x12%\n" +
|
||||||
"\x0edeleted_states\x18\x01 \x01(\x05R\rdeletedStates\";\n" +
|
"\x0edeleted_states\x18\x01 \x01(\x05R\rdeletedStates\"=\n" +
|
||||||
"\x1fSetNetworkMapPersistenceRequest\x12\x18\n" +
|
"!SetSyncResponsePersistenceRequest\x12\x18\n" +
|
||||||
"\aenabled\x18\x01 \x01(\bR\aenabled\"\"\n" +
|
"\aenabled\x18\x01 \x01(\bR\aenabled\"$\n" +
|
||||||
" SetNetworkMapPersistenceResponse\"v\n" +
|
"\"SetSyncResponsePersistenceResponse\"v\n" +
|
||||||
"\bTCPFlags\x12\x10\n" +
|
"\bTCPFlags\x12\x10\n" +
|
||||||
"\x03syn\x18\x01 \x01(\bR\x03syn\x12\x10\n" +
|
"\x03syn\x18\x01 \x01(\bR\x03syn\x12\x10\n" +
|
||||||
"\x03ack\x18\x02 \x01(\bR\x03ack\x12\x10\n" +
|
"\x03ack\x18\x02 \x01(\bR\x03ack\x12\x10\n" +
|
||||||
@@ -4881,7 +4881,7 @@ const file_daemon_proto_rawDesc = "" +
|
|||||||
"\x04WARN\x10\x04\x12\b\n" +
|
"\x04WARN\x10\x04\x12\b\n" +
|
||||||
"\x04INFO\x10\x05\x12\t\n" +
|
"\x04INFO\x10\x05\x12\t\n" +
|
||||||
"\x05DEBUG\x10\x06\x12\t\n" +
|
"\x05DEBUG\x10\x06\x12\t\n" +
|
||||||
"\x05TRACE\x10\a2\xbf\x0f\n" +
|
"\x05TRACE\x10\a2\xc5\x0f\n" +
|
||||||
"\rDaemonService\x126\n" +
|
"\rDaemonService\x126\n" +
|
||||||
"\x05Login\x12\x14.daemon.LoginRequest\x1a\x15.daemon.LoginResponse\"\x00\x12K\n" +
|
"\x05Login\x12\x14.daemon.LoginRequest\x1a\x15.daemon.LoginResponse\"\x00\x12K\n" +
|
||||||
"\fWaitSSOLogin\x12\x1b.daemon.WaitSSOLoginRequest\x1a\x1c.daemon.WaitSSOLoginResponse\"\x00\x12-\n" +
|
"\fWaitSSOLogin\x12\x1b.daemon.WaitSSOLoginRequest\x1a\x1c.daemon.WaitSSOLoginResponse\"\x00\x12-\n" +
|
||||||
@@ -4900,8 +4900,8 @@ const file_daemon_proto_rawDesc = "" +
|
|||||||
"ListStates\x12\x19.daemon.ListStatesRequest\x1a\x1a.daemon.ListStatesResponse\"\x00\x12E\n" +
|
"ListStates\x12\x19.daemon.ListStatesRequest\x1a\x1a.daemon.ListStatesResponse\"\x00\x12E\n" +
|
||||||
"\n" +
|
"\n" +
|
||||||
"CleanState\x12\x19.daemon.CleanStateRequest\x1a\x1a.daemon.CleanStateResponse\"\x00\x12H\n" +
|
"CleanState\x12\x19.daemon.CleanStateRequest\x1a\x1a.daemon.CleanStateResponse\"\x00\x12H\n" +
|
||||||
"\vDeleteState\x12\x1a.daemon.DeleteStateRequest\x1a\x1b.daemon.DeleteStateResponse\"\x00\x12o\n" +
|
"\vDeleteState\x12\x1a.daemon.DeleteStateRequest\x1a\x1b.daemon.DeleteStateResponse\"\x00\x12u\n" +
|
||||||
"\x18SetNetworkMapPersistence\x12'.daemon.SetNetworkMapPersistenceRequest\x1a(.daemon.SetNetworkMapPersistenceResponse\"\x00\x12H\n" +
|
"\x1aSetSyncResponsePersistence\x12).daemon.SetSyncResponsePersistenceRequest\x1a*.daemon.SetSyncResponsePersistenceResponse\"\x00\x12H\n" +
|
||||||
"\vTracePacket\x12\x1a.daemon.TracePacketRequest\x1a\x1b.daemon.TracePacketResponse\"\x00\x12D\n" +
|
"\vTracePacket\x12\x1a.daemon.TracePacketRequest\x1a\x1b.daemon.TracePacketResponse\"\x00\x12D\n" +
|
||||||
"\x0fSubscribeEvents\x12\x18.daemon.SubscribeRequest\x1a\x13.daemon.SystemEvent\"\x000\x01\x12B\n" +
|
"\x0fSubscribeEvents\x12\x18.daemon.SubscribeRequest\x1a\x13.daemon.SystemEvent\"\x000\x01\x12B\n" +
|
||||||
"\tGetEvents\x12\x18.daemon.GetEventsRequest\x1a\x19.daemon.GetEventsResponse\"\x00\x12N\n" +
|
"\tGetEvents\x12\x18.daemon.GetEventsRequest\x1a\x19.daemon.GetEventsResponse\"\x00\x12N\n" +
|
||||||
@@ -4974,8 +4974,8 @@ var file_daemon_proto_goTypes = []any{
|
|||||||
(*CleanStateResponse)(nil), // 42: daemon.CleanStateResponse
|
(*CleanStateResponse)(nil), // 42: daemon.CleanStateResponse
|
||||||
(*DeleteStateRequest)(nil), // 43: daemon.DeleteStateRequest
|
(*DeleteStateRequest)(nil), // 43: daemon.DeleteStateRequest
|
||||||
(*DeleteStateResponse)(nil), // 44: daemon.DeleteStateResponse
|
(*DeleteStateResponse)(nil), // 44: daemon.DeleteStateResponse
|
||||||
(*SetNetworkMapPersistenceRequest)(nil), // 45: daemon.SetNetworkMapPersistenceRequest
|
(*SetSyncResponsePersistenceRequest)(nil), // 45: daemon.SetSyncResponsePersistenceRequest
|
||||||
(*SetNetworkMapPersistenceResponse)(nil), // 46: daemon.SetNetworkMapPersistenceResponse
|
(*SetSyncResponsePersistenceResponse)(nil), // 46: daemon.SetSyncResponsePersistenceResponse
|
||||||
(*TCPFlags)(nil), // 47: daemon.TCPFlags
|
(*TCPFlags)(nil), // 47: daemon.TCPFlags
|
||||||
(*TracePacketRequest)(nil), // 48: daemon.TracePacketRequest
|
(*TracePacketRequest)(nil), // 48: daemon.TracePacketRequest
|
||||||
(*TraceStage)(nil), // 49: daemon.TraceStage
|
(*TraceStage)(nil), // 49: daemon.TraceStage
|
||||||
@@ -5053,7 +5053,7 @@ var file_daemon_proto_depIdxs = []int32{
|
|||||||
39, // 44: daemon.DaemonService.ListStates:input_type -> daemon.ListStatesRequest
|
39, // 44: daemon.DaemonService.ListStates:input_type -> daemon.ListStatesRequest
|
||||||
41, // 45: daemon.DaemonService.CleanState:input_type -> daemon.CleanStateRequest
|
41, // 45: daemon.DaemonService.CleanState:input_type -> daemon.CleanStateRequest
|
||||||
43, // 46: daemon.DaemonService.DeleteState:input_type -> daemon.DeleteStateRequest
|
43, // 46: daemon.DaemonService.DeleteState:input_type -> daemon.DeleteStateRequest
|
||||||
45, // 47: daemon.DaemonService.SetNetworkMapPersistence:input_type -> daemon.SetNetworkMapPersistenceRequest
|
45, // 47: daemon.DaemonService.SetSyncResponsePersistence:input_type -> daemon.SetSyncResponsePersistenceRequest
|
||||||
48, // 48: daemon.DaemonService.TracePacket:input_type -> daemon.TracePacketRequest
|
48, // 48: daemon.DaemonService.TracePacket:input_type -> daemon.TracePacketRequest
|
||||||
51, // 49: daemon.DaemonService.SubscribeEvents:input_type -> daemon.SubscribeRequest
|
51, // 49: daemon.DaemonService.SubscribeEvents:input_type -> daemon.SubscribeRequest
|
||||||
53, // 50: daemon.DaemonService.GetEvents:input_type -> daemon.GetEventsRequest
|
53, // 50: daemon.DaemonService.GetEvents:input_type -> daemon.GetEventsRequest
|
||||||
@@ -5080,7 +5080,7 @@ var file_daemon_proto_depIdxs = []int32{
|
|||||||
40, // 71: daemon.DaemonService.ListStates:output_type -> daemon.ListStatesResponse
|
40, // 71: daemon.DaemonService.ListStates:output_type -> daemon.ListStatesResponse
|
||||||
42, // 72: daemon.DaemonService.CleanState:output_type -> daemon.CleanStateResponse
|
42, // 72: daemon.DaemonService.CleanState:output_type -> daemon.CleanStateResponse
|
||||||
44, // 73: daemon.DaemonService.DeleteState:output_type -> daemon.DeleteStateResponse
|
44, // 73: daemon.DaemonService.DeleteState:output_type -> daemon.DeleteStateResponse
|
||||||
46, // 74: daemon.DaemonService.SetNetworkMapPersistence:output_type -> daemon.SetNetworkMapPersistenceResponse
|
46, // 74: daemon.DaemonService.SetSyncResponsePersistence:output_type -> daemon.SetSyncResponsePersistenceResponse
|
||||||
50, // 75: daemon.DaemonService.TracePacket:output_type -> daemon.TracePacketResponse
|
50, // 75: daemon.DaemonService.TracePacket:output_type -> daemon.TracePacketResponse
|
||||||
52, // 76: daemon.DaemonService.SubscribeEvents:output_type -> daemon.SystemEvent
|
52, // 76: daemon.DaemonService.SubscribeEvents:output_type -> daemon.SystemEvent
|
||||||
54, // 77: daemon.DaemonService.GetEvents:output_type -> daemon.GetEventsResponse
|
54, // 77: daemon.DaemonService.GetEvents:output_type -> daemon.GetEventsResponse
|
||||||
|
@@ -59,8 +59,8 @@ service DaemonService {
|
|||||||
// Delete specific state or all states
|
// Delete specific state or all states
|
||||||
rpc DeleteState(DeleteStateRequest) returns (DeleteStateResponse) {}
|
rpc DeleteState(DeleteStateRequest) returns (DeleteStateResponse) {}
|
||||||
|
|
||||||
// SetNetworkMapPersistence enables or disables network map persistence
|
// SetSyncResponsePersistence enables or disables sync response persistence
|
||||||
rpc SetNetworkMapPersistence(SetNetworkMapPersistenceRequest) returns (SetNetworkMapPersistenceResponse) {}
|
rpc SetSyncResponsePersistence(SetSyncResponsePersistenceRequest) returns (SetSyncResponsePersistenceResponse) {}
|
||||||
|
|
||||||
rpc TracePacket(TracePacketRequest) returns (TracePacketResponse) {}
|
rpc TracePacket(TracePacketRequest) returns (TracePacketResponse) {}
|
||||||
|
|
||||||
@@ -452,11 +452,11 @@ message DeleteStateResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
message SetNetworkMapPersistenceRequest {
|
message SetSyncResponsePersistenceRequest {
|
||||||
bool enabled = 1;
|
bool enabled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SetNetworkMapPersistenceResponse {}
|
message SetSyncResponsePersistenceResponse {}
|
||||||
|
|
||||||
message TCPFlags {
|
message TCPFlags {
|
||||||
bool syn = 1;
|
bool syn = 1;
|
||||||
|
@@ -50,8 +50,8 @@ type DaemonServiceClient interface {
|
|||||||
CleanState(ctx context.Context, in *CleanStateRequest, opts ...grpc.CallOption) (*CleanStateResponse, error)
|
CleanState(ctx context.Context, in *CleanStateRequest, opts ...grpc.CallOption) (*CleanStateResponse, error)
|
||||||
// Delete specific state or all states
|
// Delete specific state or all states
|
||||||
DeleteState(ctx context.Context, in *DeleteStateRequest, opts ...grpc.CallOption) (*DeleteStateResponse, error)
|
DeleteState(ctx context.Context, in *DeleteStateRequest, opts ...grpc.CallOption) (*DeleteStateResponse, error)
|
||||||
// SetNetworkMapPersistence enables or disables network map persistence
|
// SetSyncResponsePersistence enables or disables sync response persistence
|
||||||
SetNetworkMapPersistence(ctx context.Context, in *SetNetworkMapPersistenceRequest, opts ...grpc.CallOption) (*SetNetworkMapPersistenceResponse, error)
|
SetSyncResponsePersistence(ctx context.Context, in *SetSyncResponsePersistenceRequest, opts ...grpc.CallOption) (*SetSyncResponsePersistenceResponse, error)
|
||||||
TracePacket(ctx context.Context, in *TracePacketRequest, opts ...grpc.CallOption) (*TracePacketResponse, error)
|
TracePacket(ctx context.Context, in *TracePacketRequest, opts ...grpc.CallOption) (*TracePacketResponse, error)
|
||||||
SubscribeEvents(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (DaemonService_SubscribeEventsClient, error)
|
SubscribeEvents(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (DaemonService_SubscribeEventsClient, error)
|
||||||
GetEvents(ctx context.Context, in *GetEventsRequest, opts ...grpc.CallOption) (*GetEventsResponse, error)
|
GetEvents(ctx context.Context, in *GetEventsRequest, opts ...grpc.CallOption) (*GetEventsResponse, error)
|
||||||
@@ -217,9 +217,9 @@ func (c *daemonServiceClient) DeleteState(ctx context.Context, in *DeleteStateRe
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *daemonServiceClient) SetNetworkMapPersistence(ctx context.Context, in *SetNetworkMapPersistenceRequest, opts ...grpc.CallOption) (*SetNetworkMapPersistenceResponse, error) {
|
func (c *daemonServiceClient) SetSyncResponsePersistence(ctx context.Context, in *SetSyncResponsePersistenceRequest, opts ...grpc.CallOption) (*SetSyncResponsePersistenceResponse, error) {
|
||||||
out := new(SetNetworkMapPersistenceResponse)
|
out := new(SetSyncResponsePersistenceResponse)
|
||||||
err := c.cc.Invoke(ctx, "/daemon.DaemonService/SetNetworkMapPersistence", in, out, opts...)
|
err := c.cc.Invoke(ctx, "/daemon.DaemonService/SetSyncResponsePersistence", in, out, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -375,8 +375,8 @@ type DaemonServiceServer interface {
|
|||||||
CleanState(context.Context, *CleanStateRequest) (*CleanStateResponse, error)
|
CleanState(context.Context, *CleanStateRequest) (*CleanStateResponse, error)
|
||||||
// Delete specific state or all states
|
// Delete specific state or all states
|
||||||
DeleteState(context.Context, *DeleteStateRequest) (*DeleteStateResponse, error)
|
DeleteState(context.Context, *DeleteStateRequest) (*DeleteStateResponse, error)
|
||||||
// SetNetworkMapPersistence enables or disables network map persistence
|
// SetSyncResponsePersistence enables or disables sync response persistence
|
||||||
SetNetworkMapPersistence(context.Context, *SetNetworkMapPersistenceRequest) (*SetNetworkMapPersistenceResponse, error)
|
SetSyncResponsePersistence(context.Context, *SetSyncResponsePersistenceRequest) (*SetSyncResponsePersistenceResponse, error)
|
||||||
TracePacket(context.Context, *TracePacketRequest) (*TracePacketResponse, error)
|
TracePacket(context.Context, *TracePacketRequest) (*TracePacketResponse, error)
|
||||||
SubscribeEvents(*SubscribeRequest, DaemonService_SubscribeEventsServer) error
|
SubscribeEvents(*SubscribeRequest, DaemonService_SubscribeEventsServer) error
|
||||||
GetEvents(context.Context, *GetEventsRequest) (*GetEventsResponse, error)
|
GetEvents(context.Context, *GetEventsRequest) (*GetEventsResponse, error)
|
||||||
@@ -443,8 +443,8 @@ func (UnimplementedDaemonServiceServer) CleanState(context.Context, *CleanStateR
|
|||||||
func (UnimplementedDaemonServiceServer) DeleteState(context.Context, *DeleteStateRequest) (*DeleteStateResponse, error) {
|
func (UnimplementedDaemonServiceServer) DeleteState(context.Context, *DeleteStateRequest) (*DeleteStateResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method DeleteState not implemented")
|
return nil, status.Errorf(codes.Unimplemented, "method DeleteState not implemented")
|
||||||
}
|
}
|
||||||
func (UnimplementedDaemonServiceServer) SetNetworkMapPersistence(context.Context, *SetNetworkMapPersistenceRequest) (*SetNetworkMapPersistenceResponse, error) {
|
func (UnimplementedDaemonServiceServer) SetSyncResponsePersistence(context.Context, *SetSyncResponsePersistenceRequest) (*SetSyncResponsePersistenceResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method SetNetworkMapPersistence not implemented")
|
return nil, status.Errorf(codes.Unimplemented, "method SetSyncResponsePersistence not implemented")
|
||||||
}
|
}
|
||||||
func (UnimplementedDaemonServiceServer) TracePacket(context.Context, *TracePacketRequest) (*TracePacketResponse, error) {
|
func (UnimplementedDaemonServiceServer) TracePacket(context.Context, *TracePacketRequest) (*TracePacketResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unimplemented, "method TracePacket not implemented")
|
return nil, status.Errorf(codes.Unimplemented, "method TracePacket not implemented")
|
||||||
@@ -777,20 +777,20 @@ func _DaemonService_DeleteState_Handler(srv interface{}, ctx context.Context, de
|
|||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func _DaemonService_SetNetworkMapPersistence_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
func _DaemonService_SetSyncResponsePersistence_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
in := new(SetNetworkMapPersistenceRequest)
|
in := new(SetSyncResponsePersistenceRequest)
|
||||||
if err := dec(in); err != nil {
|
if err := dec(in); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if interceptor == nil {
|
if interceptor == nil {
|
||||||
return srv.(DaemonServiceServer).SetNetworkMapPersistence(ctx, in)
|
return srv.(DaemonServiceServer).SetSyncResponsePersistence(ctx, in)
|
||||||
}
|
}
|
||||||
info := &grpc.UnaryServerInfo{
|
info := &grpc.UnaryServerInfo{
|
||||||
Server: srv,
|
Server: srv,
|
||||||
FullMethod: "/daemon.DaemonService/SetNetworkMapPersistence",
|
FullMethod: "/daemon.DaemonService/SetSyncResponsePersistence",
|
||||||
}
|
}
|
||||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
return srv.(DaemonServiceServer).SetNetworkMapPersistence(ctx, req.(*SetNetworkMapPersistenceRequest))
|
return srv.(DaemonServiceServer).SetSyncResponsePersistence(ctx, req.(*SetSyncResponsePersistenceRequest))
|
||||||
}
|
}
|
||||||
return interceptor(ctx, in, info, handler)
|
return interceptor(ctx, in, info, handler)
|
||||||
}
|
}
|
||||||
@@ -1050,8 +1050,8 @@ var DaemonService_ServiceDesc = grpc.ServiceDesc{
|
|||||||
Handler: _DaemonService_DeleteState_Handler,
|
Handler: _DaemonService_DeleteState_Handler,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
MethodName: "SetNetworkMapPersistence",
|
MethodName: "SetSyncResponsePersistence",
|
||||||
Handler: _DaemonService_SetNetworkMapPersistence_Handler,
|
Handler: _DaemonService_SetSyncResponsePersistence_Handler,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
MethodName: "TracePacket",
|
MethodName: "TracePacket",
|
||||||
|
@@ -27,15 +27,16 @@ func (s *Server) DebugBundle(_ context.Context, req *proto.DebugBundleRequest) (
|
|||||||
s.mutex.Lock()
|
s.mutex.Lock()
|
||||||
defer s.mutex.Unlock()
|
defer s.mutex.Unlock()
|
||||||
|
|
||||||
networkMap, err := s.getLatestNetworkMap()
|
syncResponse, err := s.getLatestSyncResponse()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("failed to get latest network map: %v", err)
|
log.Warnf("failed to get latest sync response: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
bundleGenerator := debug.NewBundleGenerator(
|
bundleGenerator := debug.NewBundleGenerator(
|
||||||
debug.GeneratorDependencies{
|
debug.GeneratorDependencies{
|
||||||
InternalConfig: s.config,
|
InternalConfig: s.config,
|
||||||
StatusRecorder: s.statusRecorder,
|
StatusRecorder: s.statusRecorder,
|
||||||
NetworkMap: networkMap,
|
SyncResponse: syncResponse,
|
||||||
LogFile: s.logFile,
|
LogFile: s.logFile,
|
||||||
},
|
},
|
||||||
debug.BundleConfig{
|
debug.BundleConfig{
|
||||||
@@ -192,26 +193,25 @@ func (s *Server) SetLogLevel(_ context.Context, req *proto.SetLogLevelRequest) (
|
|||||||
return &proto.SetLogLevelResponse{}, nil
|
return &proto.SetLogLevelResponse{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNetworkMapPersistence sets the network map persistence for the server.
|
// SetSyncResponsePersistence sets the sync response persistence for the server.
|
||||||
func (s *Server) SetNetworkMapPersistence(_ context.Context, req *proto.SetNetworkMapPersistenceRequest) (*proto.SetNetworkMapPersistenceResponse, error) {
|
func (s *Server) SetSyncResponsePersistence(_ context.Context, req *proto.SetSyncResponsePersistenceRequest) (*proto.SetSyncResponsePersistenceResponse, error) {
|
||||||
s.mutex.Lock()
|
s.mutex.Lock()
|
||||||
defer s.mutex.Unlock()
|
defer s.mutex.Unlock()
|
||||||
|
|
||||||
enabled := req.GetEnabled()
|
enabled := req.GetEnabled()
|
||||||
s.persistNetworkMap = enabled
|
s.persistSyncResponse = enabled
|
||||||
if s.connectClient != nil {
|
if s.connectClient != nil {
|
||||||
s.connectClient.SetNetworkMapPersistence(enabled)
|
s.connectClient.SetSyncResponsePersistence(enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &proto.SetNetworkMapPersistenceResponse{}, nil
|
return &proto.SetSyncResponsePersistenceResponse{}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getLatestNetworkMap returns the latest network map from the engine if network map persistence is enabled
|
func (s *Server) getLatestSyncResponse() (*mgmProto.SyncResponse, error) {
|
||||||
func (s *Server) getLatestNetworkMap() (*mgmProto.NetworkMap, error) {
|
|
||||||
cClient := s.connectClient
|
cClient := s.connectClient
|
||||||
if cClient == nil {
|
if cClient == nil {
|
||||||
return nil, errors.New("connect client is not initialized")
|
return nil, errors.New("connect client is not initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
return cClient.GetLatestNetworkMap()
|
return cClient.GetLatestSyncResponse()
|
||||||
}
|
}
|
||||||
|
@@ -71,7 +71,7 @@ type Server struct {
|
|||||||
sessionWatcher *internal.SessionWatcher
|
sessionWatcher *internal.SessionWatcher
|
||||||
|
|
||||||
lastProbe time.Time
|
lastProbe time.Time
|
||||||
persistNetworkMap bool
|
persistSyncResponse bool
|
||||||
isSessionActive atomic.Bool
|
isSessionActive atomic.Bool
|
||||||
|
|
||||||
profileManager *profilemanager.ServiceManager
|
profileManager *profilemanager.ServiceManager
|
||||||
@@ -90,7 +90,7 @@ func New(ctx context.Context, logFile string, configFile string, profilesDisable
|
|||||||
return &Server{
|
return &Server{
|
||||||
rootCtx: ctx,
|
rootCtx: ctx,
|
||||||
logFile: logFile,
|
logFile: logFile,
|
||||||
persistNetworkMap: true,
|
persistSyncResponse: true,
|
||||||
statusRecorder: peer.NewRecorder(""),
|
statusRecorder: peer.NewRecorder(""),
|
||||||
profileManager: profilemanager.NewServiceManager(configFile),
|
profileManager: profilemanager.NewServiceManager(configFile),
|
||||||
profilesDisabled: profilesDisabled,
|
profilesDisabled: profilesDisabled,
|
||||||
@@ -233,7 +233,7 @@ func (s *Server) connectWithRetryRuns(ctx context.Context, config *profilemanage
|
|||||||
runOperation := func() error {
|
runOperation := func() error {
|
||||||
log.Tracef("running client connection")
|
log.Tracef("running client connection")
|
||||||
s.connectClient = internal.NewConnectClient(ctx, config, statusRecorder)
|
s.connectClient = internal.NewConnectClient(ctx, config, statusRecorder)
|
||||||
s.connectClient.SetNetworkMapPersistence(s.persistNetworkMap)
|
s.connectClient.SetSyncResponsePersistence(s.persistSyncResponse)
|
||||||
|
|
||||||
err := s.connectClient.Run(runningChan)
|
err := s.connectClient.Run(runningChan)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -395,12 +395,12 @@ func (s *serviceClient) configureServiceForDebug(
|
|||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
|
|
||||||
if enablePersistence {
|
if enablePersistence {
|
||||||
if _, err := conn.SetNetworkMapPersistence(s.ctx, &proto.SetNetworkMapPersistenceRequest{
|
if _, err := conn.SetSyncResponsePersistence(s.ctx, &proto.SetSyncResponsePersistenceRequest{
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return fmt.Errorf("enable network map persistence: %v", err)
|
return fmt.Errorf("enable sync response persistence: %v", err)
|
||||||
}
|
}
|
||||||
log.Info("Network map persistence enabled for debug")
|
log.Info("Sync response persistence enabled for debug")
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := conn.Up(s.ctx, &proto.UpRequest{}); err != nil {
|
if _, err := conn.Up(s.ctx, &proto.UpRequest{}); err != nil {
|
||||||
|
Reference in New Issue
Block a user