Added function to display real Clients #17
							
								
								
									
										137
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										137
									
								
								main.go
									
									
									
									
									
								
							@ -25,8 +25,9 @@ const (
 | 
				
			|||||||
// flags
 | 
					// flags
 | 
				
			||||||
var configPath = flag.String("configPath", "config.json", "Path to config.json")
 | 
					var configPath = flag.String("configPath", "config.json", "Path to config.json")
 | 
				
			||||||
var version = "development"
 | 
					var version = "development"
 | 
				
			||||||
var delay time.Duration = 60 * time.Second
 | 
					var delay time.Duration = 5 * time.Second
 | 
				
			||||||
var conf = loadconfig(*configPath)
 | 
					var conf = loadconfig(*configPath)
 | 
				
			||||||
 | 
					var ucDev = getDevices(conf.Unifi.UCDevicesURL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	log.Printf("starting version %s...\n", version)
 | 
						log.Printf("starting version %s...\n", version)
 | 
				
			||||||
@ -34,9 +35,9 @@ func main() {
 | 
				
			|||||||
	flag.Parse()
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// check if flags are set
 | 
						// check if flags are set
 | 
				
			||||||
	if *configPath == "" {
 | 
						//if *configPath == "" {
 | 
				
			||||||
		log.Fatalln("Please specify path to config.json flag '-configPath'")
 | 
						//	log.Fatalln("Please specify path to config.json flag '-configPath'")
 | 
				
			||||||
	}
 | 
						//}
 | 
				
			||||||
	// start API processing (runs in a loop)
 | 
						// start API processing (runs in a loop)
 | 
				
			||||||
	go processAPIs()
 | 
						go processAPIs()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,10 +69,8 @@ func processUcAPIs() ([]node, []link) {
 | 
				
			|||||||
	//get list of Unifi devices to display
 | 
						//get list of Unifi devices to display
 | 
				
			||||||
	var nodes []node
 | 
						var nodes []node
 | 
				
			||||||
	var links []link
 | 
						var links []link
 | 
				
			||||||
	d, err := getDevices(conf.Unifi.UCDevicesURL)
 | 
						d := getDevices(conf.Unifi.UCDevicesURL)
 | 
				
			||||||
	if err != nil {
 | 
					
 | 
				
			||||||
		log.Fatalln(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	//call Unifi Controller
 | 
						//call Unifi Controller
 | 
				
			||||||
	ucAPI := newAPI(conf.Unifi.User, conf.Unifi.Password, conf.Unifi.APIURL)
 | 
						ucAPI := newAPI(conf.Unifi.User, conf.Unifi.Password, conf.Unifi.APIURL)
 | 
				
			||||||
	//login
 | 
						//login
 | 
				
			||||||
@ -115,10 +114,10 @@ func processUcAPIs() ([]node, []link) {
 | 
				
			|||||||
			Lastseen:       time.Unix(int64(currentDevice.LastSeen), 0).Format(iso8601),
 | 
								Lastseen:       time.Unix(int64(currentDevice.LastSeen), 0).Format(iso8601),
 | 
				
			||||||
			IsOnline:       itob(currentDevice.State),
 | 
								IsOnline:       itob(currentDevice.State),
 | 
				
			||||||
			IsGateway:      false,
 | 
								IsGateway:      false,
 | 
				
			||||||
			Clients:        0,
 | 
								Clients:        currentDevice.Users,
 | 
				
			||||||
			ClientsWifi24:  0,
 | 
								ClientsWifi24:  0,
 | 
				
			||||||
			ClientsWifi5:   0,
 | 
								ClientsWifi5:   0,
 | 
				
			||||||
			ClientsOther:   0,
 | 
								ClientsOther:   currentDevice.Users,
 | 
				
			||||||
			RootFSUsage:    0,
 | 
								RootFSUsage:    0,
 | 
				
			||||||
			LoadAVG:        load / 100,
 | 
								LoadAVG:        load / 100,
 | 
				
			||||||
			MemoryUsage:    mem / 100,
 | 
								MemoryUsage:    mem / 100,
 | 
				
			||||||
@ -153,15 +152,12 @@ func processUNMSAPI() ([]node, []link) {
 | 
				
			|||||||
	var links []link
 | 
						var links []link
 | 
				
			||||||
	var nodes []node
 | 
						var nodes []node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d, err := getDevices(conf.Unms.DevicesURL)
 | 
						d := getDevices(conf.Unms.DevicesURL)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		log.Fatalln(err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// API CALL 1
 | 
						// API CALL 1
 | 
				
			||||||
	log.Println("calling API 1")
 | 
						log.Println("calling API 1")
 | 
				
			||||||
	var u []unifiAPIResponse
 | 
						var u []unifiAPIResponse
 | 
				
			||||||
	err = callUnifiAPI("/devices", &u)
 | 
						err := callUnifiAPI("/devices", &u)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatalln(err)
 | 
							log.Fatalln(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -254,6 +250,11 @@ func processAPIs() {
 | 
				
			|||||||
			nodes = append(nodes, ucNodes...)
 | 
								nodes = append(nodes, ucNodes...)
 | 
				
			||||||
			links = append(links, ucLinks...)
 | 
								links = append(links, ucLinks...)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if conf.Meshviewer.Enabled == true {
 | 
				
			||||||
 | 
								mvNodes, mvLinks := getMeshviewer()
 | 
				
			||||||
 | 
								nodes = append(nodes, mvNodes...)
 | 
				
			||||||
 | 
								links = append(links, mvLinks...)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// assemble final struct
 | 
							// assemble final struct
 | 
				
			||||||
		o := output{
 | 
							o := output{
 | 
				
			||||||
@ -283,7 +284,7 @@ func getFile(url string) []byte {
 | 
				
			|||||||
	return byteValue
 | 
						return byteValue
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getDevices(url string) (devices, error) {
 | 
					func getDevices(url string) devices {
 | 
				
			||||||
	// get devices from JSON file
 | 
						// get devices from JSON file
 | 
				
			||||||
	jsonFile := getFile(url)
 | 
						jsonFile := getFile(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -296,7 +297,7 @@ func getDevices(url string) (devices, error) {
 | 
				
			|||||||
		fmt.Println("can´t get devices file from " + url)
 | 
							fmt.Println("can´t get devices file from " + url)
 | 
				
			||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return d, nil
 | 
						return d
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func callUnifiAPI(url string, i interface{}) error {
 | 
					func callUnifiAPI(url string, i interface{}) error {
 | 
				
			||||||
@ -475,3 +476,105 @@ func ucAddLink(dev device, links []link) []link {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
	return links
 | 
						return links
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getMeshviewerJSON(url string) (mvDevices, error) {
 | 
				
			||||||
 | 
						// get devices from JSON file
 | 
				
			||||||
 | 
						jsonFile := getFile(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// read file to bytes
 | 
				
			||||||
 | 
						// variable for d
 | 
				
			||||||
 | 
						var n mvDevices
 | 
				
			||||||
 | 
						//var l []link
 | 
				
			||||||
 | 
						// unmarshal to struct
 | 
				
			||||||
 | 
						err := json.Unmarshal(jsonFile, &n)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							fmt.Println("can´t get Meshviewer Json file from " + url)
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return n, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func findNodeID(NodeID string) bool {
 | 
				
			||||||
 | 
						for i := range ucDev.Devices {
 | 
				
			||||||
 | 
							if ucDev.Devices[i].GatewayNexthop == NodeID {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func addmvDevices(d mvDevices) ([]node, []link) {
 | 
				
			||||||
 | 
						var nodes []node
 | 
				
			||||||
 | 
						var links []link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := range d.Nodes {
 | 
				
			||||||
 | 
							mvNode := d.Nodes[i]
 | 
				
			||||||
 | 
							if findNodeID(mvNode.NodeID) == true {
 | 
				
			||||||
 | 
								mvNode.Clients = 0
 | 
				
			||||||
 | 
								mvNode.ClientsWifi24 = 0
 | 
				
			||||||
 | 
								mvNode.ClientsWifi5 = 0
 | 
				
			||||||
 | 
								mvNode.ClientsOther = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							nodes = append(nodes, node{
 | 
				
			||||||
 | 
								Firstseen:      mvNode.Firstseen,
 | 
				
			||||||
 | 
								Lastseen:       mvNode.Lastseen,
 | 
				
			||||||
 | 
								IsOnline:       mvNode.IsOnline,
 | 
				
			||||||
 | 
								IsGateway:      mvNode.IsGateway,
 | 
				
			||||||
 | 
								Clients:        mvNode.Clients,
 | 
				
			||||||
 | 
								ClientsWifi24:  mvNode.ClientsWifi24,
 | 
				
			||||||
 | 
								ClientsWifi5:   mvNode.ClientsWifi5,
 | 
				
			||||||
 | 
								ClientsOther:   mvNode.ClientsOther,
 | 
				
			||||||
 | 
								RootFSUsage:    int(mvNode.RootfsUsage),
 | 
				
			||||||
 | 
								LoadAVG:        mvNode.Loadavg,
 | 
				
			||||||
 | 
								MemoryUsage:    mvNode.MemoryUsage,
 | 
				
			||||||
 | 
								Uptime:         mvNode.Uptime,
 | 
				
			||||||
 | 
								GatewayNexthop: mvNode.GatewayNexthop,
 | 
				
			||||||
 | 
								Gateway:        mvNode.Gateway,
 | 
				
			||||||
 | 
								Location:       mvNode.Location,
 | 
				
			||||||
 | 
								NodeID:         mvNode.NodeID,
 | 
				
			||||||
 | 
								MAC:            mvNode.Mac,
 | 
				
			||||||
 | 
								Adresses:       mvNode.Addresses,
 | 
				
			||||||
 | 
								Domain:         mvNode.Domain,
 | 
				
			||||||
 | 
								Hostname:       mvNode.Hostname,
 | 
				
			||||||
 | 
								Owner:          mvNode.Owner,
 | 
				
			||||||
 | 
								Firmware: firmware{
 | 
				
			||||||
 | 
									Base:    mvNode.Firmware.Base,
 | 
				
			||||||
 | 
									Release: mvNode.Firmware.Release,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								Autoupdater: autoupdater{
 | 
				
			||||||
 | 
									Enabled: mvNode.Autoupdater.Enabled,
 | 
				
			||||||
 | 
									Branch:  mvNode.Autoupdater.Branch,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								NProc: mvNode.Nproc,
 | 
				
			||||||
 | 
								Model: mvNode.Model,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for i := range d.Links {
 | 
				
			||||||
 | 
							mvNode := d.Links[i]
 | 
				
			||||||
 | 
							links = append(links, link{
 | 
				
			||||||
 | 
								Type:       mvNode.Type,
 | 
				
			||||||
 | 
								Source:     mvNode.Source,
 | 
				
			||||||
 | 
								Target:     mvNode.Target,
 | 
				
			||||||
 | 
								SourceTQ:   mvNode.SourceTq,
 | 
				
			||||||
 | 
								TargetTQ:   mvNode.TargetTq,
 | 
				
			||||||
 | 
								SourceAddr: mvNode.SourceAddr,
 | 
				
			||||||
 | 
								TargetAddr: mvNode.TargetAddr,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nodes, links
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getMeshviewer() ([]node, []link) {
 | 
				
			||||||
 | 
						var nodes []node
 | 
				
			||||||
 | 
						var links []link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := range conf.Meshviewer.Files {
 | 
				
			||||||
 | 
							fmt.Println("Hole Meshviewer JSON von: ", conf.Meshviewer.Files[i].URL)
 | 
				
			||||||
 | 
							m, err := getMeshviewerJSON(conf.Meshviewer.Files[i].URL)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nodes, links
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							mvNodes, mvLinks := addmvDevices(m)
 | 
				
			||||||
 | 
							nodes = append(nodes, mvNodes...)
 | 
				
			||||||
 | 
							links = append(links, mvLinks...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nodes, links
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										56
									
								
								types.go
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								types.go
									
									
									
									
									
								
							@ -24,6 +24,13 @@ type config struct {
 | 
				
			|||||||
		Password     string `json:"password"`
 | 
							Password     string `json:"password"`
 | 
				
			||||||
		UCDevicesURL string `json:"ucDevicesURL"`
 | 
							UCDevicesURL string `json:"ucDevicesURL"`
 | 
				
			||||||
	} `json:"unifi"`
 | 
						} `json:"unifi"`
 | 
				
			||||||
 | 
						Meshviewer struct {
 | 
				
			||||||
 | 
							Enabled bool `json:"enabled"`
 | 
				
			||||||
 | 
							Files   []struct {
 | 
				
			||||||
 | 
								Name string `json:"name"`
 | 
				
			||||||
 | 
								URL  string `json:"URL"`
 | 
				
			||||||
 | 
							} `json:"files"`
 | 
				
			||||||
 | 
						} `json:"meshviewer"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type device struct {
 | 
					type device struct {
 | 
				
			||||||
@ -182,6 +189,7 @@ type ucDevice struct {
 | 
				
			|||||||
	State    int    `json:"state"`
 | 
						State    int    `json:"state"`
 | 
				
			||||||
	LastSeen int    `json:"last_seen"`
 | 
						LastSeen int    `json:"last_seen"`
 | 
				
			||||||
	Uptime   int    `json:"uptime"`
 | 
						Uptime   int    `json:"uptime"`
 | 
				
			||||||
 | 
						Users    int    `json:"user-wlan-num_sta"`
 | 
				
			||||||
	Sysstats struct {
 | 
						Sysstats struct {
 | 
				
			||||||
		CPU    string `json:"cpu"`
 | 
							CPU    string `json:"cpu"`
 | 
				
			||||||
		Memory string `json:"mem"`
 | 
							Memory string `json:"mem"`
 | 
				
			||||||
@ -195,6 +203,54 @@ type ucAPIData struct {
 | 
				
			|||||||
	client  *http.Client
 | 
						client  *http.Client
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mvDevices struct {
 | 
				
			||||||
 | 
						Nodes []struct {
 | 
				
			||||||
 | 
							Firstseen      string   `json:"firstseen"`
 | 
				
			||||||
 | 
							Lastseen       string   `json:"lastseen"`
 | 
				
			||||||
 | 
							IsOnline       bool     `json:"is_online"`
 | 
				
			||||||
 | 
							IsGateway      bool     `json:"is_gateway"`
 | 
				
			||||||
 | 
							Clients        int      `json:"clients"`
 | 
				
			||||||
 | 
							ClientsWifi24  int      `json:"clients_wifi24"`
 | 
				
			||||||
 | 
							ClientsWifi5   int      `json:"clients_wifi5"`
 | 
				
			||||||
 | 
							ClientsOther   int      `json:"clients_other"`
 | 
				
			||||||
 | 
							RootfsUsage    float64  `json:"rootfs_usage"`
 | 
				
			||||||
 | 
							Loadavg        float64  `json:"loadavg"`
 | 
				
			||||||
 | 
							MemoryUsage    float64  `json:"memory_usage"`
 | 
				
			||||||
 | 
							Uptime         string   `json:"uptime"`
 | 
				
			||||||
 | 
							GatewayNexthop string   `json:"gateway_nexthop,omitempty"`
 | 
				
			||||||
 | 
							Gateway        string   `json:"gateway,omitempty"`
 | 
				
			||||||
 | 
							NodeID         string   `json:"node_id"`
 | 
				
			||||||
 | 
							Mac            string   `json:"mac"`
 | 
				
			||||||
 | 
							Addresses      []string `json:"addresses"`
 | 
				
			||||||
 | 
							Domain         string   `json:"domain"`
 | 
				
			||||||
 | 
							Hostname       string   `json:"hostname"`
 | 
				
			||||||
 | 
							Owner          string   `json:"owner,omitempty"`
 | 
				
			||||||
 | 
							Location       struct {
 | 
				
			||||||
 | 
								Longitude float64 `json:"longitude"`
 | 
				
			||||||
 | 
								Latitude  float64 `json:"latitude"`
 | 
				
			||||||
 | 
							} `json:"location,omitempty"`
 | 
				
			||||||
 | 
							Firmware struct {
 | 
				
			||||||
 | 
								Base    string `json:"base"`
 | 
				
			||||||
 | 
								Release string `json:"release"`
 | 
				
			||||||
 | 
							} `json:"firmware"`
 | 
				
			||||||
 | 
							Autoupdater struct {
 | 
				
			||||||
 | 
								Enabled bool   `json:"enabled"`
 | 
				
			||||||
 | 
								Branch  string `json:"branch"`
 | 
				
			||||||
 | 
							} `json:"autoupdater,omitempty"`
 | 
				
			||||||
 | 
							Nproc int    `json:"nproc"`
 | 
				
			||||||
 | 
							Model string `json:"model,omitempty"`
 | 
				
			||||||
 | 
						} `json:"nodes"`
 | 
				
			||||||
 | 
						Links []struct {
 | 
				
			||||||
 | 
							Type       string  `json:"type"`
 | 
				
			||||||
 | 
							Source     string  `json:"source"`
 | 
				
			||||||
 | 
							Target     string  `json:"target"`
 | 
				
			||||||
 | 
							SourceTq   float64 `json:"source_tq"`
 | 
				
			||||||
 | 
							TargetTq   float64 `json:"target_tq"`
 | 
				
			||||||
 | 
							SourceAddr string  `json:"source_addr"`
 | 
				
			||||||
 | 
							TargetAddr string  `json:"target_addr"`
 | 
				
			||||||
 | 
						} `json:"links"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//switch Unifi AP Mod IDs to Names
 | 
					//switch Unifi AP Mod IDs to Names
 | 
				
			||||||
func lookupModels(model string) string {
 | 
					func lookupModels(model string) string {
 | 
				
			||||||
	switch model {
 | 
						switch model {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user