253 lines
11 KiB
Go
253 lines
11 KiB
Go
package unifi
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
)
|
|
|
|
// USG represents all the data from the Ubiquiti Controller for a Unifi Security Gateway.
|
|
type USG struct {
|
|
site *Site
|
|
SourceName string `json:"-"`
|
|
ID string `json:"_id"`
|
|
Adopted FlexBool `json:"adopted"`
|
|
Cfgversion string `json:"cfgversion"`
|
|
ConfigNetwork *ConfigNetwork `json:"config_network"`
|
|
EthernetTable []*EthernetTable `json:"ethernet_table"`
|
|
FwCaps FlexInt `json:"fw_caps"`
|
|
InformIP string `json:"inform_ip"`
|
|
InformURL string `json:"inform_url"`
|
|
IP string `json:"ip"`
|
|
LedOverride string `json:"led_override"`
|
|
LicenseState string `json:"license_state"`
|
|
Mac string `json:"mac"`
|
|
Model string `json:"model"`
|
|
Name string `json:"name"`
|
|
OutdoorModeOverride string `json:"outdoor_mode_override"`
|
|
Serial string `json:"serial"`
|
|
SiteID string `json:"site_id"`
|
|
SiteName string `json:"-"`
|
|
Type string `json:"type"`
|
|
UsgCaps FlexInt `json:"usg_caps"`
|
|
Version string `json:"version"`
|
|
RequiredVersion string `json:"required_version"`
|
|
EthernetOverrides []*EthernetOverrides `json:"ethernet_overrides"`
|
|
HwCaps FlexInt `json:"hw_caps"`
|
|
BoardRev FlexInt `json:"board_rev"`
|
|
Unsupported FlexBool `json:"unsupported"`
|
|
UnsupportedReason FlexInt `json:"unsupported_reason"`
|
|
DeviceID string `json:"device_id"`
|
|
State FlexInt `json:"state"`
|
|
LastSeen FlexInt `json:"last_seen"`
|
|
Upgradable FlexBool `json:"upgradable"`
|
|
AdoptableWhenUpgraded FlexBool `json:"adoptable_when_upgraded"`
|
|
Rollupgrade FlexBool `json:"rollupgrade"`
|
|
KnownCfgversion string `json:"known_cfgversion"`
|
|
Uptime FlexInt `json:"uptime"`
|
|
Locating FlexBool `json:"locating"`
|
|
ConnectRequestIP string `json:"connect_request_ip"`
|
|
ConnectRequestPort string `json:"connect_request_port"`
|
|
SysStats SysStats `json:"sys_stats"`
|
|
Temperatures []Temperature `json:"temperatures,omitempty"`
|
|
SystemStats SystemStats `json:"system-stats"`
|
|
GuestToken string `json:"guest_token"`
|
|
SpeedtestStatus SpeedtestStatus `json:"speedtest-status"`
|
|
SpeedtestStatusSaved FlexBool `json:"speedtest-status-saved"`
|
|
Wan1 Wan `json:"wan1"`
|
|
Wan2 Wan `json:"wan2"`
|
|
PortTable []*Port `json:"port_table"`
|
|
NetworkTable NetworkTable `json:"network_table"`
|
|
Uplink Uplink `json:"uplink"`
|
|
Stat USGStat `json:"stat"`
|
|
TxBytes FlexInt `json:"tx_bytes"`
|
|
RxBytes FlexInt `json:"rx_bytes"`
|
|
Bytes FlexInt `json:"bytes"`
|
|
NumSta FlexInt `json:"num_sta"`
|
|
UserNumSta FlexInt `json:"user-num_sta"`
|
|
GuestNumSta FlexInt `json:"guest-num_sta"`
|
|
NumDesktop FlexInt `json:"num_desktop"`
|
|
NumMobile FlexInt `json:"num_mobile"`
|
|
NumHandheld FlexInt `json:"num_handheld"`
|
|
}
|
|
|
|
// Uplink is the Internet connection (or uplink) on a UniFi device.
|
|
type Uplink struct {
|
|
BytesR FlexInt `json:"bytes-r"`
|
|
Drops FlexInt `json:"drops"`
|
|
Enable FlexBool `json:"enable,omitempty"`
|
|
FullDuplex FlexBool `json:"full_duplex"`
|
|
Gateways []string `json:"gateways,omitempty"`
|
|
IP string `json:"ip"`
|
|
Latency FlexInt `json:"latency"`
|
|
Mac string `json:"mac,omitempty"`
|
|
MaxSpeed FlexInt `json:"max_speed"`
|
|
Name string `json:"name"`
|
|
Nameservers []string `json:"nameservers"`
|
|
Netmask string `json:"netmask"`
|
|
NumPort FlexInt `json:"num_port"`
|
|
Media string `json:"media"`
|
|
PortIdx FlexInt `json:"port_idx"`
|
|
RxBytes FlexInt `json:"rx_bytes"`
|
|
RxBytesR FlexInt `json:"rx_bytes-r"`
|
|
RxDropped FlexInt `json:"rx_dropped"`
|
|
RxErrors FlexInt `json:"rx_errors"`
|
|
RxMulticast FlexInt `json:"rx_multicast"`
|
|
RxPackets FlexInt `json:"rx_packets"`
|
|
RxRate FlexInt `json:"rx_rate"`
|
|
Speed FlexInt `json:"speed"`
|
|
SpeedtestLastrun FlexInt `json:"speedtest_lastrun,omitempty"`
|
|
SpeedtestPing FlexInt `json:"speedtest_ping,omitempty"`
|
|
SpeedtestStatus string `json:"speedtest_status,omitempty"`
|
|
TxBytes FlexInt `json:"tx_bytes"`
|
|
TxBytesR FlexInt `json:"tx_bytes-r"`
|
|
TxDropped FlexInt `json:"tx_dropped"`
|
|
TxErrors FlexInt `json:"tx_errors"`
|
|
TxPackets FlexInt `json:"tx_packets"`
|
|
TxRate FlexInt `json:"tx_rate"`
|
|
Type string `json:"type"`
|
|
Up FlexBool `json:"up"`
|
|
Uptime FlexInt `json:"uptime"`
|
|
XputDown FlexInt `json:"xput_down,omitempty"`
|
|
XputUp FlexInt `json:"xput_up,omitempty"`
|
|
}
|
|
|
|
// Wan is a Wan interface on a USG or UDM.
|
|
type Wan struct {
|
|
Autoneg FlexBool `json:"autoneg"`
|
|
BytesR FlexInt `json:"bytes-r"`
|
|
DNS []string `json:"dns"` // may be deprecated
|
|
Enable FlexBool `json:"enable"`
|
|
FlowctrlRx FlexBool `json:"flowctrl_rx"`
|
|
FlowctrlTx FlexBool `json:"flowctrl_tx"`
|
|
FullDuplex FlexBool `json:"full_duplex"`
|
|
Gateway string `json:"gateway"` // may be deprecated
|
|
IP string `json:"ip"`
|
|
Ifname string `json:"ifname"`
|
|
IsUplink FlexBool `json:"is_uplink"`
|
|
Mac string `json:"mac"`
|
|
MaxSpeed FlexInt `json:"max_speed"`
|
|
Media string `json:"media"`
|
|
Name string `json:"name"`
|
|
Netmask string `json:"netmask"` // may be deprecated
|
|
NumPort int `json:"num_port"`
|
|
PortIdx int `json:"port_idx"`
|
|
PortPoe FlexBool `json:"port_poe"`
|
|
RxBroadcast FlexInt `json:"rx_broadcast"`
|
|
RxBytes FlexInt `json:"rx_bytes"`
|
|
RxBytesR FlexInt `json:"rx_bytes-r"`
|
|
RxDropped FlexInt `json:"rx_dropped"`
|
|
RxErrors FlexInt `json:"rx_errors"`
|
|
RxMulticast FlexInt `json:"rx_multicast"`
|
|
RxPackets FlexInt `json:"rx_packets"`
|
|
RxRate FlexInt `json:"rx_rate"`
|
|
Speed FlexInt `json:"speed"`
|
|
SpeedCaps FlexInt `json:"speed_caps"`
|
|
TxBroadcast FlexInt `json:"tx_broadcast"`
|
|
TxBytes FlexInt `json:"tx_bytes"`
|
|
TxBytesR FlexInt `json:"tx_bytes-r"`
|
|
TxDropped FlexInt `json:"tx_dropped"`
|
|
TxErrors FlexInt `json:"tx_errors"`
|
|
TxMulticast FlexInt `json:"tx_multicast"`
|
|
TxPackets FlexInt `json:"tx_packets"`
|
|
TxRate FlexInt `json:"tx_rate"`
|
|
Type string `json:"type"`
|
|
Up FlexBool `json:"up"`
|
|
}
|
|
|
|
// SpeedtestStatus is the speed test info on a USG or UDM.
|
|
type SpeedtestStatus struct {
|
|
Latency FlexInt `json:"latency"`
|
|
Rundate FlexInt `json:"rundate"`
|
|
Runtime FlexInt `json:"runtime"`
|
|
ServerDesc string `json:"server_desc,omitempty"`
|
|
Server *SpeedtestServer `json:"server"`
|
|
SourceInterface string `json:"source_interface"`
|
|
StatusDownload FlexInt `json:"status_download"`
|
|
StatusPing FlexInt `json:"status_ping"`
|
|
StatusSummary FlexInt `json:"status_summary"`
|
|
StatusUpload FlexInt `json:"status_upload"`
|
|
XputDownload FlexInt `json:"xput_download"`
|
|
XputUpload FlexInt `json:"xput_upload"`
|
|
}
|
|
|
|
type SpeedtestServer struct {
|
|
Cc string `json:"cc"`
|
|
City string `json:"city"`
|
|
Country string `json:"country"`
|
|
Lat FlexInt `json:"lat"`
|
|
Lon FlexInt `json:"lon"`
|
|
Provider string `json:"provider"`
|
|
ProviderURL string `json:"provider_url"`
|
|
}
|
|
|
|
// ConfigNetwork comes from gateways.
|
|
type ConfigNetwork struct {
|
|
Type string `json:"type"`
|
|
IP string `json:"ip"`
|
|
}
|
|
|
|
// SystemStats is system info for a UDM, USG, USW.
|
|
type SystemStats struct {
|
|
CPU FlexInt `json:"cpu"`
|
|
Mem FlexInt `json:"mem"`
|
|
Uptime FlexInt `json:"uptime"`
|
|
// This exists on at least USG4, may others, maybe not.
|
|
// {"Board (CPU)":"51 C","Board (PHY)":"51 C","CPU":"72 C","PHY":"77 C"}
|
|
Temps map[string]string `json:"temps,omitempty"`
|
|
}
|
|
|
|
// SysStats is load info for a UDM, USG, USW.
|
|
type SysStats struct {
|
|
Loadavg1 FlexInt `json:"loadavg_1"`
|
|
Loadavg15 FlexInt `json:"loadavg_15"`
|
|
Loadavg5 FlexInt `json:"loadavg_5"`
|
|
MemBuffer FlexInt `json:"mem_buffer"`
|
|
MemTotal FlexInt `json:"mem_total"`
|
|
MemUsed FlexInt `json:"mem_used"`
|
|
}
|
|
|
|
// USGStat holds the "stat" data for a gateway.
|
|
// This is split out because of a JSON data format change from 5.10 to 5.11.
|
|
type USGStat struct {
|
|
*Gw
|
|
}
|
|
|
|
// Gw is a subtype of USGStat to make unmarshalling of different controller versions possible.
|
|
type Gw struct {
|
|
SiteID string `json:"site_id"`
|
|
O string `json:"o"`
|
|
Oid string `json:"oid"`
|
|
Gw string `json:"gw"`
|
|
Time FlexInt `json:"time"`
|
|
Datetime time.Time `json:"datetime"`
|
|
Duration FlexInt `json:"duration"`
|
|
WanRxPackets FlexInt `json:"wan-rx_packets"`
|
|
WanRxBytes FlexInt `json:"wan-rx_bytes"`
|
|
WanRxDropped FlexInt `json:"wan-rx_dropped"`
|
|
WanTxPackets FlexInt `json:"wan-tx_packets"`
|
|
WanTxBytes FlexInt `json:"wan-tx_bytes"`
|
|
LanRxPackets FlexInt `json:"lan-rx_packets"`
|
|
LanRxBytes FlexInt `json:"lan-rx_bytes"`
|
|
LanTxPackets FlexInt `json:"lan-tx_packets"`
|
|
LanTxBytes FlexInt `json:"lan-tx_bytes"`
|
|
LanRxDropped FlexInt `json:"lan-rx_dropped"`
|
|
WanRxErrors FlexInt `json:"wan-rx_errors,omitempty"`
|
|
LanRxErrors FlexInt `json:"lan-rx_errors,omitempty"`
|
|
}
|
|
|
|
// UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Gateway Stat data.
|
|
func (v *USGStat) UnmarshalJSON(data []byte) error {
|
|
var n struct {
|
|
Gw `json:"gw"`
|
|
}
|
|
|
|
v.Gw = &n.Gw
|
|
|
|
err := json.Unmarshal(data, v.Gw) // controller version 5.10.
|
|
if err != nil {
|
|
return json.Unmarshal(data, &n) // controller version 5.11.
|
|
}
|
|
|
|
return nil
|
|
}
|