fix duplicate controllers due to cloud gateways site being default

This commit is contained in:
brngates98
2026-01-24 17:42:54 -05:00
parent 28eae6ab22
commit 5f76c59fa2
3 changed files with 80 additions and 39 deletions

View File

@@ -193,7 +193,8 @@ func (u *InputUnifi) checkSites(c *Controller) error {
FIRST:
for _, s := range c.Sites {
for _, site := range sites {
if s == site.Name {
// Case-insensitive comparison for site names
if strings.EqualFold(s, site.Name) {
keep = append(keep, s)
continue FIRST

View File

@@ -30,16 +30,7 @@ func (u *InputUnifi) Initialize(l poller.Logger) error {
return nil
}
if u.setDefaults(&u.Default); len(u.Controllers) == 0 && !u.Dynamic {
// If remote mode is enabled at config level, set it on default controller
if u.Remote && u.RemoteAPIKey != "" {
u.Default.Remote = true
u.Default.APIKey = u.RemoteAPIKey
}
u.Controllers = []*Controller{&u.Default}
}
// Discover remote controllers if remote mode is enabled
// Discover remote controllers if remote mode is enabled at config level
if u.Remote && u.RemoteAPIKey != "" {
u.Logf("Remote API mode enabled, discovering controllers...")
@@ -47,32 +38,37 @@ func (u *InputUnifi) Initialize(l poller.Logger) error {
if err != nil {
u.LogErrorf("Failed to discover remote controllers: %v", err)
} else if len(discovered) > 0 {
// Merge discovered controllers with configured ones
u.Controllers = append(u.Controllers, discovered...)
// Replace controllers with discovered ones when using config-level remote mode
u.Controllers = discovered
u.Logf("Discovered %d remote controller(s)", len(discovered))
}
}
} else {
// Only set default controller if not using config-level remote mode
if u.setDefaults(&u.Default); len(u.Controllers) == 0 && !u.Dynamic {
u.Controllers = []*Controller{&u.Default}
}
// Also check individual controllers for remote flag
for _, c := range u.Controllers {
if c.Remote && c.APIKey != "" && c.ConsoleID == "" {
// This controller has remote flag but no console ID, try to discover
discovered, err := u.discoverRemoteControllers(c.APIKey)
if err != nil {
u.LogErrorf("Failed to discover remote controllers for controller: %v", err)
continue
}
if len(discovered) > 0 {
// Replace this controller with discovered ones
// Remove the current one and add discovered
newControllers := []*Controller{}
for _, existing := range u.Controllers {
if existing != c {
newControllers = append(newControllers, existing)
}
// Check individual controllers for remote flag (per-controller remote mode)
for _, c := range u.Controllers {
if c.Remote && c.APIKey != "" && c.ConsoleID == "" {
// This controller has remote flag but no console ID, try to discover
discovered, err := u.discoverRemoteControllers(c.APIKey)
if err != nil {
u.LogErrorf("Failed to discover remote controllers for controller: %v", err)
continue
}
if len(discovered) > 0 {
// Replace this controller with discovered ones
// Remove the current one and add discovered
newControllers := []*Controller{}
for _, existing := range u.Controllers {
if existing != c {
newControllers = append(newControllers, existing)
}
}
newControllers = append(newControllers, discovered...)
u.Controllers = newControllers
}
newControllers = append(newControllers, discovered...)
u.Controllers = newControllers
}
}
}

View File

@@ -271,14 +271,58 @@ func (u *InputUnifi) discoverRemoteControllers(apiKey string) ([]*Controller, er
URL: fmt.Sprintf("%s/v1/connector/consoles/%s", remoteAPIBaseURL, console.ID),
}
// Ensure defaults are set before calling setControllerDefaults
u.setDefaults(&u.Default)
// Copy defaults
controller = u.setControllerDefaults(controller)
// Set remote-specific defaults
// Set remote-specific defaults and ensure all boolean pointers are initialized
t := true
f := false
if controller.VerifySSL == nil {
controller.VerifySSL = &t // Remote API should verify SSL
}
// Ensure all boolean pointers are set (safety check)
if controller.HashPII == nil {
controller.HashPII = &f
}
if controller.DropPII == nil {
controller.DropPII = &f
}
if controller.SaveSites == nil {
controller.SaveSites = &t
}
if controller.SaveDPI == nil {
controller.SaveDPI = &f
}
if controller.SaveEvents == nil {
controller.SaveEvents = &f
}
if controller.SaveAlarms == nil {
controller.SaveAlarms = &f
}
if controller.SaveAnomal == nil {
controller.SaveAnomal = &f
}
if controller.SaveIDs == nil {
controller.SaveIDs = &f
}
if controller.SaveTraffic == nil {
controller.SaveTraffic = &f
}
if controller.SaveRogue == nil {
controller.SaveRogue = &f
}
if controller.SaveSyslog == nil {
controller.SaveSyslog = &f
}
if controller.SaveProtectLogs == nil {
controller.SaveProtectLogs = &f
}
if controller.ProtectThumbnails == nil {
controller.ProtectThumbnails = &f
}
// Extract site names
siteNames := make([]string, 0, len(sites))
@@ -292,13 +336,13 @@ func (u *InputUnifi) discoverRemoteControllers(apiKey string) ([]*Controller, er
// as the default site name override. The console name is in reportedState.name
// (consoleName was already set above in the loop)
// If we only have one site and it's "default", use the console name as override
if len(siteNames) == 1 && (siteNames[0] == "default" || siteNames[0] == "") && consoleName != "" {
// If we only have one site and it's "default" (case-insensitive), use the console name as override
if len(siteNames) == 1 && strings.EqualFold(siteNames[0], "default") && consoleName != "" {
controller.DefaultSiteNameOverride = consoleName
// Set sites to "all" since we're overriding the default site name
controller.Sites = []string{"all"}
u.LogDebugf("Using console name '%s' as default site name override for Cloud Gateway", consoleName)
}
if len(siteNames) > 0 {
} else if len(siteNames) > 0 {
controller.Sites = siteNames
} else {
controller.Sites = []string{"all"}