From 78b274c160214f64561aa51310f390a95fd3e298 Mon Sep 17 00:00:00 2001 From: Nils Jakobi Date: Sat, 2 Jan 2021 22:16:07 +0100 Subject: [PATCH] added webserver to serve json file. also running indefinitely now --- main.go | 226 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 118 insertions(+), 108 deletions(-) diff --git a/main.go b/main.go index f12c326..92d3ea5 100644 --- a/main.go +++ b/main.go @@ -23,118 +23,131 @@ const ( // flags var token = flag.String("token", "", "Defines the x-auth-token") var version = "development" +var delay time.Duration = 60 * time.Second func main() { - - log.Println("starting version", version, "...") + log.Printf("starting version %s...\n", version) // parse all flags flag.Parse() - // check if token is set if *token == "" { log.Fatalln("Please specify an API token via the flag '-token'") } - // Variables for runtime - var links []link - var nodes []node + // start API processing (runs in a loop) + go processAPIs() - d, err := getDevices() - if err != nil { - log.Fatalln(err) - } + // start webserver + serveJSON() +} - // API CALL 1 - log.Println("calling API 1") - var u []unifiAPIResponse - err = callUnifiAPI("/devices", &u) - if err != nil { - log.Fatalln(err) - } +func processAPIs() { + tick := time.Tick(delay) + for range tick { + // Variables for runtime + var links []link + var nodes []node - for i := range d.Devices { - var dev unifiAPIResponse - var currentDevice device - for j := range u { - if strings.ToUpper(u[j].Identification.MAC) == strings.ToUpper(d.Devices[i].MAC) { - dev = u[j] - currentDevice = d.Devices[i] + d, err := getDevices() + if err != nil { + log.Fatalln(err) + } + + // API CALL 1 + log.Println("calling API 1") + var u []unifiAPIResponse + err = callUnifiAPI("/devices", &u) + if err != nil { + log.Fatalln(err) + } + + for i := range d.Devices { + var dev unifiAPIResponse + var currentDevice device + for j := range u { + if strings.ToUpper(u[j].Identification.MAC) == strings.ToUpper(d.Devices[i].MAC) { + dev = u[j] + currentDevice = d.Devices[i] + } } - } - var isOnline bool = false - if dev.Overview.Status == "active" { - isOnline = true - } - // END OF API CALL 1 - - // API CALL 2 - log.Println("calling API 2 for device", d.Devices[i].Name) - var details unifiAPIDetails - callUnifiAPI("/devices/erouters/"+dev.Identification.ID, &details) - // END OF API CALL 2 - - // API CALL 3 - log.Println("calling API 3 for device", d.Devices[i].Name) - var airmaxes []unifiAPIAirmax - callUnifiAPI("/devices/airmaxes/"+dev.Identification.ID+"/stations", &airmaxes) - // check if remote mac address is part of our published network - for i := range airmaxes { - if isRemoteMACpublished(airmaxes[i].DeviceIdentification.MAC, d.Devices) == true { - links = addLink(dev, airmaxes[i], links) + var isOnline bool = false + if dev.Overview.Status == "active" { + isOnline = true } + // END OF API CALL 1 + + // API CALL 2 + log.Println("calling API 2 for device", d.Devices[i].Name) + var details unifiAPIDetails + callUnifiAPI("/devices/erouters/"+dev.Identification.ID, &details) + // END OF API CALL 2 + + // API CALL 3 + log.Println("calling API 3 for device", d.Devices[i].Name) + var airmaxes []unifiAPIAirmax + callUnifiAPI("/devices/airmaxes/"+dev.Identification.ID+"/stations", &airmaxes) + // check if remote mac address is part of our published network + for i := range airmaxes { + if isRemoteMACpublished(airmaxes[i].DeviceIdentification.MAC, d.Devices) == true { + links = addLink(dev, airmaxes[i], links) + } + } + // END OF API CALL 3 + + // Get info from json file (static) + nodes = append(nodes, node{ + Firstseen: dev.Overview.CreatedAt.Format(iso8601), + Lastseen: dev.Overview.LastSeen.Format(iso8601), + IsOnline: isOnline, + IsGateway: false, + Clients: 0, + ClientsWifi24: 0, + ClientsWifi5: 0, + ClientsOther: 0, + RootFSUsage: 0, + LoadAVG: details.Overview.CPU / 100, + MemoryUsage: details.Overview.RAM / 100, + Uptime: dev.Identification.Started.Format(iso8601), + GatewayNexthop: currentDevice.GatewayNexthop, + Gateway: currentDevice.Gateway, + Location: currentDevice.Location, + NodeID: strings.ReplaceAll(dev.Identification.MAC, ":", ""), + MAC: dev.Identification.MAC, + Adresses: getAddresses(details.IPAddress), + Domain: currentDevice.Domain, + Hostname: "[RiFu] " + details.Identification.Name, + Owner: "Freifunk Rhein-Sieg", + Firmware: firmware{ + Base: "Ubiquiti - Stock", + Release: details.Firmware.Current, + }, + Autoupdater: autoupdater{ + Enabled: false, + Branch: "stable", + }, + NProc: 1, + Model: details.Identification.Model, + }) } - // END OF API CALL 3 - // Get info from json file (static) - nodes = append(nodes, node{ - Firstseen: dev.Overview.CreatedAt.Format(iso8601), - Lastseen: dev.Overview.LastSeen.Format(iso8601), - IsOnline: isOnline, - IsGateway: false, - Clients: 0, - ClientsWifi24: 0, - ClientsWifi5: 0, - ClientsOther: 0, - RootFSUsage: 0, - LoadAVG: details.Overview.CPU / 100, - MemoryUsage: details.Overview.RAM / 100, - Uptime: dev.Identification.Started.Format(iso8601), - GatewayNexthop: currentDevice.GatewayNexthop, - Gateway: currentDevice.Gateway, - Location: currentDevice.Location, - NodeID: strings.ReplaceAll(dev.Identification.MAC, ":", ""), - MAC: dev.Identification.MAC, - Adresses: getAddresses(details.IPAddress), - Domain: currentDevice.Domain, - Hostname: "[RiFu] " + details.Identification.Name, - Owner: "Freifunk Rhein-Sieg", - Firmware: firmware{ - Base: "Ubiquiti - Stock", - Release: details.Firmware.Current, - }, - Autoupdater: autoupdater{ - Enabled: false, - Branch: "stable", - }, - NProc: 1, - Model: details.Identification.Model, - }) + // assemble final struct + o := output{ + Timestamp: time.Now().Format(iso8601), + Nodes: nodes, + Links: links, + } + + // create file output + log.Println("writing json file") + + if err := o.writeToFile(); err != nil { + log.Fatalln(err) + } + + // we're done here + log.Println("...done") } - - // assemble final struct - o := output{ - Timestamp: time.Now().Format(iso8601), - Nodes: nodes, - Links: links, - } - - // create file output - log.Println("writing json file") - writeJSONtoFile(o) - - // we're done here - log.Println("...done") } func getDevices() (devices, error) { @@ -213,22 +226,19 @@ func addLink(dev unifiAPIResponse, airmaxes unifiAPIAirmax, links []link) []link return links } -func writeJSONtoFile(o output) error { - file, err := json.MarshalIndent(o, "", " ") - if err != nil { - return fmt.Errorf("can't marshal to json: %+v", o) - } - - // write to file - err = ioutil.WriteFile("example.json", file, 0644) - if err != nil { - return fmt.Errorf("can't write to json file example.json") - } - return nil -} - func getAddresses(ip string) []string { var adresses []string adresses = append(adresses, strings.Split(ip, "/")[0]) return adresses } + +func serveJSON() { + fs := http.FileServer(http.Dir("./output")) + http.Handle("/", fs) + + log.Println("Listening on :3000...") + err := http.ListenAndServe(":3000", nil) + if err != nil { + log.Fatalln(err) + } +}