diff --git a/types.go b/types.go index 994df7e..befda90 100644 --- a/types.go +++ b/types.go @@ -76,6 +76,29 @@ type unifiAPIDetails struct { RAM float64 `json:"ram"` } `json:"overview"` IPAddress string `json:"ipAddress"` + Location struct { + Latitude float64 `json:"latitude"` + Longitude float64 `json:"longitude"` + Altitude int `json:"altitude"` + } `json:"location"` + Interfaces []struct { + Identification struct { + Type string `json:"type"` + Name string `json:"name"` + Description string `json:"description"` + Mac string `json:"mac"` + DisplayName string `json:"displayName"` + } `json:"identification"` + Statistics struct { + Rxrate int `json:"rxrate"` + Txrate int `json:"txrate"` + Rxbytes int64 `json:"rxbytes"` + Txbytes int64 `json:"txbytes"` + PoePower int `json:"poePower"` + Dropped int `json:"dropped"` + Errors int `json:"errors"` + } `json:"statistics"` + } `json:"interfaces"` } type unifiAPIAirmax struct { @@ -327,3 +350,9 @@ type UNMSstatistics struct { } `json:"transmit"` } `json:"interfaces"` } + +type UNMSdhcp []struct { + Address string `json:"address"` + Hostname string `json:"hostname"` + Type string `json:"type"` +} diff --git a/unms.go b/unms.go index 201a7ff..14bf324 100644 --- a/unms.go +++ b/unms.go @@ -135,13 +135,10 @@ func processUNMSAPIRouter() []node { } // END OF API CALL 1 - // API CALL 2 + // API CALL FOR ROUTER DETAILS log.Println("calling API 2 for device", d.Devices[i].Name) var details unifiAPIDetails UnmsCallAPI("/devices/erouters/"+dev.Identification.ID, &details) - // END OF API CALL 2 - - // API CALL 3 STATISTICS! bp, err := client.NewBatchPoints(client.BatchPointsConfig{ Database: "freifunk", Precision: "s", @@ -149,6 +146,43 @@ func processUNMSAPIRouter() []node { if err != nil { log.Fatalln("Error: ", err) } + for i := range d.Devices { + log.Println("calling API 3 for device", d.Devices[i].Name) + var statistics UNMSstatistics + UnmsCallAPI("/devices/"+dev.Identification.ID+"/statistics?interval=hour", &statistics) + for eth := range details.Interfaces { + tags := map[string]string{ + "hostname": d.Devices[i].Name, + "nodeid": strings.ReplaceAll(dev.Identification.MAC, ":", ""), + } + interface_name_rx := ("rate.rx" + "_" + details.Interfaces[eth].Identification.Name) + interface_name_tx := ("rate.tx" + "_" + details.Interfaces[eth].Identification.Name) + fields := map[string]interface{}{ + interface_name_rx: details.Interfaces[eth].Statistics.Rxrate, + interface_name_tx: details.Interfaces[eth].Statistics.Txrate, + } + tm := time.Now() + point, err := client.NewPoint( + "node", + tags, + fields, + tm, + ) + if err != nil { + log.Fatalln("Error: ", err) + } + + bp.AddPoint(point) + c := influxDBClient() + err = c.Write(bp) + if err != nil { + log.Fatal(err) + } + } + } + // END OF API CALL + + // API CALL 3 STATISTICS for i := range d.Devices { log.Println("calling API 3 for device", d.Devices[i].Name) var statistics UNMSstatistics @@ -158,14 +192,14 @@ func processUNMSAPIRouter() []node { break } tags := map[string]string{ - "hostname": d.Devices[i].Name, + "hostname": strings.ReplaceAll(d.Devices[i].Name, " ", "-"), "nodeid": strings.ReplaceAll(dev.Identification.MAC, ":", ""), } + load := (float64(statistics.CPU[t].Y) / float64(100)) fields := map[string]interface{}{ "cpu": statistics.CPU[t].Y, - "load": float64(statistics.CPU[t].Y / 100), + "load": load, "ram": statistics.RAM[t].Y, - //hier fehlen noch die interfaces } slice := strconv.Itoa(statistics.CPU[t].X) timeunix, err := strconv.Atoi(slice[:10]) @@ -191,60 +225,42 @@ func processUNMSAPIRouter() []node { log.Fatal(err) } } - // ab hier Interfaces - for i := range d.Devices { - log.Println("calling API 3 for device", d.Devices[i].Name) - var statistics UNMSstatistics - UnmsCallAPI("/devices/"+dev.Identification.ID+"/statistics?interval=hour", &statistics) - for eth := range statistics.Interfaces { - for t := range statistics.Interfaces[eth].Transmit { - if t > 9 { - break - } - tags := map[string]string{ - "hostname": d.Devices[i].Name, - "nodeid": strings.ReplaceAll(dev.Identification.MAC, ":", ""), - } - interface_name_rx := ("traffic.rx.bytes" + "_" + statistics.Interfaces[eth].ID) - interface_name_tx := ("traffic.tx.bytes" + "_" + statistics.Interfaces[eth].ID) - if statistics.Interfaces[eth].ID == "eth0" { - interface_name_rx = "traffic.rx.bytes" - interface_name_tx = "traffic.tx.bytes" - } - fields := map[string]interface{}{ - interface_name_rx: statistics.Interfaces[eth].Receive[t].Y * 100, - interface_name_tx: statistics.Interfaces[eth].Transmit[t].Y * 100, - } - slice := strconv.Itoa(statistics.CPU[t].X) - timeunix, err := strconv.Atoi(slice[:10]) - if err != nil { - log.Fatalln("Error: ", err) - } - tm := time.Unix(int64(timeunix), 0) - time_local := tm.Add(1 * time.Hour) - point, err := client.NewPoint( - "node", - tags, - fields, - time_local, - ) - if err != nil { - log.Fatalln("Error: ", err) - } + } + // END OF API CALL 3 - bp.AddPoint(point) - c := influxDBClient() - err = c.Write(bp) - if err != nil { - log.Fatal(err) - } - } - } + // Start API Call 4 (DHCP Leases) + for i := range d.Devices { + log.Println("calling API 4 for device", d.Devices[i].Name) + var dhcpleases UNMSdhcp + UnmsCallAPI("/devices/erouters/"+dev.Identification.ID+"/dhcp/leases", &dhcpleases) + + leases := len(dhcpleases) + tags := map[string]string{ + "hostname": strings.ReplaceAll(d.Devices[i].Name, " ", "-"), + "nodeid": strings.ReplaceAll(dev.Identification.MAC, ":", ""), + } + fields := map[string]interface{}{ + "clients.total": leases, + } + tm := time.Now() + point, err := client.NewPoint( + "node", + tags, + fields, + tm, + ) + if err != nil { + log.Fatalln("Error: ", err) + } + + bp.AddPoint(point) + c := influxDBClient() + err = c.Write(bp) + if err != nil { + log.Fatal(err) } } - // END OF API CALL 3 - // Get info from json file (static) nodes = append(nodes, node{ Firstseen: dev.Overview.CreatedAt.Format(iso8601),