diff --git a/pkg/poller/influx.go b/pkg/poller/influx.go index 3660cf38..ff2384e8 100644 --- a/pkg/poller/influx.go +++ b/pkg/poller/influx.go @@ -12,6 +12,7 @@ func (u *UnifiPoller) GetInfluxDB() (err error) { if u.Influx != nil { return nil } + u.Influx, err = influxunifi.New(&influxunifi.Config{ Database: u.Config.InfluxDB, User: u.Config.InfluxUser, @@ -22,7 +23,9 @@ func (u *UnifiPoller) GetInfluxDB() (err error) { if err != nil { return fmt.Errorf("influxdb: %v", err) } + u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) + return nil } @@ -40,6 +43,7 @@ func (u *UnifiPoller) CollectAndProcess() error { if err != nil { return err } + u.AugmentMetrics(metrics) report, err := u.Influx.ReportMetrics(metrics) @@ -54,9 +58,11 @@ func (u *UnifiPoller) CollectAndProcess() error { // LogInfluxReport writes a log message after exporting to influxdb. func (u *UnifiPoller) LogInfluxReport(r *influxunifi.Report) { idsMsg := "" + if u.Config.SaveIDS { idsMsg = fmt.Sprintf("IDS Events: %d, ", len(r.Metrics.IDSList)) } + u.Logf("UniFi Metrics Recorded. Sites: %d, Clients: %d, "+ "UAP: %d, USG/UDM: %d, USW: %d, %sPoints: %d, Fields: %d, Errs: %d, Elapsed: %v", len(r.Metrics.Sites), len(r.Metrics.Clients), len(r.Metrics.UAPs), diff --git a/pkg/poller/prometheus.go b/pkg/poller/prometheus.go index 28371c9a..59aba109 100644 --- a/pkg/poller/prometheus.go +++ b/pkg/poller/prometheus.go @@ -23,6 +23,7 @@ func (u *UnifiPoller) RunPrometheus() error { LoggingFn: u.LogExportReport, ReportErrors: true, // XXX: Does this need to be configurable? })) + return http.ListenAndServe(u.Config.HTTPListen, nil) } diff --git a/pkg/poller/start.go b/pkg/poller/start.go index 3ea0ad28..3f1a4d74 100644 --- a/pkg/poller/start.go +++ b/pkg/poller/start.go @@ -124,14 +124,16 @@ func (u *UnifiPoller) Run() error { func (u *UnifiPoller) PollController() { interval := u.Config.Interval.Round(time.Second) log.Printf("[INFO] Everything checks out! Poller started, InfluxDB interval: %v", interval) + ticker := time.NewTicker(interval) for u.LastCheck = range ticker.C { if err := u.CollectAndProcess(); err != nil { u.LogErrorf("%v", err) + if u.Unifi != nil { u.Unifi.CloseIdleConnections() + u.Unifi = nil // trigger re-auth in unifi.go. } - u.Unifi = nil // trigger re-auth in unifi.go. } } } diff --git a/pkg/poller/unifi.go b/pkg/poller/unifi.go index dcbd5c12..beeacec5 100644 --- a/pkg/poller/unifi.go +++ b/pkg/poller/unifi.go @@ -13,9 +13,11 @@ import ( func (u *UnifiPoller) GetUnifi() (err error) { u.Lock() defer u.Unlock() + if u.Unifi != nil { u.Unifi.CloseIdleConnections() } + // Create an authenticated session to the Unifi Controller. u.Unifi, err = unifi.NewUnifi(&unifi.Config{ User: u.Config.UnifiUser, @@ -29,6 +31,7 @@ func (u *UnifiPoller) GetUnifi() (err error) { u.Unifi = nil return fmt.Errorf("unifi controller: %v", err) } + u.LogDebugf("Authenticated with controller successfully") return u.CheckSites() @@ -40,20 +43,26 @@ func (u *UnifiPoller) CheckSites() error { if strings.Contains(strings.ToLower(u.Config.Mode), "lambda") { return nil // Skip this in lambda mode. } + u.LogDebugf("Checking Controller Sites List") + sites, err := u.Unifi.GetSites() if err != nil { return err } + msg := []string{} + for _, site := range sites { msg = append(msg, site.Name+" ("+site.Desc+")") } u.Logf("Found %d site(s) on controller: %v", len(msg), strings.Join(msg, ", ")) + if StringInSlice("all", u.Config.Sites) { u.Config.Sites = []string{"all"} return nil } + FIRST: for _, s := range u.Config.Sites { for _, site := range sites { @@ -64,6 +73,7 @@ FIRST: // This is fine, it may get added later. u.LogErrorf("configured site not found on controller: %v", s) } + return nil } @@ -110,23 +120,29 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { if metrics == nil || metrics.Devices == nil || metrics.Clients == nil { return } + devices := make(map[string]string) bssdIDs := make(map[string]string) + for _, r := range metrics.UAPs { devices[r.Mac] = r.Name for _, v := range r.VapTable { bssdIDs[v.Bssid] = fmt.Sprintf("%s %s %s:", r.Name, v.Radio, v.RadioName) } } + for _, r := range metrics.USGs { devices[r.Mac] = r.Name } + for _, r := range metrics.USWs { devices[r.Mac] = r.Name } + for _, r := range metrics.UDMs { devices[r.Mac] = r.Name } + // These come blank, so set them here. for i, c := range metrics.Clients { metrics.Clients[i].SwName = devices[c.SwMac] @@ -134,6 +150,7 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { metrics.Clients[i].GwName = devices[c.GwMac] metrics.Clients[i].RadioDescription = bssdIDs[metrics.Clients[i].Bssid] + metrics.Clients[i].RadioProto } + if !u.Config.SaveSites { metrics.Sites = nil } @@ -143,13 +160,15 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { // Omits requested but unconfigured sites. Grabs the full list from the // controller and returns the sites provided in the config file. func (u *UnifiPoller) GetFilteredSites() (unifi.Sites, error) { + var i int + sites, err := u.Unifi.GetSites() if err != nil { return nil, err } else if len(u.Config.Sites) < 1 || StringInSlice("all", u.Config.Sites) { return sites, nil } - var i int + for _, s := range sites { // Only include valid sites in the request filter. if StringInSlice(s.Name, u.Config.Sites) { @@ -157,5 +176,6 @@ func (u *UnifiPoller) GetFilteredSites() (unifi.Sites, error) { i++ } } + return sites[:i], nil }