155 lines
5.7 KiB
Go
155 lines
5.7 KiB
Go
package unifi
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// GetClients returns a response full of clients' data from the UniFi Controller.
|
|
func (u *Unifi) GetClients(sites []*Site) ([]*Client, error) {
|
|
data := make([]*Client, 0)
|
|
|
|
for _, site := range sites {
|
|
var response struct {
|
|
Data []*Client `json:"data"`
|
|
}
|
|
|
|
u.DebugLog("Polling Controller, retreiving UniFi Clients, site %s ", site.SiteName)
|
|
|
|
clientPath := fmt.Sprintf(APIClientPath, site.Name)
|
|
if err := u.GetData(clientPath, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for i, d := range response.Data {
|
|
// Add special SourceName value.
|
|
response.Data[i].SourceName = u.URL
|
|
// Add the special "Site Name" to each client. This becomes a Grafana filter somewhere.
|
|
response.Data[i].SiteName = site.SiteName
|
|
// Fix name and hostname fields. Sometimes one or the other is blank.
|
|
response.Data[i].Hostname = strings.TrimSpace(pick(d.Hostname, d.Name, d.Mac))
|
|
response.Data[i].Name = strings.TrimSpace(pick(d.Name, d.Hostname))
|
|
}
|
|
|
|
data = append(data, response.Data...)
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// GetClientsDPI garners dpi data for clients.
|
|
func (u *Unifi) GetClientsDPI(sites []*Site) ([]*DPITable, error) {
|
|
var data []*DPITable
|
|
|
|
for _, site := range sites {
|
|
u.DebugLog("Polling Controller, retreiving Client DPI data, site %s", site.SiteName)
|
|
|
|
var response struct {
|
|
Data []*DPITable `json:"data"`
|
|
}
|
|
|
|
clientDPIpath := fmt.Sprintf(APIClientDPI, site.Name)
|
|
if err := u.GetData(clientDPIpath, &response, `{"type":"by_app"}`); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, d := range response.Data {
|
|
d.SourceName = site.SourceName
|
|
d.SiteName = site.SiteName
|
|
data = append(data, d)
|
|
}
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// Client defines all the data a connected-network client contains.
|
|
type Client struct {
|
|
SourceName string `json:"-"`
|
|
Anomalies int64 `json:"anomalies,omitempty"`
|
|
ApMac string `json:"ap_mac"`
|
|
ApName string `json:"-"`
|
|
AssocTime int64 `json:"assoc_time"`
|
|
Blocked bool `json:"blocked,omitempty"`
|
|
Bssid string `json:"bssid"`
|
|
BytesR int64 `json:"bytes-r"`
|
|
Ccq int64 `json:"ccq"`
|
|
Channel FlexInt `json:"channel"`
|
|
DevCat FlexInt `json:"dev_cat"`
|
|
DevFamily FlexInt `json:"dev_family"`
|
|
DevID FlexInt `json:"dev_id"`
|
|
DevVendor FlexInt `json:"dev_vendor,omitempty"`
|
|
DhcpendTime FlexInt `json:"dhcpend_time,omitempty"`
|
|
Satisfaction FlexInt `json:"satisfaction,omitempty"`
|
|
Essid string `json:"essid"`
|
|
FirstSeen int64 `json:"first_seen"`
|
|
FixedIP string `json:"fixed_ip"`
|
|
GwMac string `json:"gw_mac"`
|
|
GwName string `json:"-"`
|
|
Hostname string `json:"hostname"`
|
|
ID string `json:"_id"`
|
|
IP string `json:"ip"`
|
|
IdleTime int64 `json:"idle_time"`
|
|
Is11R FlexBool `json:"is_11r"`
|
|
IsGuest FlexBool `json:"is_guest"`
|
|
IsGuestByUAP FlexBool `json:"_is_guest_by_uap"`
|
|
IsGuestByUGW FlexBool `json:"_is_guest_by_ugw"`
|
|
IsGuestByUSW FlexBool `json:"_is_guest_by_usw"`
|
|
IsWired FlexBool `json:"is_wired"`
|
|
LastSeen int64 `json:"last_seen"`
|
|
LastSeenByUAP int64 `json:"_last_seen_by_uap"`
|
|
LastSeenByUGW int64 `json:"_last_seen_by_ugw"`
|
|
LastSeenByUSW int64 `json:"_last_seen_by_usw"`
|
|
LatestAssocTime int64 `json:"latest_assoc_time"`
|
|
Mac string `json:"mac"`
|
|
Name string `json:"name"`
|
|
Network string `json:"network"`
|
|
NetworkID string `json:"network_id"`
|
|
Noise int64 `json:"noise"`
|
|
Note string `json:"note"`
|
|
Noted FlexBool `json:"noted"`
|
|
OsClass FlexInt `json:"os_class"`
|
|
OsName FlexInt `json:"os_name"`
|
|
Oui string `json:"oui"`
|
|
PowersaveEnabled FlexBool `json:"powersave_enabled"`
|
|
QosPolicyApplied FlexBool `json:"qos_policy_applied"`
|
|
Radio string `json:"radio"`
|
|
RadioName string `json:"radio_name"`
|
|
RadioProto string `json:"radio_proto"`
|
|
RadioDescription string `json:"-"`
|
|
RoamCount int64 `json:"roam_count"`
|
|
Rssi int64 `json:"rssi"`
|
|
RxBytes int64 `json:"rx_bytes"`
|
|
RxBytesR int64 `json:"rx_bytes-r"`
|
|
RxPackets int64 `json:"rx_packets"`
|
|
RxRate int64 `json:"rx_rate"`
|
|
Signal int64 `json:"signal"`
|
|
SiteID string `json:"site_id"`
|
|
SiteName string `json:"-"`
|
|
SwDepth int `json:"sw_depth"`
|
|
SwMac string `json:"sw_mac"`
|
|
SwName string `json:"-"`
|
|
SwPort FlexInt `json:"sw_port"`
|
|
TxBytes int64 `json:"tx_bytes"`
|
|
TxBytesR int64 `json:"tx_bytes-r"`
|
|
TxPackets int64 `json:"tx_packets"`
|
|
TxRetries int64 `json:"tx_retries"`
|
|
TxPower int64 `json:"tx_power"`
|
|
TxRate int64 `json:"tx_rate"`
|
|
Uptime int64 `json:"uptime"`
|
|
UptimeByUAP int64 `json:"_uptime_by_uap"`
|
|
UptimeByUGW int64 `json:"_uptime_by_ugw"`
|
|
UptimeByUSW int64 `json:"_uptime_by_usw"`
|
|
UseFixedIP FlexBool `json:"use_fixedip"`
|
|
UserGroupID string `json:"usergroup_id"`
|
|
UserID string `json:"user_id"`
|
|
Vlan FlexInt `json:"vlan"`
|
|
WifiTxAttempts int64 `json:"wifi_tx_attempts"`
|
|
WiredRxBytes int64 `json:"wired-rx_bytes"`
|
|
WiredRxBytesR int64 `json:"wired-rx_bytes-r"`
|
|
WiredRxPackets int64 `json:"wired-rx_packets"`
|
|
WiredTxBytes int64 `json:"wired-tx_bytes"`
|
|
WiredTxBytesR int64 `json:"wired-tx_bytes-r"`
|
|
WiredTxPackets int64 `json:"wired-tx_packets"`
|
|
}
|