diff --git a/integrations/inputunifi/collector.go b/integrations/inputunifi/collector.go index 8771618b..7a2ad79a 100644 --- a/integrations/inputunifi/collector.go +++ b/integrations/inputunifi/collector.go @@ -80,6 +80,7 @@ func (u *InputUnifi) collectController(c *Controller) (*poller.Metrics, error) { return metrics, err } +//nolint:cyclop func (u *InputUnifi) pollController(c *Controller) (*poller.Metrics, error) { u.RLock() defer u.RUnlock() @@ -93,6 +94,12 @@ func (u *InputUnifi) pollController(c *Controller) (*poller.Metrics, error) { m := &Metrics{TS: time.Now(), Sites: sites} defer updateWeb(c, m) + if c.SaveRogue != nil && *c.SaveRogue { + if m.RogueAPs, err = c.Unifi.GetRogueAPs(sites); err != nil { + return nil, fmt.Errorf("unifi.GetRogueAPs(%s): %w", c.URL, err) + } + } + if c.SaveDPI != nil && *c.SaveDPI { if m.SitesDPI, err = c.Unifi.GetSiteDPI(sites); err != nil { return nil, fmt.Errorf("unifi.GetSiteDPI(%s): %w", c.URL, err) @@ -154,6 +161,11 @@ func (u *InputUnifi) augmentMetrics(c *Controller, metrics *Metrics) *poller.Met m.ClientsDPI = append(m.ClientsDPI, client) } + for _, ap := range metrics.RogueAPs { + // XXX: do we need augment this data? + m.RogueAPs = append(m.RogueAPs, ap) + } + if *c.SaveSites { for _, site := range metrics.Sites { m.Sites = append(m.Sites, site) @@ -197,6 +209,11 @@ func extractDevices(metrics *Metrics) (*poller.Metrics, map[string]string, map[s m.Devices = append(m.Devices, r) } + for _, r := range metrics.Devices.UXGs { + devices[r.Mac] = r.Name + m.Devices = append(m.Devices, r) + } + return m, devices, bssdIDs } diff --git a/integrations/inputunifi/go.mod b/integrations/inputunifi/go.mod index 5fc42637..199133fb 100644 --- a/integrations/inputunifi/go.mod +++ b/integrations/inputunifi/go.mod @@ -3,7 +3,7 @@ module github.com/unifi-poller/inputunifi go 1.15 require ( - github.com/unifi-poller/poller v0.0.8 - github.com/unifi-poller/unifi v0.0.7-0.20210308061543-395de2119e12 + github.com/unifi-poller/poller v0.0.9-0.20210315011940-c43dc3c221b4 + github.com/unifi-poller/unifi v0.0.7-0.20210315015441-e5e77b264db7 github.com/unifi-poller/webserver v0.0.0-20200704065911-79e4fe954ce1 ) diff --git a/integrations/inputunifi/input.go b/integrations/inputunifi/input.go index b9f81841..13e17aff 100644 --- a/integrations/inputunifi/input.go +++ b/integrations/inputunifi/input.go @@ -40,8 +40,10 @@ type Controller struct { SaveEvents *bool `json:"save_events" toml:"save_events" xml:"save_events" yaml:"save_events"` SaveIDS *bool `json:"save_ids" toml:"save_ids" xml:"save_ids" yaml:"save_ids"` SaveDPI *bool `json:"save_dpi" toml:"save_dpi" xml:"save_dpi" yaml:"save_dpi"` + SaveRogue *bool `json:"save_rogue" toml:"save_rogue" xml:"save_rogue" yaml:"save_rogue"` HashPII *bool `json:"hash_pii" toml:"hash_pii" xml:"hash_pii" yaml:"hash_pii"` SaveSites *bool `json:"save_sites" toml:"save_sites" xml:"save_sites" yaml:"save_sites"` + CertPaths []string `json:"ssl_cert_paths" toml:"ssl_cert_paths" xml:"ssl_cert_paths" yaml:"ssl_cert_paths"` User string `json:"user" toml:"user" xml:"user" yaml:"user"` Pass string `json:"pass" toml:"pass" xml:"pass" yaml:"pass"` URL string `json:"url" toml:"url" xml:"url" yaml:"url"` @@ -66,6 +68,7 @@ type Metrics struct { Clients []*unifi.Client SitesDPI []*unifi.DPITable ClientsDPI []*unifi.DPITable + RogueAPs []*unifi.RogueAP Devices *unifi.Devices } @@ -81,10 +84,29 @@ func init() { // nolint: gochecknoinits }) } -// getUnifi (re-)authenticates to a unifi controller. -func (u *InputUnifi) getUnifi(c *Controller) error { - var err error +// getCerts reads in cert files from disk and stores them as a slice of of byte slices. +func (c *Controller) getCerts() ([][]byte, error) { + if len(c.CertPaths) == 0 { + return nil, nil + } + b := make([][]byte, len(c.CertPaths)) + + for i, f := range c.CertPaths { + c, err := ioutil.ReadFile(f) + if err != nil { + return nil, fmt.Errorf("reading SSL cert file: %w", err) + } + + b[i] = c + } + + return b, nil +} + +// getUnifi (re-)authenticates to a unifi controller. +// If certificate files are provided, they are re-read. +func (u *InputUnifi) getUnifi(c *Controller) error { u.Lock() defer u.Unlock() @@ -92,11 +114,17 @@ func (u *InputUnifi) getUnifi(c *Controller) error { c.Unifi.CloseIdleConnections() } + certs, err := c.getCerts() + if err != nil { + return err + } + // Create an authenticated session to the Unifi Controller. c.Unifi, err = unifi.NewUnifi(&unifi.Config{ User: c.User, Pass: c.Pass, URL: c.URL, + SSLCert: certs, VerifySSL: *c.VerifySSL, ErrorLog: u.LogErrorf, // Log all errors. DebugLog: u.LogDebugf, // Log debug messages. @@ -191,6 +219,10 @@ func (u *InputUnifi) setDefaults(c *Controller) { //nolint:cyclop c.SaveDPI = &f } + if c.SaveRogue == nil { + c.SaveRogue = &f + } + if c.SaveIDS == nil { c.SaveIDS = &f } @@ -252,6 +284,10 @@ func (u *InputUnifi) setControllerDefaults(c *Controller) *Controller { //nolint c.SaveIDS = u.Default.SaveIDS } + if c.SaveRogue == nil { + c.SaveRogue = u.Default.SaveRogue + } + if c.SaveEvents == nil { c.SaveEvents = u.Default.SaveEvents } diff --git a/integrations/inputunifi/interface.go b/integrations/inputunifi/interface.go index 27ba98d5..17ee714f 100644 --- a/integrations/inputunifi/interface.go +++ b/integrations/inputunifi/interface.go @@ -60,6 +60,10 @@ func (u *InputUnifi) Initialize(l poller.Logger) error { func (u *InputUnifi) logController(c *Controller) { u.Logf(" => URL: %s (verify SSL: %v)", c.URL, *c.VerifySSL) + if len(c.CertPaths) > 0 { + u.Logf(" => Cert Files: %s", c.CertPaths) + } + if c.Unifi != nil { u.Logf(" => Version: %s (%s)", c.Unifi.ServerVersion, c.Unifi.UUID) } @@ -69,6 +73,7 @@ func (u *InputUnifi) logController(c *Controller) { u.Logf(" => Save Sites / Save DPI: %v / %v (metrics)", *c.SaveSites, *c.SaveDPI) u.Logf(" => Save Events / Save IDS: %v / %v (logs)", *c.SaveEvents, *c.SaveIDS) u.Logf(" => Save Alarms / Anomalies: %v / %v (logs)", *c.SaveAlarms, *c.SaveAnomal) + u.Logf(" => Save Rogue APs: %v", *c.SaveRogue) } // Events allows you to pull only events (and IDS) from the UniFi Controller. diff --git a/integrations/inputunifi/updateweb.go b/integrations/inputunifi/updateweb.go index e83d5314..36bad814 100644 --- a/integrations/inputunifi/updateweb.go +++ b/integrations/inputunifi/updateweb.go @@ -42,6 +42,7 @@ func formatControllers(controllers []*Controller) []*Controller { VerifySSL: c.VerifySSL, SaveAnomal: c.SaveAnomal, SaveAlarms: c.SaveAlarms, + SaveRogue: c.SaveRogue, SaveEvents: c.SaveEvents, SaveIDS: c.SaveIDS, SaveDPI: c.SaveDPI,