Merge pull request #48 from unifi-poller/dn2_rogue_aps
Add methods to get Rogue APs.
This commit is contained in:
		
						commit
						e8502acf12
					
				|  | @ -14,6 +14,8 @@ var ErrCannotUnmarshalFlexInt = fmt.Errorf("cannot unmarshal to FlexInt") | |||
| // This is a list of unifi API paths.
 | ||||
| // The %s in each string must be replaced with a Site.Name.
 | ||||
| const ( | ||||
| 	// APIRogueAP shows your neighbors' wifis.
 | ||||
| 	APIRogueAP string = "/api/s/%s/stat/rogueap" | ||||
| 	// APIStatusPath shows Controller version.
 | ||||
| 	APIStatusPath string = "/status" | ||||
| 	// APIEventPath contains UniFi Event data.
 | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ package unifi | |||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
|  | @ -549,6 +550,82 @@ type VapTable []struct { | |||
| 	WlanconfID          string      `json:"wlanconf_id"` | ||||
| } | ||||
| 
 | ||||
| // RogueAP are your neighbors access points.
 | ||||
| type RogueAP struct { | ||||
| 	SourceName string   `json:"-"` | ||||
| 	SiteName   string   `json:"-"` | ||||
| 	ID         string   `json:"_id"` | ||||
| 	ApMac      string   `json:"ap_mac"` | ||||
| 	Bssid      string   `json:"bssid"` | ||||
| 	SiteID     string   `json:"site_id"` | ||||
| 	Age        FlexInt  `json:"age"` | ||||
| 	Band       string   `json:"band"` | ||||
| 	Bw         FlexInt  `json:"bw"` | ||||
| 	CenterFreq FlexInt  `json:"center_freq"` | ||||
| 	Channel    int      `json:"channel"` | ||||
| 	Essid      string   `json:"essid"` | ||||
| 	Freq       FlexInt  `json:"freq"` | ||||
| 	IsAdhoc    FlexBool `json:"is_adhoc"` | ||||
| 	IsRogue    FlexBool `json:"is_rogue"` | ||||
| 	IsUbnt     FlexBool `json:"is_ubnt"` | ||||
| 	LastSeen   FlexInt  `json:"last_seen"` | ||||
| 	Noise      FlexInt  `json:"noise"` | ||||
| 	Radio      string   `json:"radio"` | ||||
| 	RadioName  string   `json:"radio_name"` | ||||
| 	ReportTime FlexInt  `json:"report_time"` | ||||
| 	Rssi       FlexInt  `json:"rssi"` | ||||
| 	RssiAge    FlexInt  `json:"rssi_age"` | ||||
| 	Security   string   `json:"security"` | ||||
| 	Signal     FlexInt  `json:"signal"` | ||||
| 	Oui        string   `json:"oui"` | ||||
| } | ||||
| 
 | ||||
| // GetRogueAPs returns RogueAPs for a list of Sites.
 | ||||
| // Use GetRogueAPsSite if you want more control.
 | ||||
| func (u *Unifi) GetRogueAPs(sites []*Site) ([]*RogueAP, error) { | ||||
| 	data := []*RogueAP{} | ||||
| 
 | ||||
| 	for _, site := range sites { | ||||
| 		response, err := u.GetRogueAPsSite(site) | ||||
| 		if err != nil { | ||||
| 			return data, err | ||||
| 		} | ||||
| 
 | ||||
| 		data = append(data, response...) | ||||
| 	} | ||||
| 
 | ||||
| 	return data, nil | ||||
| } | ||||
| 
 | ||||
| // GetRogueAPsSite returns RogueAPs for a single Site.
 | ||||
| func (u *Unifi) GetRogueAPsSite(site *Site) ([]*RogueAP, error) { | ||||
| 	if site == nil || site.Name == "" { | ||||
| 		return nil, ErrNoSiteProvided | ||||
| 	} | ||||
| 
 | ||||
| 	u.DebugLog("Polling Controller for RogueAPs, site %s (%s)", site.Name, site.Desc) | ||||
| 
 | ||||
| 	var ( | ||||
| 		path     = fmt.Sprintf(APIRogueAP, site.Name) | ||||
| 		rogueaps struct { | ||||
| 			Data []*RogueAP `json:"data"` | ||||
| 		} | ||||
| 	) | ||||
| 
 | ||||
| 	if err := u.GetData(path, &rogueaps, ""); err != nil { | ||||
| 		return rogueaps.Data, err | ||||
| 	} | ||||
| 
 | ||||
| 	for i := range rogueaps.Data { | ||||
| 		// Add special SourceName value.
 | ||||
| 		rogueaps.Data[i].SourceName = u.URL | ||||
| 		// Add the special "Site Name" to each event. This becomes a Grafana filter somewhere.
 | ||||
| 		rogueaps.Data[i].SiteName = site.Desc + " (" + site.Name + ")" | ||||
| 	} | ||||
| 
 | ||||
| 	return rogueaps.Data, nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshalls 5.10 or 5.11 formatted Access Point Stat data.
 | ||||
| func (v *UAPStat) UnmarshalJSON(data []byte) error { | ||||
| 	var n struct { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue