package unidev import ( "strconv" "time" influx "github.com/influxdata/influxdb/client/v2" ) // Points generates a device's datapoints for InfluxDB. func (u USG) Points() ([]*influx.Point, error) { var points []*influx.Point tags := map[string]string{ "id": u.ID, "mac": u.Mac, "device_type": u.Stat.O, "device_oid": u.Stat.Oid, "site_id": u.SiteID, "addopted": strconv.FormatBool(u.Adopted), "name": u.Name, "adopt_ip": u.AdoptIP, "adopt_url": u.AdoptURL, "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, "guest_token": u.GuestToken, "inform_ip": u.InformIP, "last_seen": strconv.FormatFloat(u.LastSeen, 'f', 6, 64), "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), "usg_caps": strconv.FormatFloat(u.UsgCaps, 'f', 6, 64), "speedtest-status-saved": strconv.FormatBool(u.SpeedtestStatusSaved), } fields := map[string]interface{}{ "ip": u.IP, "bytes": u.Bytes, "last_seen": u.LastSeen, "license_state": u.LicenseState, "fw_caps": u.FwCaps, "guest-num_sta": u.GuestNumSta, "rx_bytes": u.RxBytes, "tx_bytes": u.TxBytes, "uptime": u.Uptime, "considered_lost_at": u.ConsideredLostAt, "next_heartbeat_at": u.NextHeartbeatAt, "roll_upgrade": u.Rollupgrade, "state": u.State, "upgradable": u.Upgradable, "user-num_sta": u.UserNumSta, "version": u.Version, "num_desktop": u.NumDesktop, "num_handheld": u.NumHandheld, "num_mobile": u.NumMobile, "speedtest-status_latency": u.SpeedtestStatus.Latency, "speedtest-status_rundate": u.SpeedtestStatus.Rundate, "speedtest-status_runtime": u.SpeedtestStatus.Runtime, "speedtest-status_download": u.SpeedtestStatus.StatusDownload, "speedtest-status_ping": u.SpeedtestStatus.StatusPing, "speedtest-status_summary": u.SpeedtestStatus.StatusSummary, "speedtest-status_upload": u.SpeedtestStatus.StatusUpload, "speedtest-status_xput_download": u.SpeedtestStatus.XputDownload, "speedtest-status_xput_upload": u.SpeedtestStatus.XputUpload, // have two WANs? mmmm, go ahead and add it. ;) "config_network_wan_type": u.ConfigNetworkWan.Type, "wan1_bytes-r": u.Wan1.BytesR, "wan1_enable": u.Wan1.Enable, "wan1_full_duplex": u.Wan1.FullDuplex, "wan1_purpose": "uplink", // because it should have a purpose. "wan1_gateway": u.Wan1.Gateway, "wan1_ifname": u.Wan1.Ifname, "wan1_ip": u.Wan1.IP, "wan1_mac": u.Wan1.Mac, "wan1_max_speed": u.Wan1.MaxSpeed, "wan1_name": u.Wan1.Name, "wan1_netmask": u.Wan1.Netmask, "wan1_rx_bytes": u.Wan1.RxBytes, "wan1_rx_bytes-r": u.Wan1.RxBytesR, "wan1_rx_dropped": u.Wan1.RxDropped, "wan1_rx_errors": u.Wan1.RxErrors, "wan1_rx_multicast": u.Wan1.RxMulticast, "wan1_rx_packets": u.Wan1.RxPackets, "wan1_type": u.Wan1.Type, "wan1_speed": u.Wan1.Speed, "wan1_up": u.Wan1.Up, "wan1_tx_bytes": u.Wan1.TxBytes, "wan1_tx_bytes-r": u.Wan1.TxBytesR, "wan1_tx_dropped": u.Wan1.TxDropped, "wan1_tx_errors": u.Wan1.TxErrors, "wan1_tx_packets": u.Wan1.TxPackets, "loadavg_1": u.SysStats.Loadavg1, "loadavg_5": u.SysStats.Loadavg5, "loadavg_15": u.SysStats.Loadavg15, "mem_used": u.SysStats.MemUsed, "mem_buffer": u.SysStats.MemBuffer, "mem_total": u.SysStats.MemTotal, "cpu": u.SystemStats.CPU, "mem": u.SystemStats.Mem, "system_uptime": u.SystemStats.Uptime, "stat_duration": u.Stat.Duration, "stat_datetime": u.Stat.Datetime, "gw": u.Stat.Gw, "false": "false", // to fill holes in graphs. "lan-rx_bytes": u.Stat.LanRxBytes, "lan-rx_packets": u.Stat.LanRxPackets, "lan-tx_bytes": u.Stat.LanTxBytes, "lan-tx_packets": u.Stat.LanTxPackets, "wan-rx_bytes": u.Stat.WanRxBytes, "wan-rx_dropped": u.Stat.WanRxDropped, "wan-rx_packets": u.Stat.WanRxPackets, "wan-tx_bytes": u.Stat.WanTxBytes, "wan-tx_packets": u.Stat.WanTxPackets, "uplink_name": u.Uplink.Name, "uplink_latency": u.Uplink.Latency, "uplink_speed": u.Uplink.Speed, "uplink_num_ports": u.Uplink.NumPort, "uplink_max_speed": u.Uplink.MaxSpeed, } pt, err := influx.NewPoint("usg", tags, fields, time.Now()) if err != nil { return nil, err } points = append(points, pt) for _, p := range u.NetworkTable { tags := map[string]string{ "device_name": u.Name, "device_id": u.ID, "device_mac": u.Mac, "name": p.Name, "dhcpd_dns_enabled": strconv.FormatBool(p.DhcpdDNSEnabled), "dhcpd_enabled": strconv.FormatBool(p.DhcpdEnabled), "dhcpd_ntp_enabled": strconv.FormatBool(p.DhcpdNtpEnabled), "dhcpd_time_offset_enabled": strconv.FormatBool(p.DhcpdTimeOffsetEnabled), "dhcp_relay_enabledy": strconv.FormatBool(p.DhcpRelayEnabled), "dhcpd_gateway_enabled": strconv.FormatBool(p.DhcpdGatewayEnabled), "dhcpd_wins_enabled": strconv.FormatBool(p.DhcpdWinsEnabled), "dhcpguard_enabled": strconv.FormatBool(p.DhcpguardEnabled), "enabled": strconv.FormatBool(p.Enabled), "vlan_enabled": strconv.FormatBool(p.VlanEnabled), "attr_no_delete": strconv.FormatBool(p.AttrNoDelete), "upnp_lan_enabled": strconv.FormatBool(p.UpnpLanEnabled), "igmp_snooping": strconv.FormatBool(p.IgmpSnooping), "is_guest": strconv.FormatBool(p.IsGuest), "is_nat": strconv.FormatBool(p.IsNat), "networkgroup": p.Networkgroup, "site_id": p.SiteID, } fields := map[string]interface{}{ "dhcpd_ip_1": p.DhcpdIP1, "domain_name": p.DomainName, "dhcpd_start": p.DhcpdStart, "dhcpd_stop": p.DhcpdStop, "ip": p.IP, "ip_subnet": p.IPSubnet, "mac": p.Mac, "name": p.Name, "num_sta": p.NumSta, "purpose": p.Purpose, "rx_bytes": p.RxBytes, "rx_packets": p.RxPackets, "tx_bytes": p.TxBytes, "tx_packets": p.TxPackets, "up": p.Up, "vlan": p.Vlan, "dhcpd_ntp_1": p.DhcpdNtp1, "dhcpd_unifi_controller": p.DhcpdUnifiController, "ipv6_interface_type": p.Ipv6InterfaceType, "attr_hidden_id": p.AttrHiddenID, } pt, err = influx.NewPoint("usg_networks", tags, fields, time.Now()) if err != nil { return points, err } points = append(points, pt) } return points, err }