Added function to display real Clients
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
e4a372e29a
commit
b3e8fd3bdb
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