github.com/dim13/unifi@v0.0.0-20230308161331-9b04946f5e93/uap.go (about)

     1  // Copyright (c) 2014 The unifi Authors. All rights reserved.
     2  // Use of this source code is governed by ISC-style license
     3  // that can be found in the LICENSE file.
     4  
     5  package unifi
     6  
     7  import (
     8  	"encoding/json"
     9  	"time"
    10  )
    11  
    12  // Access point data
    13  type UAP struct {
    14  	u  *Unifi
    15  	ID string `json:"_id"`
    16  	//Uptime        int           `json:"_uptime"`
    17  	Adopted       bool   `json:"adopted"`
    18  	AntennaTable  []any  `json:"antenna_table"`
    19  	Bytes         int64  `json:"bytes"`
    20  	BytesD        int64  `json:"bytes-d"`
    21  	BytesR        int64  `json:"bytes-r"`
    22  	Cfgversion    string `json:"cfgversion"`
    23  	ConfigNetwork struct {
    24  		IP   string `json:"ip"`
    25  		Type string `json:"type"`
    26  	} `json:"config_network"`
    27  	ConnectRequestIP string `json:"connect_request_ip"`
    28  	//ConnectRequestPort int           `json:"connect_request_port"` //FIXME: Prior to 5.7.20 type string!
    29  	ConsideredLostAt int    `json:"considered_lost_at"`
    30  	DeviceID         string `json:"device_id"`
    31  	DownlinkTable    []any  `json:"downlink_table"`
    32  	EthernetTable    []struct {
    33  		Mac     string `json:"mac"`
    34  		Name    string `json:"name"`
    35  		NumPort int    `json:"num_port"`
    36  	} `json:"ethernet_table"`
    37  	FwCaps          int    `json:"fw_caps"`
    38  	GuestNumSta     int    `json:"guest-num_sta"`
    39  	GuestToken      string `json:"guest_token"`
    40  	HasEth1         bool   `json:"has_eth1"`
    41  	HasSpeaker      bool   `json:"has_speaker"`
    42  	InformIP        string `json:"inform_ip"`
    43  	InformURL       string `json:"inform_url"`
    44  	IP              string `json:"ip"`
    45  	Isolated        bool   `json:"isolated"`
    46  	KnownCfgversion string `json:"known_cfgversion"`
    47  	LastSeen        int    `json:"last_seen"`
    48  	LedOverride     string `json:"led_override"`
    49  	LicenseState    string `json:"license_state"`
    50  	Locating        bool   `json:"locating"`
    51  
    52  	Mac   string `json:"mac"`
    53  	MapID string `json:"map_id"`
    54  	Model string `json:"model"`
    55  
    56  	Name            string `json:"name"`
    57  	NextHeartbeatAt int    `json:"next_heartbeat_at"`
    58  	NumSta          int    `json:"num_sta"`
    59  	PortStats       []any  `json:"port_stats"`
    60  	PortTable       []Port `json:"port_table,omitempty"`
    61  	RadioTable      []struct {
    62  		BuiltinAntGain     int    `json:"builtin_ant_gain"`
    63  		BuiltinAntenna     bool   `json:"builtin_antenna"`
    64  		CurrentAntennaGain int    `json:"current_antenna_gain"`
    65  		MaxTxpower         int    `json:"max_txpower"`
    66  		MinTxpower         int    `json:"min_txpower"`
    67  		Name               string `json:"name"`
    68  		Nss                int    `json:"nss"`
    69  		Radio              string `json:"radio"`
    70  		RadioCaps          int    `json:"radio_caps"`
    71  		WlangroupID        string `json:"wlangroup_id"`
    72  		HasDfs             bool   `json:"has_dfs,omitempty"`
    73  		HasFccdfs          bool   `json:"has_fccdfs,omitempty"`
    74  		Is11Ac             bool   `json:"is_11ac,omitempty"`
    75  	} `json:"radio_table"`
    76  	RadioTableStats []struct {
    77  		AstBeXmit   any    `json:"ast_be_xmit"`
    78  		AstCst      any    `json:"ast_cst"`
    79  		AstTxto     any    `json:"ast_txto"`
    80  		Channel     int    `json:"channel"`
    81  		CuSelfRx    int    `json:"cu_self_rx"`
    82  		CuSelfTx    int    `json:"cu_self_tx"`
    83  		CuTotal     int    `json:"cu_total"`
    84  		Extchannel  int    `json:"extchannel"`
    85  		Gain        int    `json:"gain"`
    86  		GuestNumSta int    `json:"guest-num_sta"`
    87  		Name        string `json:"name"`
    88  		NumSta      int    `json:"num_sta"`
    89  		Radio       string `json:"radio"`
    90  		State       string `json:"state"`
    91  		TxPackets   int64  `json:"tx_packets"`
    92  		TxPower     int64  `json:"tx_power"`
    93  		TxRetries   int64  `json:"tx_retries"`
    94  		UserNumSta  int    `json:"user-num_sta"`
    95  	} `json:"radio_table_stats"`
    96  
    97  	RxBytes          int64  `json:"rx_bytes"`
    98  	RxBytesD         int64  `json:"rx_bytes-d"`
    99  	ScanRadioTable   []any  `json:"scan_radio_table"`
   100  	Scanning         bool   `json:"scanning"`
   101  	Serial           string `json:"serial"`
   102  	SiteID           string `json:"site_id"`
   103  	SpectrumScanning bool   `json:"spectrum_scanning"`
   104  	SSHSessionTable  []any  `json:"ssh_session_table"`
   105  	Stat             struct {
   106  		Ap struct {
   107  			Ap                                             string    `json:"ap"`
   108  			Bytes                                          float64   `json:"bytes"`
   109  			Datetime                                       time.Time `json:"datetime"`
   110  			Duration                                       float64   `json:"duration"`
   111  			GuestRxBytes                                   float64   `json:"guest-rx_bytes"`
   112  			GuestRxCrypts                                  float64   `json:"guest-rx_crypts"`
   113  			GuestRxDropped                                 float64   `json:"guest-rx_dropped"`
   114  			GuestRxErrors                                  float64   `json:"guest-rx_errors"`
   115  			GuestRxFrags                                   float64   `json:"guest-rx_frags"`
   116  			GuestRxPackets                                 float64   `json:"guest-rx_packets"`
   117  			GuestTxBytes                                   float64   `json:"guest-tx_bytes"`
   118  			GuestTxDropped                                 float64   `json:"guest-tx_dropped"`
   119  			GuestTxErrors                                  float64   `json:"guest-tx_errors"`
   120  			GuestTxPackets                                 float64   `json:"guest-tx_packets"`
   121  			GuestTxRetries                                 float64   `json:"guest-tx_retries"`
   122  			O                                              string    `json:"o"`
   123  			Oid                                            string    `json:"oid"`
   124  			RxBytes                                        float64   `json:"rx_bytes"`
   125  			RxCrypts                                       float64   `json:"rx_crypts"`
   126  			RxDropped                                      float64   `json:"rx_dropped"`
   127  			RxErrors                                       float64   `json:"rx_errors"`
   128  			RxFrags                                        float64   `json:"rx_frags"`
   129  			RxPackets                                      float64   `json:"rx_packets"`
   130  			SiteID                                         string    `json:"site_id"`
   131  			Time                                           int64     `json:"time"`
   132  			TxBytes                                        float64   `json:"tx_bytes"`
   133  			TxDropped                                      float64   `json:"tx_dropped"`
   134  			TxErrors                                       float64   `json:"tx_errors"`
   135  			TxPackets                                      float64   `json:"tx_packets"`
   136  			TxRetries                                      float64   `json:"tx_retries"`
   137  			UserRxBytes                                    float64   `json:"user-rx_bytes"`
   138  			UserRxCrypts                                   float64   `json:"user-rx_crypts"`
   139  			UserRxDropped                                  float64   `json:"user-rx_dropped"`
   140  			UserRxErrors                                   float64   `json:"user-rx_errors"`
   141  			UserRxFrags                                    float64   `json:"user-rx_frags"`
   142  			UserRxPackets                                  float64   `json:"user-rx_packets"`
   143  			UserTxBytes                                    float64   `json:"user-tx_bytes"`
   144  			UserTxDropped                                  float64   `json:"user-tx_dropped"`
   145  			UserTxErrors                                   float64   `json:"user-tx_errors"`
   146  			UserTxPackets                                  float64   `json:"user-tx_packets"`
   147  			UserTxRetries                                  float64   `json:"user-tx_retries"`
   148  			UserWifi0Ath05Aa99001C9E77C011Dc149F7RxBytes   float64   `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-rx_bytes"`
   149  			UserWifi0Ath05Aa99001C9E77C011Dc149F7RxPackets float64   `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-rx_packets"`
   150  			UserWifi0Ath05Aa99001C9E77C011Dc149F7TxBytes   float64   `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-tx_bytes"`
   151  			UserWifi0Ath05Aa99001C9E77C011Dc149F7TxPackets float64   `json:"user-wifi0-ath0-5aa99001c9e77c011dc149f7-tx_packets"`
   152  			UserWifi0RxBytes                               float64   `json:"user-wifi0-rx_bytes"`
   153  			UserWifi0RxCrypts                              float64   `json:"user-wifi0-rx_crypts"`
   154  			UserWifi0RxDropped                             float64   `json:"user-wifi0-rx_dropped"`
   155  			UserWifi0RxErrors                              float64   `json:"user-wifi0-rx_errors"`
   156  			UserWifi0RxFrags                               float64   `json:"user-wifi0-rx_frags"`
   157  			UserWifi0RxPackets                             float64   `json:"user-wifi0-rx_packets"`
   158  			UserWifi0TxBytes                               float64   `json:"user-wifi0-tx_bytes"`
   159  			UserWifi0TxDropped                             float64   `json:"user-wifi0-tx_dropped"`
   160  			UserWifi0TxErrors                              float64   `json:"user-wifi0-tx_errors"`
   161  			UserWifi0TxPackets                             float64   `json:"user-wifi0-tx_packets"`
   162  			UserWifi0TxRetries                             float64   `json:"user-wifi0-tx_retries"`
   163  			UserWifi1Ath2NullRxBytes                       float64   `json:"user-wifi1-ath2-null-rx_bytes"`
   164  			UserWifi1Ath2NullRxPackets                     float64   `json:"user-wifi1-ath2-null-rx_packets"`
   165  			UserWifi1Ath2NullTxBytes                       float64   `json:"user-wifi1-ath2-null-tx_bytes"`
   166  			UserWifi1Ath2NullTxPackets                     float64   `json:"user-wifi1-ath2-null-tx_packets"`
   167  			UserWifi1RxBytes                               float64   `json:"user-wifi1-rx_bytes"`
   168  			UserWifi1RxCrypts                              float64   `json:"user-wifi1-rx_crypts"`
   169  			UserWifi1RxDropped                             float64   `json:"user-wifi1-rx_dropped"`
   170  			UserWifi1RxErrors                              float64   `json:"user-wifi1-rx_errors"`
   171  			UserWifi1RxFrags                               float64   `json:"user-wifi1-rx_frags"`
   172  			UserWifi1RxPackets                             float64   `json:"user-wifi1-rx_packets"`
   173  			UserWifi1TxBytes                               float64   `json:"user-wifi1-tx_bytes"`
   174  			UserWifi1TxDropped                             float64   `json:"user-wifi1-tx_dropped"`
   175  			UserWifi1TxErrors                              float64   `json:"user-wifi1-tx_errors"`
   176  			UserWifi1TxPackets                             float64   `json:"user-wifi1-tx_packets"`
   177  			UserWifi1TxRetries                             float64   `json:"user-wifi1-tx_retries"`
   178  			Wifi0RxBytes                                   float64   `json:"wifi0-rx_bytes"`
   179  			Wifi0RxCrypts                                  float64   `json:"wifi0-rx_crypts"`
   180  			Wifi0RxDropped                                 float64   `json:"wifi0-rx_dropped"`
   181  			Wifi0RxErrors                                  float64   `json:"wifi0-rx_errors"`
   182  			Wifi0RxFrags                                   float64   `json:"wifi0-rx_frags"`
   183  			Wifi0RxPackets                                 float64   `json:"wifi0-rx_packets"`
   184  			Wifi0TxBytes                                   float64   `json:"wifi0-tx_bytes"`
   185  			Wifi0TxDropped                                 float64   `json:"wifi0-tx_dropped"`
   186  			Wifi0TxErrors                                  float64   `json:"wifi0-tx_errors"`
   187  			Wifi0TxPackets                                 float64   `json:"wifi0-tx_packets"`
   188  			Wifi0TxRetries                                 float64   `json:"wifi0-tx_retries"`
   189  			Wifi1RxBytes                                   float64   `json:"wifi1-rx_bytes"`
   190  			Wifi1RxCrypts                                  float64   `json:"wifi1-rx_crypts"`
   191  			Wifi1RxDropped                                 float64   `json:"wifi1-rx_dropped"`
   192  			Wifi1RxErrors                                  float64   `json:"wifi1-rx_errors"`
   193  			Wifi1RxFrags                                   float64   `json:"wifi1-rx_frags"`
   194  			Wifi1RxPackets                                 float64   `json:"wifi1-rx_packets"`
   195  			Wifi1TxBytes                                   float64   `json:"wifi1-tx_bytes"`
   196  			Wifi1TxDropped                                 float64   `json:"wifi1-tx_dropped"`
   197  			Wifi1TxErrors                                  float64   `json:"wifi1-tx_errors"`
   198  			Wifi1TxPackets                                 float64   `json:"wifi1-tx_packets"`
   199  			Wifi1TxRetries                                 float64   `json:"wifi1-tx_retries"`
   200  		} `json:"at"`
   201  	} `json:"stat"`
   202  	State    DevState `json:"state"`
   203  	SysStats struct {
   204  	} `json:"sys_stats"`
   205  	SystemStats struct {
   206  	} `json:"system-stats"`
   207  	TxBytes           int64  `json:"tx_bytes"`
   208  	TxBytesD          int64  `json:"tx_bytes-d"`
   209  	Type              string `json:"type"`
   210  	Upgradable        bool   `json:"upgradable"`
   211  	UpgradeState      int    `json:"upgrade_state"`
   212  	UpgradeToFirmware string `json:"upgrade_to_firmware"`
   213  	Uplink            struct {
   214  		FullDuplex  bool   `json:"full_duplex"`
   215  		IP          string `json:"ip"`
   216  		Mac         string `json:"mac"`
   217  		MaxSpeed    int    `json:"max_speed"`
   218  		Name        string `json:"name"`
   219  		Netmask     string `json:"netmask"`
   220  		NumPort     int    `json:"num_port"`
   221  		RxBytes     int64  `json:"rx_bytes"`
   222  		RxBytesR    int64  `json:"rx_bytes-r"`
   223  		RxDropped   int64  `json:"rx_dropped"`
   224  		RxErrors    int64  `json:"rx_errors"`
   225  		RxMulticast int64  `json:"rx_multicast"`
   226  		RxPackets   int64  `json:"rx_packets"`
   227  		Speed       int    `json:"speed"`
   228  		TxBytes     int64  `json:"tx_bytes"`
   229  		TxBytesR    int64  `json:"tx_bytes-r"`
   230  		TxDropped   int64  `json:"tx_dropped"`
   231  		TxErrors    int64  `json:"tx_errors"`
   232  		TxPackets   int64  `json:"tx_packets"`
   233  		Type        string `json:"type"`
   234  		Up          bool   `json:"up"`
   235  	} `json:"uplink"`
   236  	UplinkTable []any `json:"uplink_table"`
   237  	Uptime      int   `json:"uptime"`
   238  	UserNumSta  int   `json:"user-num_sta"`
   239  	VapTable    []struct {
   240  		ApMac      string `json:"ap_mac"`
   241  		Bssid      string `json:"bssid"`
   242  		Ccq        int    `json:"ccq"`
   243  		Channel    int    `json:"channel"`
   244  		Essid      string `json:"essid"`
   245  		ID         string `json:"id"`
   246  		IsGuest    bool   `json:"is_guest"`
   247  		IsWep      bool   `json:"is_wep"`
   248  		MapID      string `json:"map_id"`
   249  		Name       string `json:"name"`
   250  		NumSta     int    `json:"num_sta"`
   251  		Radio      string `json:"radio"`
   252  		RadioName  string `json:"radio_name"`
   253  		RxBytes    int64  `json:"rx_bytes"`
   254  		RxCrypts   int64  `json:"rx_crypts"`
   255  		RxDropped  int64  `json:"rx_dropped"`
   256  		RxErrors   int64  `json:"rx_errors"`
   257  		RxFrags    int64  `json:"rx_frags"`
   258  		RxNwids    int64  `json:"rx_nwids"`
   259  		RxPackets  int64  `json:"rx_packets"`
   260  		SiteID     string `json:"site_id"`
   261  		State      string `json:"state"`
   262  		T          string `json:"t"`
   263  		TxBytes    int64  `json:"tx_bytes"`
   264  		TxDropped  int64  `json:"tx_dropped"`
   265  		TxErrors   int64  `json:"tx_errors"`
   266  		TxPackets  int64  `json:"tx_packets"`
   267  		TxPower    int64  `json:"tx_power"`
   268  		TxRetries  int64  `json:"tx_retries"`
   269  		Up         bool   `json:"up"`
   270  		Usage      string `json:"usage"`
   271  		WlanconfID string `json:"wlanconf_id"`
   272  	} `json:"vap_table"`
   273  	Version                string     `json:"version"`
   274  	VersionIncompatible    bool       `json:"version_incompatible"`
   275  	VwireEnabled           bool       `json:"vwireEnabled"`
   276  	VwireTable             []any      `json:"vwire_table"`
   277  	VwireVapTable          []any      `json:"vwire_vap_table"`
   278  	WifiCaps               int        `json:"wifi_caps"`
   279  	X                      fuzzyFloat `json:"x"`
   280  	XAuthkey               string     `json:"x_authkey"`
   281  	XFingerprint           string     `json:"x_fingerprint"`
   282  	XHasSSHHostkey         bool       `json:"x_has_ssh_hostkey"`
   283  	XInformAuthkey         string     `json:"x_inform_authkey"`
   284  	XSSHHostkeyFingerprint string     `json:"x_ssh_hostkey_fingerprint"`
   285  	XVwirekey              string     `json:"x_vwirekey"`
   286  	Y                      fuzzyFloat `json:"y"`
   287  }
   288  
   289  type UAPmap map[string]UAP
   290  
   291  // Returns a slice of access points
   292  // Deprecated: Use UAPs instead
   293  func (u *Unifi) Aps(site *Site) ([]UAP, error) {
   294  	return u.UAPs(site)
   295  }
   296  
   297  // Returns a slice of access points
   298  func (u *Unifi) UAPs(site *Site) ([]UAP, error) {
   299  	rawDevices, err := u.RawDevices(site, "uap")
   300  	if err != nil {
   301  		return nil, err
   302  	}
   303  
   304  	// Devices
   305  	var uaps []UAP
   306  	for _, v := range rawDevices {
   307  		var uap UAP
   308  		err := json.Unmarshal(v.Data, &uap)
   309  		if err != nil {
   310  			return uaps, err
   311  		}
   312  		// Set unifi pointer
   313  		uap.u = u
   314  
   315  		uaps = append(uaps, uap)
   316  	}
   317  	return uaps, nil
   318  }
   319  
   320  // Returns a map of access points with mac as a key
   321  func (u *Unifi) UAPMap(site *Site) (UAPmap, error) {
   322  	aps, err := u.Aps(site)
   323  	if err != nil {
   324  		return nil, err
   325  	}
   326  	m := make(UAPmap)
   327  	for _, a := range aps {
   328  		m[a.Mac] = a
   329  	}
   330  	return m, nil
   331  }
   332  
   333  // Reboot access point
   334  func (a UAP) Restart() error {
   335  	if a.u == nil {
   336  		return ErrLoginFirst
   337  	}
   338  	return a.u.devcmd(a.Mac, "restart")
   339  }
   340  
   341  func (a UAP) DeviceName() string {
   342  	if a.Name != "" {
   343  		return a.Name
   344  	}
   345  	// If no name is given, return mac as name
   346  	return a.Mac
   347  }
   348  
   349  func (a UAP) ModelName() string {
   350  	if m, ok := model[a.Model]; ok {
   351  		return m
   352  	}
   353  	return a.Model
   354  }