268 lines
11 KiB
Go
268 lines
11 KiB
Go
package unidev
|
|
|
|
import (
|
|
"strconv"
|
|
"time"
|
|
|
|
influx "github.com/influxdata/influxdb/client/v2"
|
|
)
|
|
|
|
// Points generates a device's datapoints for InfluxDB.
|
|
func (u UAP) Points() ([]*influx.Point, error) {
|
|
/* I generally suck at InfluxDB, so if I got the tags/fields wrong,
|
|
please send me a PR or open an Issue to address my faults. Thanks!
|
|
*/
|
|
var points []*influx.Point
|
|
tags := map[string]string{
|
|
"id": u.ID,
|
|
"mac": u.Mac,
|
|
"device_type": u.Stat.O,
|
|
"device_oid": u.Stat.Oid,
|
|
"device_ap": u.Stat.Ap,
|
|
"site_id": u.SiteID,
|
|
"name": u.Name,
|
|
"addopted": strconv.FormatBool(u.Adopted),
|
|
"bandsteering_mode": u.BandsteeringMode,
|
|
"board_rev": strconv.Itoa(u.BoardRev),
|
|
"cfgversion": u.Cfgversion,
|
|
"config_network_ip": u.ConfigNetwork.IP,
|
|
"config_network_type": u.ConfigNetwork.Type,
|
|
"connect_request_ip": u.ConnectRequestIP,
|
|
"connect_request_port": u.ConnectRequestPort,
|
|
"default": strconv.FormatBool(u.Default),
|
|
"device_id": u.DeviceID,
|
|
"discovered_via": u.DiscoveredVia,
|
|
"fw_caps": strconv.Itoa(u.FwCaps),
|
|
"guest-num_sta": strconv.Itoa(u.GuestNumSta),
|
|
"guest_token": u.GuestToken,
|
|
"has_eth1": strconv.FormatBool(u.HasEth1),
|
|
"has_speaker": strconv.FormatBool(u.HasSpeaker),
|
|
"inform_ip": u.InformIP,
|
|
"isolated": strconv.FormatBool(u.Isolated),
|
|
"last_seen": strconv.FormatFloat(u.LastSeen, 'f', 6, 64),
|
|
"last_uplink_mac": u.LastUplink.UplinkMac,
|
|
"last_uplink_remote_port": strconv.Itoa(u.LastUplink.UplinkRemotePort),
|
|
"known_cfgversion": u.KnownCfgversion,
|
|
"led_override": u.LedOverride,
|
|
"locating": strconv.FormatBool(u.Locating),
|
|
"model": u.Model,
|
|
"outdoor_mode_override": u.OutdoorModeOverride,
|
|
"serial": u.Serial,
|
|
"type": u.Type,
|
|
"version_incompatible": strconv.FormatBool(u.VersionIncompatible),
|
|
"vwireEnabled": strconv.FormatBool(u.VwireEnabled),
|
|
"wifi_caps": strconv.Itoa(u.WifiCaps),
|
|
}
|
|
fields := map[string]interface{}{
|
|
"ip": u.IP,
|
|
"bytes": u.Bytes,
|
|
"bytes_d": u.BytesD,
|
|
"bytes_r": u.BytesR,
|
|
"last_seen": u.LastSeen,
|
|
"rx_bytes": u.RxBytes,
|
|
"rx_bytes-d": u.RxBytesD,
|
|
"tx_bytes": u.TxBytes,
|
|
"tx_bytes-d": u.TxBytesD,
|
|
"uptime": u.Uptime,
|
|
"considered_lost_at": u.ConsideredLostAt,
|
|
"next_heartbeat_at": u.NextHeartbeatAt,
|
|
"scanning": u.Scanning,
|
|
"spectrum_scanning": u.SpectrumScanning,
|
|
"roll_upgrade": u.Rollupgrade,
|
|
"state": u.State,
|
|
"upgradable": u.Upgradable,
|
|
"user-num_sta": u.UserNumSta,
|
|
"version": u.Version,
|
|
"loadavg_1": u.SysStats.Loadavg1,
|
|
"loadavg_5": u.SysStats.Loadavg5,
|
|
"loadavg_15": u.SysStats.Loadavg15,
|
|
"mem_buffer": u.SysStats.MemBuffer,
|
|
"mem_total": u.SysStats.MemTotal,
|
|
"mem_used": u.SysStats.MemUsed,
|
|
"cpu": u.SystemStats.CPU,
|
|
"mem": u.SystemStats.Mem,
|
|
"system_uptime": u.SystemStats.Uptime,
|
|
"stat_bytes": u.Stat.Bytes,
|
|
"stat_duration": u.Stat.Duration,
|
|
"stat_guest-rx_bytes": u.Stat.RxBytes,
|
|
"stat_guest-rx_crypts": u.Stat.RxCrypts,
|
|
"stat_guest-rx_dropped": u.Stat.RxDropped,
|
|
"stat_guest-rx_errors": u.Stat.RxErrors,
|
|
"stat_guest-rx_frags": u.Stat.RxFrags,
|
|
"stat_guest-rx_packets": u.Stat.RxPackets,
|
|
"stat_guest-tx_bytes": u.Stat.TxBytes,
|
|
"stat_guest-tx_dropped": u.Stat.TxDropped,
|
|
"stat_guest-tx_errors": u.Stat.TxErrors,
|
|
"stat_guest-tx_packets": u.Stat.TxPackets,
|
|
"stat_guest-tx_retries": u.Stat.TxRetries,
|
|
"stat_port_1-rx_broadcast": u.Stat.Port1RxBroadcast,
|
|
"stat_port_1-rx_bytes": u.Stat.Port1RxBytes,
|
|
"stat_port_1-rx_multicast": u.Stat.Port1RxMulticast,
|
|
"stat_port_1-rx_packets": u.Stat.Port1RxPackets,
|
|
"stat_port_1-tx_broadcast": u.Stat.Port1TxBroadcast,
|
|
"stat_port_1-tx_bytes": u.Stat.Port1TxBytes,
|
|
"stat_port_1-tx_multicast": u.Stat.Port1TxMulticast,
|
|
"stat_port_1-tx_packets": u.Stat.Port1TxPackets,
|
|
"stat_rx_bytes": u.Stat.RxBytes,
|
|
"stat_rx_crypts": u.Stat.RxCrypts,
|
|
"stat_rx_dropped": u.Stat.RxDropped,
|
|
"stat_rx_errors": u.Stat.RxErrors,
|
|
"stat_rx_frags": u.Stat.RxFrags,
|
|
"stat_rx_packets": u.Stat.TxPackets,
|
|
"stat_tx_bytes": u.Stat.TxBytes,
|
|
"stat_tx_dropped": u.Stat.TxDropped,
|
|
"stat_tx_errors": u.Stat.TxErrors,
|
|
"stat_tx_packets": u.Stat.TxPackets,
|
|
"stat_tx_retries": u.Stat.TxRetries,
|
|
"stat_user-rx_bytes": u.Stat.UserRxBytes,
|
|
"stat_user-rx_crypts": u.Stat.UserRxCrypts,
|
|
"stat_user-rx_dropped": u.Stat.UserRxDropped,
|
|
"stat_user-rx_errors": u.Stat.UserRxErrors,
|
|
"stat_user-rx_frags": u.Stat.UserRxFrags,
|
|
"stat_user-rx_packets": u.Stat.UserRxPackets,
|
|
"stat_user-tx_bytes": u.Stat.UserTxBytes,
|
|
"stat_user-tx_dropped": u.Stat.UserTxDropped,
|
|
"stat_user-tx_errors": u.Stat.UserTxErrors,
|
|
"stat_user-tx_packets": u.Stat.UserTxPackets,
|
|
"stat_user-tx_retries": u.Stat.UserTxRetries,
|
|
"stat_user-wifi0-rx_bytes": u.Stat.UserWifi0RxBytes,
|
|
"stat_user-wifi0-rx_crypts": u.Stat.UserWifi0RxCrypts,
|
|
"stat_user-wifi0-rx_dropped": u.Stat.UserWifi0RxDropped,
|
|
"stat_user-wifi0-rx_errors": u.Stat.UserWifi0RxErrors,
|
|
"stat_user-wifi0-rx_frags": u.Stat.UserWifi0RxFrags,
|
|
"stat_user-wifi0-rx_packets": u.Stat.UserWifi0RxPackets,
|
|
"stat_user-wifi0-tx_bytes": u.Stat.UserWifi0TxBytes,
|
|
"stat_user-wifi0-tx_dropped": u.Stat.UserWifi0TxDropped,
|
|
"stat_user-wifi0-tx_errors": u.Stat.UserWifi0TxErrors,
|
|
"stat_user-wifi0-tx_packets": u.Stat.UserWifi0TxPackets,
|
|
"stat_user-wifi0-tx_retries": u.Stat.UserWifi0TxRetries,
|
|
"stat_user-wifi1-rx_bytes": u.Stat.UserWifi1RxBytes,
|
|
"stat_user-wifi1-rx_crypts": u.Stat.UserWifi1RxCrypts,
|
|
"stat_user-wifi1-rx_dropped": u.Stat.UserWifi1RxDropped,
|
|
"stat_user-wifi1-rx_errors": u.Stat.UserWifi1RxErrors,
|
|
"stat_user-wifi1-rx_frags": u.Stat.UserWifi1RxFrags,
|
|
"stat_user-wifi1-rx_packets": u.Stat.UserWifi1RxPackets,
|
|
"stat_user-wifi1-tx_bytes": u.Stat.UserWifi1TxBytes,
|
|
"stat_user-wifi1-tx_dropped": u.Stat.UserWifi1TxDropped,
|
|
"stat_user-wifi1-tx_errors": u.Stat.UserWifi1TxErrors,
|
|
"stat_user-wifi1-tx_packets": u.Stat.UserWifi1TxPackets,
|
|
"stat_user-wifi1-tx_retries": u.Stat.UserWifi1TxRetries,
|
|
"stat_wifi0-rx_bytes": u.Stat.Wifi0RxBytes,
|
|
"stat_wifi0-rx_crypts": u.Stat.Wifi0RxCrypts,
|
|
"stat_wifi0-rx_dropped": u.Stat.Wifi0RxDropped,
|
|
"stat_wifi0-rx_errors": u.Stat.Wifi0RxErrors,
|
|
"stat_wifi0-rx_frags": u.Stat.Wifi0RxFrags,
|
|
"stat_wifi0-rx_packets": u.Stat.Wifi0RxPackets,
|
|
"stat_wifi0-tx_bytes": u.Stat.Wifi0TxBytes,
|
|
"stat_wifi0-tx_dropped": u.Stat.Wifi0TxDropped,
|
|
"stat_wifi0-tx_errors": u.Stat.Wifi0TxErrors,
|
|
"stat_wifi0-tx_packets": u.Stat.Wifi0TxPackets,
|
|
"stat_wifi0-tx_retries": u.Stat.Wifi0TxRetries,
|
|
"stat_wifi1-rx_bytes": u.Stat.Wifi1RxBytes,
|
|
"stat_wifi1-rx_crypts": u.Stat.Wifi1RxCrypts,
|
|
"stat_wifi1-rx_dropped": u.Stat.Wifi1RxDropped,
|
|
"stat_wifi1-rx_errors": u.Stat.Wifi1RxErrors,
|
|
"stat_wifi1-rx_frags": u.Stat.Wifi1RxFrags,
|
|
"stat_wifi1-rx_packets": u.Stat.Wifi1RxPackets,
|
|
"stat_wifi1-tx_bytes": u.Stat.Wifi1TxBytes,
|
|
"stat_wifi1-tx_dropped": u.Stat.Wifi1TxDropped,
|
|
"stat_wifi1-tx_errors": u.Stat.Wifi1TxErrors,
|
|
"stat_wifi1-tx_packets": u.Stat.Wifi1TxPackets,
|
|
"stat_wifi1-tx_retries": u.Stat.Wifi1TxRetries,
|
|
}
|
|
pt, err := influx.NewPoint("uap", tags, fields, time.Now())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
points = append(points, pt)
|
|
for _, p := range u.RadioTable {
|
|
tags := map[string]string{
|
|
"device_name": u.Name,
|
|
"device_id": u.ID,
|
|
"device_mac": u.Mac,
|
|
"name": p.Name,
|
|
"wlangroup_id": p.WlangroupID,
|
|
"channel": p.Channel, // not the channel #
|
|
"radio": p.Radio,
|
|
}
|
|
fields := map[string]interface{}{
|
|
"builtin_ant_gain": p.BuiltinAntGain,
|
|
"current_antenna_gain": p.CurrentAntennaGain,
|
|
"has_dfs": p.HasDfs,
|
|
"has_fccdfs": p.HasFccdfs,
|
|
"ht": p.Ht,
|
|
"is_11ac": p.Is11Ac,
|
|
"max_txpower": p.MaxTxpower,
|
|
"min_rssi_enabled": p.MinRssiEnabled,
|
|
"min_txpower": p.MinTxpower,
|
|
"nss": p.Nss,
|
|
"radio_caps": p.RadioCaps,
|
|
"tx_power": p.TxPower,
|
|
"tx_power_mode": p.TxPowerMode,
|
|
}
|
|
|
|
for _, s := range u.RadioTableStats {
|
|
// This may be a tad slower but it allows putting
|
|
// all the radio stats into one table.
|
|
if p.Name == s.Name {
|
|
fields["ast_be_xmit"] = s.AstBeXmit
|
|
fields["ast_cst"] = s.AstCst
|
|
fields["channel"] = s.Channel
|
|
fields["ast_txto"] = s.AstTxto
|
|
fields["cu_self_rx"] = s.CuSelfRx
|
|
fields["cu_self_tx"] = s.CuSelfTx
|
|
fields["cu_total"] = s.CuTotal
|
|
fields["extchannel"] = s.Extchannel
|
|
fields["gain"] = s.Gain
|
|
fields["guest-num_sta"] = s.GuestNumSta
|
|
fields["num_sta"] = s.NumSta
|
|
fields["radio"] = s.Radio
|
|
fields["state"] = s.State
|
|
fields["radio_tx_packets"] = s.TxPackets
|
|
fields["radio_tx_power"] = s.TxPower
|
|
fields["radio_tx_retries"] = s.TxRetries
|
|
fields["user-num_sta"] = s.UserNumSta
|
|
}
|
|
}
|
|
for _, s := range u.VapTable {
|
|
if p.Name == s.RadioName {
|
|
tags["ap_mac"] = s.ApMac
|
|
tags["bssid"] = s.Bssid
|
|
fields["ccq"] = s.Ccq
|
|
fields["essid"] = s.Essid
|
|
fields["extchannel"] = s.Extchannel
|
|
tags["vap_id"] = s.ID
|
|
fields["is_guest"] = s.IsGuest
|
|
fields["is_wep"] = s.IsWep
|
|
fields["mac_filter_rejections"] = s.MacFilterRejections
|
|
fields["map_id"] = s.MapID
|
|
tags["vap_name"] = s.Name
|
|
fields["rx_bytes"] = s.RxBytes
|
|
fields["rx_crypts"] = s.RxCrypts
|
|
fields["rx_dropped"] = s.RxDropped
|
|
fields["rx_errors"] = s.RxErrors
|
|
fields["rx_frags"] = s.RxFrags
|
|
fields["rx_nwids"] = s.RxNwids
|
|
fields["rx_packets"] = s.RxPackets
|
|
fields["tx_bytes"] = s.TxBytes
|
|
fields["tx_dropped"] = s.TxDropped
|
|
fields["tx_errors"] = s.TxErrors
|
|
fields["tx_latency_avg"] = s.TxLatencyAvg
|
|
fields["tx_latency_max"] = s.TxLatencyMax
|
|
fields["tx_latency_min"] = s.TxLatencyMin
|
|
fields["tx_packets"] = s.TxPackets
|
|
fields["tx_power"] = s.TxPower
|
|
fields["tx_retries"] = s.TxRetries
|
|
fields["usage"] = s.Usage
|
|
tags["wlanconf_id"] = s.WlanconfID
|
|
}
|
|
}
|
|
pt, err := influx.NewPoint("uap_radios", tags, fields, time.Now())
|
|
if err != nil {
|
|
return points, err
|
|
}
|
|
points = append(points, pt)
|
|
}
|
|
return points, nil
|
|
}
|