CLI works
This commit is contained in:
parent
db9bcd5687
commit
3768c53512
|
|
@ -204,7 +204,7 @@ func (u *DatadogUnifi) Enabled() bool {
|
||||||
return *u.Enable
|
return *u.Enable
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *DatadogUnifi) DebugOutput(l poller.Logger) (bool, error) {
|
func (u *DatadogUnifi) DebugOutput() (bool, error) {
|
||||||
if u == nil {
|
if u == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -143,7 +143,7 @@ func (u *InfluxUnifi) Enabled() bool {
|
||||||
return !u.Disable
|
return !u.Disable
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *InfluxUnifi) DebugOutput(l poller.Logger) (bool, error) {
|
func (u *InfluxUnifi) DebugOutput() (bool, error) {
|
||||||
if u == nil {
|
if u == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ func (u *InfluxUnifi) Logf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "info"},
|
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.
|
// LogErrorf logs an error message.
|
||||||
|
|
@ -24,7 +26,9 @@ func (u *InfluxUnifi) LogErrorf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "error"},
|
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.
|
// LogDebugf logs a debug message.
|
||||||
|
|
@ -34,5 +38,7 @@ func (u *InfluxUnifi) LogDebugf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "debug"},
|
Tags: map[string]string{"type": "debug"},
|
||||||
})
|
})
|
||||||
u.Collector.LogDebugf(msg, v...)
|
if u.Collector != nil {
|
||||||
|
u.Collector.LogDebugf(msg, v...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ func (u *InputUnifi) Initialize(l poller.Logger) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) {
|
func (u *InputUnifi) DebugInput() (bool, error) {
|
||||||
if u == nil || u.Config == nil {
|
if u == nil || u.Config == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
@ -70,23 +70,27 @@ func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) {
|
||||||
u.logController(&u.Default)
|
u.logController(&u.Default)
|
||||||
}
|
}
|
||||||
|
|
||||||
ok := true
|
allOK := true
|
||||||
var allErrors error
|
var allErrors error
|
||||||
for i, c := range u.Controllers {
|
for i, c := range u.Controllers {
|
||||||
if err := u.getUnifi(u.setControllerDefaults(c)); err != nil {
|
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)
|
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 {
|
if allErrors != nil {
|
||||||
err = fmt.Errorf("%v: %w", err, allErrors)
|
allErrors = fmt.Errorf("%v: %w", err, allErrors)
|
||||||
|
} else {
|
||||||
|
allErrors = err
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := u.checkSites(c); err != nil {
|
if err := u.checkSites(c); err != nil {
|
||||||
u.LogErrorf("checking sites on %s: %v", c.URL, err)
|
u.LogErrorf("checking sites on %s: %v", c.URL, err)
|
||||||
ok = false
|
allOK = false
|
||||||
if allErrors != nil {
|
if allErrors != nil {
|
||||||
err = fmt.Errorf("%v: %w", err, allErrors)
|
allErrors = fmt.Errorf("%v: %w", err, allErrors)
|
||||||
|
} else {
|
||||||
|
allErrors = err
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +99,7 @@ func (u *InputUnifi) DebugInputs(l poller.Logger) (bool, error) {
|
||||||
u.logController(c)
|
u.logController(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok, allErrors
|
return allOK, allErrors
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *InputUnifi) logController(c *Controller) {
|
func (u *InputUnifi) logController(c *Controller) {
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,9 @@ func (u *InputUnifi) Logf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "info"},
|
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.
|
// LogErrorf logs an error message.
|
||||||
|
|
@ -201,7 +203,9 @@ func (u *InputUnifi) LogErrorf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "error"},
|
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.
|
// LogDebugf logs a debug message.
|
||||||
|
|
@ -211,5 +215,7 @@ func (u *InputUnifi) LogDebugf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "debug"},
|
Tags: map[string]string{"type": "debug"},
|
||||||
})
|
})
|
||||||
u.Logger.LogDebugf(msg, v...)
|
if u.Logger != nil {
|
||||||
|
u.Logger.LogDebugf(msg, v...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ func (l *Loki) Enabled() bool {
|
||||||
return !l.Disable
|
return !l.Disable
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Loki) DebugOutput(logger poller.Logger) (bool, error) {
|
func (l *Loki) DebugOutput() (bool, error) {
|
||||||
if l == nil {
|
if l == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ func (p *plugin) Enabled() bool {
|
||||||
return !p.Disable
|
return !p.Disable
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *plugin) DebugOutput(l poller.Logger) (bool, error) {
|
func (p *plugin) DebugOutput() (bool, error) {
|
||||||
if p == nil {
|
if p == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,3 +54,57 @@ func (u *UnifiPoller) PrintPasswordHash() (err error) {
|
||||||
|
|
||||||
return err //nolint:wrapcheck
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ type Flags struct {
|
||||||
DumpJSON string
|
DumpJSON string
|
||||||
HashPW string
|
HashPW string
|
||||||
ShowVer bool
|
ShowVer bool
|
||||||
|
DebugIO bool
|
||||||
*pflag.FlagSet
|
*pflag.FlagSet
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ type Input interface {
|
||||||
Metrics(*Filter) (*Metrics, error) // Called every time new metrics are requested.
|
Metrics(*Filter) (*Metrics, error) // Called every time new metrics are requested.
|
||||||
Events(*Filter) (*Events, error) // This is new.
|
Events(*Filter) (*Events, error) // This is new.
|
||||||
RawMetrics(*Filter) ([]byte, error)
|
RawMetrics(*Filter) ([]byte, error)
|
||||||
DebugInputs(Logger) (bool, error)
|
DebugInput() (bool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// InputPlugin describes an input plugin's consumable interface.
|
// InputPlugin describes an input plugin's consumable interface.
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ type Collect interface {
|
||||||
type OutputPlugin interface {
|
type OutputPlugin interface {
|
||||||
Run(Collect) error
|
Run(Collect) error
|
||||||
Enabled() bool
|
Enabled() bool
|
||||||
DebugOutput(Logger) (bool, error)
|
DebugOutput() (bool, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output defines the output data for a metric exporter like influx or prometheus.
|
// Output defines the output data for a metric exporter like influx or prometheus.
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,15 @@ func (u *UnifiPoller) Start() error {
|
||||||
return err
|
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()
|
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.")
|
"This option bcrypts a provided string. Useful for the webserver password. Use - to be prompted.")
|
||||||
f.StringVarP(&f.DumpJSON, "dumpjson", "j", "",
|
f.StringVarP(&f.DumpJSON, "dumpjson", "j", "",
|
||||||
"This debug option prints a json payload and exits. See man page for more info.")
|
"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(),
|
f.StringVarP(&f.ConfigFile, "config", "c", DefaultConfFile(),
|
||||||
"Poller config file path. Separating multiple paths with a comma will load the first config file found.")
|
"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.")
|
f.BoolVarP(&f.ShowVer, "version", "v", false, "Print the version and exit.")
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"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 {
|
if u == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
@ -129,16 +128,17 @@ func (u *promUnifi) DebugOutput(l poller.Logger) (bool, error) {
|
||||||
return false, fmt.Errorf("invalid listen string")
|
return false, fmt.Errorf("invalid listen string")
|
||||||
}
|
}
|
||||||
// check the port
|
// check the port
|
||||||
httpListenURL, err := url.Parse(u.HTTPListen)
|
parts := strings.Split(u.HTTPListen, ":")
|
||||||
if err != nil {
|
if len(parts) != 2 {
|
||||||
return false, err
|
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 {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
_ = ln.Close()
|
_ = ln.Close()
|
||||||
return false, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *promUnifi) Enabled() bool {
|
func (u *promUnifi) Enabled() bool {
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ func (u *promUnifi) Logf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "info"},
|
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.
|
// LogErrorf logs an error message.
|
||||||
|
|
@ -24,7 +26,9 @@ func (u *promUnifi) LogErrorf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "error"},
|
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.
|
// LogDebugf logs a debug message.
|
||||||
|
|
@ -34,5 +38,7 @@ func (u *promUnifi) LogDebugf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "debug"},
|
Tags: map[string]string{"type": "debug"},
|
||||||
})
|
})
|
||||||
u.Collector.LogDebugf(msg, v...)
|
if u.Collector != nil {
|
||||||
|
u.Collector.LogDebugf(msg, v...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,9 @@ func (s *Server) Logf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "info"},
|
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.
|
// LogErrorf logs an error message.
|
||||||
|
|
@ -22,7 +24,9 @@ func (s *Server) LogErrorf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "error"},
|
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.
|
// LogDebugf logs a debug message.
|
||||||
|
|
@ -32,5 +36,7 @@ func (s *Server) LogDebugf(msg string, v ...any) {
|
||||||
Msg: fmt.Sprintf(msg, v...),
|
Msg: fmt.Sprintf(msg, v...),
|
||||||
Tags: map[string]string{"type": "debug"},
|
Tags: map[string]string{"type": "debug"},
|
||||||
})
|
})
|
||||||
s.Collect.LogDebugf(msg, v...)
|
if s.Collect != nil {
|
||||||
|
s.Collect.LogDebugf(msg, v...)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ func (s *Server) Run(c poller.Collect) error {
|
||||||
return s.Start()
|
return s.Start()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) DebugOutput(l poller.Logger) (bool, error) {
|
func (s *Server) DebugOutput() (bool, error) {
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue