unpoller_unpoller/pkg/unifi-poller/jsondebug.go

81 lines
2.0 KiB
Go

package unifipoller
import (
"fmt"
"io/ioutil"
"os"
"github.com/golift/unifi"
"github.com/pkg/errors"
)
// DumpJSONPayload prints raw json from the Unifi Controller.
func (u *UnifiPoller) DumpJSONPayload() (err error) {
u.Quiet = true
u.Unifi, err = unifi.NewUnifi(u.UnifiUser, u.UnifiPass, u.UnifiBase, u.VerifySSL)
if err != nil {
return err
}
fmt.Fprintln(os.Stderr, "[INFO] Authenticated to Unifi Controller @", u.UnifiBase, "as user", u.UnifiUser)
if err := u.CheckSites(); err != nil {
return err
}
u.Unifi.ErrorLog = func(m string, v ...interface{}) {
fmt.Fprintf(os.Stderr, "[ERROR] "+m, v...)
} // Log all errors to stderr.
switch sites, err := u.filterSites(u.Sites); {
case err != nil:
return err
case StringInSlice(u.DumpJSON, []string{"d", "device", "devices"}):
return u.DumpDeviceJSON(sites)
case StringInSlice(u.DumpJSON, []string{"client", "clients", "c"}):
return u.DumpClientsJSON(sites)
default:
return errors.New("must provide filter: devices, clients")
}
}
// DumpClientsJSON prints the raw json for clients in a Unifi Controller.
func (u *UnifiPoller) DumpClientsJSON(sites []unifi.Site) error {
for _, s := range sites {
path := fmt.Sprintf(unifi.ClientPath, s.Name)
if err := u.dumpJSON(path, "Client", s); err != nil {
return err
}
}
return nil
}
// DumpDeviceJSON prints the raw json for devices in a Unifi Controller.
func (u *UnifiPoller) DumpDeviceJSON(sites []unifi.Site) error {
for _, s := range sites {
path := fmt.Sprintf(unifi.DevicePath, s.Name)
if err := u.dumpJSON(path, "Device", s); err != nil {
return err
}
}
return nil
}
func (u *UnifiPoller) dumpJSON(path, what string, site unifi.Site) error {
req, err := u.UniReq(path, "")
if err != nil {
return err
}
resp, err := u.Do(req)
if err != nil {
return err
}
defer func() {
_ = resp.Body.Close()
}()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
fmt.Fprintf(os.Stderr, "[INFO] Dumping %s JSON for site %s (%s)\n", what, site.Desc, site.Name)
fmt.Println(string(body))
return nil
}