From 3768c535120e3fb4c5c5d02e66f0947f3277c173 Mon Sep 17 00:00:00 2001 From: Cody Lee Date: Thu, 22 Dec 2022 18:16:43 -0600 Subject: [PATCH] CLI works --- pkg/datadogunifi/datadog.go | 2 +- pkg/influxunifi/influxdb.go | 2 +- pkg/influxunifi/logger.go | 12 ++++++--- pkg/inputunifi/interface.go | 18 ++++++++----- pkg/inputunifi/updateweb.go | 12 ++++++--- pkg/lokiunifi/loki.go | 2 +- pkg/mysqlunifi/main.go | 2 +- pkg/poller/commands.go | 54 +++++++++++++++++++++++++++++++++++++ pkg/poller/config.go | 1 + pkg/poller/inputs.go | 2 +- pkg/poller/outputs.go | 2 +- pkg/poller/start.go | 10 +++++++ pkg/promunifi/collector.go | 14 +++++----- pkg/promunifi/logger.go | 12 ++++++--- pkg/webserver/logger.go | 12 ++++++--- pkg/webserver/server.go | 2 +- 16 files changed, 126 insertions(+), 33 deletions(-) diff --git a/pkg/datadogunifi/datadog.go b/pkg/datadogunifi/datadog.go index 924a0d09..be875247 100644 --- a/pkg/datadogunifi/datadog.go +++ b/pkg/datadogunifi/datadog.go @@ -204,7 +204,7 @@ func (u *DatadogUnifi) Enabled() bool { return *u.Enable } -func (u *DatadogUnifi) DebugOutput(l poller.Logger) (bool, error) { +func (u *DatadogUnifi) DebugOutput() (bool, error) { if u == nil { return true, nil } diff --git a/pkg/influxunifi/influxdb.go b/pkg/influxunifi/influxdb.go index b0459438..eff554cd 100644 --- a/pkg/influxunifi/influxdb.go +++ b/pkg/influxunifi/influxdb.go @@ -143,7 +143,7 @@ func (u *InfluxUnifi) Enabled() bool { return !u.Disable } -func (u *InfluxUnifi) DebugOutput(l poller.Logger) (bool, error) { +func (u *InfluxUnifi) DebugOutput() (bool, error) { if u == nil { return true, nil } diff --git a/pkg/influxunifi/logger.go b/pkg/influxunifi/logger.go index 57806442..6148f77e 100644 --- a/pkg/influxunifi/logger.go +++ b/pkg/influxunifi/logger.go @@ -14,7 +14,9 @@ func (u *InfluxUnifi) Logf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "info"}, }) - u.Collector.Logf(msg, v...) + if u.Collector != nil { + u.Collector.Logf(msg, v...) + } } // LogErrorf logs an error message. @@ -24,7 +26,9 @@ func (u *InfluxUnifi) LogErrorf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "error"}, }) - u.Collector.LogErrorf(msg, v...) + if u.Collector != nil { + u.Collector.LogErrorf(msg, v...) + } } // LogDebugf logs a debug message. @@ -34,5 +38,7 @@ func (u *InfluxUnifi) LogDebugf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "debug"}, }) - u.Collector.LogDebugf(msg, v...) + if u.Collector != nil { + u.Collector.LogDebugf(msg, v...) + } } diff --git a/pkg/inputunifi/interface.go b/pkg/inputunifi/interface.go index 1833bb48..dd9b1e08 100644 --- a/pkg/inputunifi/interface.go +++ b/pkg/inputunifi/interface.go @@ -57,7 +57,7 @@ func (u *InputUnifi) Initialize(l poller.Logger) error { return nil } -func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) { +func (u *InputUnifi) DebugInput() (bool, error) { if u == nil || u.Config == nil { return true, nil } @@ -70,23 +70,27 @@ func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) { u.logController(&u.Default) } - ok := true + allOK := true var allErrors error for i, c := range u.Controllers { if err := u.getUnifi(u.setControllerDefaults(c)); err != nil { u.LogErrorf("Controller %d of %d Auth or Connection Error, retrying: %v", i+1, len(u.Controllers), err) - ok = false + allOK = false if allErrors != nil { - err = fmt.Errorf("%v: %w", err, allErrors) + allErrors = fmt.Errorf("%v: %w", err, allErrors) + } else { + allErrors = err } continue } if err := u.checkSites(c); err != nil { u.LogErrorf("checking sites on %s: %v", c.URL, err) - ok = false + allOK = false if allErrors != nil { - err = fmt.Errorf("%v: %w", err, allErrors) + allErrors = fmt.Errorf("%v: %w", err, allErrors) + } else { + allErrors = err } continue } @@ -95,7 +99,7 @@ func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) { u.logController(c) } - return ok, allErrors + return allOK, allErrors } func (u *InputUnifi) logController(c *Controller) { diff --git a/pkg/inputunifi/updateweb.go b/pkg/inputunifi/updateweb.go index 18b5f0aa..c660690f 100644 --- a/pkg/inputunifi/updateweb.go +++ b/pkg/inputunifi/updateweb.go @@ -191,7 +191,9 @@ func (u *InputUnifi) Logf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "info"}, }) - u.Logger.Logf(msg, v...) + if u.Logger != nil { + u.Logger.Logf(msg, v...) + } } // LogErrorf logs an error message. @@ -201,7 +203,9 @@ func (u *InputUnifi) LogErrorf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "error"}, }) - u.Logger.LogErrorf(msg, v...) + if u.Logger != nil { + u.Logger.LogErrorf(msg, v...) + } } // LogDebugf logs a debug message. @@ -211,5 +215,7 @@ func (u *InputUnifi) LogDebugf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "debug"}, }) - u.Logger.LogDebugf(msg, v...) + if u.Logger != nil { + u.Logger.LogDebugf(msg, v...) + } } diff --git a/pkg/lokiunifi/loki.go b/pkg/lokiunifi/loki.go index 669a3711..d0a37cb0 100644 --- a/pkg/lokiunifi/loki.go +++ b/pkg/lokiunifi/loki.go @@ -76,7 +76,7 @@ func (l *Loki) Enabled() bool { return !l.Disable } -func (l *Loki) DebugOutput(logger poller.Logger) (bool, error) { +func (l *Loki) DebugOutput() (bool, error) { if l == nil { return true, nil } diff --git a/pkg/mysqlunifi/main.go b/pkg/mysqlunifi/main.go index 74ce80a3..5530513f 100644 --- a/pkg/mysqlunifi/main.go +++ b/pkg/mysqlunifi/main.go @@ -69,7 +69,7 @@ func (p *plugin) Enabled() bool { return !p.Disable } -func (p *plugin) DebugOutput(l poller.Logger) (bool, error) { +func (p *plugin) DebugOutput() (bool, error) { if p == nil { return true, nil } diff --git a/pkg/poller/commands.go b/pkg/poller/commands.go index e9b9f032..f50dfad1 100644 --- a/pkg/poller/commands.go +++ b/pkg/poller/commands.go @@ -54,3 +54,57 @@ func (u *UnifiPoller) PrintPasswordHash() (err error) { return err //nolint:wrapcheck } + +func (u *UnifiPoller) DebugIO() error { + inputSync.RLock() + defer inputSync.RUnlock() + outputSync.RLock() + defer outputSync.RUnlock() + + allOK := true + var allErr error + + u.Logf("Checking inputs...") + totalInputs := len(inputs) + for i, input := range inputs { + u.Logf("\t(%d/%d) Checking input %s...", i+1, totalInputs, input.Name) + ok, err := input.DebugInput() + if !ok { + u.LogErrorf("\t\t %s Failed: %v", input.Name, err) + allOK = false + } else { + u.Logf("\t\t %s is OK", input.Name) + } + if err != nil { + if allErr == nil { + allErr = err + } else { + allErr = fmt.Errorf("%v: %w", err, allErr) + } + } + } + + u.Logf("Checking outputs...") + totalOutputs := len(outputs) + for i, output := range outputs { + u.Logf("\t(%d/%d) Checking output %s...", i+1, totalOutputs, output.Name) + ok, err := output.DebugOutput() + if !ok { + u.LogErrorf("\t\t %s Failed: %v", output.Name, err) + allOK = false + } else { + u.Logf("\t\t %s is OK", output.Name) + } + if err != nil { + if allErr == nil { + allErr = err + } else { + allErr = fmt.Errorf("%v: %w", err, allErr) + } + } + } + if !allOK { + u.LogErrorf("No all checks passed, please fix the logged issues.") + } + return allErr +} diff --git a/pkg/poller/config.go b/pkg/poller/config.go index 2eb3242f..519299f6 100644 --- a/pkg/poller/config.go +++ b/pkg/poller/config.go @@ -72,6 +72,7 @@ type Flags struct { DumpJSON string HashPW string ShowVer bool + DebugIO bool *pflag.FlagSet } diff --git a/pkg/poller/inputs.go b/pkg/poller/inputs.go index fea5a125..65fc4c8f 100644 --- a/pkg/poller/inputs.go +++ b/pkg/poller/inputs.go @@ -21,7 +21,7 @@ type Input interface { Metrics(*Filter) (*Metrics, error) // Called every time new metrics are requested. Events(*Filter) (*Events, error) // This is new. RawMetrics(*Filter) ([]byte, error) - DebugInputs(Logger) (bool, error) + DebugInput() (bool, error) } // InputPlugin describes an input plugin's consumable interface. diff --git a/pkg/poller/outputs.go b/pkg/poller/outputs.go index 183b66e4..4f05ffc9 100644 --- a/pkg/poller/outputs.go +++ b/pkg/poller/outputs.go @@ -27,7 +27,7 @@ type Collect interface { type OutputPlugin interface { Run(Collect) error Enabled() bool - DebugOutput(Logger) (bool, error) + DebugOutput() (bool, error) } // Output defines the output data for a metric exporter like influx or prometheus. diff --git a/pkg/poller/start.go b/pkg/poller/start.go index ea204297..fae92743 100644 --- a/pkg/poller/start.go +++ b/pkg/poller/start.go @@ -48,6 +48,15 @@ func (u *UnifiPoller) Start() error { return err } + if u.Flags.DebugIO { + err = u.DebugIO() + if err != nil { + os.Exit(1) + } + log.Fatal("Failed debug checks") + return err + } + return u.Run() } @@ -63,6 +72,7 @@ func (f *Flags) Parse(args []string) { "This option bcrypts a provided string. Useful for the webserver password. Use - to be prompted.") f.StringVarP(&f.DumpJSON, "dumpjson", "j", "", "This debug option prints a json payload and exits. See man page for more info.") + f.BoolVarP(&f.DebugIO, "debugio", "d", false, "Debug the Inputs and Outputs configured and exit.") f.StringVarP(&f.ConfigFile, "config", "c", DefaultConfFile(), "Poller config file path. Separating multiple paths with a comma will load the first config file found.") f.BoolVarP(&f.ShowVer, "version", "v", false, "Print the version and exit.") diff --git a/pkg/promunifi/collector.go b/pkg/promunifi/collector.go index cfd070dc..f38dcd54 100644 --- a/pkg/promunifi/collector.go +++ b/pkg/promunifi/collector.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "net/http" - "net/url" "reflect" "strings" "sync" @@ -118,7 +117,7 @@ func init() { // nolint: gochecknoinits }) } -func (u *promUnifi) DebugOutput(l poller.Logger) (bool, error) { +func (u *promUnifi) DebugOutput() (bool, error) { if u == nil { return true, nil } @@ -129,16 +128,17 @@ func (u *promUnifi) DebugOutput(l poller.Logger) (bool, error) { return false, fmt.Errorf("invalid listen string") } // check the port - httpListenURL, err := url.Parse(u.HTTPListen) - if err != nil { - return false, err + parts := strings.Split(u.HTTPListen, ":") + if len(parts) != 2 { + return false, fmt.Errorf("invalid listen address: %s (must be of the form \"IP:Port\"", u.HTTPListen) } - ln, err := net.Listen("tcp", fmt.Sprintf("%s:%s", httpListenURL.Host, httpListenURL.Port())) + + ln, err := net.Listen("tcp", u.HTTPListen) if err != nil { return false, err } _ = ln.Close() - return false, nil + return true, nil } func (u *promUnifi) Enabled() bool { diff --git a/pkg/promunifi/logger.go b/pkg/promunifi/logger.go index 8215fd51..242386bb 100644 --- a/pkg/promunifi/logger.go +++ b/pkg/promunifi/logger.go @@ -14,7 +14,9 @@ func (u *promUnifi) Logf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "info"}, }) - u.Collector.Logf(msg, v...) + if u.Collector != nil { + u.Collector.Logf(msg, v...) + } } // LogErrorf logs an error message. @@ -24,7 +26,9 @@ func (u *promUnifi) LogErrorf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "error"}, }) - u.Collector.LogErrorf(msg, v...) + if u.Collector != nil { + u.Collector.LogErrorf(msg, v...) + } } // LogDebugf logs a debug message. @@ -34,5 +38,7 @@ func (u *promUnifi) LogDebugf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "debug"}, }) - u.Collector.LogDebugf(msg, v...) + if u.Collector != nil { + u.Collector.LogDebugf(msg, v...) + } } diff --git a/pkg/webserver/logger.go b/pkg/webserver/logger.go index 31d2baa5..65c8acd3 100644 --- a/pkg/webserver/logger.go +++ b/pkg/webserver/logger.go @@ -12,7 +12,9 @@ func (s *Server) Logf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "info"}, }) - s.Collect.Logf(msg, v...) + if s.Collect != nil { + s.Collect.Logf(msg, v...) + } } // LogErrorf logs an error message. @@ -22,7 +24,9 @@ func (s *Server) LogErrorf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "error"}, }) - s.Collect.LogErrorf(msg, v...) + if s.Collect != nil { + s.Collect.LogErrorf(msg, v...) + } } // LogDebugf logs a debug message. @@ -32,5 +36,7 @@ func (s *Server) LogDebugf(msg string, v ...any) { Msg: fmt.Sprintf(msg, v...), Tags: map[string]string{"type": "debug"}, }) - s.Collect.LogDebugf(msg, v...) + if s.Collect != nil { + s.Collect.LogDebugf(msg, v...) + } } diff --git a/pkg/webserver/server.go b/pkg/webserver/server.go index 9d3be346..5854b90f 100644 --- a/pkg/webserver/server.go +++ b/pkg/webserver/server.go @@ -95,7 +95,7 @@ func (s *Server) Run(c poller.Collect) error { return s.Start() } -func (s *Server) DebugOutput(l poller.Logger) (bool, error) { +func (s *Server) DebugOutput() (bool, error) { if s == nil { return true, nil }