From 06ae401e53a7103f804dd86d4ae6389ce5a3238e Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 2 Sep 2019 23:58:27 -0700 Subject: [PATCH] Re-do structs to support UDM w/ UAP. --- core/unifi/.travis.yml | 2 +- core/unifi/{clients_type.go => clients.go} | 0 core/unifi/{site_type.go => site.go} | 0 core/unifi/uap.go | 564 +++++++++++++++++++ core/unifi/{uap_type_test.go => uap_test.go} | 0 core/unifi/uap_type.go | 449 --------------- core/unifi/udm.go | 208 +++++++ core/unifi/udm_type.go | 185 ------ core/unifi/{usg_type.go => usg.go} | 64 +-- core/unifi/{usg_type_test.go => usg_test.go} | 0 core/unifi/usw.go | 373 ++++++++++++ core/unifi/{usw_type_test.go => usw_test.go} | 0 core/unifi/usw_type.go | 370 ------------ 13 files changed, 1158 insertions(+), 1057 deletions(-) rename core/unifi/{clients_type.go => clients.go} (100%) rename core/unifi/{site_type.go => site.go} (100%) create mode 100644 core/unifi/uap.go rename core/unifi/{uap_type_test.go => uap_test.go} (100%) delete mode 100644 core/unifi/uap_type.go create mode 100644 core/unifi/udm.go delete mode 100644 core/unifi/udm_type.go rename core/unifi/{usg_type.go => usg.go} (77%) rename core/unifi/{usg_type_test.go => usg_test.go} (100%) create mode 100644 core/unifi/usw.go rename core/unifi/{usw_type_test.go => usw_test.go} (100%) delete mode 100644 core/unifi/usw_type.go diff --git a/core/unifi/.travis.yml b/core/unifi/.travis.yml index 5266b77c..a05c4c9f 100644 --- a/core/unifi/.travis.yml +++ b/core/unifi/.travis.yml @@ -11,5 +11,5 @@ before_install: install: - dep ensure script: -- golangci-lint run --enable-all -e G402 -e dupl +- golangci-lint run --enable-all -e G402 - go test ./... diff --git a/core/unifi/clients_type.go b/core/unifi/clients.go similarity index 100% rename from core/unifi/clients_type.go rename to core/unifi/clients.go diff --git a/core/unifi/site_type.go b/core/unifi/site.go similarity index 100% rename from core/unifi/site_type.go rename to core/unifi/site.go diff --git a/core/unifi/uap.go b/core/unifi/uap.go new file mode 100644 index 00000000..d94b60e4 --- /dev/null +++ b/core/unifi/uap.go @@ -0,0 +1,564 @@ +package unifi + +import ( + "encoding/json" + "time" +) + +// UAP represents all the data from the Ubiquiti Controller for a Unifi Access Point. +type UAP struct { + /* This was auto generated and then slowly edited by hand + to get all the data types right and graphable. + */ + ID string `json:"_id"` + Adopted FlexBool `json:"adopted"` + AntennaTable []struct { + Default FlexBool `json:"default"` + ID FlexInt `json:"id"` + Name string `json:"name"` + Wifi0Gain FlexInt `json:"wifi0_gain"` + Wifi1Gain FlexInt `json:"wifi1_gain"` + } `json:"antenna_table"` + BandsteeringMode string `json:"bandsteering_mode,omitempty"` + BoardRev int `json:"board_rev"` + Cfgversion string `json:"cfgversion"` + ConfigNetwork struct { + Type string `json:"type"` + IP string `json:"ip"` + } `json:"config_network"` + CountrycodeTable []int `json:"countrycode_table"` + EthernetTable []struct { + Mac string `json:"mac"` + NumPort FlexInt `json:"num_port"` + Name string `json:"name"` + } `json:"ethernet_table"` + FwCaps int `json:"fw_caps"` + HasEth1 FlexBool `json:"has_eth1"` + HasSpeaker FlexBool `json:"has_speaker"` + InformIP string `json:"inform_ip"` + InformURL string `json:"inform_url"` + IP string `json:"ip"` + LedOverride string `json:"led_override"` + Mac string `json:"mac"` + MeshStaVapEnabled FlexBool `json:"mesh_sta_vap_enabled"` + Model string `json:"model"` + Name string `json:"name"` + OutdoorModeOverride string `json:"outdoor_mode_override"` + PortTable []Port `json:"port_table"` + RadioTable RadioTable `json:"radio_table"` + ScanRadioTable []interface{} `json:"scan_radio_table"` + Serial string `json:"serial"` + SiteID string `json:"site_id"` + SiteName string `json:"-"` + Type string `json:"type"` + Version string `json:"version"` + VwireTable []interface{} `json:"vwire_table"` + WifiCaps int `json:"wifi_caps"` + WlangroupIDNa string `json:"wlangroup_id_na"` + WlangroupIDNg string `json:"wlangroup_id_ng"` + RequiredVersion string `json:"required_version"` + HwCaps int `json:"hw_caps"` + Unsupported FlexBool `json:"unsupported"` + UnsupportedReason FlexInt `json:"unsupported_reason"` + SysErrorCaps int `json:"sys_error_caps"` + HasFan FlexBool `json:"has_fan"` + HasTemperature FlexBool `json:"has_temperature"` + DeviceID string `json:"device_id"` + State int `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"` + UUptime FlexInt `json:"_uptime"` + Locating FlexBool `json:"locating"` + ConnectRequestIP string `json:"connect_request_ip"` + ConnectRequestPort string `json:"connect_request_port"` + SysStats SysStats `json:"sys_stats"` + SystemStats SystemStats `json:"system-stats"` + SSHSessionTable []interface{} `json:"ssh_session_table"` + Scanning FlexBool `json:"scanning"` + SpectrumScanning FlexBool `json:"spectrum_scanning"` + GuestToken string `json:"guest_token"` + Meshv3PeerMac string `json:"meshv3_peer_mac"` + Satisfaction FlexInt `json:"satisfaction"` + Isolated FlexBool `json:"isolated"` + RadioTableStats RadioTableStats `json:"radio_table_stats"` + Uplink struct { + FullDuplex FlexBool `json:"full_duplex"` + IP string `json:"ip"` + Mac string `json:"mac"` + MaxVlan int `json:"max_vlan"` + Name string `json:"name"` + Netmask string `json:"netmask"` + NumPort int `json:"num_port"` + RxBytes FlexInt `json:"rx_bytes"` + RxDropped FlexInt `json:"rx_dropped"` + RxErrors FlexInt `json:"rx_errors"` + RxMulticast FlexInt `json:"rx_multicast"` + RxPackets FlexInt `json:"rx_packets"` + Speed FlexInt `json:"speed"` + TxBytes FlexInt `json:"tx_bytes"` + TxDropped FlexInt `json:"tx_dropped"` + TxErrors FlexInt `json:"tx_errors"` + TxPackets FlexInt `json:"tx_packets"` + Up FlexBool `json:"up"` + MaxSpeed FlexInt `json:"max_speed"` + Type string `json:"type"` + TxBytesR FlexInt `json:"tx_bytes-r"` + RxBytesR FlexInt `json:"rx_bytes-r"` + UplinkMac string `json:"uplink_mac"` + UplinkRemotePort int `json:"uplink_remote_port"` + } `json:"uplink"` + VapTable VapTable `json:"vap_table"` + DownlinkTable []struct { + PortIdx int `json:"port_idx"` + Speed int `json:"speed"` + FullDuplex bool `json:"full_duplex"` + Mac string `json:"mac"` + } `json:"downlink_table,omitempty"` + VwireVapTable []interface{} `json:"vwire_vap_table"` + BytesD FlexInt `json:"bytes-d"` + TxBytesD FlexInt `json:"tx_bytes-d"` + RxBytesD FlexInt `json:"rx_bytes-d"` + BytesR FlexInt `json:"bytes-r"` + LastUplink struct { + UplinkMac string `json:"uplink_mac"` + UplinkRemotePort int `json:"uplink_remote_port"` + } `json:"last_uplink"` + Stat UAPStat `json:"stat"` + TxBytes FlexInt `json:"tx_bytes"` + RxBytes FlexInt `json:"rx_bytes"` + Bytes FlexInt `json:"bytes"` + VwireEnabled FlexBool `json:"vwireEnabled"` + UplinkTable []interface{} `json:"uplink_table"` + NumSta int `json:"num_sta"` + UserNumSta int `json:"user-num_sta"` + GuestNumSta int `json:"guest-num_sta"` + TwoPhaseAdopt FlexBool `json:"two_phase_adopt,omitempty"` +} + +// UAPStat holds the "stat" data for an access point. +// This is split out because of a JSON data format change from 5.10 to 5.11. +type UAPStat struct { + *Ap +} + +// Ap is a subtype of UAPStat to make unmarshalling of different controller versions possible. +type Ap struct { + SiteID string `json:"site_id"` + O string `json:"o"` + Oid string `json:"oid"` + Ap string `json:"ap"` + Time FlexInt `json:"time"` + Datetime time.Time `json:"datetime"` + Bytes FlexInt `json:"bytes"` + Duration FlexInt `json:"duration"` + WifiTxDropped FlexInt `json:"wifi_tx_dropped"` + RxErrors FlexInt `json:"rx_errors"` + RxDropped FlexInt `json:"rx_dropped"` + RxFrags FlexInt `json:"rx_frags"` + RxCrypts FlexInt `json:"rx_crypts"` + TxPackets FlexInt `json:"tx_packets"` + TxBytes FlexInt `json:"tx_bytes"` + TxErrors FlexInt `json:"tx_errors"` + TxDropped FlexInt `json:"tx_dropped"` + TxRetries FlexInt `json:"tx_retries"` + RxPackets FlexInt `json:"rx_packets"` + RxBytes FlexInt `json:"rx_bytes"` + UserRxDropped FlexInt `json:"user-rx_dropped"` + GuestRxDropped FlexInt `json:"guest-rx_dropped"` + UserRxErrors FlexInt `json:"user-rx_errors"` + GuestRxErrors FlexInt `json:"guest-rx_errors"` + UserRxPackets FlexInt `json:"user-rx_packets"` + GuestRxPackets FlexInt `json:"guest-rx_packets"` + UserRxBytes FlexInt `json:"user-rx_bytes"` + GuestRxBytes FlexInt `json:"guest-rx_bytes"` + UserRxCrypts FlexInt `json:"user-rx_crypts"` + GuestRxCrypts FlexInt `json:"guest-rx_crypts"` + UserRxFrags FlexInt `json:"user-rx_frags"` + GuestRxFrags FlexInt `json:"guest-rx_frags"` + UserTxPackets FlexInt `json:"user-tx_packets"` + GuestTxPackets FlexInt `json:"guest-tx_packets"` + UserTxBytes FlexInt `json:"user-tx_bytes"` + GuestTxBytes FlexInt `json:"guest-tx_bytes"` + UserTxErrors FlexInt `json:"user-tx_errors"` + GuestTxErrors FlexInt `json:"guest-tx_errors"` + UserTxDropped FlexInt `json:"user-tx_dropped"` + GuestTxDropped FlexInt `json:"guest-tx_dropped"` + UserTxRetries FlexInt `json:"user-tx_retries"` + GuestTxRetries FlexInt `json:"guest-tx_retries"` + MacFilterRejections FlexInt `json:"mac_filter_rejections"` + UserMacFilterRejections FlexInt `json:"user-mac_filter_rejections"` + GuestMacFilterRejections FlexInt `json:"guest-mac_filter_rejections"` + WifiTxAttempts FlexInt `json:"wifi_tx_attempts"` + UserWifiTxDropped FlexInt `json:"user-wifi_tx_dropped"` + GuestWifiTxDropped FlexInt `json:"guest-wifi_tx_dropped"` + UserWifiTxAttempts FlexInt `json:"user-wifi_tx_attempts"` + GuestWifiTxAttempts FlexInt `json:"guest-wifi_tx_attempts"` + + // UAP-AC-PRO names, others may differ. + /* These are all in VAP TABLE */ + /* + GuestWifi0RxPackets FlexInt `json:"guest-wifi0-rx_packets"` + GuestWifi1RxPackets FlexInt `json:"guest-wifi1-rx_packets"` + UserWifi1RxPackets FlexInt `json:"user-wifi1-rx_packets"` + UserWifi0RxPackets FlexInt `json:"user-wifi0-rx_packets"` + Wifi0RxPackets FlexInt `json:"wifi0-rx_packets"` + Wifi1RxPackets FlexInt `json:"wifi1-rx_packets"` + GuestWifi0RxBytes FlexInt `json:"guest-wifi0-rx_bytes"` + GuestWifi1RxBytes FlexInt `json:"guest-wifi1-rx_bytes"` + UserWifi1RxBytes FlexInt `json:"user-wifi1-rx_bytes"` + UserWifi0RxBytes FlexInt `json:"user-wifi0-rx_bytes"` + Wifi0RxBytes FlexInt `json:"wifi0-rx_bytes"` + Wifi1RxBytes FlexInt `json:"wifi1-rx_bytes"` + GuestWifi0RxErrors FlexInt `json:"guest-wifi0-rx_errors"` + GuestWifi1RxErrors FlexInt `json:"guest-wifi1-rx_errors"` + UserWifi1RxErrors FlexInt `json:"user-wifi1-rx_errors"` + UserWifi0RxErrors FlexInt `json:"user-wifi0-rx_errors"` + Wifi0RxErrors FlexInt `json:"wifi0-rx_errors"` + Wifi1RxErrors FlexInt `json:"wifi1-rx_errors"` + GuestWifi0RxDropped FlexInt `json:"guest-wifi0-rx_dropped"` + GuestWifi1RxDropped FlexInt `json:"guest-wifi1-rx_dropped"` + UserWifi1RxDropped FlexInt `json:"user-wifi1-rx_dropped"` + UserWifi0RxDropped FlexInt `json:"user-wifi0-rx_dropped"` + Wifi0RxDropped FlexInt `json:"wifi0-rx_dropped"` + Wifi1RxDropped FlexInt `json:"wifi1-rx_dropped"` + GuestWifi0RxCrypts FlexInt `json:"guest-wifi0-rx_crypts"` + GuestWifi1RxCrypts FlexInt `json:"guest-wifi1-rx_crypts"` + UserWifi1RxCrypts FlexInt `json:"user-wifi1-rx_crypts"` + UserWifi0RxCrypts FlexInt `json:"user-wifi0-rx_crypts"` + Wifi0RxCrypts FlexInt `json:"wifi0-rx_crypts"` + Wifi1RxCrypts FlexInt `json:"wifi1-rx_crypts"` + GuestWifi0RxFrags FlexInt `json:"guest-wifi0-rx_frags"` + GuestWifi1RxFrags FlexInt `json:"guest-wifi1-rx_frags"` + UserWifi1RxFrags FlexInt `json:"user-wifi1-rx_frags"` + UserWifi0RxFrags FlexInt `json:"user-wifi0-rx_frags"` + Wifi0RxFrags FlexInt `json:"wifi0-rx_frags"` + Wifi1RxFrags FlexInt `json:"wifi1-rx_frags"` + GuestWifi0TxPackets FlexInt `json:"guest-wifi0-tx_packets"` + GuestWifi1TxPackets FlexInt `json:"guest-wifi1-tx_packets"` + UserWifi1TxPackets FlexInt `json:"user-wifi1-tx_packets"` + UserWifi0TxPackets FlexInt `json:"user-wifi0-tx_packets"` + Wifi0TxPackets FlexInt `json:"wifi0-tx_packets"` + Wifi1TxPackets FlexInt `json:"wifi1-tx_packets"` + GuestWifi0TxBytes FlexInt `json:"guest-wifi0-tx_bytes"` + GuestWifi1TxBytes FlexInt `json:"guest-wifi1-tx_bytes"` + UserWifi1TxBytes FlexInt `json:"user-wifi1-tx_bytes"` + UserWifi0TxBytes FlexInt `json:"user-wifi0-tx_bytes"` + Wifi0TxBytes FlexInt `json:"wifi0-tx_bytes"` + Wifi1TxBytes FlexInt `json:"wifi1-tx_bytes"` + GuestWifi0TxErrors FlexInt `json:"guest-wifi0-tx_errors"` + GuestWifi1TxErrors FlexInt `json:"guest-wifi1-tx_errors"` + UserWifi1TxErrors FlexInt `json:"user-wifi1-tx_errors"` + UserWifi0TxErrors FlexInt `json:"user-wifi0-tx_errors"` + Wifi0TxErrors FlexInt `json:"wifi0-tx_errors"` + Wifi1TxErrors FlexInt `json:"wifi1-tx_errors"` + GuestWifi0TxDropped FlexInt `json:"guest-wifi0-tx_dropped"` + GuestWifi1TxDropped FlexInt `json:"guest-wifi1-tx_dropped"` + UserWifi1TxDropped FlexInt `json:"user-wifi1-tx_dropped"` + UserWifi0TxDropped FlexInt `json:"user-wifi0-tx_dropped"` + Wifi0TxDropped FlexInt `json:"wifi0-tx_dropped"` + Wifi1TxDropped FlexInt `json:"wifi1-tx_dropped"` + GuestWifi0TxRetries FlexInt `json:"guest-wifi0-tx_retries"` + GuestWifi1TxRetries FlexInt `json:"guest-wifi1-tx_retries"` + UserWifi1TxRetries FlexInt `json:"user-wifi1-tx_retries"` + UserWifi0TxRetries FlexInt `json:"user-wifi0-tx_retries"` + Wifi0TxRetries FlexInt `json:"wifi0-tx_retries"` + Wifi1TxRetries FlexInt `json:"wifi1-tx_retries"` + GuestWifi0MacFilterRejections FlexInt `json:"guest-wifi0-mac_filter_rejections"` + GuestWifi1MacFilterRejections FlexInt `json:"guest-wifi1-mac_filter_rejections"` + UserWifi1MacFilterRejections FlexInt `json:"user-wifi1-mac_filter_rejections"` + UserWifi0MacFilterRejections FlexInt `json:"user-wifi0-mac_filter_rejections"` + Wifi0MacFilterRejections FlexInt `json:"wifi0-mac_filter_rejections"` + Wifi1MacFilterRejections FlexInt `json:"wifi1-mac_filter_rejections"` + GuestWifi0WifiTxAttempts FlexInt `json:"guest-wifi0-wifi_tx_attempts"` + GuestWifi1WifiTxAttempts FlexInt `json:"guest-wifi1-wifi_tx_attempts"` + UserWifi1WifiTxAttempts FlexInt `json:"user-wifi1-wifi_tx_attempts"` + UserWifi0WifiTxAttempts FlexInt `json:"user-wifi0-wifi_tx_attempts"` + Wifi0WifiTxAttempts FlexInt `json:"wifi0-wifi_tx_attempts"` + Wifi1WifiTxAttempts FlexInt `json:"wifi1-wifi_tx_attempts"` + GuestWifi0WifiTxDropped FlexInt `json:"guest-wifi0-wifi_tx_dropped"` + GuestWifi1WifiTxDropped FlexInt `json:"guest-wifi1-wifi_tx_dropped"` + UserWifi1WifiTxDropped FlexInt `json:"user-wifi1-wifi_tx_dropped"` + UserWifi0WifiTxDropped FlexInt `json:"user-wifi0-wifi_tx_dropped"` + Wifi0WifiTxDropped FlexInt `json:"wifi0-wifi_tx_dropped"` + Wifi1WifiTxDropped FlexInt `json:"wifi1-wifi_tx_dropped"` + // UDM Names + GuestRa0RxPackets FlexInt `json:"guest-ra0-rx_packets"` + UserRa0RxPackets FlexInt `json:"user-ra0-rx_packets"` + Ra0RxPackets FlexInt `json:"ra0-rx_packets"` + GuestRa0RxBytes FlexInt `json:"guest-ra0-rx_bytes"` + UserRa0RxBytes FlexInt `json:"user-ra0-rx_bytes"` + Ra0RxBytes FlexInt `json:"ra0-rx_bytes"` + GuestRa0RxErrors FlexInt `json:"guest-ra0-rx_errors"` + UserRa0RxErrors FlexInt `json:"user-ra0-rx_errors"` + Ra0RxErrors FlexInt `json:"ra0-rx_errors"` + GuestRa0RxDropped FlexInt `json:"guest-ra0-rx_dropped"` + UserRa0RxDropped FlexInt `json:"user-ra0-rx_dropped"` + Ra0RxDropped FlexInt `json:"ra0-rx_dropped"` + GuestRa0RxCrypts FlexInt `json:"guest-ra0-rx_crypts"` + UserRa0RxCrypts FlexInt `json:"user-ra0-rx_crypts"` + Ra0RxCrypts FlexInt `json:"ra0-rx_crypts"` + GuestRa0RxFrags FlexInt `json:"guest-ra0-rx_frags"` + UserRa0RxFrags FlexInt `json:"user-ra0-rx_frags"` + Ra0RxFrags FlexInt `json:"ra0-rx_frags"` + GuestRa0TxPackets FlexInt `json:"guest-ra0-tx_packets"` + UserRa0TxPackets FlexInt `json:"user-ra0-tx_packets"` + Ra0TxPackets FlexInt `json:"ra0-tx_packets"` + GuestRa0TxBytes FlexInt `json:"guest-ra0-tx_bytes"` + UserRa0TxBytes FlexInt `json:"user-ra0-tx_bytes"` + Ra0TxBytes FlexInt `json:"ra0-tx_bytes"` + GuestRa0TxErrors FlexInt `json:"guest-ra0-tx_errors"` + UserRa0TxErrors FlexInt `json:"user-ra0-tx_errors"` + Ra0TxErrors FlexInt `json:"ra0-tx_errors"` + GuestRa0TxDropped FlexInt `json:"guest-ra0-tx_dropped"` + UserRa0TxDropped FlexInt `json:"user-ra0-tx_dropped"` + Ra0TxDropped FlexInt `json:"ra0-tx_dropped"` + GuestRa0TxRetries FlexInt `json:"guest-ra0-tx_retries"` + UserRa0TxRetries FlexInt `json:"user-ra0-tx_retries"` + Ra0TxRetries FlexInt `json:"ra0-tx_retries"` + GuestRa0MacFilterRejections FlexInt `json:"guest-ra0-mac_filter_rejections"` + UserRa0MacFilterRejections FlexInt `json:"user-ra0-mac_filter_rejections"` + Ra0MacFilterRejections FlexInt `json:"ra0-mac_filter_rejections"` + GuestRa0WifiTxAttempts FlexInt `json:"guest-ra0-wifi_tx_attempts"` + UserRa0WifiTxAttempts FlexInt `json:"user-ra0-wifi_tx_attempts"` + Ra0WifiTxAttempts FlexInt `json:"ra0-wifi_tx_attempts"` + GuestRa0WifiTxDropped FlexInt `json:"guest-ra0-wifi_tx_dropped"` + UserRa0WifiTxDropped FlexInt `json:"user-ra0-wifi_tx_dropped"` + Ra0WifiTxDropped FlexInt `json:"ra0-wifi_tx_dropped"` + GuestRai0RxPackets FlexInt `json:"guest-rai0-rx_packets"` + UserRai0RxPackets FlexInt `json:"user-rai0-rx_packets"` + Rai0RxPackets FlexInt `json:"rai0-rx_packets"` + GuestRai0RxBytes FlexInt `json:"guest-rai0-rx_bytes"` + UserRai0RxBytes FlexInt `json:"user-rai0-rx_bytes"` + Rai0RxBytes FlexInt `json:"rai0-rx_bytes"` + GuestRai0RxErrors FlexInt `json:"guest-rai0-rx_errors"` + UserRai0RxErrors FlexInt `json:"user-rai0-rx_errors"` + Rai0RxErrors FlexInt `json:"rai0-rx_errors"` + GuestRai0RxDropped FlexInt `json:"guest-rai0-rx_dropped"` + UserRai0RxDropped FlexInt `json:"user-rai0-rx_dropped"` + Rai0RxDropped FlexInt `json:"rai0-rx_dropped"` + GuestRai0RxCrypts FlexInt `json:"guest-rai0-rx_crypts"` + UserRai0RxCrypts FlexInt `json:"user-rai0-rx_crypts"` + Rai0RxCrypts FlexInt `json:"rai0-rx_crypts"` + GuestRai0RxFrags FlexInt `json:"guest-rai0-rx_frags"` + UserRai0RxFrags FlexInt `json:"user-rai0-rx_frags"` + Rai0RxFrags FlexInt `json:"rai0-rx_frags"` + GuestRai0TxPackets FlexInt `json:"guest-rai0-tx_packets"` + UserRai0TxPackets FlexInt `json:"user-rai0-tx_packets"` + Rai0TxPackets FlexInt `json:"rai0-tx_packets"` + GuestRai0TxBytes FlexInt `json:"guest-rai0-tx_bytes"` + UserRai0TxBytes FlexInt `json:"user-rai0-tx_bytes"` + Rai0TxBytes FlexInt `json:"rai0-tx_bytes"` + GuestRai0TxErrors FlexInt `json:"guest-rai0-tx_errors"` + UserRai0TxErrors FlexInt `json:"user-rai0-tx_errors"` + Rai0TxErrors FlexInt `json:"rai0-tx_errors"` + GuestRai0TxDropped FlexInt `json:"guest-rai0-tx_dropped"` + UserRai0TxDropped FlexInt `json:"user-rai0-tx_dropped"` + Rai0TxDropped FlexInt `json:"rai0-tx_dropped"` + GuestRai0TxRetries FlexInt `json:"guest-rai0-tx_retries"` + UserRai0TxRetries FlexInt `json:"user-rai0-tx_retries"` + Rai0TxRetries FlexInt `json:"rai0-tx_retries"` + GuestRai0MacFilterRejections FlexInt `json:"guest-rai0-mac_filter_rejections"` + UserRai0MacFilterRejections FlexInt `json:"user-rai0-mac_filter_rejections"` + Rai0MacFilterRejections FlexInt `json:"rai0-mac_filter_rejections"` + GuestRai0WifiTxAttempts FlexInt `json:"guest-rai0-wifi_tx_attempts"` + UserRai0WifiTxAttempts FlexInt `json:"user-rai0-wifi_tx_attempts"` + Rai0WifiTxAttempts FlexInt `json:"rai0-wifi_tx_attempts"` + GuestRai0WifiTxDropped FlexInt `json:"guest-rai0-wifi_tx_dropped"` + UserRai0WifiTxDropped FlexInt `json:"user-rai0-wifi_tx_dropped"` + Rai0WifiTxDropped FlexInt `json:"rai0-wifi_tx_dropped"` + */ +} + +// RadioTable is part of the data for UAPs and UDMs. +type RadioTable []struct { + AntennaGain FlexInt `json:"antenna_gain"` + BuiltinAntGain FlexInt `json:"builtin_ant_gain"` + BuiltinAntenna FlexBool `json:"builtin_antenna"` + Channel FlexInt `json:"channel"` + CurrentAntennaGain FlexInt `json:"current_antenna_gain"` + HasDfs FlexBool `json:"has_dfs"` + HasFccdfs FlexBool `json:"has_fccdfs"` + HasHt160 FlexBool `json:"has_ht160"` + Ht string `json:"ht"` + Is11Ac FlexBool `json:"is_11ac"` + MaxTxpower FlexInt `json:"max_txpower"` + MinRssi FlexInt `json:"min_rssi,omitempty"` + MinRssiEnabled FlexBool `json:"min_rssi_enabled"` + MinTxpower FlexInt `json:"min_txpower"` + Name string `json:"name"` + Nss FlexInt `json:"nss"` + Radio string `json:"radio"` + RadioCaps FlexInt `json:"radio_caps"` + SensLevelEnabled FlexBool `json:"sens_level_enabled"` + TxPower FlexInt `json:"tx_power"` + TxPowerMode string `json:"tx_power_mode"` + VwireEnabled FlexBool `json:"vwire_enabled"` + WlangroupID string `json:"wlangroup_id"` +} + +// RadioTableStats is part of the data shared between UAP and UDM +type RadioTableStats []struct { + Name string `json:"name"` + Channel FlexInt `json:"channel"` + Radio string `json:"radio"` + AstTxto interface{} `json:"ast_txto"` + AstCst interface{} `json:"ast_cst"` + AstBeXmit FlexInt `json:"ast_be_xmit"` + CuTotal FlexInt `json:"cu_total"` + CuSelfRx FlexInt `json:"cu_self_rx"` + CuSelfTx FlexInt `json:"cu_self_tx"` + Gain FlexInt `json:"gain"` + Satisfaction FlexInt `json:"satisfaction"` + State string `json:"state"` + Extchannel FlexInt `json:"extchannel"` + TxPower FlexInt `json:"tx_power"` + TxPackets FlexInt `json:"tx_packets"` + TxRetries FlexInt `json:"tx_retries"` + NumSta FlexInt `json:"num_sta"` + GuestNumSta FlexInt `json:"guest-num_sta"` + UserNumSta FlexInt `json:"user-num_sta"` +} + +// VapTable holds much of the UAP wireless data. Shared by UDM. +type VapTable []struct { + AnomaliesBarChart struct { + HighDNSLatency FlexInt `json:"high_dns_latency"` + HighTCPLatency FlexInt `json:"high_tcp_latency"` + HighTCPPacketLoss FlexInt `json:"high_tcp_packet_loss"` + HighWifiLatency FlexInt `json:"high_wifi_latency"` + HighWifiRetries FlexInt `json:"high_wifi_retries"` + LowPhyRate FlexInt `json:"low_phy_rate"` + PoorStreamEff FlexInt `json:"poor_stream_eff"` + SleepyClient FlexInt `json:"sleepy_client"` + StaArpTimeout FlexInt `json:"sta_arp_timeout"` + StaDNSTimeout FlexInt `json:"sta_dns_timeout"` + StaIPTimeout FlexInt `json:"sta_ip_timeout"` + WeakSignal FlexInt `json:"weak_signal"` + } `json:"anomalies_bar_chart"` + AnomaliesBarChartNow struct { + HighDNSLatency FlexInt `json:"high_dns_latency"` + HighTCPLatency FlexInt `json:"high_tcp_latency"` + HighTCPPacketLoss FlexInt `json:"high_tcp_packet_loss"` + HighWifiLatency FlexInt `json:"high_wifi_latency"` + HighWifiRetries FlexInt `json:"high_wifi_retries"` + LowPhyRate FlexInt `json:"low_phy_rate"` + PoorStreamEff FlexInt `json:"poor_stream_eff"` + SleepyClient FlexInt `json:"sleepy_client"` + StaArpTimeout FlexInt `json:"sta_arp_timeout"` + StaDNSTimeout FlexInt `json:"sta_dns_timeout"` + StaIPTimeout FlexInt `json:"sta_ip_timeout"` + WeakSignal FlexInt `json:"weak_signal"` + } `json:"anomalies_bar_chart_now"` + ReasonsBarChart struct { + PhyRate FlexInt `json:"phy_rate"` + Signal FlexInt `json:"signal"` + SleepyClient FlexInt `json:"sleepy_client"` + StaArpTimeout FlexInt `json:"sta_arp_timeout"` + StaDNSLatency FlexInt `json:"sta_dns_latency"` + StaDNSTimeout FlexInt `json:"sta_dns_timeout"` + StaIPTimeout FlexInt `json:"sta_ip_timeout"` + StreamEff FlexInt `json:"stream_eff"` + TCPLatency FlexInt `json:"tcp_latency"` + TCPPacketLoss FlexInt `json:"tcp_packet_loss"` + WifiLatency FlexInt `json:"wifi_latency"` + WifiRetries FlexInt `json:"wifi_retries"` + } `json:"reasons_bar_chart"` + ReasonsBarChartNow struct { + PhyRate FlexInt `json:"phy_rate"` + Signal FlexInt `json:"signal"` + SleepyClient FlexInt `json:"sleepy_client"` + StaArpTimeout FlexInt `json:"sta_arp_timeout"` + StaDNSLatency FlexInt `json:"sta_dns_latency"` + StaDNSTimeout FlexInt `json:"sta_dns_timeout"` + StaIPTimeout FlexInt `json:"sta_ip_timeout"` + StreamEff FlexInt `json:"stream_eff"` + TCPLatency FlexInt `json:"tcp_latency"` + TCPPacketLoss FlexInt `json:"tcp_packet_loss"` + WifiLatency FlexInt `json:"wifi_latency"` + WifiRetries FlexInt `json:"wifi_retries"` + } `json:"reasons_bar_chart_now"` + RxTCPStats struct { + Goodbytes FlexInt `json:"goodbytes"` + LatAvg FlexInt `json:"lat_avg"` + LatMax FlexInt `json:"lat_max"` + LatMin FlexInt `json:"lat_min"` + Stalls FlexInt `json:"stalls"` + } `json:"rx_tcp_stats"` + TxTCPStats struct { + Goodbytes FlexInt `json:"goodbytes"` + LatAvg FlexInt `json:"lat_avg"` + LatMax FlexInt `json:"lat_max"` + LatMin FlexInt `json:"lat_min"` + Stalls FlexInt `json:"stalls"` + } `json:"tx_tcp_stats"` + WifiTxLatencyMov struct { + Avg FlexInt `json:"avg"` + Max FlexInt `json:"max"` + Min FlexInt `json:"min"` + Total FlexInt `json:"total"` + TotalCount FlexInt `json:"total_count"` + } `json:"wifi_tx_latency_mov"` + ApMac string `json:"ap_mac"` + AvgClientSignal FlexInt `json:"avg_client_signal"` + Bssid string `json:"bssid"` + Ccq int `json:"ccq"` + Channel int `json:"channel"` + DNSAvgLatency FlexInt `json:"dns_avg_latency"` + Essid string `json:"essid"` + Extchannel int `json:"extchannel"` + ID string `json:"id"` + IsGuest FlexBool `json:"is_guest"` + IsWep FlexBool `json:"is_wep"` + MacFilterRejections int `json:"mac_filter_rejections"` + MapID interface{} `json:"map_id"` + Name string `json:"name"` + NumSatisfactionSta FlexInt `json:"num_satisfaction_sta"` + NumSta int `json:"num_sta"` + Radio string `json:"radio"` + RadioName string `json:"radio_name"` + RxBytes FlexInt `json:"rx_bytes"` + RxCrypts FlexInt `json:"rx_crypts"` + RxDropped FlexInt `json:"rx_dropped"` + RxErrors FlexInt `json:"rx_errors"` + RxFrags FlexInt `json:"rx_frags"` + RxNwids FlexInt `json:"rx_nwids"` + RxPackets FlexInt `json:"rx_packets"` + Satisfaction FlexInt `json:"satisfaction"` + SatisfactionNow FlexInt `json:"satisfaction_now"` + SiteID string `json:"site_id"` + State string `json:"state"` + T string `json:"t"` + TxBytes FlexInt `json:"tx_bytes"` + TxCombinedRetries FlexInt `json:"tx_combined_retries"` + TxDataMpduBytes FlexInt `json:"tx_data_mpdu_bytes"` + TxDropped FlexInt `json:"tx_dropped"` + TxErrors FlexInt `json:"tx_errors"` + TxPackets FlexInt `json:"tx_packets"` + TxPower FlexInt `json:"tx_power"` + TxRetries FlexInt `json:"tx_retries"` + TxRtsRetries FlexInt `json:"tx_rts_retries"` + TxSuccess FlexInt `json:"tx_success"` + TxTotal FlexInt `json:"tx_total"` + Up FlexBool `json:"up"` + Usage string `json:"usage"` + WifiTxAttempts FlexInt `json:"wifi_tx_attempts"` + WifiTxDropped FlexInt `json:"wifi_tx_dropped"` + WlanconfID string `json:"wlanconf_id"` +} + +// UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Access Point Stat data. +func (v *UAPStat) UnmarshalJSON(data []byte) error { + var n struct { + Ap `json:"ap"` + } + v.Ap = &n.Ap + err := json.Unmarshal(data, v.Ap) // controller version 5.10. + if err != nil { + return json.Unmarshal(data, &n) // controller version 5.11. + } + return nil +} diff --git a/core/unifi/uap_type_test.go b/core/unifi/uap_test.go similarity index 100% rename from core/unifi/uap_type_test.go rename to core/unifi/uap_test.go diff --git a/core/unifi/uap_type.go b/core/unifi/uap_type.go deleted file mode 100644 index a83657b7..00000000 --- a/core/unifi/uap_type.go +++ /dev/null @@ -1,449 +0,0 @@ -package unifi - -import ( - "encoding/json" - "time" -) - -// UAP represents all the data from the Ubiquiti Controller for a Unifi Access Point. -type UAP struct { - /* This was auto generated and then slowly edited by hand - to get all the data types right and graphable. - */ - ID string `json:"_id"` - Adopted FlexBool `json:"adopted"` - AntennaTable []struct { - Default FlexBool `json:"default"` - ID FlexInt `json:"id"` - Name string `json:"name"` - Wifi0Gain FlexInt `json:"wifi0_gain"` - Wifi1Gain FlexInt `json:"wifi1_gain"` - } `json:"antenna_table"` - BandsteeringMode string `json:"bandsteering_mode,omitempty"` - BoardRev int `json:"board_rev"` - Cfgversion string `json:"cfgversion"` - ConfigNetwork struct { - Type string `json:"type"` - IP string `json:"ip"` - } `json:"config_network"` - CountrycodeTable []int `json:"countrycode_table"` - EthernetTable []struct { - Mac string `json:"mac"` - NumPort FlexInt `json:"num_port"` - Name string `json:"name"` - } `json:"ethernet_table"` - FwCaps int `json:"fw_caps"` - HasEth1 FlexBool `json:"has_eth1"` - HasSpeaker FlexBool `json:"has_speaker"` - InformIP string `json:"inform_ip"` - InformURL string `json:"inform_url"` - IP string `json:"ip"` - LedOverride string `json:"led_override"` - Mac string `json:"mac"` - MeshStaVapEnabled FlexBool `json:"mesh_sta_vap_enabled"` - Model string `json:"model"` - Name string `json:"name"` - OutdoorModeOverride string `json:"outdoor_mode_override"` - PortTable []Port `json:"port_table"` - RadioTable []struct { - Radio string `json:"radio"` - Name string `json:"name"` - Channel FlexInt `json:"channel"` - Ht string `json:"ht"` - TxPowerMode string `json:"tx_power_mode"` - TxPower FlexInt `json:"tx_power"` - MaxTxpower FlexInt `json:"max_txpower"` - MinTxpower FlexInt `json:"min_txpower"` - Nss FlexInt `json:"nss"` - MinRssiEnabled FlexBool `json:"min_rssi_enabled"` - BuiltinAntenna FlexBool `json:"builtin_antenna"` - BuiltinAntGain FlexInt `json:"builtin_ant_gain"` - CurrentAntennaGain FlexInt `json:"current_antenna_gain"` - RadioCaps FlexInt `json:"radio_caps"` - WlangroupID string `json:"wlangroup_id"` - Is11Ac FlexBool `json:"is_11ac,omitempty"` - HasDfs FlexBool `json:"has_dfs,omitempty"` - HasFccdfs FlexBool `json:"has_fccdfs,omitempty"` - } `json:"radio_table"` - ScanRadioTable []interface{} `json:"scan_radio_table"` - Serial string `json:"serial"` - SiteID string `json:"site_id"` - SiteName string `json:"-"` - Type string `json:"type"` - Version string `json:"version"` - VwireTable []interface{} `json:"vwire_table"` - WifiCaps int `json:"wifi_caps"` - WlangroupIDNa string `json:"wlangroup_id_na"` - WlangroupIDNg string `json:"wlangroup_id_ng"` - RequiredVersion string `json:"required_version"` - HwCaps int `json:"hw_caps"` - Unsupported FlexBool `json:"unsupported"` - UnsupportedReason FlexInt `json:"unsupported_reason"` - SysErrorCaps int `json:"sys_error_caps"` - HasFan FlexBool `json:"has_fan"` - HasTemperature FlexBool `json:"has_temperature"` - DeviceID string `json:"device_id"` - State int `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"` - UUptime FlexInt `json:"_uptime"` - Locating FlexBool `json:"locating"` - ConnectRequestIP string `json:"connect_request_ip"` - ConnectRequestPort string `json:"connect_request_port"` - SysStats SysStats `json:"sys_stats"` - SystemStats SystemStats `json:"system-stats"` - SSHSessionTable []interface{} `json:"ssh_session_table"` - Scanning FlexBool `json:"scanning"` - SpectrumScanning FlexBool `json:"spectrum_scanning"` - GuestToken string `json:"guest_token"` - Meshv3PeerMac string `json:"meshv3_peer_mac"` - Satisfaction FlexInt `json:"satisfaction"` - Isolated FlexBool `json:"isolated"` - RadioTableStats []struct { - Name string `json:"name"` - Channel FlexInt `json:"channel"` - Radio string `json:"radio"` - AstTxto interface{} `json:"ast_txto"` - AstCst interface{} `json:"ast_cst"` - AstBeXmit FlexInt `json:"ast_be_xmit"` - CuTotal FlexInt `json:"cu_total"` - CuSelfRx FlexInt `json:"cu_self_rx"` - CuSelfTx FlexInt `json:"cu_self_tx"` - Gain FlexInt `json:"gain"` - State string `json:"state"` - Extchannel FlexInt `json:"extchannel"` - TxPower FlexInt `json:"tx_power"` - TxPackets FlexInt `json:"tx_packets"` - TxRetries FlexInt `json:"tx_retries"` - NumSta FlexInt `json:"num_sta"` - GuestNumSta FlexInt `json:"guest-num_sta"` - UserNumSta FlexInt `json:"user-num_sta"` - } `json:"radio_table_stats"` - Uplink struct { - FullDuplex FlexBool `json:"full_duplex"` - IP string `json:"ip"` - Mac string `json:"mac"` - MaxVlan int `json:"max_vlan"` - Name string `json:"name"` - Netmask string `json:"netmask"` - NumPort int `json:"num_port"` - RxBytes FlexInt `json:"rx_bytes"` - RxDropped FlexInt `json:"rx_dropped"` - RxErrors FlexInt `json:"rx_errors"` - RxMulticast FlexInt `json:"rx_multicast"` - RxPackets FlexInt `json:"rx_packets"` - Speed FlexInt `json:"speed"` - TxBytes FlexInt `json:"tx_bytes"` - TxDropped FlexInt `json:"tx_dropped"` - TxErrors FlexInt `json:"tx_errors"` - TxPackets FlexInt `json:"tx_packets"` - Up FlexBool `json:"up"` - MaxSpeed FlexInt `json:"max_speed"` - Type string `json:"type"` - TxBytesR FlexInt `json:"tx_bytes-r"` - RxBytesR FlexInt `json:"rx_bytes-r"` - UplinkMac string `json:"uplink_mac"` - UplinkRemotePort int `json:"uplink_remote_port"` - } `json:"uplink"` - VapTable []struct { - AnomaliesBarChart struct { - HighTCPLatency FlexInt `json:"high_tcp_latency"` - HighTCPPacketLoss FlexInt `json:"high_tcp_packet_loss"` - HighWifiLatency FlexInt `json:"high_wifi_latency"` - HighWifiRetries FlexInt `json:"high_wifi_retries"` - LowPhyRate FlexInt `json:"low_phy_rate"` - PoorStreamEff FlexInt `json:"poor_stream_eff"` - SleepyClient FlexInt `json:"sleepy_client"` - StaArpTimeout FlexInt `json:"sta_arp_timeout"` - StaDNSTimeout FlexInt `json:"sta_dns_timeout"` - StaIPTimeout FlexInt `json:"sta_ip_timeout"` - WeakSignal FlexInt `json:"weak_signal"` - } `json:"anomalies_bar_chart"` - AnomaliesBarChartNow struct { - HighTCPLatency FlexInt `json:"high_tcp_latency"` - HighTCPPacketLoss FlexInt `json:"high_tcp_packet_loss"` - HighWifiLatency FlexInt `json:"high_wifi_latency"` - HighWifiRetries FlexInt `json:"high_wifi_retries"` - LowPhyRate FlexInt `json:"low_phy_rate"` - PoorStreamEff FlexInt `json:"poor_stream_eff"` - SleepyClient FlexInt `json:"sleepy_client"` - StaArpTimeout FlexInt `json:"sta_arp_timeout"` - StaDNSTimeout FlexInt `json:"sta_dns_timeout"` - StaIPTimeout FlexInt `json:"sta_ip_timeout"` - WeakSignal FlexInt `json:"weak_signal"` - } `json:"anomalies_bar_chart_now"` - AvgClientSignal FlexInt `json:"avg_client_signal"` - Bssid string `json:"bssid"` - Ccq int `json:"ccq"` - Channel int `json:"channel"` - Essid string `json:"essid"` - Extchannel int `json:"extchannel"` - ID string `json:"id"` - MacFilterRejections int `json:"mac_filter_rejections"` - Name string `json:"name"` - NumSatisfactionSta FlexInt `json:"num_satisfaction_sta"` - NumSta int `json:"num_sta"` - Radio string `json:"radio"` - RadioName string `json:"radio_name"` - ReasonsBarChart struct { - PhyRate FlexInt `json:"phy_rate"` - Signal FlexInt `json:"signal"` - SleepyClient FlexInt `json:"sleepy_client"` - StaArpTimeout FlexInt `json:"sta_arp_timeout"` - StaDNSTimeout FlexInt `json:"sta_dns_timeout"` - StaIPTimeout FlexInt `json:"sta_ip_timeout"` - StreamEff FlexInt `json:"stream_eff"` - TCPLatency FlexInt `json:"tcp_latency"` - TCPPacketLoss FlexInt `json:"tcp_packet_loss"` - WifiLatency FlexInt `json:"wifi_latency"` - WifiRetries FlexInt `json:"wifi_retries"` - } `json:"reasons_bar_chart"` - ReasonsBarChartNow struct { - PhyRate FlexInt `json:"phy_rate"` - Signal FlexInt `json:"signal"` - SleepyClient FlexInt `json:"sleepy_client"` - StaArpTimeout FlexInt `json:"sta_arp_timeout"` - StaDNSTimeout FlexInt `json:"sta_dns_timeout"` - StaIPTimeout FlexInt `json:"sta_ip_timeout"` - StreamEff FlexInt `json:"stream_eff"` - TCPLatency FlexInt `json:"tcp_latency"` - TCPPacketLoss FlexInt `json:"tcp_packet_loss"` - WifiLatency FlexInt `json:"wifi_latency"` - WifiRetries FlexInt `json:"wifi_retries"` - } `json:"reasons_bar_chart_now"` - RxBytes FlexInt `json:"rx_bytes"` - RxCrypts FlexInt `json:"rx_crypts"` - RxDropped FlexInt `json:"rx_dropped"` - RxErrors FlexInt `json:"rx_errors"` - RxFrags FlexInt `json:"rx_frags"` - RxNwids FlexInt `json:"rx_nwids"` - RxPackets FlexInt `json:"rx_packets"` - RxTCPStats struct { - Goodbytes FlexInt `json:"goodbytes"` - LatAvg FlexInt `json:"lat_avg"` - LatMax FlexInt `json:"lat_max"` - LatMin FlexInt `json:"lat_min"` - Stalls FlexInt `json:"stalls"` - } `json:"rx_tcp_stats"` - Satisfaction FlexInt `json:"satisfaction"` - SatisfactionNow FlexInt `json:"satisfaction_now"` - State string `json:"state"` - TxBytes FlexInt `json:"tx_bytes"` - TxCombinedRetries FlexInt `json:"tx_combined_retries"` - TxDataMpduBytes FlexInt `json:"tx_data_mpdu_bytes"` - TxDropped FlexInt `json:"tx_dropped"` - TxErrors FlexInt `json:"tx_errors"` - TxPackets FlexInt `json:"tx_packets"` - TxPower FlexInt `json:"tx_power"` - TxRetries FlexInt `json:"tx_retries"` - TxRtsRetries FlexInt `json:"tx_rts_retries"` - TxSuccess FlexInt `json:"tx_success"` - TxTCPStats struct { - Goodbytes FlexInt `json:"goodbytes"` - LatAvg FlexInt `json:"lat_avg"` - LatMax FlexInt `json:"lat_max"` - LatMin FlexInt `json:"lat_min"` - Stalls FlexInt `json:"stalls"` - } `json:"tx_tcp_stats"` - TxTotal FlexInt `json:"tx_total"` - Up FlexBool `json:"up"` - Usage string `json:"usage"` - WifiTxAttempts FlexInt `json:"wifi_tx_attempts"` - WifiTxDropped FlexInt `json:"wifi_tx_dropped"` - WifiTxLatencyMov struct { - Avg FlexInt `json:"avg"` - Max FlexInt `json:"max"` - Min FlexInt `json:"min"` - Total FlexInt `json:"total"` - TotalCount FlexInt `json:"total_count"` - } `json:"wifi_tx_latency_mov"` - T string `json:"t"` - WlanconfID string `json:"wlanconf_id"` - IsGuest FlexBool `json:"is_guest"` - IsWep FlexBool `json:"is_wep"` - ApMac string `json:"ap_mac"` - MapID interface{} `json:"map_id"` - SiteID string `json:"site_id"` - } `json:"vap_table"` - DownlinkTable []interface{} `json:"downlink_table"` - VwireVapTable []interface{} `json:"vwire_vap_table"` - BytesD FlexInt `json:"bytes-d"` - TxBytesD FlexInt `json:"tx_bytes-d"` - RxBytesD FlexInt `json:"rx_bytes-d"` - BytesR FlexInt `json:"bytes-r"` - LastUplink struct { - UplinkMac string `json:"uplink_mac"` - UplinkRemotePort int `json:"uplink_remote_port"` - } `json:"last_uplink"` - Stat UAPStat `json:"stat"` - TxBytes FlexInt `json:"tx_bytes"` - RxBytes FlexInt `json:"rx_bytes"` - Bytes FlexInt `json:"bytes"` - VwireEnabled FlexBool `json:"vwireEnabled"` - UplinkTable []interface{} `json:"uplink_table"` - NumSta int `json:"num_sta"` - UserNumSta int `json:"user-num_sta"` - GuestNumSta int `json:"guest-num_sta"` - TwoPhaseAdopt FlexBool `json:"two_phase_adopt,omitempty"` -} - -// UAPStat holds the "stat" data for an access point. -// This is split out because of a JSON data format change from 5.10 to 5.11. -type UAPStat struct { - *Ap -} - -// Ap is a subtype of UAPStat to make unmarshalling of different controller versions possible. -type Ap struct { - SiteID string `json:"site_id"` - O string `json:"o"` - Oid string `json:"oid"` - Ap string `json:"ap"` - Time FlexInt `json:"time"` - Datetime time.Time `json:"datetime"` - GuestWifi0RxPackets FlexInt `json:"guest-wifi0-rx_packets"` - GuestWifi1RxPackets FlexInt `json:"guest-wifi1-rx_packets"` - UserWifi1RxPackets FlexInt `json:"user-wifi1-rx_packets"` - UserWifi0RxPackets FlexInt `json:"user-wifi0-rx_packets"` - UserRxPackets FlexInt `json:"user-rx_packets"` - GuestRxPackets FlexInt `json:"guest-rx_packets"` - Wifi0RxPackets FlexInt `json:"wifi0-rx_packets"` - Wifi1RxPackets FlexInt `json:"wifi1-rx_packets"` - RxPackets FlexInt `json:"rx_packets"` - GuestWifi0RxBytes FlexInt `json:"guest-wifi0-rx_bytes"` - GuestWifi1RxBytes FlexInt `json:"guest-wifi1-rx_bytes"` - UserWifi1RxBytes FlexInt `json:"user-wifi1-rx_bytes"` - UserWifi0RxBytes FlexInt `json:"user-wifi0-rx_bytes"` - UserRxBytes FlexInt `json:"user-rx_bytes"` - GuestRxBytes FlexInt `json:"guest-rx_bytes"` - Wifi0RxBytes FlexInt `json:"wifi0-rx_bytes"` - Wifi1RxBytes FlexInt `json:"wifi1-rx_bytes"` - RxBytes FlexInt `json:"rx_bytes"` - GuestWifi0RxErrors FlexInt `json:"guest-wifi0-rx_errors"` - GuestWifi1RxErrors FlexInt `json:"guest-wifi1-rx_errors"` - UserWifi1RxErrors FlexInt `json:"user-wifi1-rx_errors"` - UserWifi0RxErrors FlexInt `json:"user-wifi0-rx_errors"` - UserRxErrors FlexInt `json:"user-rx_errors"` - GuestRxErrors FlexInt `json:"guest-rx_errors"` - Wifi0RxErrors FlexInt `json:"wifi0-rx_errors"` - Wifi1RxErrors FlexInt `json:"wifi1-rx_errors"` - RxErrors FlexInt `json:"rx_errors"` - GuestWifi0RxDropped FlexInt `json:"guest-wifi0-rx_dropped"` - GuestWifi1RxDropped FlexInt `json:"guest-wifi1-rx_dropped"` - UserWifi1RxDropped FlexInt `json:"user-wifi1-rx_dropped"` - UserWifi0RxDropped FlexInt `json:"user-wifi0-rx_dropped"` - UserRxDropped FlexInt `json:"user-rx_dropped"` - GuestRxDropped FlexInt `json:"guest-rx_dropped"` - Wifi0RxDropped FlexInt `json:"wifi0-rx_dropped"` - Wifi1RxDropped FlexInt `json:"wifi1-rx_dropped"` - RxDropped FlexInt `json:"rx_dropped"` - GuestWifi0RxCrypts FlexInt `json:"guest-wifi0-rx_crypts"` - GuestWifi1RxCrypts FlexInt `json:"guest-wifi1-rx_crypts"` - UserWifi1RxCrypts FlexInt `json:"user-wifi1-rx_crypts"` - UserWifi0RxCrypts FlexInt `json:"user-wifi0-rx_crypts"` - UserRxCrypts FlexInt `json:"user-rx_crypts"` - GuestRxCrypts FlexInt `json:"guest-rx_crypts"` - Wifi0RxCrypts FlexInt `json:"wifi0-rx_crypts"` - Wifi1RxCrypts FlexInt `json:"wifi1-rx_crypts"` - RxCrypts FlexInt `json:"rx_crypts"` - GuestWifi0RxFrags FlexInt `json:"guest-wifi0-rx_frags"` - GuestWifi1RxFrags FlexInt `json:"guest-wifi1-rx_frags"` - UserWifi1RxFrags FlexInt `json:"user-wifi1-rx_frags"` - UserWifi0RxFrags FlexInt `json:"user-wifi0-rx_frags"` - UserRxFrags FlexInt `json:"user-rx_frags"` - GuestRxFrags FlexInt `json:"guest-rx_frags"` - Wifi0RxFrags FlexInt `json:"wifi0-rx_frags"` - Wifi1RxFrags FlexInt `json:"wifi1-rx_frags"` - RxFrags FlexInt `json:"rx_frags"` - GuestWifi0TxPackets FlexInt `json:"guest-wifi0-tx_packets"` - GuestWifi1TxPackets FlexInt `json:"guest-wifi1-tx_packets"` - UserWifi1TxPackets FlexInt `json:"user-wifi1-tx_packets"` - UserWifi0TxPackets FlexInt `json:"user-wifi0-tx_packets"` - UserTxPackets FlexInt `json:"user-tx_packets"` - GuestTxPackets FlexInt `json:"guest-tx_packets"` - Wifi0TxPackets FlexInt `json:"wifi0-tx_packets"` - Wifi1TxPackets FlexInt `json:"wifi1-tx_packets"` - TxPackets FlexInt `json:"tx_packets"` - GuestWifi0TxBytes FlexInt `json:"guest-wifi0-tx_bytes"` - GuestWifi1TxBytes FlexInt `json:"guest-wifi1-tx_bytes"` - UserWifi1TxBytes FlexInt `json:"user-wifi1-tx_bytes"` - UserWifi0TxBytes FlexInt `json:"user-wifi0-tx_bytes"` - UserTxBytes FlexInt `json:"user-tx_bytes"` - GuestTxBytes FlexInt `json:"guest-tx_bytes"` - Wifi0TxBytes FlexInt `json:"wifi0-tx_bytes"` - Wifi1TxBytes FlexInt `json:"wifi1-tx_bytes"` - TxBytes FlexInt `json:"tx_bytes"` - GuestWifi0TxErrors FlexInt `json:"guest-wifi0-tx_errors"` - GuestWifi1TxErrors FlexInt `json:"guest-wifi1-tx_errors"` - UserWifi1TxErrors FlexInt `json:"user-wifi1-tx_errors"` - UserWifi0TxErrors FlexInt `json:"user-wifi0-tx_errors"` - UserTxErrors FlexInt `json:"user-tx_errors"` - GuestTxErrors FlexInt `json:"guest-tx_errors"` - Wifi0TxErrors FlexInt `json:"wifi0-tx_errors"` - Wifi1TxErrors FlexInt `json:"wifi1-tx_errors"` - TxErrors FlexInt `json:"tx_errors"` - GuestWifi0TxDropped FlexInt `json:"guest-wifi0-tx_dropped"` - GuestWifi1TxDropped FlexInt `json:"guest-wifi1-tx_dropped"` - UserWifi1TxDropped FlexInt `json:"user-wifi1-tx_dropped"` - UserWifi0TxDropped FlexInt `json:"user-wifi0-tx_dropped"` - UserTxDropped FlexInt `json:"user-tx_dropped"` - GuestTxDropped FlexInt `json:"guest-tx_dropped"` - Wifi0TxDropped FlexInt `json:"wifi0-tx_dropped"` - Wifi1TxDropped FlexInt `json:"wifi1-tx_dropped"` - TxDropped FlexInt `json:"tx_dropped"` - GuestWifi0TxRetries FlexInt `json:"guest-wifi0-tx_retries"` - GuestWifi1TxRetries FlexInt `json:"guest-wifi1-tx_retries"` - UserWifi1TxRetries FlexInt `json:"user-wifi1-tx_retries"` - UserWifi0TxRetries FlexInt `json:"user-wifi0-tx_retries"` - UserTxRetries FlexInt `json:"user-tx_retries"` - GuestTxRetries FlexInt `json:"guest-tx_retries"` - Wifi0TxRetries FlexInt `json:"wifi0-tx_retries"` - Wifi1TxRetries FlexInt `json:"wifi1-tx_retries"` - TxRetries FlexInt `json:"tx_retries"` - GuestWifi0MacFilterRejections FlexInt `json:"guest-wifi0-mac_filter_rejections"` - GuestWifi1MacFilterRejections FlexInt `json:"guest-wifi1-mac_filter_rejections"` - UserWifi1MacFilterRejections FlexInt `json:"user-wifi1-mac_filter_rejections"` - UserWifi0MacFilterRejections FlexInt `json:"user-wifi0-mac_filter_rejections"` - UserMacFilterRejections FlexInt `json:"user-mac_filter_rejections"` - GuestMacFilterRejections FlexInt `json:"guest-mac_filter_rejections"` - Wifi0MacFilterRejections FlexInt `json:"wifi0-mac_filter_rejections"` - Wifi1MacFilterRejections FlexInt `json:"wifi1-mac_filter_rejections"` - MacFilterRejections FlexInt `json:"mac_filter_rejections"` - GuestWifi0WifiTxAttempts FlexInt `json:"guest-wifi0-wifi_tx_attempts"` - GuestWifi1WifiTxAttempts FlexInt `json:"guest-wifi1-wifi_tx_attempts"` - UserWifi1WifiTxAttempts FlexInt `json:"user-wifi1-wifi_tx_attempts"` - UserWifi0WifiTxAttempts FlexInt `json:"user-wifi0-wifi_tx_attempts"` - UserWifiTxAttempts FlexInt `json:"user-wifi_tx_attempts"` - GuestWifiTxAttempts FlexInt `json:"guest-wifi_tx_attempts"` - Wifi0WifiTxAttempts FlexInt `json:"wifi0-wifi_tx_attempts"` - Wifi1WifiTxAttempts FlexInt `json:"wifi1-wifi_tx_attempts"` - WifiTxAttempts FlexInt `json:"wifi_tx_attempts"` - GuestWifi0WifiTxDropped FlexInt `json:"guest-wifi0-wifi_tx_dropped"` - GuestWifi1WifiTxDropped FlexInt `json:"guest-wifi1-wifi_tx_dropped"` - UserWifi1WifiTxDropped FlexInt `json:"user-wifi1-wifi_tx_dropped"` - UserWifi0WifiTxDropped FlexInt `json:"user-wifi0-wifi_tx_dropped"` - UserWifiTxDropped FlexInt `json:"user-wifi_tx_dropped"` - GuestWifiTxDropped FlexInt `json:"guest-wifi_tx_dropped"` - Wifi0WifiTxDropped FlexInt `json:"wifi0-wifi_tx_dropped"` - Wifi1WifiTxDropped FlexInt `json:"wifi1-wifi_tx_dropped"` - WifiTxDropped FlexInt `json:"wifi_tx_dropped"` - Bytes FlexInt `json:"bytes"` - Duration FlexInt `json:"duration"` -} - -// UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Access Point Stat data. -func (v *UAPStat) UnmarshalJSON(data []byte) error { - var n struct { - Ap `json:"ap"` - } - v.Ap = &n.Ap - err := json.Unmarshal(data, v.Ap) // controller version 5.10. - if err != nil { - return json.Unmarshal(data, &n) // controller version 5.11. - } - return nil -} diff --git a/core/unifi/udm.go b/core/unifi/udm.go new file mode 100644 index 00000000..840b12cd --- /dev/null +++ b/core/unifi/udm.go @@ -0,0 +1,208 @@ +package unifi + +// UDM represents all the data from the Ubiquiti Controller for a Unifi Dream Machine. +// The UDM shares several structs/type-data with USW and USG. +type UDM struct { + SiteID string `json:"site_id"` + SiteName string `json:"-"` + Mac string `json:"mac"` + Adopted FlexBool `json:"adopted"` + Serial string `json:"serial"` + IP string `json:"ip"` + Uptime FlexInt `json:"uptime"` + Model string `json:"model"` + Version string `json:"version"` + Name string `json:"name"` + Default FlexBool `json:"default"` + Locating FlexBool `json:"locating"` + Type string `json:"type"` + Unsupported FlexBool `json:"unsupported"` + UnsupportedReason FlexInt `json:"unsupported_reason"` + DiscoveredVia string `json:"discovered_via"` + AdoptIP string `json:"adopt_ip"` + AdoptURL string `json:"adopt_url"` + State FlexInt `json:"state"` + AdoptStatus FlexInt `json:"adopt_status"` + UpgradeState FlexInt `json:"upgrade_state"` + LastSeen FlexInt `json:"last_seen"` + AdoptableWhenUpgraded FlexBool `json:"adoptable_when_upgraded"` + Cfgversion string `json:"cfgversion"` + ConfigNetwork struct { + Type string `json:"type"` + IP string `json:"ip"` + } `json:"config_network"` + VwireTable []interface{} `json:"vwire_table"` + Dot1XPortctrlEnabled FlexBool `json:"dot1x_portctrl_enabled"` + JumboframeEnabled FlexBool `json:"jumboframe_enabled"` + FlowctrlEnabled FlexBool `json:"flowctrl_enabled"` + StpVersion string `json:"stp_version"` + StpPriority string `json:"stp_priority"` + PowerSourceCtrlEnabled FlexBool `json:"power_source_ctrl_enabled"` + LicenseState string `json:"license_state"` + ID string `json:"_id"` + DeviceID string `json:"device_id"` + AdoptState FlexInt `json:"adopt_state"` + AdoptTries FlexInt `json:"adopt_tries"` + AdoptManual FlexBool `json:"adopt_manual"` + InformURL string `json:"inform_url"` + InformIP string `json:"inform_ip"` + RequiredVersion string `json:"required_version"` + BoardRev FlexInt `json:"board_rev"` + EthernetTable []struct { + Mac string `json:"mac"` + NumPort FlexInt `json:"num_port"` + Name string `json:"name"` + } `json:"ethernet_table"` + PortTable []Port `json:"port_table"` + EthernetOverrides []struct { + Ifname string `json:"ifname"` + Networkgroup string `json:"networkgroup"` + } `json:"ethernet_overrides"` + UsgCaps FlexInt `json:"usg_caps"` + HasSpeaker FlexBool `json:"has_speaker"` + HasEth1 FlexBool `json:"has_eth1"` + FwCaps FlexInt `json:"fw_caps"` + HwCaps FlexInt `json:"hw_caps"` + WifiCaps FlexInt `json:"wifi_caps"` + SwitchCaps struct { + MaxMirrorSessions FlexInt `json:"max_mirror_sessions"` + MaxAggregateSessions FlexInt `json:"max_aggregate_sessions"` + } `json:"switch_caps"` + HasFan FlexBool `json:"has_fan"` + HasTemperature FlexBool `json:"has_temperature"` + RulesetInterfaces interface{} `json:"ruleset_interfaces"` + /* struct { + Br0 string `json:"br0"` + Eth0 string `json:"eth0"` + Eth1 string `json:"eth1"` + Eth2 string `json:"eth2"` + Eth3 string `json:"eth3"` + Eth4 string `json:"eth4"` + Eth5 string `json:"eth5"` + Eth6 string `json:"eth6"` + Eth7 string `json:"eth7"` + Eth8 string `json:"eth8"` + } */ + KnownCfgversion string `json:"known_cfgversion"` + SysStats SysStats `json:"sys_stats"` + SystemStats SystemStats `json:"system-stats"` + GuestToken string `json:"guest_token"` + Overheating FlexBool `json:"overheating"` + SpeedtestStatus SpeedtestStatus `json:"speedtest-status"` + SpeedtestStatusSaved FlexBool `json:"speedtest-status-saved"` + Wan1 Wan `json:"wan1"` + Wan2 Wan `json:"wan2"` + Uplink Uplink `json:"uplink"` + ConnectRequestIP string `json:"connect_request_ip"` + ConnectRequestPort string `json:"connect_request_port"` + DownlinkTable []interface{} `json:"downlink_table"` + WlangroupIDNa string `json:"wlangroup_id_na"` + WlangroupIDNg string `json:"wlangroup_id_ng"` + BandsteeringMode string `json:"bandsteering_mode"` + RadioTable *RadioTable `json:"radio_table,omitempty"` + RadioTableStats *RadioTableStats `json:"radio_table_stats,omitempty"` + VapTable *VapTable `json:"vap_table"` + XInformAuthkey string `json:"x_inform_authkey"` + NetworkTable NetworkTable `json:"network_table"` + PortOverrides []struct { + PortIdx FlexInt `json:"port_idx"` + PortconfID string `json:"portconf_id"` + } `json:"port_overrides"` + Stat UDMStat `json:"stat"` + TxBytes FlexInt `json:"tx_bytes"` + RxBytes FlexInt `json:"rx_bytes"` + Bytes FlexInt `json:"bytes"` + NumSta FlexInt `json:"num_sta"` + WlanNumSta FlexInt `json:"wlan-num_sta"` + LanNumSta FlexInt `json:"lan-num_sta"` + UserWlanNumSta FlexInt `json:"user-wlan-num_sta"` + UserLanNumSta FlexInt `json:"user-lan-num_sta"` + UserNumSta FlexInt `json:"user-num_sta"` + GuestWlanNumSta FlexInt `json:"guest-wlan-num_sta"` + GuestLanNumSta FlexInt `json:"guest-lan-num_sta"` + GuestNumSta FlexInt `json:"guest-num_sta"` + NumDesktop FlexInt `json:"num_desktop"` + NumMobile FlexInt `json:"num_mobile"` + NumHandheld FlexInt `json:"num_handheld"` +} + +// NetworkTable is the list of networks on a gateway. +type NetworkTable []struct { + ID string `json:"_id"` + AttrNoDelete FlexBool `json:"attr_no_delete"` + AttrHiddenID string `json:"attr_hidden_id"` + Name string `json:"name"` + SiteID string `json:"site_id"` + VlanEnabled FlexBool `json:"vlan_enabled"` + Purpose string `json:"purpose"` + IPSubnet string `json:"ip_subnet"` + Ipv6InterfaceType string `json:"ipv6_interface_type"` + DomainName string `json:"domain_name"` + IsNat FlexBool `json:"is_nat"` + DhcpdEnabled FlexBool `json:"dhcpd_enabled"` + DhcpdStart string `json:"dhcpd_start"` + DhcpdStop string `json:"dhcpd_stop"` + Dhcpdv6Enabled FlexBool `json:"dhcpdv6_enabled"` + Ipv6RaEnabled FlexBool `json:"ipv6_ra_enabled"` + LteLanEnabled FlexBool `json:"lte_lan_enabled"` + Networkgroup string `json:"networkgroup"` + DhcpdLeasetime FlexInt `json:"dhcpd_leasetime"` + DhcpdDNSEnabled FlexBool `json:"dhcpd_dns_enabled"` + DhcpdGatewayEnabled FlexBool `json:"dhcpd_gateway_enabled"` + DhcpdTimeOffsetEnabled FlexBool `json:"dhcpd_time_offset_enabled"` + Ipv6PdStart string `json:"ipv6_pd_start"` + Ipv6PdStop string `json:"ipv6_pd_stop"` + DhcpdDNS1 string `json:"dhcpd_dns_1"` + DhcpdDNS2 string `json:"dhcpd_dns_2"` + DhcpdDNS3 string `json:"dhcpd_dns_3"` + DhcpdDNS4 string `json:"dhcpd_dns_4"` + Enabled FlexBool `json:"enabled"` + DhcpRelayEnabled FlexBool `json:"dhcp_relay_enabled"` + Mac string `json:"mac"` + IsGuest FlexBool `json:"is_guest"` + IP string `json:"ip"` + Up FlexBool `json:"up"` + DPIStatsTable DPIStatsTable `json:"dpistats_table,omitempty"` + NumSta FlexInt `json:"num_sta"` + RxBytes FlexInt `json:"rx_bytes"` + RxPackets FlexInt `json:"rx_packets"` + TxBytes FlexInt `json:"tx_bytes"` + TxPackets FlexInt `json:"tx_packets"` +} + +// DPIStatsTable is the Deep Packet Inspection data for each "network" +type DPIStatsTable struct { + LastUpdated FlexInt `json:"last_updated"` + ByCat []struct { + Cat FlexInt `json:"cat"` + Apps []FlexInt `json:"apps"` + RxBytes FlexInt `json:"rx_bytes"` + TxBytes FlexInt `json:"tx_bytes"` + RxPackets FlexInt `json:"rx_packets"` + TxPackets FlexInt `json:"tx_packets"` + } `json:"by_cat"` + ByApp []struct { + App FlexInt `json:"app"` + Cat FlexInt `json:"cat"` + Clients []struct { + Mac string `json:"mac"` + RxBytes FlexInt `json:"rx_bytes"` + TxBytes FlexInt `json:"tx_bytes"` + RxPackets FlexInt `json:"rx_packets"` + TxPackets FlexInt `json:"tx_packets"` + } `json:"clients"` + KnownClients FlexInt `json:"known_clients"` + RxBytes FlexInt `json:"rx_bytes"` + TxBytes FlexInt `json:"tx_bytes"` + RxPackets FlexInt `json:"rx_packets"` + TxPackets FlexInt `json:"tx_packets"` + } `json:"by_app"` +} + +// UDMStat holds the "stat" data for a dream machine. +// A dream machine is a USG + USW + Controller +type UDMStat struct { + *Gw `json:"gw"` + *Sw `json:"sw"` + *Ap `json:"ap,omitempty"` +} diff --git a/core/unifi/udm_type.go b/core/unifi/udm_type.go deleted file mode 100644 index e7a21c39..00000000 --- a/core/unifi/udm_type.go +++ /dev/null @@ -1,185 +0,0 @@ -package unifi - -// UDM represents all the data from the Ubiquiti Controller for a Unifi Dream Machine. -// The UDM shares several structs/type-data with USW and USG. -type UDM struct { - SiteID string `json:"site_id"` - SiteName string `json:"-"` - Mac string `json:"mac"` - Adopted FlexBool `json:"adopted"` - Serial string `json:"serial"` - IP string `json:"ip"` - Uptime FlexInt `json:"uptime"` - Model string `json:"model"` - Version string `json:"version"` - Name string `json:"name"` - Default FlexBool `json:"default"` - Locating FlexBool `json:"locating"` - Type string `json:"type"` - Unsupported FlexBool `json:"unsupported"` - UnsupportedReason FlexInt `json:"unsupported_reason"` - DiscoveredVia string `json:"discovered_via"` - AdoptIP string `json:"adopt_ip"` - AdoptURL string `json:"adopt_url"` - State FlexInt `json:"state"` - AdoptStatus FlexInt `json:"adopt_status"` - UpgradeState FlexInt `json:"upgrade_state"` - LastSeen FlexInt `json:"last_seen"` - AdoptableWhenUpgraded FlexBool `json:"adoptable_when_upgraded"` - Cfgversion string `json:"cfgversion"` - ConfigNetwork struct { - Type string `json:"type"` - IP string `json:"ip"` - } `json:"config_network"` - VwireTable []interface{} `json:"vwire_table"` - Dot1XPortctrlEnabled FlexBool `json:"dot1x_portctrl_enabled"` - JumboframeEnabled FlexBool `json:"jumboframe_enabled"` - FlowctrlEnabled FlexBool `json:"flowctrl_enabled"` - StpVersion string `json:"stp_version"` - StpPriority string `json:"stp_priority"` - PowerSourceCtrlEnabled FlexBool `json:"power_source_ctrl_enabled"` - LicenseState string `json:"license_state"` - ID string `json:"_id"` - DeviceID string `json:"device_id"` - AdoptState FlexInt `json:"adopt_state"` - AdoptTries FlexInt `json:"adopt_tries"` - AdoptManual FlexBool `json:"adopt_manual"` - InformURL string `json:"inform_url"` - InformIP string `json:"inform_ip"` - RequiredVersion string `json:"required_version"` - BoardRev FlexInt `json:"board_rev"` - EthernetTable []struct { - Mac string `json:"mac"` - NumPort FlexInt `json:"num_port"` - Name string `json:"name"` - } `json:"ethernet_table"` - PortTable []Port `json:"port_table"` - EthernetOverrides []struct { - Ifname string `json:"ifname"` - Networkgroup string `json:"networkgroup"` - } `json:"ethernet_overrides"` - UsgCaps FlexInt `json:"usg_caps"` - HasSpeaker FlexBool `json:"has_speaker"` - HasEth1 FlexBool `json:"has_eth1"` - FwCaps FlexInt `json:"fw_caps"` - HwCaps FlexInt `json:"hw_caps"` - SwitchCaps struct { - MaxMirrorSessions FlexInt `json:"max_mirror_sessions"` - MaxAggregateSessions FlexInt `json:"max_aggregate_sessions"` - } `json:"switch_caps"` - HasFan FlexBool `json:"has_fan"` - HasTemperature FlexBool `json:"has_temperature"` - RulesetInterfaces struct { - Br0 string `json:"br0"` - Eth8 string `json:"eth8"` - Eth9 string `json:"eth9"` - } `json:"ruleset_interfaces"` - KnownCfgversion string `json:"known_cfgversion"` - SysStats SysStats `json:"sys_stats"` - SystemStats SystemStats `json:"system-stats"` - GuestToken string `json:"guest_token"` - Overheating FlexBool `json:"overheating"` - SpeedtestStatus SpeedtestStatus `json:"speedtest-status"` - SpeedtestStatusSaved FlexBool `json:"speedtest-status-saved"` - Wan1 Wan `json:"wan1"` - Wan2 Wan `json:"wan2"` - Uplink Uplink `json:"uplink"` - ConnectRequestIP string `json:"connect_request_ip"` - ConnectRequestPort string `json:"connect_request_port"` - DownlinkTable []interface{} `json:"downlink_table"` - NetworkTable []struct { - ID string `json:"_id"` - AttrNoDelete FlexBool `json:"attr_no_delete"` - AttrHiddenID string `json:"attr_hidden_id"` - Name string `json:"name"` - SiteID string `json:"site_id"` - VlanEnabled FlexBool `json:"vlan_enabled"` - Purpose string `json:"purpose"` - IPSubnet string `json:"ip_subnet"` - Ipv6InterfaceType string `json:"ipv6_interface_type"` - DomainName string `json:"domain_name"` - IsNat FlexBool `json:"is_nat"` - DhcpdEnabled FlexBool `json:"dhcpd_enabled"` - DhcpdStart string `json:"dhcpd_start"` - DhcpdStop string `json:"dhcpd_stop"` - Dhcpdv6Enabled FlexBool `json:"dhcpdv6_enabled"` - Ipv6RaEnabled FlexBool `json:"ipv6_ra_enabled"` - LteLanEnabled FlexBool `json:"lte_lan_enabled"` - Networkgroup string `json:"networkgroup"` - DhcpdLeasetime FlexInt `json:"dhcpd_leasetime"` - DhcpdDNSEnabled FlexBool `json:"dhcpd_dns_enabled"` - DhcpdGatewayEnabled FlexBool `json:"dhcpd_gateway_enabled"` - DhcpdTimeOffsetEnabled FlexBool `json:"dhcpd_time_offset_enabled"` - Ipv6PdStart string `json:"ipv6_pd_start"` - Ipv6PdStop string `json:"ipv6_pd_stop"` - DhcpdDNS1 string `json:"dhcpd_dns_1"` - DhcpdDNS2 string `json:"dhcpd_dns_2"` - DhcpdDNS3 string `json:"dhcpd_dns_3"` - DhcpdDNS4 string `json:"dhcpd_dns_4"` - Enabled FlexBool `json:"enabled"` - DhcpRelayEnabled FlexBool `json:"dhcp_relay_enabled"` - Mac string `json:"mac"` - IsGuest FlexBool `json:"is_guest"` - IP string `json:"ip"` - Up FlexBool `json:"up"` - DpistatsTable struct { - LastUpdated FlexInt `json:"last_updated"` - ByCat []struct { - Cat FlexInt `json:"cat"` - Apps []FlexInt `json:"apps"` - RxBytes FlexInt `json:"rx_bytes"` - TxBytes FlexInt `json:"tx_bytes"` - RxPackets FlexInt `json:"rx_packets"` - TxPackets FlexInt `json:"tx_packets"` - } `json:"by_cat"` - ByApp []struct { - App FlexInt `json:"app"` - Cat FlexInt `json:"cat"` - Clients []struct { - Mac string `json:"mac"` - RxBytes FlexInt `json:"rx_bytes"` - TxBytes FlexInt `json:"tx_bytes"` - RxPackets FlexInt `json:"rx_packets"` - TxPackets FlexInt `json:"tx_packets"` - } `json:"clients"` - KnownClients FlexInt `json:"known_clients"` - RxBytes FlexInt `json:"rx_bytes"` - TxBytes FlexInt `json:"tx_bytes"` - RxPackets FlexInt `json:"rx_packets"` - TxPackets FlexInt `json:"tx_packets"` - } `json:"by_app"` - } `json:"dpistats_table,omitempty"` - NumSta FlexInt `json:"num_sta"` - RxBytes FlexInt `json:"rx_bytes"` - RxPackets FlexInt `json:"rx_packets"` - TxBytes FlexInt `json:"tx_bytes"` - TxPackets FlexInt `json:"tx_packets"` - } `json:"network_table"` - PortOverrides []struct { - PortIdx FlexInt `json:"port_idx"` - PortconfID string `json:"portconf_id"` - } `json:"port_overrides"` - Stat UDMStat `json:"stat"` - TxBytes FlexInt `json:"tx_bytes"` - RxBytes FlexInt `json:"rx_bytes"` - Bytes FlexInt `json:"bytes"` - NumSta FlexInt `json:"num_sta"` - WlanNumSta FlexInt `json:"wlan-num_sta"` - LanNumSta FlexInt `json:"lan-num_sta"` - UserWlanNumSta FlexInt `json:"user-wlan-num_sta"` - UserLanNumSta FlexInt `json:"user-lan-num_sta"` - UserNumSta FlexInt `json:"user-num_sta"` - GuestWlanNumSta FlexInt `json:"guest-wlan-num_sta"` - GuestLanNumSta FlexInt `json:"guest-lan-num_sta"` - GuestNumSta FlexInt `json:"guest-num_sta"` - NumDesktop FlexInt `json:"num_desktop"` - NumMobile FlexInt `json:"num_mobile"` - NumHandheld FlexInt `json:"num_handheld"` -} - -// UDMStat holds the "stat" data for a dream machine. -// A dream machine is a USG + USW + Controller -type UDMStat struct { - *Gw `json:"gw"` - *Sw `json:"sw"` -} diff --git a/core/unifi/usg_type.go b/core/unifi/usg.go similarity index 77% rename from core/unifi/usg_type.go rename to core/unifi/usg.go index 5db8db43..d5cc7a21 100644 --- a/core/unifi/usg_type.go +++ b/core/unifi/usg.go @@ -84,58 +84,18 @@ type USG struct { DNS []string `json:"dns,omitempty"` Gateway string `json:"gateway,omitempty"` } `json:"port_table"` - NetworkTable []struct { - ID string `json:"_id"` - IsNat FlexBool `json:"is_nat"` - DhcpdDNSEnabled FlexBool `json:"dhcpd_dns_enabled"` - Purpose string `json:"purpose"` - DhcpdLeasetime FlexInt `json:"dhcpd_leasetime"` - IgmpSnooping FlexBool `json:"igmp_snooping"` - DhcpguardEnabled FlexBool `json:"dhcpguard_enabled,omitempty"` - DhcpdStart string `json:"dhcpd_start"` - Enabled FlexBool `json:"enabled"` - DhcpdStop string `json:"dhcpd_stop"` - DhcpdWinsEnabled FlexBool `json:"dhcpd_wins_enabled,omitempty"` - DomainName string `json:"domain_name"` - DhcpdEnabled FlexBool `json:"dhcpd_enabled"` - IPSubnet string `json:"ip_subnet"` - Vlan FlexInt `json:"vlan,omitempty"` - Networkgroup string `json:"networkgroup"` - Name string `json:"name"` - SiteID string `json:"site_id"` - DhcpdIP1 string `json:"dhcpd_ip_1,omitempty"` - VlanEnabled FlexBool `json:"vlan_enabled"` - DhcpdGatewayEnabled FlexBool `json:"dhcpd_gateway_enabled"` - DhcpdTimeOffsetEnabled FlexBool `json:"dhcpd_time_offset_enabled"` - Ipv6InterfaceType string `json:"ipv6_interface_type"` - DhcpRelayEnabled FlexBool `json:"dhcp_relay_enabled"` - Mac string `json:"mac"` - IsGuest FlexBool `json:"is_guest"` - IP string `json:"ip"` - Up FlexBool `json:"up"` - NumSta FlexInt `json:"num_sta"` - RxBytes FlexInt `json:"rx_bytes"` - RxPackets FlexInt `json:"rx_packets"` - TxBytes FlexInt `json:"tx_bytes"` - TxPackets FlexInt `json:"tx_packets"` - DhcpdNtp1 string `json:"dhcpd_ntp_1,omitempty"` - DhcpdNtpEnabled FlexBool `json:"dhcpd_ntp_enabled,omitempty"` - DhcpdUnifiController string `json:"dhcpd_unifi_controller,omitempty"` - UpnpLanEnabled FlexBool `json:"upnp_lan_enabled,omitempty"` - AttrNoDelete FlexBool `json:"attr_no_delete,omitempty"` - AttrHiddenID string `json:"attr_hidden_id,omitempty"` - } `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"` + 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. diff --git a/core/unifi/usg_type_test.go b/core/unifi/usg_test.go similarity index 100% rename from core/unifi/usg_type_test.go rename to core/unifi/usg_test.go diff --git a/core/unifi/usw.go b/core/unifi/usw.go new file mode 100644 index 00000000..62a5cd48 --- /dev/null +++ b/core/unifi/usw.go @@ -0,0 +1,373 @@ +package unifi + +import ( + "encoding/json" + "time" +) + +// USW represents all the data from the Ubiquiti Controller for a Unifi Switch. +type USW struct { + SiteName string `json:"-"` + ID string `json:"_id"` + Adopted FlexBool `json:"adopted"` + BoardRev FlexInt `json:"board_rev"` + Cfgversion string `json:"cfgversion"` + ConfigNetwork struct { + Type string `json:"type"` + IP string `json:"ip"` + } `json:"config_network"` + Dot1XPortctrlEnabled FlexBool `json:"dot1x_portctrl_enabled"` + EthernetTable []struct { + Mac string `json:"mac"` + NumPort FlexInt `json:"num_port,omitempty"` + Name string `json:"name"` + } `json:"ethernet_table"` + FlowctrlEnabled FlexBool `json:"flowctrl_enabled"` + FwCaps FlexInt `json:"fw_caps"` + HasFan FlexBool `json:"has_fan"` + HasTemperature FlexBool `json:"has_temperature"` + InformIP string `json:"inform_ip"` + InformURL string `json:"inform_url"` + IP string `json:"ip"` + JumboframeEnabled FlexBool `json:"jumboframe_enabled"` + 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"` + PortOverrides []struct { + Name string `json:"name,omitempty"` + PoeMode string `json:"poe_mode,omitempty"` + PortIdx FlexInt `json:"port_idx"` + PortconfID string `json:"portconf_id"` + } `json:"port_overrides"` + PortTable []Port `json:"port_table"` + Serial string `json:"serial"` + SiteID string `json:"site_id"` + StpPriority string `json:"stp_priority"` + StpVersion string `json:"stp_version"` + Type string `json:"type"` + Version string `json:"version"` + RequiredVersion string `json:"required_version"` + SwitchCaps struct { + FeatureCaps FlexInt `json:"feature_caps"` + MaxMirrorSessions FlexInt `json:"max_mirror_sessions"` + MaxAggregateSessions FlexInt `json:"max_aggregate_sessions"` + } `json:"switch_caps"` + HwCaps FlexInt `json:"hw_caps"` + Unsupported FlexBool `json:"unsupported"` + UnsupportedReason FlexInt `json:"unsupported_reason"` + SysErrorCaps FlexInt `json:"sys_error_caps"` + DeviceID string `json:"device_id"` + State FlexInt `json:"state"` + LastSeen FlexInt `json:"last_seen"` + Upgradable FlexBool `json:"upgradable,omitempty"` + AdoptableWhenUpgraded FlexBool `json:"adoptable_when_upgraded,omitempty"` + Rollupgrade FlexBool `json:"rollupgrade,omitempty"` + 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"` + SystemStats SystemStats `json:"system-stats"` + FanLevel FlexInt `json:"fan_level"` + GeneralTemperature FlexInt `json:"general_temperature"` + Overheating FlexBool `json:"overheating"` + TotalMaxPower FlexInt `json:"total_max_power"` + DownlinkTable []struct { + PortIdx FlexInt `json:"port_idx"` + Speed FlexInt `json:"speed"` + FullDuplex FlexBool `json:"full_duplex"` + Mac string `json:"mac"` + } `json:"downlink_table"` + Uplink Uplink `json:"uplink"` + LastUplink struct { + UplinkMac string `json:"uplink_mac"` + } `json:"last_uplink"` + UplinkDepth FlexInt `json:"uplink_depth"` + Stat USWStat `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"` +} + +// Port is a physical connection on a USW or UDM. +type Port struct { + AggregatedBy FlexBool `json:"aggregated_by"` + Autoneg FlexBool `json:"autoneg,omitempty"` + BytesR FlexInt `json:"bytes-r"` + DNS []string `json:"dns,omitempty"` + Dot1XMode string `json:"dot1x_mode"` + Dot1XStatus string `json:"dot1x_status"` + Enable FlexBool `json:"enable"` + FlowctrlRx FlexBool `json:"flowctrl_rx"` + FlowctrlTx FlexBool `json:"flowctrl_tx"` + FullDuplex FlexBool `json:"full_duplex"` + IP string `json:"ip,omitempty"` + Ifname string `json:"ifname,omitempty"` + IsUplink FlexBool `json:"is_uplink"` + Mac string `json:"mac,omitempty"` + Jumbo FlexBool `json:"jumbo,omitempty"` + Masked FlexBool `json:"masked"` + Media string `json:"media"` + Name string `json:"name"` + NetworkName string `json:"network_name,omitempty"` + NumPort int `json:"num_port,omitempty"` + OpMode string `json:"op_mode"` + PoeCaps FlexInt `json:"poe_caps"` + PoeClass string `json:"poe_class,omitempty"` + PoeCurrent FlexInt `json:"poe_current,omitempty"` + PoeEnable FlexBool `json:"poe_enable,omitempty"` + PoeGood FlexBool `json:"poe_good,omitempty"` + PoeMode string `json:"poe_mode,omitempty"` + PoePower FlexInt `json:"poe_power,omitempty"` + PoeVoltage FlexInt `json:"poe_voltage,omitempty"` + PortDelta struct { + TimeDelta int64 `json:"time_delta"` + } `json:"port_delta,omitempty"` + PortIdx FlexInt `json:"port_idx"` + PortPoe FlexBool `json:"port_poe"` + PortconfID string `json:"portconf_id"` + 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"` + Satisfaction FlexInt `json:"satisfaction,omitempty"` + SfpFound FlexBool `json:"sfp_found,omitempty"` + Speed FlexInt `json:"speed"` + SpeedCaps FlexInt `json:"speed_caps"` + StpPathcost FlexInt `json:"stp_pathcost"` + StpState string `json:"stp_state"` + 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"` + Type string `json:"type,omitempty"` + Up FlexBool `json:"up"` +} + +// USWStat holds the "stat" data for a switch. +// This is split out because of a JSON data format change from 5.10 to 5.11. +type USWStat struct { + *Sw +} + +// Sw is a subtype of USWStat to make unmarshalling of different controller versions possible. +type Sw struct { + SiteID string `json:"site_id"` + O string `json:"o"` + Oid string `json:"oid"` + Sw string `json:"sw"` + Time FlexInt `json:"time"` + Datetime time.Time `json:"datetime"` + RxPackets FlexInt `json:"rx_packets"` + RxBytes FlexInt `json:"rx_bytes"` + RxErrors FlexInt `json:"rx_errors"` + RxDropped FlexInt `json:"rx_dropped"` + RxCrypts FlexInt `json:"rx_crypts"` + RxFrags FlexInt `json:"rx_frags"` + TxPackets FlexInt `json:"tx_packets"` + TxBytes FlexInt `json:"tx_bytes"` + TxErrors FlexInt `json:"tx_errors"` + TxDropped FlexInt `json:"tx_dropped"` + TxRetries FlexInt `json:"tx_retries"` + RxMulticast FlexInt `json:"rx_multicast"` + RxBroadcast FlexInt `json:"rx_broadcast"` + TxMulticast FlexInt `json:"tx_multicast"` + TxBroadcast FlexInt `json:"tx_broadcast"` + Bytes FlexInt `json:"bytes"` + Duration FlexInt `json:"duration"` + /* These are all in port table */ + /* + Port1RxPackets FlexInt `json:"port_1-rx_packets,omitempty"` + Port1RxBytes FlexInt `json:"port_1-rx_bytes,omitempty"` + Port1TxPackets FlexInt `json:"port_1-tx_packets,omitempty"` + Port1TxBytes FlexInt `json:"port_1-tx_bytes,omitempty"` + Port1TxMulticast FlexInt `json:"port_1-tx_multicast"` + Port1TxBroadcast FlexInt `json:"port_1-tx_broadcast"` + Port3RxPackets FlexInt `json:"port_3-rx_packets,omitempty"` + Port3RxBytes FlexInt `json:"port_3-rx_bytes,omitempty"` + Port3TxPackets FlexInt `json:"port_3-tx_packets,omitempty"` + Port3TxBytes FlexInt `json:"port_3-tx_bytes,omitempty"` + Port3RxBroadcast FlexInt `json:"port_3-rx_broadcast"` + Port3TxMulticast FlexInt `json:"port_3-tx_multicast"` + Port3TxBroadcast FlexInt `json:"port_3-tx_broadcast"` + Port6RxPackets FlexInt `json:"port_6-rx_packets,omitempty"` + Port6RxBytes FlexInt `json:"port_6-rx_bytes,omitempty"` + Port6TxPackets FlexInt `json:"port_6-tx_packets,omitempty"` + Port6TxBytes FlexInt `json:"port_6-tx_bytes,omitempty"` + Port6RxMulticast FlexInt `json:"port_6-rx_multicast"` + Port6TxMulticast FlexInt `json:"port_6-tx_multicast"` + Port6TxBroadcast FlexInt `json:"port_6-tx_broadcast"` + Port7RxPackets FlexInt `json:"port_7-rx_packets,omitempty"` + Port7RxBytes FlexInt `json:"port_7-rx_bytes,omitempty"` + Port7TxPackets FlexInt `json:"port_7-tx_packets,omitempty"` + Port7TxBytes FlexInt `json:"port_7-tx_bytes,omitempty"` + Port7TxMulticast FlexInt `json:"port_7-tx_multicast"` + Port7TxBroadcast FlexInt `json:"port_7-tx_broadcast"` + Port9RxPackets FlexInt `json:"port_9-rx_packets,omitempty"` + Port9RxBytes FlexInt `json:"port_9-rx_bytes,omitempty"` + Port9TxPackets FlexInt `json:"port_9-tx_packets,omitempty"` + Port9TxBytes FlexInt `json:"port_9-tx_bytes,omitempty"` + Port9TxMulticast FlexInt `json:"port_9-tx_multicast"` + Port9TxBroadcast FlexInt `json:"port_9-tx_broadcast"` + Port10RxPackets FlexInt `json:"port_10-rx_packets,omitempty"` + Port10RxBytes FlexInt `json:"port_10-rx_bytes,omitempty"` + Port10TxPackets FlexInt `json:"port_10-tx_packets,omitempty"` + Port10TxBytes FlexInt `json:"port_10-tx_bytes,omitempty"` + Port10RxMulticast FlexInt `json:"port_10-rx_multicast"` + Port10TxMulticast FlexInt `json:"port_10-tx_multicast"` + Port10TxBroadcast FlexInt `json:"port_10-tx_broadcast"` + Port11RxPackets FlexInt `json:"port_11-rx_packets,omitempty"` + Port11RxBytes FlexInt `json:"port_11-rx_bytes,omitempty"` + Port11TxPackets FlexInt `json:"port_11-tx_packets,omitempty"` + Port11TxBytes FlexInt `json:"port_11-tx_bytes,omitempty"` + Port11TxMulticast FlexInt `json:"port_11-tx_multicast"` + Port11TxBroadcast FlexInt `json:"port_11-tx_broadcast"` + Port12RxPackets FlexInt `json:"port_12-rx_packets,omitempty"` + Port12RxBytes FlexInt `json:"port_12-rx_bytes,omitempty"` + Port12TxPackets FlexInt `json:"port_12-tx_packets,omitempty"` + Port12TxBytes FlexInt `json:"port_12-tx_bytes,omitempty"` + Port12TxMulticast FlexInt `json:"port_12-tx_multicast"` + Port12TxBroadcast FlexInt `json:"port_12-tx_broadcast"` + Port13RxPackets FlexInt `json:"port_13-rx_packets,omitempty"` + Port13RxBytes FlexInt `json:"port_13-rx_bytes,omitempty"` + Port13TxPackets FlexInt `json:"port_13-tx_packets,omitempty"` + Port13TxBytes FlexInt `json:"port_13-tx_bytes,omitempty"` + Port13RxMulticast FlexInt `json:"port_13-rx_multicast"` + Port13RxBroadcast FlexInt `json:"port_13-rx_broadcast"` + Port13TxMulticast FlexInt `json:"port_13-tx_multicast"` + Port13TxBroadcast FlexInt `json:"port_13-tx_broadcast"` + Port15RxPackets FlexInt `json:"port_15-rx_packets,omitempty"` + Port15RxBytes FlexInt `json:"port_15-rx_bytes,omitempty"` + Port15TxPackets FlexInt `json:"port_15-tx_packets,omitempty"` + Port15TxBytes FlexInt `json:"port_15-tx_bytes,omitempty"` + Port15RxBroadcast FlexInt `json:"port_15-rx_broadcast"` + Port15TxMulticast FlexInt `json:"port_15-tx_multicast"` + Port15TxBroadcast FlexInt `json:"port_15-tx_broadcast"` + Port16RxPackets FlexInt `json:"port_16-rx_packets,omitempty"` + Port16RxBytes FlexInt `json:"port_16-rx_bytes,omitempty"` + Port16TxPackets FlexInt `json:"port_16-tx_packets,omitempty"` + Port16TxBytes FlexInt `json:"port_16-tx_bytes,omitempty"` + Port16TxMulticast FlexInt `json:"port_16-tx_multicast"` + Port16TxBroadcast FlexInt `json:"port_16-tx_broadcast"` + Port17RxPackets FlexInt `json:"port_17-rx_packets,omitempty"` + Port17RxBytes FlexInt `json:"port_17-rx_bytes,omitempty"` + Port17TxPackets FlexInt `json:"port_17-tx_packets,omitempty"` + Port17TxBytes FlexInt `json:"port_17-tx_bytes,omitempty"` + Port17TxMulticast FlexInt `json:"port_17-tx_multicast"` + Port17TxBroadcast FlexInt `json:"port_17-tx_broadcast"` + Port18RxPackets FlexInt `json:"port_18-rx_packets,omitempty"` + Port18RxBytes FlexInt `json:"port_18-rx_bytes,omitempty"` + Port18TxPackets FlexInt `json:"port_18-tx_packets,omitempty"` + Port18TxBytes FlexInt `json:"port_18-tx_bytes,omitempty"` + Port18RxMulticast FlexInt `json:"port_18-rx_multicast"` + Port18TxMulticast FlexInt `json:"port_18-tx_multicast"` + Port18TxBroadcast FlexInt `json:"port_18-tx_broadcast"` + Port19RxPackets FlexInt `json:"port_19-rx_packets,omitempty"` + Port19RxBytes FlexInt `json:"port_19-rx_bytes,omitempty"` + Port19TxPackets FlexInt `json:"port_19-tx_packets,omitempty"` + Port19TxBytes FlexInt `json:"port_19-tx_bytes,omitempty"` + Port19TxMulticast FlexInt `json:"port_19-tx_multicast"` + Port19TxBroadcast FlexInt `json:"port_19-tx_broadcast"` + Port21RxPackets FlexInt `json:"port_21-rx_packets,omitempty"` + Port21RxBytes FlexInt `json:"port_21-rx_bytes,omitempty"` + Port21TxPackets FlexInt `json:"port_21-tx_packets,omitempty"` + Port21TxBytes FlexInt `json:"port_21-tx_bytes,omitempty"` + Port21RxBroadcast FlexInt `json:"port_21-rx_broadcast"` + Port21TxMulticast FlexInt `json:"port_21-tx_multicast"` + Port21TxBroadcast FlexInt `json:"port_21-tx_broadcast"` + Port22RxPackets FlexInt `json:"port_22-rx_packets,omitempty"` + Port22RxBytes FlexInt `json:"port_22-rx_bytes,omitempty"` + Port22TxPackets FlexInt `json:"port_22-tx_packets,omitempty"` + Port22TxBytes FlexInt `json:"port_22-tx_bytes,omitempty"` + Port22RxMulticast FlexInt `json:"port_22-rx_multicast"` + Port22TxMulticast FlexInt `json:"port_22-tx_multicast"` + Port22TxBroadcast FlexInt `json:"port_22-tx_broadcast"` + Port23RxPackets FlexInt `json:"port_23-rx_packets,omitempty"` + Port23RxBytes FlexInt `json:"port_23-rx_bytes,omitempty"` + Port23RxDropped FlexInt `json:"port_23-rx_dropped"` + Port23TxPackets FlexInt `json:"port_23-tx_packets,omitempty"` + Port23TxBytes FlexInt `json:"port_23-tx_bytes,omitempty"` + Port23RxMulticast FlexInt `json:"port_23-rx_multicast"` + Port23RxBroadcast FlexInt `json:"port_23-rx_broadcast"` + Port23TxMulticast FlexInt `json:"port_23-tx_multicast"` + Port23TxBroadcast FlexInt `json:"port_23-tx_broadcast"` + Port24RxPackets FlexInt `json:"port_24-rx_packets,omitempty"` + Port24RxBytes FlexInt `json:"port_24-rx_bytes,omitempty"` + Port24TxPackets FlexInt `json:"port_24-tx_packets,omitempty"` + Port24TxBytes FlexInt `json:"port_24-tx_bytes,omitempty"` + Port24RxMulticast FlexInt `json:"port_24-rx_multicast"` + Port24TxMulticast FlexInt `json:"port_24-tx_multicast"` + Port24TxBroadcast FlexInt `json:"port_24-tx_broadcast"` + Port1RxMulticast FlexInt `json:"port_1-rx_multicast"` + Port3RxDropped FlexInt `json:"port_3-rx_dropped"` + Port3RxMulticast FlexInt `json:"port_3-rx_multicast"` + Port6RxDropped FlexInt `json:"port_6-rx_dropped"` + Port7RxDropped FlexInt `json:"port_7-rx_dropped"` + Port7RxMulticast FlexInt `json:"port_7-rx_multicast"` + Port9RxDropped FlexInt `json:"port_9-rx_dropped"` + Port9RxMulticast FlexInt `json:"port_9-rx_multicast"` + Port9RxBroadcast FlexInt `json:"port_9-rx_broadcast"` + Port10RxBroadcast FlexInt `json:"port_10-rx_broadcast"` + Port12RxDropped FlexInt `json:"port_12-rx_dropped"` + Port12RxMulticast FlexInt `json:"port_12-rx_multicast"` + Port13RxDropped FlexInt `json:"port_13-rx_dropped"` + Port17RxDropped FlexInt `json:"port_17-rx_dropped"` + Port17RxMulticast FlexInt `json:"port_17-rx_multicast"` + Port17RxBroadcast FlexInt `json:"port_17-rx_broadcast"` + Port19RxDropped FlexInt `json:"port_19-rx_dropped"` + Port19RxMulticast FlexInt `json:"port_19-rx_multicast"` + Port19RxBroadcast FlexInt `json:"port_19-rx_broadcast"` + Port21RxDropped FlexInt `json:"port_21-rx_dropped"` + Port21RxMulticast FlexInt `json:"port_21-rx_multicast"` + Port7RxBroadcast FlexInt `json:"port_7-rx_broadcast"` + Port18RxBroadcast FlexInt `json:"port_18-rx_broadcast"` + Port16RxMulticast FlexInt `json:"port_16-rx_multicast"` + Port15RxDropped FlexInt `json:"port_15-rx_dropped"` + Port15RxMulticast FlexInt `json:"port_15-rx_multicast"` + Port16RxBroadcast FlexInt `json:"port_16-rx_broadcast"` + Port11RxBroadcast FlexInt `json:"port_11-rx_broadcast"` + Port12RxBroadcast FlexInt `json:"port_12-rx_broadcast"` + Port6RxBroadcast FlexInt `json:"port_6-rx_broadcast"` + Port24RxBroadcast FlexInt `json:"port_24-rx_broadcast"` + Port22RxBroadcast FlexInt `json:"port_22-rx_broadcast"` + Port10TxDropped FlexInt `json:"port_10-tx_dropped"` + Port16TxDropped FlexInt `json:"port_16-tx_dropped"` + Port1RxBroadcast FlexInt `json:"port_1-rx_broadcast"` + Port4RxPackets FlexInt `json:"port_4-rx_packets,omitempty"` + Port4RxBytes FlexInt `json:"port_4-rx_bytes,omitempty"` + Port4RxDropped FlexInt `json:"port_4-rx_dropped"` + Port4TxPackets FlexInt `json:"port_4-tx_packets,omitempty"` + Port4TxBytes FlexInt `json:"port_4-tx_bytes,omitempty"` + Port4TxDropped FlexInt `json:"port_4-tx_dropped"` + Port4RxMulticast FlexInt `json:"port_4-rx_multicast"` + Port4RxBroadcast FlexInt `json:"port_4-rx_broadcast"` + Port4TxMulticast FlexInt `json:"port_4-tx_multicast"` + Port4TxBroadcast FlexInt `json:"port_4-tx_broadcast"` + */ +} + +// UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Switch Stat data. +func (v *USWStat) UnmarshalJSON(data []byte) error { + var n struct { + Sw `json:"sw"` + } + v.Sw = &n.Sw + err := json.Unmarshal(data, v.Sw) // controller version 5.10. + if err != nil { + return json.Unmarshal(data, &n) // controller version 5.11. + } + return nil +} diff --git a/core/unifi/usw_type_test.go b/core/unifi/usw_test.go similarity index 100% rename from core/unifi/usw_type_test.go rename to core/unifi/usw_test.go diff --git a/core/unifi/usw_type.go b/core/unifi/usw_type.go deleted file mode 100644 index 04b4c070..00000000 --- a/core/unifi/usw_type.go +++ /dev/null @@ -1,370 +0,0 @@ -package unifi - -import ( - "encoding/json" - "time" -) - -// USW represents all the data from the Ubiquiti Controller for a Unifi Switch. -type USW struct { - SiteName string `json:"-"` - ID string `json:"_id"` - Adopted FlexBool `json:"adopted"` - BoardRev FlexInt `json:"board_rev"` - Cfgversion string `json:"cfgversion"` - ConfigNetwork struct { - Type string `json:"type"` - IP string `json:"ip"` - } `json:"config_network"` - Dot1XPortctrlEnabled FlexBool `json:"dot1x_portctrl_enabled"` - EthernetTable []struct { - Mac string `json:"mac"` - NumPort FlexInt `json:"num_port,omitempty"` - Name string `json:"name"` - } `json:"ethernet_table"` - FlowctrlEnabled FlexBool `json:"flowctrl_enabled"` - FwCaps FlexInt `json:"fw_caps"` - HasFan FlexBool `json:"has_fan"` - HasTemperature FlexBool `json:"has_temperature"` - InformIP string `json:"inform_ip"` - InformURL string `json:"inform_url"` - IP string `json:"ip"` - JumboframeEnabled FlexBool `json:"jumboframe_enabled"` - 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"` - PortOverrides []struct { - Name string `json:"name,omitempty"` - PoeMode string `json:"poe_mode,omitempty"` - PortIdx FlexInt `json:"port_idx"` - PortconfID string `json:"portconf_id"` - } `json:"port_overrides"` - PortTable []Port `json:"port_table"` - Serial string `json:"serial"` - SiteID string `json:"site_id"` - StpPriority string `json:"stp_priority"` - StpVersion string `json:"stp_version"` - Type string `json:"type"` - Version string `json:"version"` - RequiredVersion string `json:"required_version"` - SwitchCaps struct { - FeatureCaps FlexInt `json:"feature_caps"` - MaxMirrorSessions FlexInt `json:"max_mirror_sessions"` - MaxAggregateSessions FlexInt `json:"max_aggregate_sessions"` - } `json:"switch_caps"` - HwCaps FlexInt `json:"hw_caps"` - Unsupported FlexBool `json:"unsupported"` - UnsupportedReason FlexInt `json:"unsupported_reason"` - SysErrorCaps FlexInt `json:"sys_error_caps"` - DeviceID string `json:"device_id"` - State FlexInt `json:"state"` - LastSeen FlexInt `json:"last_seen"` - Upgradable FlexBool `json:"upgradable,omitempty"` - AdoptableWhenUpgraded FlexBool `json:"adoptable_when_upgraded,omitempty"` - Rollupgrade FlexBool `json:"rollupgrade,omitempty"` - 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"` - SystemStats SystemStats `json:"system-stats"` - FanLevel FlexInt `json:"fan_level"` - GeneralTemperature FlexInt `json:"general_temperature"` - Overheating FlexBool `json:"overheating"` - TotalMaxPower FlexInt `json:"total_max_power"` - DownlinkTable []struct { - PortIdx FlexInt `json:"port_idx"` - Speed FlexInt `json:"speed"` - FullDuplex FlexBool `json:"full_duplex"` - Mac string `json:"mac"` - } `json:"downlink_table"` - Uplink Uplink `json:"uplink"` - LastUplink struct { - UplinkMac string `json:"uplink_mac"` - } `json:"last_uplink"` - UplinkDepth FlexInt `json:"uplink_depth"` - Stat USWStat `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"` -} - -// Port is a physical connection on a USW or UDM. -type Port struct { - AggregatedBy FlexBool `json:"aggregated_by"` - Autoneg FlexBool `json:"autoneg,omitempty"` - BytesR FlexInt `json:"bytes-r"` - DNS []string `json:"dns,omitempty"` - Dot1XMode string `json:"dot1x_mode"` - Dot1XStatus string `json:"dot1x_status"` - Enable FlexBool `json:"enable"` - FlowctrlRx FlexBool `json:"flowctrl_rx"` - FlowctrlTx FlexBool `json:"flowctrl_tx"` - FullDuplex FlexBool `json:"full_duplex"` - IP string `json:"ip,omitempty"` - Ifname string `json:"ifname,omitempty"` - IsUplink FlexBool `json:"is_uplink"` - Mac string `json:"mac,omitempty"` - Jumbo FlexBool `json:"jumbo,omitempty"` - Masked FlexBool `json:"masked"` - Media string `json:"media"` - Name string `json:"name"` - NetworkName string `json:"network_name,omitempty"` - NumPort int `json:"num_port,omitempty"` - OpMode string `json:"op_mode"` - PoeCaps FlexInt `json:"poe_caps"` - PoeClass string `json:"poe_class,omitempty"` - PoeCurrent FlexInt `json:"poe_current,omitempty"` - PoeEnable FlexBool `json:"poe_enable,omitempty"` - PoeGood FlexBool `json:"poe_good,omitempty"` - PoeMode string `json:"poe_mode,omitempty"` - PoePower FlexInt `json:"poe_power,omitempty"` - PoeVoltage FlexInt `json:"poe_voltage,omitempty"` - PortDelta struct { - TimeDelta int64 `json:"time_delta"` - } `json:"port_delta,omitempty"` - PortIdx FlexInt `json:"port_idx"` - PortPoe FlexBool `json:"port_poe"` - PortconfID string `json:"portconf_id"` - 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"` - Satisfaction FlexInt `json:"satisfaction,omitempty"` - SfpFound FlexBool `json:"sfp_found,omitempty"` - Speed FlexInt `json:"speed"` - SpeedCaps FlexInt `json:"speed_caps"` - StpPathcost FlexInt `json:"stp_pathcost"` - StpState string `json:"stp_state"` - 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"` - Type string `json:"type,omitempty"` - Up FlexBool `json:"up"` -} - -// USWStat holds the "stat" data for a switch. -// This is split out because of a JSON data format change from 5.10 to 5.11. -type USWStat struct { - *Sw -} - -// Sw is a subtype of USWStat to make unmarshalling of different controller versions possible. -type Sw struct { - SiteID string `json:"site_id"` - O string `json:"o"` - Oid string `json:"oid"` - Sw string `json:"sw"` - Time FlexInt `json:"time"` - Datetime time.Time `json:"datetime"` - RxPackets FlexInt `json:"rx_packets"` - RxBytes FlexInt `json:"rx_bytes"` - RxErrors FlexInt `json:"rx_errors"` - RxDropped FlexInt `json:"rx_dropped"` - RxCrypts FlexInt `json:"rx_crypts"` - RxFrags FlexInt `json:"rx_frags"` - TxPackets FlexInt `json:"tx_packets"` - TxBytes FlexInt `json:"tx_bytes"` - TxErrors FlexInt `json:"tx_errors"` - TxDropped FlexInt `json:"tx_dropped"` - TxRetries FlexInt `json:"tx_retries"` - RxMulticast FlexInt `json:"rx_multicast"` - RxBroadcast FlexInt `json:"rx_broadcast"` - TxMulticast FlexInt `json:"tx_multicast"` - TxBroadcast FlexInt `json:"tx_broadcast"` - Bytes FlexInt `json:"bytes"` - Duration FlexInt `json:"duration"` - Port1RxPackets FlexInt `json:"port_1-rx_packets,omitempty"` - Port1RxBytes FlexInt `json:"port_1-rx_bytes,omitempty"` - Port1TxPackets FlexInt `json:"port_1-tx_packets,omitempty"` - Port1TxBytes FlexInt `json:"port_1-tx_bytes,omitempty"` - Port1TxMulticast FlexInt `json:"port_1-tx_multicast"` - Port1TxBroadcast FlexInt `json:"port_1-tx_broadcast"` - Port3RxPackets FlexInt `json:"port_3-rx_packets,omitempty"` - Port3RxBytes FlexInt `json:"port_3-rx_bytes,omitempty"` - Port3TxPackets FlexInt `json:"port_3-tx_packets,omitempty"` - Port3TxBytes FlexInt `json:"port_3-tx_bytes,omitempty"` - Port3RxBroadcast FlexInt `json:"port_3-rx_broadcast"` - Port3TxMulticast FlexInt `json:"port_3-tx_multicast"` - Port3TxBroadcast FlexInt `json:"port_3-tx_broadcast"` - Port6RxPackets FlexInt `json:"port_6-rx_packets,omitempty"` - Port6RxBytes FlexInt `json:"port_6-rx_bytes,omitempty"` - Port6TxPackets FlexInt `json:"port_6-tx_packets,omitempty"` - Port6TxBytes FlexInt `json:"port_6-tx_bytes,omitempty"` - Port6RxMulticast FlexInt `json:"port_6-rx_multicast"` - Port6TxMulticast FlexInt `json:"port_6-tx_multicast"` - Port6TxBroadcast FlexInt `json:"port_6-tx_broadcast"` - Port7RxPackets FlexInt `json:"port_7-rx_packets,omitempty"` - Port7RxBytes FlexInt `json:"port_7-rx_bytes,omitempty"` - Port7TxPackets FlexInt `json:"port_7-tx_packets,omitempty"` - Port7TxBytes FlexInt `json:"port_7-tx_bytes,omitempty"` - Port7TxMulticast FlexInt `json:"port_7-tx_multicast"` - Port7TxBroadcast FlexInt `json:"port_7-tx_broadcast"` - Port9RxPackets FlexInt `json:"port_9-rx_packets,omitempty"` - Port9RxBytes FlexInt `json:"port_9-rx_bytes,omitempty"` - Port9TxPackets FlexInt `json:"port_9-tx_packets,omitempty"` - Port9TxBytes FlexInt `json:"port_9-tx_bytes,omitempty"` - Port9TxMulticast FlexInt `json:"port_9-tx_multicast"` - Port9TxBroadcast FlexInt `json:"port_9-tx_broadcast"` - Port10RxPackets FlexInt `json:"port_10-rx_packets,omitempty"` - Port10RxBytes FlexInt `json:"port_10-rx_bytes,omitempty"` - Port10TxPackets FlexInt `json:"port_10-tx_packets,omitempty"` - Port10TxBytes FlexInt `json:"port_10-tx_bytes,omitempty"` - Port10RxMulticast FlexInt `json:"port_10-rx_multicast"` - Port10TxMulticast FlexInt `json:"port_10-tx_multicast"` - Port10TxBroadcast FlexInt `json:"port_10-tx_broadcast"` - Port11RxPackets FlexInt `json:"port_11-rx_packets,omitempty"` - Port11RxBytes FlexInt `json:"port_11-rx_bytes,omitempty"` - Port11TxPackets FlexInt `json:"port_11-tx_packets,omitempty"` - Port11TxBytes FlexInt `json:"port_11-tx_bytes,omitempty"` - Port11TxMulticast FlexInt `json:"port_11-tx_multicast"` - Port11TxBroadcast FlexInt `json:"port_11-tx_broadcast"` - Port12RxPackets FlexInt `json:"port_12-rx_packets,omitempty"` - Port12RxBytes FlexInt `json:"port_12-rx_bytes,omitempty"` - Port12TxPackets FlexInt `json:"port_12-tx_packets,omitempty"` - Port12TxBytes FlexInt `json:"port_12-tx_bytes,omitempty"` - Port12TxMulticast FlexInt `json:"port_12-tx_multicast"` - Port12TxBroadcast FlexInt `json:"port_12-tx_broadcast"` - Port13RxPackets FlexInt `json:"port_13-rx_packets,omitempty"` - Port13RxBytes FlexInt `json:"port_13-rx_bytes,omitempty"` - Port13TxPackets FlexInt `json:"port_13-tx_packets,omitempty"` - Port13TxBytes FlexInt `json:"port_13-tx_bytes,omitempty"` - Port13RxMulticast FlexInt `json:"port_13-rx_multicast"` - Port13RxBroadcast FlexInt `json:"port_13-rx_broadcast"` - Port13TxMulticast FlexInt `json:"port_13-tx_multicast"` - Port13TxBroadcast FlexInt `json:"port_13-tx_broadcast"` - Port15RxPackets FlexInt `json:"port_15-rx_packets,omitempty"` - Port15RxBytes FlexInt `json:"port_15-rx_bytes,omitempty"` - Port15TxPackets FlexInt `json:"port_15-tx_packets,omitempty"` - Port15TxBytes FlexInt `json:"port_15-tx_bytes,omitempty"` - Port15RxBroadcast FlexInt `json:"port_15-rx_broadcast"` - Port15TxMulticast FlexInt `json:"port_15-tx_multicast"` - Port15TxBroadcast FlexInt `json:"port_15-tx_broadcast"` - Port16RxPackets FlexInt `json:"port_16-rx_packets,omitempty"` - Port16RxBytes FlexInt `json:"port_16-rx_bytes,omitempty"` - Port16TxPackets FlexInt `json:"port_16-tx_packets,omitempty"` - Port16TxBytes FlexInt `json:"port_16-tx_bytes,omitempty"` - Port16TxMulticast FlexInt `json:"port_16-tx_multicast"` - Port16TxBroadcast FlexInt `json:"port_16-tx_broadcast"` - Port17RxPackets FlexInt `json:"port_17-rx_packets,omitempty"` - Port17RxBytes FlexInt `json:"port_17-rx_bytes,omitempty"` - Port17TxPackets FlexInt `json:"port_17-tx_packets,omitempty"` - Port17TxBytes FlexInt `json:"port_17-tx_bytes,omitempty"` - Port17TxMulticast FlexInt `json:"port_17-tx_multicast"` - Port17TxBroadcast FlexInt `json:"port_17-tx_broadcast"` - Port18RxPackets FlexInt `json:"port_18-rx_packets,omitempty"` - Port18RxBytes FlexInt `json:"port_18-rx_bytes,omitempty"` - Port18TxPackets FlexInt `json:"port_18-tx_packets,omitempty"` - Port18TxBytes FlexInt `json:"port_18-tx_bytes,omitempty"` - Port18RxMulticast FlexInt `json:"port_18-rx_multicast"` - Port18TxMulticast FlexInt `json:"port_18-tx_multicast"` - Port18TxBroadcast FlexInt `json:"port_18-tx_broadcast"` - Port19RxPackets FlexInt `json:"port_19-rx_packets,omitempty"` - Port19RxBytes FlexInt `json:"port_19-rx_bytes,omitempty"` - Port19TxPackets FlexInt `json:"port_19-tx_packets,omitempty"` - Port19TxBytes FlexInt `json:"port_19-tx_bytes,omitempty"` - Port19TxMulticast FlexInt `json:"port_19-tx_multicast"` - Port19TxBroadcast FlexInt `json:"port_19-tx_broadcast"` - Port21RxPackets FlexInt `json:"port_21-rx_packets,omitempty"` - Port21RxBytes FlexInt `json:"port_21-rx_bytes,omitempty"` - Port21TxPackets FlexInt `json:"port_21-tx_packets,omitempty"` - Port21TxBytes FlexInt `json:"port_21-tx_bytes,omitempty"` - Port21RxBroadcast FlexInt `json:"port_21-rx_broadcast"` - Port21TxMulticast FlexInt `json:"port_21-tx_multicast"` - Port21TxBroadcast FlexInt `json:"port_21-tx_broadcast"` - Port22RxPackets FlexInt `json:"port_22-rx_packets,omitempty"` - Port22RxBytes FlexInt `json:"port_22-rx_bytes,omitempty"` - Port22TxPackets FlexInt `json:"port_22-tx_packets,omitempty"` - Port22TxBytes FlexInt `json:"port_22-tx_bytes,omitempty"` - Port22RxMulticast FlexInt `json:"port_22-rx_multicast"` - Port22TxMulticast FlexInt `json:"port_22-tx_multicast"` - Port22TxBroadcast FlexInt `json:"port_22-tx_broadcast"` - Port23RxPackets FlexInt `json:"port_23-rx_packets,omitempty"` - Port23RxBytes FlexInt `json:"port_23-rx_bytes,omitempty"` - Port23RxDropped FlexInt `json:"port_23-rx_dropped"` - Port23TxPackets FlexInt `json:"port_23-tx_packets,omitempty"` - Port23TxBytes FlexInt `json:"port_23-tx_bytes,omitempty"` - Port23RxMulticast FlexInt `json:"port_23-rx_multicast"` - Port23RxBroadcast FlexInt `json:"port_23-rx_broadcast"` - Port23TxMulticast FlexInt `json:"port_23-tx_multicast"` - Port23TxBroadcast FlexInt `json:"port_23-tx_broadcast"` - Port24RxPackets FlexInt `json:"port_24-rx_packets,omitempty"` - Port24RxBytes FlexInt `json:"port_24-rx_bytes,omitempty"` - Port24TxPackets FlexInt `json:"port_24-tx_packets,omitempty"` - Port24TxBytes FlexInt `json:"port_24-tx_bytes,omitempty"` - Port24RxMulticast FlexInt `json:"port_24-rx_multicast"` - Port24TxMulticast FlexInt `json:"port_24-tx_multicast"` - Port24TxBroadcast FlexInt `json:"port_24-tx_broadcast"` - Port1RxMulticast FlexInt `json:"port_1-rx_multicast"` - Port3RxDropped FlexInt `json:"port_3-rx_dropped"` - Port3RxMulticast FlexInt `json:"port_3-rx_multicast"` - Port6RxDropped FlexInt `json:"port_6-rx_dropped"` - Port7RxDropped FlexInt `json:"port_7-rx_dropped"` - Port7RxMulticast FlexInt `json:"port_7-rx_multicast"` - Port9RxDropped FlexInt `json:"port_9-rx_dropped"` - Port9RxMulticast FlexInt `json:"port_9-rx_multicast"` - Port9RxBroadcast FlexInt `json:"port_9-rx_broadcast"` - Port10RxBroadcast FlexInt `json:"port_10-rx_broadcast"` - Port12RxDropped FlexInt `json:"port_12-rx_dropped"` - Port12RxMulticast FlexInt `json:"port_12-rx_multicast"` - Port13RxDropped FlexInt `json:"port_13-rx_dropped"` - Port17RxDropped FlexInt `json:"port_17-rx_dropped"` - Port17RxMulticast FlexInt `json:"port_17-rx_multicast"` - Port17RxBroadcast FlexInt `json:"port_17-rx_broadcast"` - Port19RxDropped FlexInt `json:"port_19-rx_dropped"` - Port19RxMulticast FlexInt `json:"port_19-rx_multicast"` - Port19RxBroadcast FlexInt `json:"port_19-rx_broadcast"` - Port21RxDropped FlexInt `json:"port_21-rx_dropped"` - Port21RxMulticast FlexInt `json:"port_21-rx_multicast"` - Port7RxBroadcast FlexInt `json:"port_7-rx_broadcast"` - Port18RxBroadcast FlexInt `json:"port_18-rx_broadcast"` - Port16RxMulticast FlexInt `json:"port_16-rx_multicast"` - Port15RxDropped FlexInt `json:"port_15-rx_dropped"` - Port15RxMulticast FlexInt `json:"port_15-rx_multicast"` - Port16RxBroadcast FlexInt `json:"port_16-rx_broadcast"` - Port11RxBroadcast FlexInt `json:"port_11-rx_broadcast"` - Port12RxBroadcast FlexInt `json:"port_12-rx_broadcast"` - Port6RxBroadcast FlexInt `json:"port_6-rx_broadcast"` - Port24RxBroadcast FlexInt `json:"port_24-rx_broadcast"` - Port22RxBroadcast FlexInt `json:"port_22-rx_broadcast"` - Port10TxDropped FlexInt `json:"port_10-tx_dropped"` - Port16TxDropped FlexInt `json:"port_16-tx_dropped"` - Port1RxBroadcast FlexInt `json:"port_1-rx_broadcast"` - Port4RxPackets FlexInt `json:"port_4-rx_packets,omitempty"` - Port4RxBytes FlexInt `json:"port_4-rx_bytes,omitempty"` - Port4RxDropped FlexInt `json:"port_4-rx_dropped"` - Port4TxPackets FlexInt `json:"port_4-tx_packets,omitempty"` - Port4TxBytes FlexInt `json:"port_4-tx_bytes,omitempty"` - Port4TxDropped FlexInt `json:"port_4-tx_dropped"` - Port4RxMulticast FlexInt `json:"port_4-rx_multicast"` - Port4RxBroadcast FlexInt `json:"port_4-rx_broadcast"` - Port4TxMulticast FlexInt `json:"port_4-tx_multicast"` - Port4TxBroadcast FlexInt `json:"port_4-tx_broadcast"` -} - -// UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Switch Stat data. -func (v *USWStat) UnmarshalJSON(data []byte) error { - var n struct { - Sw `json:"sw"` - } - v.Sw = &n.Sw - err := json.Unmarshal(data, v.Sw) // controller version 5.10. - if err != nil { - return json.Unmarshal(data, &n) // controller version 5.11. - } - return nil -}